From 934762954b691371da905ffebf3aa6adf7dac98b Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 17 Nov 2011 21:30:51 -0800 Subject: [PATCH 0001/1771] first pass on site --- History.md | 32 - Makefile | 51 +- Readme.md | 393 ---- bin/mocha | 179 -- bin/mocha-debug | 3 - .../Snippets/bdd - after each.tmSnippet | 16 - .../Snippets/bdd - after.tmSnippet | 16 - .../Snippets/bdd - before each.tmSnippet | 16 - .../Snippets/bdd - before.tmSnippet | 16 - .../Snippets/bdd - it.tmSnippet | 16 - .../Snippets/untitled.tmSnippet | 16 - editors/JavaScript mocha.tmbundle/info.plist | 19 - foot.html | 2 + head.html | 15 + images/concrete_wall_3.png | Bin 0 -> 62281 bytes images/handmadepaper.png | Bin 0 -> 6498 bytes images/soft_wallpaper.png | Bin 0 -> 230850 bytes images/whitey.png | Bin 0 -> 87134 bytes index.html | 377 +++ index.md | 338 +++ lib/browser/events.js | 53 - lib/browser/tty.js | 8 - lib/interfaces/bdd.js | 86 - lib/interfaces/exports.js | 60 - lib/interfaces/index.js | 4 - lib/interfaces/tdd.js | 70 - lib/mocha.js | 18 - lib/reporters/base.js | 218 -- lib/reporters/doc.js | 77 - lib/reporters/dot.js | 62 - lib/reporters/html.js | 115 - lib/reporters/index.js | 11 - lib/reporters/json-stream.js | 63 - lib/reporters/json.js | 72 - lib/reporters/landing.js | 97 - lib/reporters/list.js | 61 - lib/reporters/progress.js | 84 - lib/reporters/spec.js | 83 - lib/reporters/tap.js | 50 - lib/runner.js | 302 --- lib/suite.js | 194 -- lib/test.js | 83 - mocha.js | 2043 ----------------- package.json | 20 - style.css | 123 + support/compile.js | 150 -- support/tail.js | 37 - test/browser/array.js | 33 - test/browser/index.html | 18 - test/browser/style.css | 45 - test/duration.js | 20 - test/fs.js | 18 - test/globals.js | 19 - test/hook.async.js | 94 - test/hook.sync.js | 63 - test/hook.sync.nested.js | 62 - test/http.js | 17 - test/http.meta.2.js | 82 - test/http.meta.js | 52 - test/interfaces/bdd.js | 25 - test/interfaces/exports.js | 44 - test/interfaces/tdd.js | 15 - test/merge.js | 34 - test/misc/grep.js | 22 - test/mocha.opts | 4 - test/multiple.done.js | 10 - test/pending.js | 4 - test/timeout.js | 8 - test/uncaught.js | 10 - 69 files changed, 861 insertions(+), 5587 deletions(-) delete mode 100644 History.md delete mode 100644 Readme.md delete mode 100755 bin/mocha delete mode 100755 bin/mocha-debug delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/Snippets/untitled.tmSnippet delete mode 100644 editors/JavaScript mocha.tmbundle/info.plist create mode 100644 foot.html create mode 100644 head.html create mode 100644 images/concrete_wall_3.png create mode 100644 images/handmadepaper.png create mode 100644 images/soft_wallpaper.png create mode 100644 images/whitey.png create mode 100644 index.html create mode 100644 index.md delete mode 100644 lib/browser/events.js delete mode 100644 lib/browser/tty.js delete mode 100644 lib/interfaces/bdd.js delete mode 100644 lib/interfaces/exports.js delete mode 100644 lib/interfaces/index.js delete mode 100644 lib/interfaces/tdd.js delete mode 100644 lib/mocha.js delete mode 100644 lib/reporters/base.js delete mode 100644 lib/reporters/doc.js delete mode 100644 lib/reporters/dot.js delete mode 100644 lib/reporters/html.js delete mode 100644 lib/reporters/index.js delete mode 100644 lib/reporters/json-stream.js delete mode 100644 lib/reporters/json.js delete mode 100644 lib/reporters/landing.js delete mode 100644 lib/reporters/list.js delete mode 100644 lib/reporters/progress.js delete mode 100644 lib/reporters/spec.js delete mode 100644 lib/reporters/tap.js delete mode 100644 lib/runner.js delete mode 100644 lib/suite.js delete mode 100644 lib/test.js delete mode 100644 mocha.js delete mode 100644 package.json create mode 100644 style.css delete mode 100644 support/compile.js delete mode 100644 support/tail.js delete mode 100644 test/browser/array.js delete mode 100644 test/browser/index.html delete mode 100644 test/browser/style.css delete mode 100644 test/duration.js delete mode 100644 test/fs.js delete mode 100644 test/globals.js delete mode 100644 test/hook.async.js delete mode 100644 test/hook.sync.js delete mode 100644 test/hook.sync.nested.js delete mode 100644 test/http.js delete mode 100644 test/http.meta.2.js delete mode 100644 test/http.meta.js delete mode 100644 test/interfaces/bdd.js delete mode 100644 test/interfaces/exports.js delete mode 100644 test/interfaces/tdd.js delete mode 100644 test/merge.js delete mode 100644 test/misc/grep.js delete mode 100644 test/mocha.opts delete mode 100644 test/multiple.done.js delete mode 100644 test/pending.js delete mode 100644 test/timeout.js delete mode 100644 test/uncaught.js diff --git a/History.md b/History.md deleted file mode 100644 index 91d11de34f..0000000000 --- a/History.md +++ /dev/null @@ -1,32 +0,0 @@ - -0.0.1-alpha5 / 2011-11-17 -================== - - * Added `doc` reporter. Closes #33 - * Added suite merging. Closes #28 - * Added TextMate bundle and `make tm`. Closes #20 - -0.0.1-alpha4 / 2011-11-15 -================== - - * Fixed getWindowSize() for 0.4.x - -0.0.1-alpha3 / 2011-11-15 -================== - - * Added `-s, --slow ` to specify "slow" test threshold - * Added `mocha-debug(1)` - * Added `mocha.opts` support. Closes #31 - * Added: default [files] to _test/*.js_ - * Added protection against multiple calls to `done()`. Closes #35 - * Changed: bright yellow for slow Dot reporter tests - -0.0.1-alpha1 / 2011-11-08 -================== - - * Missed this one :) - -0.0.1-alpha1 / 2011-11-08 -================== - - * Initial release diff --git a/Makefile b/Makefile index 5b0eb18f12..51fbe9831a 100644 --- a/Makefile +++ b/Makefile @@ -1,49 +1,10 @@ -REPORTER = dot -TM_DEST = ~/Library/Application\ Support/TextMate/Bundles -TM_BUNDLE = JavaScript\ mocha.tmbundle -SRC = $(shell find lib -name "*.js" -type f) - -mocha.js: $(SRC) - @node support/compile $^ - @cat support/tail.js >> mocha.js +index.html: head.html foot.html index.md + @markdown < index.md \ + | cat head.html - foot.html \ + > $@ clean: - rm -f mocha.js - -test: test-unit - -test-all: test-bdd test-tdd test-exports test-unit test-grep - -test-unit: - @./bin/mocha \ - --reporter $(REPORTER) - -test-bdd: - @./bin/mocha \ - --reporter $(REPORTER) \ - --ui bdd \ - test/interfaces/bdd - -test-tdd: - @./bin/mocha \ - --reporter $(REPORTER) \ - --ui tdd \ - test/interfaces/tdd - -test-exports: - @./bin/mocha \ - --reporter $(REPORTER) \ - --ui exports \ - test/interfaces/exports - -test-grep: - @./bin/mocha \ - --reporter $(REPORTER) \ - --grep fast \ - test/misc/grep - -tm: - cp -fr editors/$(TM_BUNDLE) $(TM_DEST)/$(TM_BUNDLE) + rm -f index.html -.PHONY: test test-all test-bdd test-tdd test-exports test-unit test-grep tm clean \ No newline at end of file +.PHONY: clean \ No newline at end of file diff --git a/Readme.md b/Readme.md deleted file mode 100644 index a8e9cae7a7..0000000000 --- a/Readme.md +++ /dev/null @@ -1,393 +0,0 @@ - -# mocha - - Mocha is a _simple_, _fun_, _extensible_ JavaScript test framework rich with features, running on [node](http://nodejs.org) and the browser. Mocha tests run serially, allowing reporting flexibility, and mapping uncaught exceptions to the correct test cases; This also makes Mocha an ideal choice when mocking and stubbing is involved. - - Mocha allows you to use any assertion library you want, if it throws an error, it will work. This means you can utilize libraries such as [should](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. - - Testing asynchronous code with Mocha could not be simpler, when your tests are sync simple omit the callback, when they are async add a callback and invoke it when your test is complete. - - -## Features - - - proper exit status for CI support etc - - ideal for asynchronous APIs - - auto-detects and disables coloring for non-ttys - - maps uncaught exceptions to the correct test case - - async test timeout support - - growl notification support - - reports test durations - - highlights slow tests - - global variable leak detection - - configurable test-case timeout - - optionally run tests that match a regexp - - auto-exit to prevent "hanging" due to an active event loop - - easily meta-generate suites & test-cases - - mocha.opts file support - - `mocha-debug(1)` for node debugger support - - detects multiple calls to `done()` - - TextMate bundle - - use any assertion library you want ([should](http://github.com/visionmedia/should.js), `assert`, etc) - - extensible reporting - - `dot`: a dot matrix - - `doc`: a documentation generator (html) based on your tests - - `landing`: a unicode landing strip ✈ - - `tap`: test-anything-protocol (TAP) producer - - `progress`: a progress bar - - `spec`: hierarchical specification - - `list`: similar to `spec` as a flat-list - - `json-stream`: streaming JSON delimited by a LF - - `json`: a single JSON chunk on exit - - extensible test DSLs - - BDD - - TDD - - exports - -## Usage - -``` - -Usage: mocha [options] [files] - -Options: - - -h, --help output usage information - -V, --version output the version number - -r, --require require the given module - -R, --reporter specify the reporter to use - -u, --ui specify user-interface (bdd|tdd|exports) - -g, --grep only run tests matching - -t, --timeout set test-case timeout in milliseconds [2000] - -s, --slow "slow" test threshold in milliseconds [75] - -G, --growl enable growl support - -Reporters: - - dot - dot matrix - doc - html documentation - json - single json object - progress - progress bar - list - spec-style listing - tap - test-anything-protocol - landing - unicode landing strip - json-stream - newline delimited json events - -Interfaces: - - bdd - describe() / it() - tdd - suite() / test() - exports - module.exports - -``` - -## Interfaces - - Mocha "interfaces" providing BDD, TDD, and expresso export-style flavoured APIs on top of the internals. - -### BDD - -```js -describe('Array', function(){ - before(function(){ - // ... - }); - - describe('#indexOf()', function(){ - it('should return -1 when not present', function(){ - [1,2,3].indexOf(4).should.equal(-1); - }); - - it('should return the index when present', function(){ - [1,2,3].indexOf(3).should.equal(2); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(1).should.equal(0); - }); - }); -}); -``` - -### TDD - -```js -suite('Array', function(){ - setup(function(){ - // ... - }); - - suite('#indexOf()', function(){ - test('should return -1 when not present', function(){ - assert.equal(-1, [1,2,3].indexOf(4)); - }); - - test('should return the index when present', function(){ - assert.equal(2, [1,2,3].indexOf(3)); - assert.equal(1, [1,2,3].indexOf(2)); - assert.equal(0, [1,2,3].indexOf(1)); - }); - }); -}); -``` - -### Exports - -```js -module.exports = { - 'Array': { - '#indexOf()': { - 'should return -1 when not present': function(){ - [1,2,3].indexOf(4).should.equal(-1); - }, - - 'should return the index when present': function(){ - [1,2,3].indexOf(3).should.equal(2); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(1).should.equal(0); - } - } - } -}; -``` - -## Reporters - - Mocha reporters adjust to the terminal window, - and always disable ansi-escape colouring when - the stdio streams are not associated with a tty. - -### Dot Matrix - - The Dot Matrix reporter is simply a series of dots - that represent test cases, failures highlight in red. - - ![dot matrix reporter](http://f.cl.ly/items/3b3b471Z1p2U3D1P2Y1n/Screenshot.png) - - ![dot matrix failure](http://f.cl.ly/items/1P11330L033r423g1y1n/Screenshot.png) - -## TAP - - The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. - - ![test anything protocol](http://f.cl.ly/items/2O0X3h0d1Q430O1t1T3p/Screenshot.png) - -## Landing Strip - - The Landing Strip reporter is a gimmicky test reporter simulating - a plane landing :) unicode ftw - - ![landing strip plane reporter](http://f.cl.ly/items/0z1k400K1N1Y2G3u2u0i/Screenshot.png) - -## List - - The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at - the bottom of the output. - - ![list reporter](http://f.cl.ly/items/0Y0x1B3l3K0n3t3h3l0p/Screenshot.png) - - ![failures](http://f.cl.ly/items/2Z0E150v20042G2d1J0i/Screenshot.png) - -## JSON - - The JSON reporter outputs a single large JSON object when - the tests have completed (failures or not). - -## JSON Stream - - The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. - -```json -["start",{"total":12}] -["pass",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present","duration":0}] -["pass",{"title":"should return the index when present","fullTitle":"Array #indexOf() should return the index when present","duration":0}] -["fail",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present"}] -["end",{"start":"2011-08-29T03:21:02.050Z","suites":13,"passes":11,"tests":12,"failures":1,"end":"2011-08-29T03:21:02.052Z","duration":2}] -```` - -## Doc - - The "doc" reporter outputs a hierarchical HTML body representation - of your tests, wrap it with a header, footer, some styling and you - have some fantastic documentation! - - For example suppose you have the following JavaScript: - -```js -describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }) - }) -}) -``` - - The command `mocha --reporter doc array` would yield: - -```html -
-

Array

-
-
-

#indexOf()

-
-
should return -1 when the value is not present
-
[1,2,3].indexOf(5).should.equal(-1);
-[1,2,3].indexOf(0).should.equal(-1);
-
-
-
-
-``` - -## Async tests - - Testing async code with mocha is simple, invoke the `done()` callback - when complete, if called multiple times (due to a race-condition etc) - will cause mocha to fail, this is invaluable for testing async code. - -```js -describe('something async', function(){ - it('should finish after 300ms', function(done){ - setTimeout(done, 300); - }) -}) -``` - - The `done()` callback also accepts an error, so it's easy to write - tests that adhere to node's callback convention of `(err, result)`: - - ```js - describe('User.save()', function(){ - it('should save without failing', function(done){ - var user = new User('tj'); - user.save(done); - }) - }) - ``` - -## Best practices - -### test/* - - By default `mocha(1)` will use the pattern `./test/*.js`, so - it's usually a good place to put your tests. - -### mocha.opts - - Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: - -``` ---require should ---reporter dot ---ui bdd -``` - - This will default the reporter to `dot`, require the `should` library, - and use `bdd` as the interface. With this you may then invoke `mocha(1)` - with additional arguments, here enabling growl support and changing - the reporter to `spec`: - -``` -$ mocha --reporter list --growl -``` - -### Suite merging - - Suites with common names are "merged" in order - to produce unified reporting, especially when - meta-generating tests. - -```js -describe('merge', function(){ - describe('stuff', function(){ - describe('one', function(){ - it('should do something', function(){ - - }) - }) - }) -}) - -describe('merge', function(){ - describe('stuff', function(){ - describe('two', function(){ - it('should do something', function(){ - - }) - }) - }) -}) - -describe('merge stuff', function(){ - describe('three', function(){ - it('should do something', function(){ - - }) - }) -}) -``` - -will produce the following: - - ![mocha suite merging](http://f.cl.ly/items/380R3S1t1t0b0O2K250V/Screenshot.png) - -### Makefiles - - Be kind and don't make developers hunt around in your docs to figure - out how to run the tests, add a `make test` target to your _Makefile_: - -``` -test: - ./node_modules/.bin/mocha \ - --reporter list - -.PHONY: test -``` - -## TextMate Bundle - - The Mocha TextMate bundle includes snippets to - make writing tests quicker and more enjoyable. - To install the bundle run: - - $ make tm - -## Running tests - - Run mocha tests: - - $ make test - - Run all tests, including interfaces: - - $ make test-all - - Alter the reporter: - - $ make test REPORTER=list - -## License - -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/bin/mocha b/bin/mocha deleted file mode 100755 index c162ad84b2..0000000000 --- a/bin/mocha +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander') - , exec = require('child_process').exec - , path = require('path') - , mocha = require('../') - , reporters = mocha.reporters - , interfaces = mocha.interfaces - , Runner = mocha.Runner - , Suite = mocha.Suite - , vm = require('vm') - , fs = require('fs') - , join = path.join - , cwd = process.cwd(); - -/** - * Files. - */ - -var files = []; - -// options - -program - .version(mocha.version) - .usage('[options] [files]') - .option('-r, --require ', 'require the given module') - .option('-R, --reporter ', 'specify the reporter to use', 'dot') - .option('-u, --ui ', 'specify user-interface (bdd|tdd|exports)', 'bdd') - .option('-g, --grep ', 'only run tests matching ') - .option('-t, --timeout ', 'set test-case timeout in milliseconds [2000]', parseInt) - .option('-s, --slow ', '"slow" test threshold in milliseconds [75]', parseInt) - .option('-G, --growl', 'enable growl support') - -// report help - -program.on('--help', function(){ - console.log(' Reporters:'); - console.log(''); - console.log(' dot - dot matrix'); - console.log(' doc - html documentation'); - console.log(' json - single json object'); - console.log(' progress - progress bar'); - console.log(' list - spec-style listing'); - console.log(' tap - test-anything-protocol'); - console.log(' landing - unicode landing strip'); - console.log(' json-stream - newline delimited json events'); - console.log(''); - - console.log(' Interfaces:'); - console.log(''); - console.log(' bdd - describe() / it()'); - console.log(' tdd - suite() / test()'); - console.log(' exports - module.exports'); - console.log(''); -}); - -// -r, --require - -program.on('require', function(mod){ - require(mod); -}); - -// mocha.opts support - -try { - var opts = fs.readFileSync('test/mocha.opts', 'utf8'); - opts = opts.split(/\s+/).slice(0, -1); - process.argv = process.argv - .slice(0, 2) - .concat(opts.concat(process.argv.slice(2))); -} catch (err) { - // ignore -} - -// parse args - -program.parse(process.argv); - -// infinite stack traces - -Error.stackTraceLimit = Infinity; // TODO: config - -// reporter - -var suite = new Suite('') - , Base = require('../lib/reporters/base') - , Reporter = require('../lib/reporters/' + program.reporter) - , ui = interfaces[program.ui](suite); - -// --slow - -if (program.slow) Base.slow = program.slow; - -// --timeout - -if (program.timeout) suite.timeout(program.timeout); - -// files - -var files = program.args; - -// default files to test/*.js - -if (!files.length) { - files = fs.readdirSync('test').filter(function(path){ - return path.match(/\.js$/); - }).map(function(path){ - return join('test', path); - }); -} - -// require test files before running -// the root suite - -var pending = files.length; -files.forEach(function(file){ - file = join(cwd, file); - suite.emit('pre-require', global, file); - suite.emit('require', require(file), file); - suite.emit('post-require', global, file); - --pending || run(suite); -}); - -// run the given suite - -function run(suite) { - suite.emit('run'); - var runner = new Runner(suite); - var reporter = new Reporter(runner); - if (program.grep) runner.grep(new RegExp(program.grep)); - if (program.growl) growl(runner, reporter) - runner.run(); -} - -// enable growl notifications - -function growl(runner, reporter) { - runner.on('end', function(){ - var stats = reporter.stats; - if (stats.failures) { - var msg = stats.failures + ' of ' + stats.tests + ' tests failed'; - notify(msg, { title: 'Failed' }); - } else { - notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { - title: 'Passed' - }); - } - }); -} - -// growl notification - -function notify(msg, options) { - var image - , args = ['growlnotify', '-m', '"' + msg + '"'] - , options = options || {} - , fn = fn || function(){}; - - if (image = options.image) { - var flag, ext = path.extname(image).substr(1) - flag = flag || ext == 'icns' && 'iconpath' - flag = flag || /^[A-Z]/.test(image) && 'appIcon' - flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' - flag = flag || ext && (image = ext) && 'icon' - flag = flag || 'icon' - args.push('--' + flag, image) - } - - if (options.sticky) args.push('--sticky'); - if (options.priority) args.push('--priority', options.priority); - if (options.name) args.push('--name', options.name); - if (options.title) args.push(options.title); - exec(args.join(' '), fn); -} \ No newline at end of file diff --git a/bin/mocha-debug b/bin/mocha-debug deleted file mode 100755 index 0968bcf883..0000000000 --- a/bin/mocha-debug +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node debug - -require('./mocha'); \ No newline at end of file diff --git a/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet deleted file mode 100644 index e76cae136c..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - afterEach(function(){ - $0 -}) - name - bdd - after each - tabTrigger - ae - uuid - 7B4DA8F4-2064-468B-B252-054148419B4B - - diff --git a/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet deleted file mode 100644 index f1a67aa172..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - after(function(){ - $0 -}) - name - bdd - after - tabTrigger - a - uuid - A49A87F9-399E-4D74-A489-C535BB06D487 - - diff --git a/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet deleted file mode 100644 index f8442fa5a5..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - beforeEach(function(){ - $0 -}) - name - bdd - before each - tabTrigger - be - uuid - 7AB064E3-EFBB-4FA7-98CA-9E87C10CC04E - - diff --git a/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet deleted file mode 100644 index 5c7e40fb7e..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - before(function(){ - $0 -}) - name - bdd - before - tabTrigger - b - uuid - DF6F1F42-F80A-4A24-AF78-376F19070C4C - - diff --git a/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet deleted file mode 100644 index 8cd3fb1759..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - it('should $1', function(){ - $0 -}) - name - bdd - it - tabTrigger - it - uuid - 591AE071-95E4-4E1E-B0F3-A7DAF41595EE - - diff --git a/editors/JavaScript mocha.tmbundle/Snippets/untitled.tmSnippet b/editors/JavaScript mocha.tmbundle/Snippets/untitled.tmSnippet deleted file mode 100644 index 46fd7206b7..0000000000 --- a/editors/JavaScript mocha.tmbundle/Snippets/untitled.tmSnippet +++ /dev/null @@ -1,16 +0,0 @@ - - - - - content - describe('$1', function(){ - $0 -}) - name - bdd - describe - tabTrigger - des - uuid - 4AA1FB50-9BB9-400E-A140-D61C39BDFDF5 - - diff --git a/editors/JavaScript mocha.tmbundle/info.plist b/editors/JavaScript mocha.tmbundle/info.plist deleted file mode 100644 index 16f6587a6c..0000000000 --- a/editors/JavaScript mocha.tmbundle/info.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - name - JavaScript mocha - ordering - - 4AA1FB50-9BB9-400E-A140-D61C39BDFDF5 - 591AE071-95E4-4E1E-B0F3-A7DAF41595EE - DF6F1F42-F80A-4A24-AF78-376F19070C4C - A49A87F9-399E-4D74-A489-C535BB06D487 - 7AB064E3-EFBB-4FA7-98CA-9E87C10CC04E - 7B4DA8F4-2064-468B-B252-054148419B4B - - uuid - 094ACE33-0C0E-422A-B3F7-5B919F5B1239 - - diff --git a/foot.html b/foot.html new file mode 100644 index 0000000000..1fd5f4f290 --- /dev/null +++ b/foot.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/head.html b/head.html new file mode 100644 index 0000000000..7f7f2fce4c --- /dev/null +++ b/head.html @@ -0,0 +1,15 @@ + + + + Mocha - the fun, simple, flexible JavaScript test framework + + + + + +

Mocha

+

simple, flexible, fun

diff --git a/images/concrete_wall_3.png b/images/concrete_wall_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5d04a21cd9e36b720b513656b6ac93bf3f7e7918 GIT binary patch literal 62281 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 literal 0 HcmV?d00001 diff --git a/images/soft_wallpaper.png b/images/soft_wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc74d97c3a903c7a4f5b91e65754a58dd3d0708 GIT binary patch literal 230850 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
  • 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 +### Browser support + + Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. + + + + + + + + + + ### mocha.opts Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: From 13458b1d529c52042c1bd71dbfb1ca5c6a9b900a Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:43:24 -0800 Subject: [PATCH 0005/1771] images --- images/reporter-doc.png | Bin 0 -> 33028 bytes images/reporter-dot.png | Bin 0 -> 23625 bytes images/reporter-json-stream.png | Bin 0 -> 32939 bytes images/reporter-json.png | Bin 0 -> 38201 bytes images/reporter-landing-fail.png | Bin 0 -> 31304 bytes images/reporter-landing.png | Bin 0 -> 23659 bytes images/reporter-list.png | Bin 0 -> 27012 bytes images/reporter-spec-fail.png | Bin 0 -> 33493 bytes images/reporter-spec.png | Bin 0 -> 26342 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/reporter-doc.png create mode 100644 images/reporter-dot.png create mode 100644 images/reporter-json-stream.png create mode 100644 images/reporter-json.png create mode 100644 images/reporter-landing-fail.png create mode 100644 images/reporter-landing.png create mode 100644 images/reporter-list.png create mode 100644 images/reporter-spec-fail.png create mode 100644 images/reporter-spec.png diff --git a/images/reporter-doc.png b/images/reporter-doc.png new file mode 100644 index 0000000000000000000000000000000000000000..d139bb8e8a35d03cbdb5205c05de35a33c8b2d91 GIT binary patch literal 33028 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 Vj}w^!`+$G0YZ+X{U$Ot=e*t-!iQ)hN literal 0 HcmV?d00001 diff --git a/images/reporter-dot.png b/images/reporter-dot.png new file mode 100644 index 0000000000000000000000000000000000000000..c95eaeeebe2b6a1a567d5e0b4743b4745f011a31 GIT binary patch literal 23625 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 CGo?rX literal 0 HcmV?d00001 diff --git a/images/reporter-json-stream.png b/images/reporter-json-stream.png new file mode 100644 index 0000000000000000000000000000000000000000..7f1e1099538d6caaed0375957b3a82153e1925cf GIT binary patch literal 32939 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 R06#~5I{IVL52ye2zW_MVi@pE= literal 0 HcmV?d00001 diff --git a/images/reporter-json.png b/images/reporter-json.png new file mode 100644 index 0000000000000000000000000000000000000000..b80f07e41fa6888915407eb0f0d1aaf6e79cb273 GIT binary patch literal 38201 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 Oa_)@tY2qp0U;h_r-kS{o literal 0 HcmV?d00001 diff --git a/images/reporter-landing.png b/images/reporter-landing.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7f56b31527f2c39fcb83b5feb1c9c9936e05fb GIT binary patch literal 23659 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 literal 0 HcmV?d00001 diff --git a/images/reporter-list.png b/images/reporter-list.png new file mode 100644 index 0000000000000000000000000000000000000000..e169cd38771302822e3348e16e80045c096c573f GIT binary patch literal 27012 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 WG%3#?j+6lYoj+%LmU_nhkN*SB@lTKd literal 0 HcmV?d00001 diff --git a/images/reporter-spec.png b/images/reporter-spec.png new file mode 100644 index 0000000000000000000000000000000000000000..64bf096f5aee4d5867a0fec4ec21130b5e446c4f GIT binary patch literal 26342 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≫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 WgpM+!P))J`0000+zAY>mv5i5&$&PD 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

    Mocha

    +

    simple, flexible, fun

    +

    Mocha is a feature-rich JavaScript test framework running on node and the browser, aiming to make async testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

    + +

    Features

    + +
      +
    • proper exit status for CI support etc
    • +
    • ideal for asynchronous APIs
    • +
    • auto-detects and disables coloring for non-ttys
    • +
    • maps uncaught exceptions to the correct test case
    • +
    • async test timeout support
    • +
    • growl notification support
    • +
    • reports test durations
    • +
    • highlights slow tests
    • +
    • global variable leak detection
    • +
    • configurable test-case timeout
    • +
    • optionally run tests that match a regexp
    • +
    • auto-exit to prevent “hanging” with an active loop
    • +
    • easily meta-generate suites & test-cases
    • +
    • mocha.opts file support
    • +
    • mocha-debug(1) for node debugger support
    • +
    • detects multiple calls to done()
    • +
    • use any assertion library you want
    • +
    • extensible reporting, bundled with 9+ reporters
    • +
    • extensible test DSLs or “interfaces”
    • +
    • before, after, before each, after each hooks
    • +
    • TextMate bundle
    • +
    + + +

    Installation

    + +

    Install with npm:

    + +
    $ npm install -g mocha
    +
    + +

    Assertions

    + +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    + +

    Synchronous code

    + +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    + +
    describe('Array', function(){
    +  describe('#indexOf()', function(){
    +    it('should return -1 when the value is not present', function(){
    +      [1,2,3].indexOf(5).should.equal(-1);
    +      [1,2,3].indexOf(0).should.equal(-1);
    +    })
    +  })
    +})
    +
    + +

    Asynchronous code

    + +

    Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete:

    + +
    describe('User', function(){
    +  describe('#save()', function(){
    +    it('should save without error', function(done){
    +      var user = new User('Luna');
    +      user.save(function(err){
    +        if (err) throw err;
    +        done();
    +      });
    +    })
    +  })
    +})
    +
    + +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    + +
    describe('User', function(){
    +  describe('#save()', function(){
    +    it('should save without error', function(done){
    +      var user = new User('Luna');
    +      user.save(done);
    +    })
    +  })
    +})
    +
    + +

    Pending tests

    + +

    Pending test-cases are simply those without a callback:

    + +
    describe('Array', function(){
    +  describe('#indexOf()', function(){
    +    it('should return -1 when the value is not present')
    +  })
    +})
    +
    + +

    mocha(1)

    + +
    Usage: mocha [options] [files]
    +
    +Options:
    +
    +  -h, --help             output usage information
    +  -V, --version          output the version number
    +  -r, --require <name>   require the given module
    +  -R, --reporter <name>  specify the reporter to use
    +  -u, --ui <name>        specify user-interface (bdd|tdd|exports)
    +  -g, --grep <pattern>   only run tests matching <pattern>
    +  -t, --timeout <ms>     set test-case timeout in milliseconds [2000]
    +  -s, --slow <ms>        "slow" test threshold in milliseconds [75]
    +  -G, --growl            enable growl support
    +
    + +

    mocha-debug(1)

    + +

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    + +

    Interfaces

    + +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    + +

    BDD

    + +

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    + +
    describe('Array', function(){
    +  before(function(){
    +    // ...
    +  });
    +
    +  describe('#indexOf()', function(){
    +    it('should return -1 when not present', function(){
    +      [1,2,3].indexOf(4).should.equal(-1);
    +    });
    +  });
    +});
    +
    + +

    TDD

    + +

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    + +
    suite('Array', function(){
    +  setup(function(){
    +    // ...
    +  });
    +
    +  suite('#indexOf()', function(){
    +    test('should return -1 when not present', function(){
    +      assert.equal(-1, [1,2,3].indexOf(4));
    +    });
    +  });
    +});
    +
    + +

    Exports

    + +

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values + are suites, and function values are test-cases.

    + +
    module.exports = {
    +  before: function(){
    +    // ...
    +  },
    +
    +  'Array': {
    +    '#indexOf()': {
    +      'should return -1 when not present': function(){
    +        [1,2,3].indexOf(4).should.equal(-1);
    +      }
    +    }
    +  }
    +};
    +
    + +

    Reporters

    + +

    Mocha reporters adjust to the terminal window, + and always disable ansi-escape colouring when + the stdio streams are not associated with a tty.

    + +

    Dot Matrix

    + +

    The Dot Matrix reporter is simply a series of dots + that represent test cases, failures highlight in red.

    + +

    dot matrix reporter

    + +

    dot matrix failure

    + +

    TAP

    + +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    + +

    test anything protocol

    + +

    Landing Strip

    + +

    The Landing Strip reporter is a gimmicky test reporter simulating + a plane landing :) unicode ftw

    + +

    landing strip plane reporter

    + +

    List

    + +

    The “List” reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at + the bottom of the output.

    + +

    list reporter

    + +

    failures

    + +

    JSON

    + +

    The JSON reporter outputs a single large JSON object when + the tests have completed (failures or not).

    + +

    JSON Stream

    + +

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    + +
    ["start",{"total":12}]
    +["pass",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present","duration":0}]
    +["pass",{"title":"should return the index when present","fullTitle":"Array #indexOf() should return the index when present","duration":0}]
    +["fail",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present"}]
    +["end",{"start":"2011-08-29T03:21:02.050Z","suites":13,"passes":11,"tests":12,"failures":1,"end":"2011-08-29T03:21:02.052Z","duration":2}]
    +
    + +

    Doc

    + +

    The “doc” reporter outputs a hierarchical HTML body representation + of your tests, wrap it with a header, footer, some styling and you + have some fantastic documentation!

    + +

    For example suppose you have the following JavaScript:

    + +
    describe('Array', function(){
    +  describe('#indexOf()', function(){
    +    it('should return -1 when the value is not present', function(){
    +      [1,2,3].indexOf(5).should.equal(-1);
    +      [1,2,3].indexOf(0).should.equal(-1);
    +    })
    +  })
    +})
    +
    + +

    The command mocha --reporter doc array would yield:

    + +
    <section class="suite">
    +  <h1>Array</h1>
    +  <dl>
    +    <section class="suite">
    +      <h1>#indexOf()</h1>
    +      <dl>
    +      <dt>should return -1 when the value is not present</dt>
    +      <dd><pre><code>[1,2,3].indexOf(5).should.equal(-1);
    +[1,2,3].indexOf(0).should.equal(-1);</code></pre></dd>
    +      </dl>
    +    </section>
    +  </dl>
    +</section>
    +
    + +

    mocha.opts

    + +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    + +
    --require should
    +--reporter dot
    +--ui bdd
    +
    + +

    This will default the reporter to dot, require the should library, + and use bdd as the interface. With this you may then invoke mocha(1) + with additional arguments, here enabling growl support and changing + the reporter to spec:

    + +
    $ mocha --reporter list --growl
    +
    + +

    Suite merging

    + +

    Suites with common names are “merged” in order + to produce unified reporting, especially when + meta-generating tests.

    + +
    describe('merge', function(){
    +  describe('stuff', function(){
    +    describe('one', function(){
    +      it('should do something', function(){})
    +    })
    +  })
    +})
    +
    +describe('merge', function(){
    +  describe('stuff', function(){
    +    describe('two', function(){
    +      it('should do something', function(){})
    +    })
    +  })
    +})
    +
    +describe('merge stuff', function(){
    +  describe('three', function(){
    +    it('should do something', function(){})
    +  })
    +})
    +
    + +

    will produce the following:

    + +

    mocha suite merging

    + +

    Best practices

    + +

    test/*

    + +

    By default mocha(1) will use the pattern ./test/*.js, so + it’s usually a good place to put your tests.

    + +

    Makefiles

    + +

    Be kind and don’t make developers hunt around in your docs to figure + out how to run the tests, add a make test target to your Makefile:

    + +
     test:
    +   ./node_modules/.bin/mocha \
    +     --reporter list
    +
    + .PHONY: test
    +
    + +

    Editors

    + +

    The following editor-related packages are available:

    + +

    TextMate bundle

    + +

    The Mocha TextMate bundle includes snippets to + make writing tests quicker and more enjoyable. + To install the bundle run:

    + +
      $ make tm
    +
    + +

    Running mocha’s tests

    + +

    Run the tests:

    + +
       $ make test
    +
    + +

    Run all tests, including interfaces:

    + +
       $ make test-all
    +
    + +

    Alter the reporter:

    + +
       $ make test REPORTER=list
    +
    + + \ No newline at end of file diff --git a/index.md b/index.md new file mode 100644 index 0000000000..c0d2bb92f2 --- /dev/null +++ b/index.md @@ -0,0 +1,338 @@ + +Mocha is a feature-rich JavaScript test framework running on [node](http://nodejs.org) and the browser, aiming to make async testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. + +## Features + + - proper exit status for CI support etc + - ideal for asynchronous APIs + - auto-detects and disables coloring for non-ttys + - maps uncaught exceptions to the correct test case + - async test timeout support + - growl notification support + - reports test durations + - highlights slow tests + - global variable leak detection + - configurable test-case timeout + - optionally run tests that match a regexp + - auto-exit to prevent "hanging" with an active loop + - easily meta-generate suites & test-cases + - mocha.opts file support + - `mocha-debug(1)` for node debugger support + - detects multiple calls to `done()` + - use any assertion library you want + - extensible reporting, bundled with 9+ reporters + - extensible test DSLs or "interfaces" + - before, after, before each, after each hooks + - TextMate bundle + +## Installation + + Install with [npm](http://npmjs.org): + + $ npm install -g mocha + +## Assertions + +Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. + +## Synchronous code + + When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. + + describe('Array', function(){ + describe('#indexOf()', function(){ + it('should return -1 when the value is not present', function(){ + [1,2,3].indexOf(5).should.equal(-1); + [1,2,3].indexOf(0).should.equal(-1); + }) + }) + }) + +## Asynchronous code + +Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete: + + describe('User', function(){ + describe('#save()', function(){ + it('should save without error', function(done){ + var user = new User('Luna'); + user.save(function(err){ + if (err) throw err; + done(); + }); + }) + }) + }) + + To make things even easier, the `done()` callback accepts an error, so we may use this directly: + + describe('User', function(){ + describe('#save()', function(){ + it('should save without error', function(done){ + var user = new User('Luna'); + user.save(done); + }) + }) + }) + +## Pending tests + + Pending test-cases are simply those without a callback: + + describe('Array', function(){ + describe('#indexOf()', function(){ + it('should return -1 when the value is not present') + }) + }) + +## mocha(1) + + Usage: mocha [options] [files] + + Options: + + -h, --help output usage information + -V, --version output the version number + -r, --require require the given module + -R, --reporter specify the reporter to use + -u, --ui specify user-interface (bdd|tdd|exports) + -g, --grep only run tests matching + -t, --timeout set test-case timeout in milliseconds [2000] + -s, --slow "slow" test threshold in milliseconds [75] + -G, --growl enable growl support + +## mocha-debug(1) + + `mocha-debug(1)` is identical to `mocha(1)`, however it enables node's debugger so you may step through tests with the __debugger__ statement. + +## Interfaces + + Mocha "interface" system allows developers to choose their style of DSL. Shipping with __BDD__, __TDD__, and __export__ flavoured interfaces. + +### BDD + + The "__BDD__" interface provides `describe()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`: + + describe('Array', function(){ + before(function(){ + // ... + }); + + describe('#indexOf()', function(){ + it('should return -1 when not present', function(){ + [1,2,3].indexOf(4).should.equal(-1); + }); + }); + }); + +### TDD + + The "__TDD__" interface provides `suite()`, `test()`, `setup()`, and `teardown()`. + + suite('Array', function(){ + setup(function(){ + // ... + }); + + suite('#indexOf()', function(){ + test('should return -1 when not present', function(){ + assert.equal(-1, [1,2,3].indexOf(4)); + }); + }); + }); + +### Exports + + The "__exports__" interface is much like Mocha's predecessor [expresso](http://github.com/visionmedia/expresso). The keys `before`, `after`, `beforeEach`, and `afterEach` are special-cased, object values + are suites, and function values are test-cases. + + module.exports = { + before: function(){ + // ... + }, + + 'Array': { + '#indexOf()': { + 'should return -1 when not present': function(){ + [1,2,3].indexOf(4).should.equal(-1); + } + } + } + }; + +## Reporters + + Mocha reporters adjust to the terminal window, + and always disable ansi-escape colouring when + the stdio streams are not associated with a tty. + +### Dot Matrix + + The Dot Matrix reporter is simply a series of dots + that represent test cases, failures highlight in red. + + ![dot matrix reporter](http://f.cl.ly/items/3b3b471Z1p2U3D1P2Y1n/Screenshot.png) + + ![dot matrix failure](http://f.cl.ly/items/1P11330L033r423g1y1n/Screenshot.png) + +## TAP + + The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. + + ![test anything protocol](http://f.cl.ly/items/2O0X3h0d1Q430O1t1T3p/Screenshot.png) + +## Landing Strip + + The Landing Strip reporter is a gimmicky test reporter simulating + a plane landing :) unicode ftw + + ![landing strip plane reporter](http://f.cl.ly/items/0z1k400K1N1Y2G3u2u0i/Screenshot.png) + +## List + + The "List" reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at + the bottom of the output. + + ![list reporter](http://f.cl.ly/items/0Y0x1B3l3K0n3t3h3l0p/Screenshot.png) + + ![failures](http://f.cl.ly/items/2Z0E150v20042G2d1J0i/Screenshot.png) + +## JSON + + The JSON reporter outputs a single large JSON object when + the tests have completed (failures or not). + +## JSON Stream + + The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. + + ["start",{"total":12}] + ["pass",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present","duration":0}] + ["pass",{"title":"should return the index when present","fullTitle":"Array #indexOf() should return the index when present","duration":0}] + ["fail",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present"}] + ["end",{"start":"2011-08-29T03:21:02.050Z","suites":13,"passes":11,"tests":12,"failures":1,"end":"2011-08-29T03:21:02.052Z","duration":2}] + +## Doc + + The "doc" reporter outputs a hierarchical HTML body representation + of your tests, wrap it with a header, footer, some styling and you + have some fantastic documentation! + + For example suppose you have the following JavaScript: + + describe('Array', function(){ + describe('#indexOf()', function(){ + it('should return -1 when the value is not present', function(){ + [1,2,3].indexOf(5).should.equal(-1); + [1,2,3].indexOf(0).should.equal(-1); + }) + }) + }) + + The command `mocha --reporter doc array` would yield: + +
    +

    Array

    +
    +
    +

    #indexOf()

    +
    +
    should return -1 when the value is not present
    +
    [1,2,3].indexOf(5).should.equal(-1);
    +    [1,2,3].indexOf(0).should.equal(-1);
    +
    +
    +
    +
    + +### mocha.opts + + Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: + + --require should + --reporter dot + --ui bdd + + This will default the reporter to `dot`, require the `should` library, + and use `bdd` as the interface. With this you may then invoke `mocha(1)` + with additional arguments, here enabling growl support and changing + the reporter to `spec`: + + $ mocha --reporter list --growl + +### Suite merging + + Suites with common names are "merged" in order + to produce unified reporting, especially when + meta-generating tests. + + describe('merge', function(){ + describe('stuff', function(){ + describe('one', function(){ + it('should do something', function(){}) + }) + }) + }) + + describe('merge', function(){ + describe('stuff', function(){ + describe('two', function(){ + it('should do something', function(){}) + }) + }) + }) + + describe('merge stuff', function(){ + describe('three', function(){ + it('should do something', function(){}) + }) + }) + +will produce the following: + + ![mocha suite merging](http://f.cl.ly/items/380R3S1t1t0b0O2K250V/Screenshot.png) + +## Best practices + +### test/* + + By default `mocha(1)` will use the pattern `./test/*.js`, so + it's usually a good place to put your tests. + +### Makefiles + + Be kind and don't make developers hunt around in your docs to figure + out how to run the tests, add a `make test` target to your _Makefile_: + + test: + ./node_modules/.bin/mocha \ + --reporter list + + .PHONY: test + +## Editors + + The following editor-related packages are available: + +### TextMate bundle + + The Mocha TextMate bundle includes snippets to + make writing tests quicker and more enjoyable. + To install the bundle run: + + $ make tm + +## Running mocha's tests + + Run the tests: + + $ make test + + Run all tests, including interfaces: + + $ make test-all + + Alter the reporter: + + $ make test REPORTER=list diff --git a/lib/browser/events.js b/lib/browser/events.js deleted file mode 100644 index dfcd4ee5aa..0000000000 --- a/lib/browser/events.js +++ /dev/null @@ -1,53 +0,0 @@ - -/** - * Expose `EventEmitter`. - */ - -exports.EventEmitter = EventEmitter; - -/** - * Slice reference. - */ - -var slice = [].slice; - -/** - * EventEmitter. - */ - -function EventEmitter() { - this.callbacks = {}; -}; - -/** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - */ - -EventEmitter.prototype.on = function(event, fn){ - (this.callbacks[event] = this.callbacks[event] || []) - .push(fn); - return this; -}; - -/** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - */ - -EventEmitter.prototype.emit = function(event){ - var args = slice.call(arguments, 1) - , callbacks = this.callbacks[event]; - - if (callbacks) { - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args) - } - } - - return this; -}; diff --git a/lib/browser/tty.js b/lib/browser/tty.js deleted file mode 100644 index 2d84374081..0000000000 --- a/lib/browser/tty.js +++ /dev/null @@ -1,8 +0,0 @@ - -exports.isatty = function(){ - return true; -}; - -exports.getWindowSize = function(){ - return [window.innerHeight, window.innerWidth]; -}; \ No newline at end of file diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js deleted file mode 100644 index 1a06567c2b..0000000000 --- a/lib/interfaces/bdd.js +++ /dev/null @@ -1,86 +0,0 @@ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * BDD-style interface: - * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * - * }); - * - * it('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.describe = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; diff --git a/lib/interfaces/exports.js b/lib/interfaces/exports.js deleted file mode 100644 index b22607e04d..0000000000 --- a/lib/interfaces/exports.js +++ /dev/null @@ -1,60 +0,0 @@ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * exports.Array = { - * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ - * - * }, - * - * 'should return the correct index when the value is present': function(){ - * - * } - * } - * }; - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('require', visit); - - function visit(obj) { - var suite; - for (var key in obj) { - if ('function' == typeof obj[key]) { - var fn = obj[key]; - switch (key) { - case 'before': - suites[0].beforeAll(fn); - break; - case 'after': - suites[0].afterAll(fn); - break; - case 'beforeEach': - suites[0].beforeEach(fn); - break; - case 'afterEach': - suites[0].afterEach(fn); - break; - default: - suites[0].addTest(new Test(key, fn)); - } - } else { - var suite = Suite.create(suites[0], key); - suites.unshift(suite); - visit(obj[key]); - suites.shift(); - } - } - } -}; \ No newline at end of file diff --git a/lib/interfaces/index.js b/lib/interfaces/index.js deleted file mode 100644 index 0dc76674ba..0000000000 --- a/lib/interfaces/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -exports.bdd = require('./bdd'); -exports.tdd = require('./tdd'); -exports.exports = require('./exports'); \ No newline at end of file diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js deleted file mode 100644 index e3ae6eb376..0000000000 --- a/lib/interfaces/tdd.js +++ /dev/null @@ -1,70 +0,0 @@ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * test('should return -1 when not present', function(){ - * - * }); - * - * test('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before each test case. - */ - - context.setup = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute before each test case. - */ - - context.tearDown = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.suite = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; diff --git a/lib/mocha.js b/lib/mocha.js deleted file mode 100644 index 52630165ea..0000000000 --- a/lib/mocha.js +++ /dev/null @@ -1,18 +0,0 @@ - -/*! - * mocha - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Library version. - */ - -exports.version = '0.0.1-alpha5'; - -exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); -exports.Runner = require('./runner'); -exports.Suite = require('./suite'); -exports.Test = require('./test'); \ No newline at end of file diff --git a/lib/reporters/base.js b/lib/reporters/base.js deleted file mode 100644 index 007ecc5c02..0000000000 --- a/lib/reporters/base.js +++ /dev/null @@ -1,218 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); - -/** - * Check if both stdio streams are associated with a tty. - */ - -var isatty = tty.isatty(1) && tty.isatty(2); - -/** - * Expose `Base`. - */ - -exports = module.exports = Base; - -/** - * Enable coloring by default. - */ - -exports.useColors = isatty; - -/** - * Default color map. - */ - -exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'pending': 36 - , 'suite': '40' - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 -}; - -/** - * Color `str` with the given `type`, - * allowing colors to be disabled, - * as well as user-defined color - * schemes. - * - * @param {String} type - * @param {String} str - * @return {String} - * @api private - */ - -var color = exports.color = function(type, str) { - if (!exports.useColors) return str; - return '\033[' + exports.colors[type] + 'm' + str + '\033[0m'; -}; - -/** - * Expose term window size, with some - * defaults for when stderr is not a tty. - */ - -exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 -}; - -/** - * Expose some basic cursor interactions - * that are common among reporters. - */ - -exports.cursor = { - hide: function(){ - process.stdout.write('\033[?25l'); - }, - - show: function(){ - process.stdout.write('\033[?25h'); - } -}; - -/** - * A test is considered slow if it - * exceeds the following value in milliseconds. - */ - -exports.slow = 75; - -/** - * Outut the given `failures` as a list. - * - * @param {Array} failures - * @api public - */ - -exports.list = function(failures){ - console.error(); - failures.forEach(function(test, i){ - // format - var fmt = color('error title', ' %s) %s: ') - + color('error message', '%s') - + color('error stack', '\n%s\n'); - - // msg - var stack = test.err.stack - , index = stack.indexOf('at') - , msg = stack.slice(0, index); - - // indent stack trace without msg - stack = stack.slice(index) - .replace(/^/gm, ' '); - - console.error(fmt, i, test.fullTitle(), msg, stack); - }); -}; - -/** - * Initialize a new `Base` reporter. - * - * All other reporters generally - * inherit from this reporter, providing - * stats such as test duration, number - * of tests passed / failed etc. - * - * @param {Runner} runner - * @api public - */ - -function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, failures: 0 } - , failures = this.failures = []; - - if (!runner) return; - - runner.on('start', function(){ - stats.start = new Date; - }); - - runner.on('suite', function(suite){ - stats.suites = stats.suites || 0; - stats.suites++; - }); - - runner.on('test end', function(test){ - stats.tests = stats.tests || 0; - stats.tests++; - }); - - runner.on('pass', function(test){ - stats.passes = stats.passes || 0; - - var medium = exports.slow / 2; - test.speed = test.duration > exports.slow - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; - - stats.passes++; - }); - - runner.on('fail', function(test, err){ - stats.failures = stats.failures || 0; - stats.failures++; - test.err = err; - failures.push(test); - }); - - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; - }); -} - -/** - * Output common epilogue used by many of - * the bundled reporters. - * - * @api public - */ - -Base.prototype.epilogue = function(){ - var stats = this.stats; - - console.log(); - - // failure - if (stats.failures) { - console.error( - ' \033[91m✖\033[31m %d of %d tests failed\033[90m:\033[0m' - , stats.failures, stats.tests); - Base.list(this.failures); - console.error(); - process.nextTick(function(){ - process.exit(stats.failures); - }); - return; - } - - // pass - console.log( - ' \033[92m✔\033[32m %d tests completed\033[90m (%dms)\033[0m' - , stats.tests || 0 - , stats.duration); - - console.log(); - process.nextTick(function(){ - process.exit(0); - }); -}; diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js deleted file mode 100644 index a65c5b2e58..0000000000 --- a/lib/reporters/doc.js +++ /dev/null @@ -1,77 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = Doc; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Doc(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; - - function indent() { - return Array(indents).join(' '); - } - - runner.on('suite', function(suite){ - if (suite.root) return; - ++indents; - console.log('%s
    ', indent()); - ++indents; - console.log('%s

    %s

    ', indent(), suite.title); - console.log('%s
    ', indent()); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - console.log('%s
    ', indent()); - --indents; - console.log('%s
    ', indent()); - --indents; - }); - - runner.on('pass', function(test){ - console.log('%s
    %s
    ', indent(), test.title); - var code = clean(test.fn.toString()); - console.log('%s
    %s
    ', indent(), code); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -function clean(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str.replace(re, ''); - - return str; -} \ No newline at end of file diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js deleted file mode 100644 index f1adb38c4c..0000000000 --- a/lib/reporters/dot.js +++ /dev/null @@ -1,62 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = Dot; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Dot(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , n = 0; - - runner.on('start', function(){ - process.stdout.write('\n '); - }); - - runner.on('pending', function(test){ - process.stdout.write(color('pending', '.')); - }); - - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { - process.stdout.write('\033[93m.\033[0m'); - } else { - process.stdout.write(color(test.speed, '.')); - } - }); - - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); - process.stdout.write(color('fail', '.')); - }); - - runner.on('end', function(){ - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Dot.prototype.__proto__ = Base.prototype; \ No newline at end of file diff --git a/lib/reporters/html.js b/lib/reporters/html.js deleted file mode 100644 index 75a321103c..0000000000 --- a/lib/reporters/html.js +++ /dev/null @@ -1,115 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = HTML; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTML(runner) { - Base.call(this, runner); - - // TODO: clean up - - var self = this - , stats = this.stats - , total = runner.total - , root = document.getElementById('mocha') - , stack = [root] - , stat = document.createElement('div'); - - stat.innerHTML = '
      ' - + '
    • passes: 0
    • ' - + '
    • failures: 0
    • ' - + '
    '; - - if (!root) error('#mocha div missing, add it to your document'); - - document.body.appendChild(root); - document.body.appendChild(stat); - - runner.on('suite', function(suite){ - if (suite.root) return; - - // suite - var el = document.createElement('div'); - el.setAttribute('class', 'suite'); - - // title - var title = document.createElement('h1'); - title.textContent = suite.title; - el.appendChild(title); - - // container - stack[0].appendChild(el); - stack.unshift(document.createElement('div')); - el.appendChild(stack[0]); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - stack.shift(); - }); - - runner.on('test end', function(test){ - console.log(stats); - // test - var el = document.createElement('div'); - el.setAttribute('class', 'test ' + (test.passed ? 'pass' : 'fail')); - - // title - var title = document.createElement('h2'); - title.textContent = test.title; - el.appendChild(title); - - // code - var pre = document.createElement('pre'); - var code = document.createElement('code'); - pre.appendChild(code); - code.textContent = clean(test.fn.toString()); - el.appendChild(pre); - - stack[0].appendChild(el); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} - -function error(msg) { - // TODO: nicer - throw new Error(msg); -} - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -function clean(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str - .replace(re, '') - .replace(/^\s+/, ''); - - return str; -} \ No newline at end of file diff --git a/lib/reporters/index.js b/lib/reporters/index.js deleted file mode 100644 index 2120c2809b..0000000000 --- a/lib/reporters/index.js +++ /dev/null @@ -1,11 +0,0 @@ - -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONStream = require('./json-stream'); diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js deleted file mode 100644 index f69567912b..0000000000 --- a/lib/reporters/json-stream.js +++ /dev/null @@ -1,63 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total; - - runner.on('start', function(){ - console.log(JSON.stringify(['start', { total: total }])); - }); - - runner.on('pass', function(test){ - console.log(JSON.stringify(['pass', clean(test)])); - }); - - runner.on('fail', function(test, err){ - console.log(JSON.stringify(['fail', clean(test)])); - }); - - runner.on('end', function(){ - process.stdout.write(JSON.stringify(['end', self.stats]), function(){ - process.exit(0); - }); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} \ No newline at end of file diff --git a/lib/reporters/json.js b/lib/reporters/json.js deleted file mode 100644 index d6edce989b..0000000000 --- a/lib/reporters/json.js +++ /dev/null @@ -1,72 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `JSON`. - */ - -exports = module.exports = JSONReporter; - -/** - * Initialize a new `JSON` reporter. - * - * @param {Runner} runner - * @api public - */ - -function JSONReporter(runner) { - var self = this; - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var obj = { - stats: self.stats - , tests: tests.map(clean) - , failures: failures.map(clean) - , passes: passes.map(clean) - }; - - process.stdout.write(JSON.stringify(obj), function(){ - process.exit(0); - }); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} \ No newline at end of file diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js deleted file mode 100644 index ceab6d8d71..0000000000 --- a/lib/reporters/landing.js +++ /dev/null @@ -1,97 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Landing`. - */ - -exports = module.exports = Landing; - -/** - * Airplane color. - */ - -Base.colors.plane = 0; - -/** - * Airplane crash color. - */ - -Base.colors['plane crash'] = 31; - -/** - * Runway color. - */ - -Base.colors.runway = 90; - -/** - * Initialize a new `Landing` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Landing(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; - - function runway() { - var buf = Array(width).join('-'); - return ' ' + color('runway', buf); - } - - runner.on('start', function(){ - stream.write('\n '); - cursor.hide(); - }); - - runner.on('test end', function(test){ - // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; - - // show the crash - if (test.failed) { - plane = color('plane crash', '✈'); - crashed = col; - } - - // render landing strip - stream.write('\033[4F\n\n'); - stream.write(runway()); - stream.write('\n '); - stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) - stream.write(color('runway', Array(width - col).join('⋅') + '\n')); - stream.write(runway()); - stream.write('\033[0m'); - }); - - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Landing.prototype.__proto__ = Base.prototype; \ No newline at end of file diff --git a/lib/reporters/list.js b/lib/reporters/list.js deleted file mode 100644 index 60acc4fd34..0000000000 --- a/lib/reporters/list.js +++ /dev/null @@ -1,61 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , n = 0; - - runner.on('start', function(){ - console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = color('checkmark', ' -') - + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); - }); - - runner.on('pass', function(test){ - var fmt = color('checkmark', ' ✓') - + color('pass', ' %s: ') - + color(test.speed, '%dms'); - console.log('\r' + fmt, test.fullTitle(), test.duration); - }); - - runner.on('fail', function(test, err){ - console.log('\r' + color('fail', ' %d) %s'), n++, test.fullTitle()); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -List.prototype.__proto__ = Base.prototype; \ No newline at end of file diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js deleted file mode 100644 index 423c98255b..0000000000 --- a/lib/reporters/progress.js +++ /dev/null @@ -1,84 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Progress`. - */ - -exports = module.exports = Progress; - -/** - * General progress bar color. - */ - -Base.colors.progress = 90; - -/** - * Initialize a new `Progress` bar test reporter. - * - * @param {Runner} runner - * @param {Object} options - * @api public - */ - -function Progress(runner, options) { - Base.call(this, runner); - - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max; - - // default chars - options.open = options.open || '['; - options.complete = options.complete || '▬'; - options.incomplete = options.incomplete || '⋅'; - options.close = options.close || ']'; - options.verbose = false; - - // tests started - runner.on('start', function(){ - console.log(); - cursor.hide(); - }); - - // tests complete - runner.on('test end', function(){ - var incomplete = total - complete - , percent = complete++ / total - , n = width * percent | 0 - , i = width - n; - - process.stdout.write('\r\033[J'); - process.stdout.write(color('progress', ' ' + options.open)); - process.stdout.write(Array(n).join(options.complete)); - process.stdout.write(Array(i).join(options.incomplete)); - process.stdout.write(color('progress', options.close)); - if (options.verbose) { - process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); - } - }); - - // tests are complete, output some stats - // and the failures if any - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Progress.prototype.__proto__ = Base.prototype; \ No newline at end of file diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js deleted file mode 100644 index 8efc3936a9..0000000000 --- a/lib/reporters/spec.js +++ /dev/null @@ -1,83 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Spec`. - */ - -exports = module.exports = Spec; - -/** - * Initialize a new `Spec` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Spec(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , indents = 0 - , n = 0; - - function indent() { - return Array(indents).join(' ') - } - - runner.on('start', function(){ - console.log(); - }); - - runner.on('suite', function(suite){ - ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); - }); - - runner.on('suite end', function(suite){ - --indents; - if (1 == indents) console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(indent() + color('pass', test.title + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); - }); - - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s '); - console.log('\r' + fmt, test.title); - } else { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); - console.log('\r' + fmt, test.title, test.duration); - } - }); - - runner.on('fail', function(test, err){ - console.log('\r' + indent() + color('fail', ' %d) %s'), n++, test.title); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Spec.prototype.__proto__ = Base.prototype; \ No newline at end of file diff --git a/lib/reporters/tap.js b/lib/reporters/tap.js deleted file mode 100644 index ef58497234..0000000000 --- a/lib/reporters/tap.js +++ /dev/null @@ -1,50 +0,0 @@ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `TAP`. - */ - -exports = module.exports = TAP; - -/** - * Initialize a new `TAP` reporter. - * - * @param {Runner} runner - * @api public - */ - -function TAP(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , n = 1; - - runner.on('start', function(){ - console.log(' %d..%d', 1, total); - }); - - runner.on('test end', function(){ - ++n; - }); - - runner.on('pass', function(test){ - console.log(' ok %d %s', n, test.fullTitle()); - }); - - runner.on('fail', function(test){ - console.log(' not ok %d %s', n, test.fullTitle()); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} \ No newline at end of file diff --git a/lib/runner.js b/lib/runner.js deleted file mode 100644 index 5c919e6c6b..0000000000 --- a/lib/runner.js +++ /dev/null @@ -1,302 +0,0 @@ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , Test = require('./test') - , noop = function(){}; - -/** - * Expose `Runner`. - */ - -module.exports = Runner; - -/** - * Initialize a `Runner` for the given `suite`. - * - * Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - * @api public - */ - -function Runner(suite) { - this.suite = suite; - this.total = suite.total(); - this.globals = Object.keys(global).concat(['errno']); - this.on('test end', this.checkGlobals.bind(this)); - this.grep(/.*/); -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runner.prototype.__proto__ = EventEmitter.prototype; - -/** - * Run tests with full titles matching `re`. - * - * @param {RegExp} re - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.grep = function(re){ - this._grep = re; - return this; -}; - -/** - * Check for global variable leaks. - * - * @api private - */ - -Runner.prototype.checkGlobals = function(test){ - var leaks = Object.keys(global).filter(function(key){ - return !~this.globals.indexOf(key); - }, this); - - this.globals = this.globals.concat(leaks); - - if (leaks.length > 1) { - this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); - } else if (leaks.length) { - this.fail(test, new Error('global leak detected: ' + leaks[0])); - } -}; - -/** - * Fail the given `test`. - * - * @param {Test} test - * @param {Error} err - * @api private - */ - -Runner.prototype.fail = function(test, err){ - test.failed = true; - this.emit('fail', test, err); -}; - -/** - * Fail the given `hook` name. - * - * @param {String} hook - * @param {Error} err - * @api private - */ - -Runner.prototype.failHook = function(hook, err){ - var test = new Test(hook + ' hook', noop); - test.parent = this.suite; - this.fail(test, err); - this.emit('end'); - process.exit(0); -}; - -/** - * Run hook `name` callbacks and then invoke `fn(err)`. - * - * @param {String} name - * @param {Function} function - * @api private - */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , test = this.test - , callbacks = suite[name + 'Callbacks'] - , pending = callbacks.length; - - function next(i) { - var callback = callbacks[i] - if (!callback) return fn(); - - // async - if (1 == callback.length) { - // async - try { - callback(function(err){ - if (err) return fn(err); - next(++i); - }); - } catch (err) { - fn(err); - } - return; - } - - // serial - try { - callback(); - process.nextTick(function(){ - next(++i); - }); - } catch (err) { - fn(err); - } - } - - process.nextTick(function(){ - next(0); - }); -}; - -/** - * Run the current test and callback `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - // run the test - try { - // async - if (test.async) return test.run(function(err){ - if (test.finished) { - self.fail(test, new Error('done() called multiple times')); - return; - } - fn(err); - }); - // sync - process.nextTick(function(){ - test.run(); - fn(); - }); - } catch (err) { - fn(err); - } -}; - -/** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests - , test; - - function next(err) { - // error handling - if (err) self.fail(test, err); - - // next test - test = tests.shift(); - - // all done - if (!test) return fn(); - - // grep - if (!self._grep.test(test.fullTitle())) return next(); - - // pending - if (test.pending) { - self.emit('pending', test); - self.emit('test end', test); - return next(); - } - - // execute test and hook(s) - self.emit('test', self.test = test); - self.hook('beforeEach', function(err){ - if (err) return self.failHook('beforeEach', err); - self.runTest(function(err){ - if (err) return next(err); - self.emit('pass', test); - test.passed = true; - self.emit('test end', test); - if (err) return self.failHook('beforeEach', err); - self.hook('afterEach', function(err){ - if (err) return self.failHook('afterEach', err); - next(); - }); - }); - }); - } - - next(); -}; - -/** - * Run the given `suite` and invoke the - * callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runSuite = function(suite, fn){ - var self = this - , i = 0; - - this.emit('suite', this.suite = suite); - - function next() { - var curr = suite.suites[i++]; - if (!curr) return done(); - self.runSuite(curr, next); - } - - function done() { - self.suite = suite; - self.hook('afterAll', function(err){ - if (err) return self.failHook('afterAll', err); - self.emit('suite end', suite); - fn(); - }); - } - - this.hook('beforeAll', function(err){ - // TODO: use interface names - if (err) return self.failHook('beforeAll', err); - self.runTests(suite, next); - }); -}; - -/** - * Run the root suite. - * - * @api public - */ - -Runner.prototype.run = function(){ - var self = this; - - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - self.emit('end'); - }); - - // uncaught exception - process.on('uncaughtException', function(err){ - self.fail(self.test, err); - self.emit('end'); - }); - - return this; -}; diff --git a/lib/suite.js b/lib/suite.js deleted file mode 100644 index 719beec21b..0000000000 --- a/lib/suite.js +++ /dev/null @@ -1,194 +0,0 @@ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; - -/** - * Expose `Suite`. - */ - -exports = module.exports = Suite; - -/** - * Suite map. - */ - -var map = {}; - -/** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. - * - * @param {Suite} parent - * @param {String} title - * @return {Suite} - * @api public - */ - -exports.create = function(parent, title){ - var suite = new Suite(title); - suite.parent = parent; - title = suite.fullTitle(); - if (map[title]) return map[title]; - parent.addSuite(suite); - return map[title] = suite; -}; - -/** - * Initialize a new `Suite` with the given `title`. - * - * @param {String} title - * @api private - */ - -function Suite(title) { - this.title = title; - this.suites = []; - this.tests = []; - this.beforeAllCallbacks = []; - this.beforeEachCallbacks = []; - this.afterAllCallbacks = []; - this.afterEachCallbacks = []; - this.root = !title; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Suite.prototype.__proto__ = EventEmitter.prototype; - -/** - * Set timeout `ms`. - * - * @param {Number} ms - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.timeout = function(ms){ - this._timeout = ms; - return this; -}; - -/** - * Run `fn(test[, done])` before running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeAll = function(fn){ - this.beforeAllCallbacks.push(fn); - this.emit('beforeAll', fn); - return this; -}; - -/** - * Run `fn(test[, done])` after running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterAll = function(fn){ - this.afterAllCallbacks.push(fn); - this.emit('afterAll', fn); - return this; -}; - -/** - * Run `fn(test[, done])` before each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeEach = function(fn){ - this.beforeEachCallbacks.push(fn); - this.emit('beforeEach', fn); - return this; -}; - -/** - * Run `fn(test[, done])` after each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterEach = function(fn){ - this.afterEachCallbacks.push(fn); - this.emit('afterEach', fn); - return this; -}; - -/** - * Add a test `suite`. - * - * @param {Suite} suite - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addSuite = function(suite){ - suite.parent = this; - if (this._timeout) suite.timeout(this._timeout); - this.suites.push(suite); - this.emit('suite', suite); - return this; -}; - -/** - * Add a `test` to this suite. - * - * @param {Test} test - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addTest = function(test){ - test.parent = this; - if (this._timeout) test.timeout(this._timeout); - this.tests.push(test); - this.emit('test', test); - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Suite.prototype.fullTitle = function(){ - if (this.parent) { - var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; - } - return this.title; -}; - -/** - * Return the total number of tests. - * - * @return {Number} - * @api public - */ - -Suite.prototype.total = function(){ - return this.suites.reduce(function(sum, suite){ - return sum + suite.total(); - }, 0) + this.tests.length; -}; diff --git a/lib/test.js b/lib/test.js deleted file mode 100644 index 41301996d6..0000000000 --- a/lib/test.js +++ /dev/null @@ -1,83 +0,0 @@ - -/** - * Expose `Test`. - */ - -module.exports = Test; - -/** - * Initialize a new `Test` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Test(title, fn) { - this.title = title; - this.fn = fn; - this.pending = !fn; - this.async = fn && fn.length; - this.sync = ! this.async; - this.timeout(2000); -} - -/** - * Set timeout `ms`. - * - * @param {Number} ms - * @return {Test} for chaining - * @api private - */ - -Test.prototype.timeout = function(ms){ - this._timeout = ms; - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Test.prototype.fullTitle = function(){ - return this.parent.fullTitle() + ' ' + this.title; -}; - -/** - * Run the test and invoke `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Test.prototype.run = function(fn){ - var timer - , self = this - , ms = this._timeout - , start = new Date; - - // timeout - if (this.async) { - timer = setTimeout(function(){ - fn(new Error('timeout of ' + ms + 'ms exceeded')); - }, ms); - } - - // async - if (this.async) { - this.fn(function(err){ - clearTimeout(timer); - self.duration = new Date - start; - fn(err); - self.finished = true; - }); - // sync - } else { - if (!this.pending) this.fn(); - this.duration = new Date - start; - } -}; diff --git a/mocha.js b/mocha.js deleted file mode 100644 index 7ce59dc4dc..0000000000 --- a/mocha.js +++ /dev/null @@ -1,2043 +0,0 @@ - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p[0]) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("browser/events.js", function(module, exports, require){ - -/** - * Expose `EventEmitter`. - */ - -exports.EventEmitter = EventEmitter; - -/** - * Slice reference. - */ - -var slice = [].slice; - -/** - * EventEmitter. - */ - -function EventEmitter() { - this.callbacks = {}; -}; - -/** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - */ - -EventEmitter.prototype.on = function(event, fn){ - (this.callbacks[event] = this.callbacks[event] || []) - .push(fn); - return this; -}; - -/** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - */ - -EventEmitter.prototype.emit = function(event){ - var args = slice.call(arguments, 1) - , callbacks = this.callbacks[event]; - - if (callbacks) { - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args) - } - } - - return this; -}; - -}); // module: browser/events.js - -require.register("browser/tty.js", function(module, exports, require){ - -exports.isatty = function(){ - return true; -}; - -exports.getWindowSize = function(){ - return [window.innerHeight, window.innerWidth]; -}; -}); // module: browser/tty.js - -require.register("interfaces/bdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * BDD-style interface: - * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * - * }); - * - * it('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.describe = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/bdd.js - -require.register("interfaces/exports.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * exports.Array = { - * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ - * - * }, - * - * 'should return the correct index when the value is present': function(){ - * - * } - * } - * }; - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('require', visit); - - function visit(obj) { - var suite; - for (var key in obj) { - if ('function' == typeof obj[key]) { - var fn = obj[key]; - switch (key) { - case 'before': - suites[0].beforeAll(fn); - break; - case 'after': - suites[0].afterAll(fn); - break; - case 'beforeEach': - suites[0].beforeEach(fn); - break; - case 'afterEach': - suites[0].afterEach(fn); - break; - default: - suites[0].addTest(new Test(key, fn)); - } - } else { - var suite = Suite.create(suites[0], key); - suites.unshift(suite); - visit(obj[key]); - suites.shift(); - } - } - } -}; -}); // module: interfaces/exports.js - -require.register("interfaces/index.js", function(module, exports, require){ - -exports.bdd = require('./bdd'); -exports.tdd = require('./tdd'); -exports.exports = require('./exports'); -}); // module: interfaces/index.js - -require.register("interfaces/tdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * test('should return -1 when not present', function(){ - * - * }); - * - * test('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before each test case. - */ - - context.setup = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute before each test case. - */ - - context.tearDown = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.suite = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/tdd.js - -require.register("mocha.js", function(module, exports, require){ - -/*! - * mocha - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Library version. - */ - -exports.version = '0.0.1-alpha5'; - -exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); -exports.Runner = require('./runner'); -exports.Suite = require('./suite'); -exports.Test = require('./test'); -}); // module: mocha.js - -require.register("reporters/base.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var tty = require('browser/tty'); - -/** - * Check if both stdio streams are associated with a tty. - */ - -var isatty = tty.isatty(1) && tty.isatty(2); - -/** - * Expose `Base`. - */ - -exports = module.exports = Base; - -/** - * Enable coloring by default. - */ - -exports.useColors = isatty; - -/** - * Default color map. - */ - -exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'pending': 36 - , 'suite': '40' - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 -}; - -/** - * Color `str` with the given `type`, - * allowing colors to be disabled, - * as well as user-defined color - * schemes. - * - * @param {String} type - * @param {String} str - * @return {String} - * @api private - */ - -var color = exports.color = function(type, str) { - if (!exports.useColors) return str; - return '\033[' + exports.colors[type] + 'm' + str + '\033[0m'; -}; - -/** - * Expose term window size, with some - * defaults for when stderr is not a tty. - */ - -exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 -}; - -/** - * Expose some basic cursor interactions - * that are common among reporters. - */ - -exports.cursor = { - hide: function(){ - process.stdout.write('\033[?25l'); - }, - - show: function(){ - process.stdout.write('\033[?25h'); - } -}; - -/** - * A test is considered slow if it - * exceeds the following value in milliseconds. - */ - -exports.slow = 75; - -/** - * Outut the given `failures` as a list. - * - * @param {Array} failures - * @api public - */ - -exports.list = function(failures){ - console.error(); - failures.forEach(function(test, i){ - // format - var fmt = color('error title', ' %s) %s: ') - + color('error message', '%s') - + color('error stack', '\n%s\n'); - - // msg - var stack = test.err.stack - , index = stack.indexOf('at') - , msg = stack.slice(0, index); - - // indent stack trace without msg - stack = stack.slice(index) - .replace(/^/gm, ' '); - - console.error(fmt, i, test.fullTitle(), msg, stack); - }); -}; - -/** - * Initialize a new `Base` reporter. - * - * All other reporters generally - * inherit from this reporter, providing - * stats such as test duration, number - * of tests passed / failed etc. - * - * @param {Runner} runner - * @api public - */ - -function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, failures: 0 } - , failures = this.failures = []; - - if (!runner) return; - - runner.on('start', function(){ - stats.start = new Date; - }); - - runner.on('suite', function(suite){ - stats.suites = stats.suites || 0; - stats.suites++; - }); - - runner.on('test end', function(test){ - stats.tests = stats.tests || 0; - stats.tests++; - }); - - runner.on('pass', function(test){ - stats.passes = stats.passes || 0; - - var medium = exports.slow / 2; - test.speed = test.duration > exports.slow - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; - - stats.passes++; - }); - - runner.on('fail', function(test, err){ - stats.failures = stats.failures || 0; - stats.failures++; - test.err = err; - failures.push(test); - }); - - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; - }); -} - -/** - * Output common epilogue used by many of - * the bundled reporters. - * - * @api public - */ - -Base.prototype.epilogue = function(){ - var stats = this.stats; - - console.log(); - - // failure - if (stats.failures) { - console.error( - ' \033[91m✖\033[31m %d of %d tests failed\033[90m:\033[0m' - , stats.failures, stats.tests); - Base.list(this.failures); - console.error(); - process.nextTick(function(){ - process.exit(stats.failures); - }); - return; - } - - // pass - console.log( - ' \033[92m✔\033[32m %d tests completed\033[90m (%dms)\033[0m' - , stats.tests || 0 - , stats.duration); - - console.log(); - process.nextTick(function(){ - process.exit(0); - }); -}; - -}); // module: reporters/base.js - -require.register("reporters/doc.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = Doc; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Doc(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; - - function indent() { - return Array(indents).join(' '); - } - - runner.on('suite', function(suite){ - if (suite.root) return; - ++indents; - console.log('%s
    ', indent()); - ++indents; - console.log('%s

    %s

    ', indent(), suite.title); - console.log('%s
    ', indent()); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - console.log('%s
    ', indent()); - --indents; - console.log('%s
    ', indent()); - --indents; - }); - - runner.on('pass', function(test){ - console.log('%s
    %s
    ', indent(), test.title); - var code = clean(test.fn.toString()); - console.log('%s
    %s
    ', indent(), code); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -function clean(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str.replace(re, ''); - - return str; -} -}); // module: reporters/doc.js - -require.register("reporters/dot.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = Dot; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Dot(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , n = 0; - - runner.on('start', function(){ - process.stdout.write('\n '); - }); - - runner.on('pending', function(test){ - process.stdout.write(color('pending', '.')); - }); - - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { - process.stdout.write('\033[93m.\033[0m'); - } else { - process.stdout.write(color(test.speed, '.')); - } - }); - - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); - process.stdout.write(color('fail', '.')); - }); - - runner.on('end', function(){ - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Dot.prototype = new Base; -Dot.prototype.constructor = Dot; - -}); // module: reporters/dot.js - -require.register("reporters/html.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = HTML; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTML(runner) { - Base.call(this, runner); - - // TODO: clean up - - var self = this - , stats = this.stats - , total = runner.total - , root = document.getElementById('mocha') - , stack = [root] - , stat = document.createElement('div'); - - stat.innerHTML = '
      ' - + '
    • passes: 0
    • ' - + '
    • failures: 0
    • ' - + '
    '; - - if (!root) error('#mocha div missing, add it to your document'); - - document.body.appendChild(root); - document.body.appendChild(stat); - - runner.on('suite', function(suite){ - if (suite.root) return; - - // suite - var el = document.createElement('div'); - el.setAttribute('class', 'suite'); - - // title - var title = document.createElement('h1'); - title.textContent = suite.title; - el.appendChild(title); - - // container - stack[0].appendChild(el); - stack.unshift(document.createElement('div')); - el.appendChild(stack[0]); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - stack.shift(); - }); - - runner.on('test end', function(test){ - console.log(stats); - // test - var el = document.createElement('div'); - el.setAttribute('class', 'test ' + (test.passed ? 'pass' : 'fail')); - - // title - var title = document.createElement('h2'); - title.textContent = test.title; - el.appendChild(title); - - // code - var pre = document.createElement('pre'); - var code = document.createElement('code'); - pre.appendChild(code); - code.textContent = clean(test.fn.toString()); - el.appendChild(pre); - - stack[0].appendChild(el); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} - -function error(msg) { - // TODO: nicer - throw new Error(msg); -} - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -function clean(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str - .replace(re, '') - .replace(/^\s+/, ''); - - return str; -} -}); // module: reporters/html.js - -require.register("reporters/index.js", function(module, exports, require){ - -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONStream = require('./json-stream'); - -}); // module: reporters/index.js - -require.register("reporters/json-stream.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total; - - runner.on('start', function(){ - console.log(JSON.stringify(['start', { total: total }])); - }); - - runner.on('pass', function(test){ - console.log(JSON.stringify(['pass', clean(test)])); - }); - - runner.on('fail', function(test, err){ - console.log(JSON.stringify(['fail', clean(test)])); - }); - - runner.on('end', function(){ - process.stdout.write(JSON.stringify(['end', self.stats]), function(){ - process.exit(0); - }); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json-stream.js - -require.register("reporters/json.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `JSON`. - */ - -exports = module.exports = JSONReporter; - -/** - * Initialize a new `JSON` reporter. - * - * @param {Runner} runner - * @api public - */ - -function JSONReporter(runner) { - var self = this; - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var obj = { - stats: self.stats - , tests: tests.map(clean) - , failures: failures.map(clean) - , passes: passes.map(clean) - }; - - process.stdout.write(JSON.stringify(obj), function(){ - process.exit(0); - }); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json.js - -require.register("reporters/landing.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Landing`. - */ - -exports = module.exports = Landing; - -/** - * Airplane color. - */ - -Base.colors.plane = 0; - -/** - * Airplane crash color. - */ - -Base.colors['plane crash'] = 31; - -/** - * Runway color. - */ - -Base.colors.runway = 90; - -/** - * Initialize a new `Landing` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Landing(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; - - function runway() { - var buf = Array(width).join('-'); - return ' ' + color('runway', buf); - } - - runner.on('start', function(){ - stream.write('\n '); - cursor.hide(); - }); - - runner.on('test end', function(test){ - // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; - - // show the crash - if (test.failed) { - plane = color('plane crash', '✈'); - crashed = col; - } - - // render landing strip - stream.write('\033[4F\n\n'); - stream.write(runway()); - stream.write('\n '); - stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) - stream.write(color('runway', Array(width - col).join('⋅') + '\n')); - stream.write(runway()); - stream.write('\033[0m'); - }); - - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Landing.prototype = new Base; -Landing.prototype.constructor = Landing; - -}); // module: reporters/landing.js - -require.register("reporters/list.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , n = 0; - - runner.on('start', function(){ - console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = color('checkmark', ' -') - + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); - }); - - runner.on('pass', function(test){ - var fmt = color('checkmark', ' ✓') - + color('pass', ' %s: ') - + color(test.speed, '%dms'); - console.log('\r' + fmt, test.fullTitle(), test.duration); - }); - - runner.on('fail', function(test, err){ - console.log('\r' + color('fail', ' %d) %s'), n++, test.fullTitle()); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -List.prototype = new Base; -List.prototype.constructor = List; - -}); // module: reporters/list.js - -require.register("reporters/progress.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Progress`. - */ - -exports = module.exports = Progress; - -/** - * General progress bar color. - */ - -Base.colors.progress = 90; - -/** - * Initialize a new `Progress` bar test reporter. - * - * @param {Runner} runner - * @param {Object} options - * @api public - */ - -function Progress(runner, options) { - Base.call(this, runner); - - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max; - - // default chars - options.open = options.open || '['; - options.complete = options.complete || '▬'; - options.incomplete = options.incomplete || '⋅'; - options.close = options.close || ']'; - options.verbose = false; - - // tests started - runner.on('start', function(){ - console.log(); - cursor.hide(); - }); - - // tests complete - runner.on('test end', function(){ - var incomplete = total - complete - , percent = complete++ / total - , n = width * percent | 0 - , i = width - n; - - process.stdout.write('\r\033[J'); - process.stdout.write(color('progress', ' ' + options.open)); - process.stdout.write(Array(n).join(options.complete)); - process.stdout.write(Array(i).join(options.incomplete)); - process.stdout.write(color('progress', options.close)); - if (options.verbose) { - process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); - } - }); - - // tests are complete, output some stats - // and the failures if any - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Progress.prototype = new Base; -Progress.prototype.constructor = Progress; - -}); // module: reporters/progress.js - -require.register("reporters/spec.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Spec`. - */ - -exports = module.exports = Spec; - -/** - * Initialize a new `Spec` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Spec(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , indents = 0 - , n = 0; - - function indent() { - return Array(indents).join(' ') - } - - runner.on('start', function(){ - console.log(); - }); - - runner.on('suite', function(suite){ - ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); - }); - - runner.on('suite end', function(suite){ - --indents; - if (1 == indents) console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(indent() + color('pass', test.title + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); - }); - - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s '); - console.log('\r' + fmt, test.title); - } else { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); - console.log('\r' + fmt, test.title, test.duration); - } - }); - - runner.on('fail', function(test, err){ - console.log('\r' + indent() + color('fail', ' %d) %s'), n++, test.title); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Spec.prototype = new Base; -Spec.prototype.constructor = Spec; - -}); // module: reporters/spec.js - -require.register("reporters/tap.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `TAP`. - */ - -exports = module.exports = TAP; - -/** - * Initialize a new `TAP` reporter. - * - * @param {Runner} runner - * @api public - */ - -function TAP(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , n = 1; - - runner.on('start', function(){ - console.log(' %d..%d', 1, total); - }); - - runner.on('test end', function(){ - ++n; - }); - - runner.on('pass', function(test){ - console.log(' ok %d %s', n, test.fullTitle()); - }); - - runner.on('fail', function(test){ - console.log(' not ok %d %s', n, test.fullTitle()); - }); - - runner.on('end', function(){ - process.exit(stats.failures); - }); -} -}); // module: reporters/tap.js - -require.register("runner.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , Test = require('./test') - , noop = function(){}; - -/** - * Expose `Runner`. - */ - -module.exports = Runner; - -/** - * Initialize a `Runner` for the given `suite`. - * - * Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - * @api public - */ - -function Runner(suite) { - this.suite = suite; - this.total = suite.total(); - this.globals = Object.keys(global).concat(['errno']); - this.on('test end', this.checkGlobals.bind(this)); - this.grep(/.*/); -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runner.prototype = new EventEmitter; -Runner.prototype.constructor = Runner; - - -/** - * Run tests with full titles matching `re`. - * - * @param {RegExp} re - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.grep = function(re){ - this._grep = re; - return this; -}; - -/** - * Check for global variable leaks. - * - * @api private - */ - -Runner.prototype.checkGlobals = function(test){ - var leaks = Object.keys(global).filter(function(key){ - return !~this.globals.indexOf(key); - }, this); - - this.globals = this.globals.concat(leaks); - - if (leaks.length > 1) { - this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); - } else if (leaks.length) { - this.fail(test, new Error('global leak detected: ' + leaks[0])); - } -}; - -/** - * Fail the given `test`. - * - * @param {Test} test - * @param {Error} err - * @api private - */ - -Runner.prototype.fail = function(test, err){ - test.failed = true; - this.emit('fail', test, err); -}; - -/** - * Fail the given `hook` name. - * - * @param {String} hook - * @param {Error} err - * @api private - */ - -Runner.prototype.failHook = function(hook, err){ - var test = new Test(hook + ' hook', noop); - test.parent = this.suite; - this.fail(test, err); - this.emit('end'); - process.exit(0); -}; - -/** - * Run hook `name` callbacks and then invoke `fn(err)`. - * - * @param {String} name - * @param {Function} function - * @api private - */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , test = this.test - , callbacks = suite[name + 'Callbacks'] - , pending = callbacks.length; - - function next(i) { - var callback = callbacks[i] - if (!callback) return fn(); - - // async - if (1 == callback.length) { - // async - try { - callback(function(err){ - if (err) return fn(err); - next(++i); - }); - } catch (err) { - fn(err); - } - return; - } - - // serial - try { - callback(); - process.nextTick(function(){ - next(++i); - }); - } catch (err) { - fn(err); - } - } - - process.nextTick(function(){ - next(0); - }); -}; - -/** - * Run the current test and callback `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - // run the test - try { - // async - if (test.async) return test.run(function(err){ - if (test.finished) { - self.fail(test, new Error('done() called multiple times')); - return; - } - fn(err); - }); - // sync - process.nextTick(function(){ - test.run(); - fn(); - }); - } catch (err) { - fn(err); - } -}; - -/** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests - , test; - - function next(err) { - // error handling - if (err) self.fail(test, err); - - // next test - test = tests.shift(); - - // all done - if (!test) return fn(); - - // grep - if (!self._grep.test(test.fullTitle())) return next(); - - // pending - if (test.pending) { - self.emit('pending', test); - self.emit('test end', test); - return next(); - } - - // execute test and hook(s) - self.emit('test', self.test = test); - self.hook('beforeEach', function(err){ - if (err) return self.failHook('beforeEach', err); - self.runTest(function(err){ - if (err) return next(err); - self.emit('pass', test); - test.passed = true; - self.emit('test end', test); - if (err) return self.failHook('beforeEach', err); - self.hook('afterEach', function(err){ - if (err) return self.failHook('afterEach', err); - next(); - }); - }); - }); - } - - next(); -}; - -/** - * Run the given `suite` and invoke the - * callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runSuite = function(suite, fn){ - var self = this - , i = 0; - - this.emit('suite', this.suite = suite); - - function next() { - var curr = suite.suites[i++]; - if (!curr) return done(); - self.runSuite(curr, next); - } - - function done() { - self.suite = suite; - self.hook('afterAll', function(err){ - if (err) return self.failHook('afterAll', err); - self.emit('suite end', suite); - fn(); - }); - } - - this.hook('beforeAll', function(err){ - // TODO: use interface names - if (err) return self.failHook('beforeAll', err); - self.runTests(suite, next); - }); -}; - -/** - * Run the root suite. - * - * @api public - */ - -Runner.prototype.run = function(){ - var self = this; - - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - self.emit('end'); - }); - - // uncaught exception - process.on('uncaughtException', function(err){ - self.fail(self.test, err); - self.emit('end'); - }); - - return this; -}; - -}); // module: runner.js - -require.register("suite.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter; - -/** - * Expose `Suite`. - */ - -exports = module.exports = Suite; - -/** - * Suite map. - */ - -var map = {}; - -/** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. - * - * @param {Suite} parent - * @param {String} title - * @return {Suite} - * @api public - */ - -exports.create = function(parent, title){ - var suite = new Suite(title); - suite.parent = parent; - title = suite.fullTitle(); - if (map[title]) return map[title]; - parent.addSuite(suite); - return map[title] = suite; -}; - -/** - * Initialize a new `Suite` with the given `title`. - * - * @param {String} title - * @api private - */ - -function Suite(title) { - this.title = title; - this.suites = []; - this.tests = []; - this.beforeAllCallbacks = []; - this.beforeEachCallbacks = []; - this.afterAllCallbacks = []; - this.afterEachCallbacks = []; - this.root = !title; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Suite.prototype = new EventEmitter; -Suite.prototype.constructor = Suite; - - -/** - * Set timeout `ms`. - * - * @param {Number} ms - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.timeout = function(ms){ - this._timeout = ms; - return this; -}; - -/** - * Run `fn(test[, done])` before running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeAll = function(fn){ - this.beforeAllCallbacks.push(fn); - this.emit('beforeAll', fn); - return this; -}; - -/** - * Run `fn(test[, done])` after running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterAll = function(fn){ - this.afterAllCallbacks.push(fn); - this.emit('afterAll', fn); - return this; -}; - -/** - * Run `fn(test[, done])` before each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeEach = function(fn){ - this.beforeEachCallbacks.push(fn); - this.emit('beforeEach', fn); - return this; -}; - -/** - * Run `fn(test[, done])` after each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterEach = function(fn){ - this.afterEachCallbacks.push(fn); - this.emit('afterEach', fn); - return this; -}; - -/** - * Add a test `suite`. - * - * @param {Suite} suite - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addSuite = function(suite){ - suite.parent = this; - if (this._timeout) suite.timeout(this._timeout); - this.suites.push(suite); - this.emit('suite', suite); - return this; -}; - -/** - * Add a `test` to this suite. - * - * @param {Test} test - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addTest = function(test){ - test.parent = this; - if (this._timeout) test.timeout(this._timeout); - this.tests.push(test); - this.emit('test', test); - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Suite.prototype.fullTitle = function(){ - if (this.parent) { - var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; - } - return this.title; -}; - -/** - * Return the total number of tests. - * - * @return {Number} - * @api public - */ - -Suite.prototype.total = function(){ - return this.suites.reduce(function(sum, suite){ - return sum + suite.total(); - }, 0) + this.tests.length; -}; - -}); // module: suite.js - -require.register("test.js", function(module, exports, require){ - -/** - * Expose `Test`. - */ - -module.exports = Test; - -/** - * Initialize a new `Test` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Test(title, fn) { - this.title = title; - this.fn = fn; - this.pending = !fn; - this.async = fn && fn.length; - this.sync = ! this.async; - this.timeout(2000); -} - -/** - * Set timeout `ms`. - * - * @param {Number} ms - * @return {Test} for chaining - * @api private - */ - -Test.prototype.timeout = function(ms){ - this._timeout = ms; - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Test.prototype.fullTitle = function(){ - return this.parent.fullTitle() + ' ' + this.title; -}; - -/** - * Run the test and invoke `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Test.prototype.run = function(fn){ - var timer - , self = this - , ms = this._timeout - , start = new Date; - - // timeout - if (this.async) { - timer = setTimeout(function(){ - fn(new Error('timeout of ' + ms + 'ms exceeded')); - }, ms); - } - - // async - if (this.async) { - this.fn(function(err){ - clearTimeout(timer); - self.duration = new Date - start; - fn(err); - self.finished = true; - }); - // sync - } else { - if (!this.pending) this.fn(); - this.duration = new Date - start; - } -}; - -}); // module: test.js - -/** - * Node shims. - * - * These are meant only to allow - * mocha.js to run untouched, not - * to allow running node code on - * the server. - */ - -process = {}; - -process.nextTick = function(fn){ setTimeout(fn, 0); }; -process.on = function(){}; -process.exit = function(status){}; -process.stdout = {}; - -global = this; - -// boot - -;(function(){ - var mocha = require('mocha'); - var suite = new mocha.Suite; - var Reporter = mocha.reporters.HTML; - mocha.interfaces.bdd(suite); - suite.emit('pre-require', global); - - global.onload = run; // TODO: remove - - function run() { - suite.emit('run'); - var runner = new mocha.Runner(suite); - var reporter = new Reporter(runner); - runner.run(); - } -})(); \ No newline at end of file diff --git a/package.json b/package.json deleted file mode 100644 index 21cdbfba8a..0000000000 --- a/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "mocha" - , "version": "0.0.1-alpha5" - , "description": "Test framework inspired by JSpec, Expresso, & Qunit" - , "keywords": ["test", "bdd", "tdd", "tap"] - , "bin": { "mocha": "./bin/mocha" } - , "author": "TJ Holowaychuk " - , "main": "index" - , "bin": { - "mocha": "./bin/mocha" - , "mocha-debug": "./bin/mocha-debug" - } - , "engines": { "node": ">= 0.4.x < 0.7.0" } - , "dependencies":{ - "commander": "0.3.2" - } - , "devDependencies": { - "should": "0.3.x" - } -} diff --git a/style.css b/style.css new file mode 100644 index 0000000000..1f84713615 --- /dev/null +++ b/style.css @@ -0,0 +1,123 @@ + +body { + font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 0; + padding: 140px 110px; + color: #2C2C2C; + border-top: 2px solid #ddd; +} + +h1 { + position: relative; + font-style: normal; + font-weight: 100; + text-transform: lowercase; + background: #8A6343; + color: white; + display: inline-block; + padding: 48px 30px; + opacity: 0; + -webkit-border-radius: 100px; + -webkit-transition: opacity 1s, background-color 200ms; +} + +h1:hover { + background: #A07A5C; +} + +h1 a { + color: inherit; + font-weight: inherit; +} + +h1 a:hover { + text-decoration: none; +} + +.onload h1 { + opacity: 1; +} + +h2 { + margin-top: 40px; + font-weight: 100; + letter-spacing: 1px; + border-bottom: 1px solid #eee; +} + +#tag { + opacity: 0; + color: #C29D7F; + font-weight: 100; + font-size: 30px; + margin-top: -110px; + margin-left: 140px; + margin-bottom: 100px; + letter-spacing: 2px; + -webkit-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; +} + +#tag em { + font-style: normal +} + +.onload #tag { + opacity: 1; + margin-left: 170px; +} + +a { + color: #8A6343; + font-weight: bold; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +ul { + width: 100%; +} + +ul li { + float: left; + width: 40%; + margin-right: 60px; +} + +ul::after { + content: '.'; + height: 0; + display: block; + visibility: hidden; + clear: both; +} + +code { + font: 12px monaco, monospace; +} + +pre { + padding: 30px; + border: 1px solid #eee; + border-bottom-color: #ddd; + -webkit-border-radius: 2px; + -webkit-box-shadow: inset 0 0 10px #eee; +} + +@media all and (max-width: 600px) { + #tag { + margin-top: 0; + margin-left: 0; + margin-bottom: 0; + } + + .onload #tag { + margin-left: 0; + } + + ul li { + width: 100%; + } +} diff --git a/support/compile.js b/support/compile.js deleted file mode 100644 index 65be223dab..0000000000 --- a/support/compile.js +++ /dev/null @@ -1,150 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs'); - -/** - * Arguments. - */ - -var args = process.argv.slice(2) - , pending = args.length - , files = {}; - -console.log(''); - -// parse arguments - -args.forEach(function(file){ - var mod = file.replace('lib/', ''); - fs.readFile(file, 'utf8', function(err, js){ - if (err) throw err; - console.log(' \033[90mcompile : \033[0m\033[36m%s\033[0m', file); - files[file] = ~js.indexOf('require: off') - ? js - : parse(js); - --pending || compile(); - }); -}); - -/** - * Parse the given `js`. - */ - -function parse(js) { - return parseRequires(parseInheritance(js)); -} - -/** - * Parse requires. - */ - -function parseRequires(js) { - return js - .replace(/require\('events'\)/g, "require('browser/events')") - .replace(/require\('tty'\)/g, "require('browser/tty')") -} - -/** - * Parse __proto__. - */ - -function parseInheritance(js) { - return js - .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){ - return child + '.prototype = new ' + parent + ';\n' - + child + '.prototype.constructor = '+ child + ';\n'; - }); -} - -/** - * Compile the files. - */ - -function compile() { - var buf = ''; - buf += '\n// CommonJS require()\n\n'; - buf += browser.require + '\n\n'; - buf += 'require.modules = {};\n\n'; - buf += 'require.resolve = ' + browser.resolve + ';\n\n'; - buf += 'require.register = ' + browser.register + ';\n\n'; - buf += 'require.relative = ' + browser.relative + ';\n\n'; - args.forEach(function(file){ - var js = files[file]; - file = file.replace('lib/', ''); - buf += '\nrequire.register("' + file + '", function(module, exports, require){\n'; - buf += js; - buf += '\n}); // module: ' + file + '\n'; - }); - fs.writeFile('mocha.js', buf, function(err){ - if (err) throw err; - console.log(' \033[90m create : \033[0m\033[36m%s\033[0m', 'mocha.js'); - console.log(); - }); -} - -// refactored version of weepy's -// https://github.com/weepy/brequire/blob/master/browser/brequire.js - -var browser = { - - /** - * Require a module. - */ - - require: function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - }, - - /** - * Resolve module path. - */ - - resolve: function(path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }, - - /** - * Return relative require(). - */ - - relative: function(parent) { - return function(p){ - if ('.' != p[0]) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }, - - /** - * Register a module. - */ - - register: function(path, fn){ - require.modules[path] = fn; - } -}; \ No newline at end of file diff --git a/support/tail.js b/support/tail.js deleted file mode 100644 index 1f07fcfe46..0000000000 --- a/support/tail.js +++ /dev/null @@ -1,37 +0,0 @@ - -/** - * Node shims. - * - * These are meant only to allow - * mocha.js to run untouched, not - * to allow running node code on - * the server. - */ - -process = {}; - -process.nextTick = function(fn){ setTimeout(fn, 0); }; -process.on = function(){}; -process.exit = function(status){}; -process.stdout = {}; - -global = this; - -// boot - -;(function(){ - var mocha = require('mocha'); - var suite = new mocha.Suite; - var Reporter = mocha.reporters.HTML; - mocha.interfaces.bdd(suite); - suite.emit('pre-require', global); - - global.onload = run; // TODO: remove - - function run() { - suite.emit('run'); - var runner = new mocha.Runner(suite); - var reporter = new Reporter(runner); - runner.run(); - } -})(); \ No newline at end of file diff --git a/test/browser/array.js b/test/browser/array.js deleted file mode 100644 index 388149e70c..0000000000 --- a/test/browser/array.js +++ /dev/null @@ -1,33 +0,0 @@ -describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - var arr = [1,2,3]; - assert(-1 == arr.indexOf(5)); - }) - - it('should return the correct index when the value is present', function(){ - var arr = [1,2,3]; - assert(0 == arr.indexOf(1)); // just to test indentation - assert(1 == arr.indexOf(2)); - }) - }) -}) - -describe('Array', function(){ - describe('#pop()', function(){ - it('should remove and return the last value', function(){ - var arr = [1,2,3]; - assert(arr.pop() == 3); - }) - }) -}) - -describe('Array', function(){ - describe('#pop()', function(){ - it('should adjust .length', function(){ - var arr = [1,2,3]; - arr.pop(); - assert(arr.length == 2); - }) - }) -}) \ No newline at end of file diff --git a/test/browser/index.html b/test/browser/index.html deleted file mode 100644 index 594a421f83..0000000000 --- a/test/browser/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - Mocha - - - - - - - - -
    - - \ No newline at end of file diff --git a/test/browser/style.css b/test/browser/style.css deleted file mode 100644 index f2f4dc968e..0000000000 --- a/test/browser/style.css +++ /dev/null @@ -1,45 +0,0 @@ - -body { - font: 18px/1.5 "Helvetica Neue", Helvetica, Aria;, sans-serif; - padding: 60px 50px; -} - -h1, h2 { - margin: 0; -} - -h1 { - font-size: 1em; -} - -.suite .suite h1 { - font-size: .8em; -} - -h2 { - font-size: 12px; - font-weight: normal; -} - -.suite { - margin-left: 15px; -} - -.test { - margin-left: 15px; -} - -.test pre { - display: none; - margin: 5px; - padding: 15px; - border: 1px solid #eee; - border-bottom-color: #ddd; - -webkit-border-radius: 3px; - -webkit-box-shadow: 0 1px 3px #eee; -} - -.test:hover pre { - font: 12px/1.5 monaco, monospace; - display: inline-block; -} \ No newline at end of file diff --git a/test/duration.js b/test/duration.js deleted file mode 100644 index 400ba95631..0000000000 --- a/test/duration.js +++ /dev/null @@ -1,20 +0,0 @@ - -describe('durations', function(){ - describe('when slow', function(){ - it('should highlight in red', function(done){ - setTimeout(done, 100); - }) - }) - - describe('when reasonable', function(){ - it('should highlight in yellow', function(done){ - setTimeout(done, 50); - }) - }) - - describe('when fast', function(){ - it('should highlight in green', function(done){ - setTimeout(done, 10); - }) - }) -}) \ No newline at end of file diff --git a/test/fs.js b/test/fs.js deleted file mode 100644 index 102b8e1eac..0000000000 --- a/test/fs.js +++ /dev/null @@ -1,18 +0,0 @@ - -var fs = require('fs'); - -describe('fs.readFile()', function(){ - describe('when the file exists', function(){ - it('should succeed', function(done){ - fs.writeFile('/tmp/mocha', 'wahoo', done) - }) - }) - - describe('when the file does not exist', function(){ - it('should fail', function(done){ - // uncomment - // fs.readFile('/tmp/does-not-exist', done); - done(); - }) - }) -}) diff --git a/test/globals.js b/test/globals.js deleted file mode 100644 index f9c2ef6743..0000000000 --- a/test/globals.js +++ /dev/null @@ -1,19 +0,0 @@ - -describe('global leaks', function(){ - beforeEach(function(){ - // uncomment to test - // foo = 'bar' - }); - - it('should cause tests to fail', function(){ - // uncomment to test - // foo = 'bar'; - // bar = 'baz'; - // baz = 'raz'; - }); - - afterEach(function(){ - // uncomment to test - // foo = 'bar' - }); -}); \ No newline at end of file diff --git a/test/hook.async.js b/test/hook.async.js deleted file mode 100644 index 81abb41f0f..0000000000 --- a/test/hook.async.js +++ /dev/null @@ -1,94 +0,0 @@ - -describe('async', function(){ - var calls = []; - - before(function(){ - calls.push('root before all'); - }) - - after(function(){ - calls.push('root after all'); - calls.should.eql([ - 'root before all' - , 'before all' - , 'before' - , 'one' - , 'after' - , 'before' - , 'two' - , 'after' - , 'before' - , 'three' - , 'after' - , 'after all' - , 'root after all']); - }) - - beforeEach(function(){ - // should not be invoked - calls.push('parent before'); - }) - - afterEach(function(){ - // should not be invoked - calls.push('parent after' ); - }) - - describe('hooks', function(){ - before(function(){ - calls.push('before all'); - }); - - after(function(){ - calls.push('after all'); - }); - - beforeEach(function(done){ - process.nextTick(function(){ - calls.push('before'); - done(); - }) - }) - - it('one', function(done){ - calls.should.eql([ - 'root before all' - , 'before all' - , 'before']); - calls.push('one'); - process.nextTick(done); - }) - - it('two', function(){ - calls.should.eql([ - 'root before all' - , 'before all' - , 'before' - , 'one' - , 'after' - , 'before']); - calls.push('two'); - }) - - it('three', function(){ - calls.should.eql([ - 'root before all' - , 'before all' - , 'before' - , 'one' - , 'after' - , 'before' - , 'two' - , 'after' - , 'before']); - calls.push('three'); - }) - - afterEach(function(done){ - process.nextTick(function(){ - calls.push('after'); - done(); - }) - }) - }) -}) diff --git a/test/hook.sync.js b/test/hook.sync.js deleted file mode 100644 index d5ad993603..0000000000 --- a/test/hook.sync.js +++ /dev/null @@ -1,63 +0,0 @@ - -describe('serial', function(){ - var calls = []; - - beforeEach(function(){ - // not hit - calls.push('parent before'); - }) - - afterEach(function(){ - // not hit - calls.push('parent after'); - }) - - describe('hooks', function(){ - beforeEach(function(){ - calls.push('before'); - }) - - it('one', function(){ - calls.should.eql(['before']); - calls.push('one'); - }) - - it('two', function(){ - calls.should.eql([ - 'before' - , 'one' - , 'after' - , 'before']); - calls.push('two'); - }) - - it('three', function(){ - calls.should.eql([ - 'before' - , 'one' - , 'after' - , 'before' - , 'two' - , 'after' - , 'before']); - calls.push('three'); - }) - - afterEach(function(){ - calls.push('after'); - }) - - after(function(){ - calls.should.eql([ - 'before' - , 'one' - , 'after' - , 'before' - , 'two' - , 'after' - , 'before' - , 'three' - , 'after']); - }) - }) -}) \ No newline at end of file diff --git a/test/hook.sync.nested.js b/test/hook.sync.nested.js deleted file mode 100644 index 88fe72c8f0..0000000000 --- a/test/hook.sync.nested.js +++ /dev/null @@ -1,62 +0,0 @@ - -describe('serial', function(){ - describe('nested', function(){ - var calls = []; - - beforeEach(function(){ - calls.push('parent before'); - }) - - afterEach(function(){ - calls.push('parent after'); - }); - - it('foo', function(){ - calls.should.eql(['parent before']); - calls.push('foo'); - }) - - it('bar', function(){ - calls.should.eql([ - 'parent before' - , 'foo' - , 'parent after' - , 'parent before']); - }) - - describe('hooks', function(){ - beforeEach(function(){ - calls.push('before'); - }) - - it('one', function(){ - calls.should.eql([ - 'parent before' - , 'foo' - , 'parent after' - , 'parent before' - , 'parent after' - , 'before']); - calls.push('one'); - }) - - it('two', function(){ - calls.should.eql([ - 'parent before' - , 'foo' - , 'parent after' - , 'parent before' - , 'parent after' - , 'before' - , 'one' - , 'after' - , 'before']); - calls.push('two'); - }); - - afterEach(function(){ - calls.push('after'); - }) - }) - }) -}) \ No newline at end of file diff --git a/test/http.js b/test/http.js deleted file mode 100644 index 14ddd4f582..0000000000 --- a/test/http.js +++ /dev/null @@ -1,17 +0,0 @@ - -var http = require('http'); - -var server = http.createServer(function(req, res){ - res.end('Hello World\n'); -}) - -server.listen(8888); - -describe('http', function(){ - it('should provide an example', function(done){ - http.get({ path: '/', port: 8888 }, function(res){ - res.statusCode.should.equal(200); - done(); - }) - }) -}) \ No newline at end of file diff --git a/test/http.meta.2.js b/test/http.meta.2.js deleted file mode 100644 index c9606495c2..0000000000 --- a/test/http.meta.2.js +++ /dev/null @@ -1,82 +0,0 @@ - -var http = require('http'); - -var server = http.createServer(function(req, res){ - var accept = req.headers.accept || '' - , json = ~accept.indexOf('json'); - - switch (req.url) { - case '/': - res.end('hello'); - break; - case '/users': - if (json) { - res.end('["tobi","loki","jane"]'); - } else { - res.end('tobi, loki, jane'); - } - break; - } -}) - -server.listen(8899); - -function get(url) { - var fields - , expected - , header = {}; - - function request(done) { - http.get({ path: url, port: 8899, headers: header }, function(res){ - var buf = ''; - res.statusCode.should.equal(200); - res.setEncoding('utf8'); - res.on('data', function(chunk){ buf += chunk }); - res.on('end', function(){ - buf.should.equal(expected); - done(); - }); - }) - } - - return { - set: function(field, val){ - header[field] = val; - return this; - }, - - should: { - respond: function(body){ - fields = Object.keys(header).map(function(field){ - return field + ': ' + header[field]; - }).join(', '); - - expected = body; - describe('GET ' + url, function(){ - if (fields) { - describe('when given ' + fields, function(){ - it('should respond with "' + body + '"', request); - }); - } else { - it('should respond with "' + body + '"', request); - } - }); - } - } - }; -} - -describe('http server', function(){ - get('/') - .should - .respond('hello') - - get('/users') - .should - .respond('tobi, loki, jane') - - get('/users') - .set('Accept', 'application/json') - .should - .respond('["tobi","loki","jane"]') -}) \ No newline at end of file diff --git a/test/http.meta.js b/test/http.meta.js deleted file mode 100644 index 1a4a7ff291..0000000000 --- a/test/http.meta.js +++ /dev/null @@ -1,52 +0,0 @@ - -var http = require('http'); - -var server = http.createServer(function(req, res){ - var accept = req.headers.accept || '' - , json = ~accept.indexOf('json'); - - switch (req.url) { - case '/': - res.end('hello'); - break; - case '/users': - if (json) { - res.end('["tobi","loki","jane"]'); - } else { - res.end('tobi, loki, jane'); - } - break; - } -}) - -server.listen(8889); - -function get(url, body, header) { - return function(done){ - http.get({ path: url, port: 8889, headers: header }, function(res){ - var buf = ''; - res.statusCode.should.equal(200); - res.setEncoding('utf8'); - res.on('data', function(chunk){ buf += chunk }); - res.on('end', function(){ - buf.should.equal(body); - done(); - }); - }) - } -} - -describe('http requests', function(){ - describe('GET /', function(){ - it('should respond with hello', - get('/', 'hello')) - }) - - describe('GET /users', function(){ - it('should respond with users', - get('/users', 'tobi, loki, jane')) - - it('should respond with users', - get('/users', '["tobi","loki","jane"]', { Accept: 'application/json' })) - }) -}) \ No newline at end of file diff --git a/test/interfaces/bdd.js b/test/interfaces/bdd.js deleted file mode 100644 index 9e95817dbd..0000000000 --- a/test/interfaces/bdd.js +++ /dev/null @@ -1,25 +0,0 @@ - -describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }) - - it('should return the correct index when the value is present', function(){ - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); - }) - }) -}) - -describe('Array', function(){ - describe('#pop()', function(){ - it('should remove and return the last value', function(){ - var arr = [1,2,3]; - arr.pop().should.equal(3); - arr.should.eql([1,2]); - }) - }) -}) \ No newline at end of file diff --git a/test/interfaces/exports.js b/test/interfaces/exports.js deleted file mode 100644 index 8746cbcc63..0000000000 --- a/test/interfaces/exports.js +++ /dev/null @@ -1,44 +0,0 @@ - -var calls = []; - -exports.Array = { - before: function(){ - calls.push('before'); - }, - - after: function(){ - calls.push('after'); - calls.should.eql([ - 'before' - , 'before each' - , 'one' - , 'after each' - , 'before each' - , 'two' - , 'after each' - , 'after']); - }, - - '#indexOf()': { - beforeEach: function(){ - calls.push('before each'); - }, - - afterEach: function(){ - calls.push('after each'); - }, - - 'should return -1 when the value is not present': function(){ - calls.push('one'); - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }, - - 'should return the correct index when the value is present': function(){ - calls.push('two'); - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); - } - } -}; diff --git a/test/interfaces/tdd.js b/test/interfaces/tdd.js deleted file mode 100644 index c6f23080ff..0000000000 --- a/test/interfaces/tdd.js +++ /dev/null @@ -1,15 +0,0 @@ - -suite('Array', function(){ - suite('#indexOf()', function(){ - test('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }) - - test('should return the correct index when the value is present', function(){ - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); - }) - }) -}) diff --git a/test/merge.js b/test/merge.js deleted file mode 100644 index 10487febd5..0000000000 --- a/test/merge.js +++ /dev/null @@ -1,34 +0,0 @@ - -describe('merge', function(){ - describe('stuff', function(){ - describe('one', function(){ - it('should do something', function(){ - - }) - }) - - describe('two', function(){ - it('should do stuff', function(){ - - }) - }) - }) -}) - -describe('merge', function(){ - describe('stuff', function(){ - describe('three', function(){ - it('should do something', function(){ - - }) - }) - }) -}) - -describe('merge stuff', function(){ - describe('four', function(){ - it('should do something', function(){ - - }) - }) -}) \ No newline at end of file diff --git a/test/misc/grep.js b/test/misc/grep.js deleted file mode 100644 index d40effb160..0000000000 --- a/test/misc/grep.js +++ /dev/null @@ -1,22 +0,0 @@ - -describe('grep', function(){ - describe('fast', function(){ - it('should run fast', function(){ - - }) - - it('should run fast again', function(){ - - }) - }) - - describe('slow', function(){ - it('should run slow', function(done){ - setTimeout(done, 1000); - }) - - it('should run slow again', function(done){ - setTimeout(done, 1000); - }) - }) -}) diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 7104117c69..0000000000 --- a/test/mocha.opts +++ /dev/null @@ -1,4 +0,0 @@ ---require should ---reporter dot ---ui bdd ---growl diff --git a/test/multiple.done.js b/test/multiple.done.js deleted file mode 100644 index 0425e7e722..0000000000 --- a/test/multiple.done.js +++ /dev/null @@ -1,10 +0,0 @@ - -describe('multiple calls to done()', function(){ - it('should fail in a test-case', function(done){ - process.nextTick(function(){ - done(); - // uncomment - // done(); - }); - }) -}) \ No newline at end of file diff --git a/test/pending.js b/test/pending.js deleted file mode 100644 index cf738b27ba..0000000000 --- a/test/pending.js +++ /dev/null @@ -1,4 +0,0 @@ - -describe('pending', function(){ - it('should be allowed') -}) \ No newline at end of file diff --git a/test/timeout.js b/test/timeout.js deleted file mode 100644 index 11481600ea..0000000000 --- a/test/timeout.js +++ /dev/null @@ -1,8 +0,0 @@ - -describe('timeouts', function(){ - it('should error on timeout', function(done){ - // uncomment - // setTimeout(done, 3000); - done(); - }); -}); \ No newline at end of file diff --git a/test/uncaught.js b/test/uncaught.js deleted file mode 100644 index e1964da724..0000000000 --- a/test/uncaught.js +++ /dev/null @@ -1,10 +0,0 @@ - -describe('uncaught', function(){ - it('should report properly', function(done){ - process.nextTick(function(){ - // if you uncomment this :) - // throw new Error("I'm uncaught!"); - done(); - }) - }) -}) \ No newline at end of file From 0493cf032de73d95d8d452620724626f32245138 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 17 Nov 2011 21:32:19 -0800 Subject: [PATCH 0002/1771] and more --- index.html | 1 + index.md | 1 + 2 files changed, 2 insertions(+) diff --git a/index.html b/index.html index a8dfd48a18..9081e11224 100644 --- a/index.html +++ b/index.html @@ -39,6 +39,7 @@

    Features

  • extensible test DSLs or “interfaces”
  • before, after, before each, after each hooks
  • TextMate bundle
  • +
  • and more!
  • diff --git a/index.md b/index.md index c0d2bb92f2..a11bc0ec79 100644 --- a/index.md +++ b/index.md @@ -24,6 +24,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - extensible test DSLs or "interfaces" - before, after, before each, after each hooks - TextMate bundle + - and more! ## Installation From 8ce45879b1fade407490fef2662b5bd73aec0bcb Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:03:15 -0800 Subject: [PATCH 0003/1771] feature --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index a11bc0ec79..779a567716 100644 --- a/index.md +++ b/index.md @@ -3,6 +3,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej ## Features + - browser support - proper exit status for CI support etc - ideal for asynchronous APIs - auto-detects and disables coloring for non-ttys From 74498d49b001634c32a6969b90daa2dfaef5c7af Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:07:49 -0800 Subject: [PATCH 0004/1771] docs for browser support --- index.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/index.md b/index.md index 779a567716..20ad6382bc 100644 --- a/index.md +++ b/index.md @@ -248,6 +248,19 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

    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 + + + Mocha - the fun, simple, flexible JavaScript test framework + + + + + +

  • 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 I52)M!1MAWq&j0`b literal 0 HcmV?d00001 From 95b95dfa145097fab0c6d2d1d5a488fdebe94c64 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:50:53 -0800 Subject: [PATCH 0006/1771] display new images --- images/reporter-html.png | Bin 0 -> 76140 bytes index.html | 117 ++++++++++++++++++++++----------------- index.md | 26 ++++----- 3 files changed, 78 insertions(+), 65 deletions(-) create mode 100644 images/reporter-html.png diff --git a/images/reporter-html.png b/images/reporter-html.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cb12683664867bfb3ddb55d2fd23c5274325e GIT binary patch literal 76140 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 9081e11224..42f4a5c3ea 100644 --- a/index.html +++ b/index.html @@ -18,6 +18,7 @@

    Features

      +
    • browser support
    • proper exit status for CI support etc
    • ideal for asynchronous APIs
    • auto-detects and disables coloring for non-ttys
    • @@ -29,34 +30,33 @@

      Features

    • global variable leak detection
    • configurable test-case timeout
    • optionally run tests that match a regexp
    • -
    • auto-exit to prevent “hanging” with an active loop
    • +
    • auto-exit to prevent "hanging" with an active loop
    • easily meta-generate suites & test-cases
    • mocha.opts file support
    • mocha-debug(1) for node debugger support
    • detects multiple calls to done()
    • use any assertion library you want
    • extensible reporting, bundled with 9+ reporters
    • -
    • extensible test DSLs or “interfaces”
    • +
    • extensible test DSLs or "interfaces"
    • before, after, before each, after each hooks
    • TextMate bundle
    • and more!
    -

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others.

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -85,7 +85,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -99,7 +99,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -127,15 +127,15 @@ 

    mocha(1)

    mocha-debug(1)

    -

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    +

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    Interfaces

    -

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    +

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    BDD

    -

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -152,7 +152,7 @@ 

    BDD

    TDD

    -

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    +

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -169,7 +169,7 @@ 

    TDD

    Exports

    -

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -189,65 +189,62 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The Dot Matrix reporter is simply a series of dots - that represent test cases, failures highlight in red.

    - -

    dot matrix reporter

    +

    The Dot Matrix reporter is simply a series of dots + that represent test cases, failures highlight in red, + pending in blue, slow as yellow.

    -

    dot matrix failure

    +

    dot matrix reporter

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The “List” reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The "List" reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    - -

    failures

    +

    list reporter

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    +

    json reporter

    +

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    +

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    -
    ["start",{"total":12}]
    -["pass",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present","duration":0}]
    -["pass",{"title":"should return the index when present","fullTitle":"Array #indexOf() should return the index when present","duration":0}]
    -["fail",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present"}]
    -["end",{"start":"2011-08-29T03:21:02.050Z","suites":13,"passes":11,"tests":12,"failures":1,"end":"2011-08-29T03:21:02.052Z","duration":2}]
    -
    +

    json stream reporter

    Doc

    -

    The “doc” reporter outputs a hierarchical HTML body representation +

    The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    For example suppose you have the following JavaScript:

    +

    doc reporter

    + +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -259,7 +256,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -276,16 +273,32 @@ 

    Doc

    </section>
    +

    Browser support

    + +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    + +

    HTML test reporter

    + +
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
    +<link rel="stylesheet" href="style.css" />
    +<script src="../mocha.js"></script>
    +<script>mocha.setup('bdd')</script>
    +<script src="test.array.js"></script>
    +<script src="test.object.js"></script>
    +<script src="test.xhr.js"></script>
    +<script>onload = mocha.run;</script>
    +
    +

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -295,7 +308,7 @@

    mocha.opts

    Suite merging

    -

    Suites with common names are “merged” in order +

    Suites with common names are "merged" in order to produce unified reporting, especially when meta-generating tests.

    @@ -324,18 +337,18 @@

    Suite merging

    will produce the following:

    -

    mocha suite merging

    +

    mocha suite merging

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it’s usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it's usually a good place to put your tests.

    Makefiles

    -

    Be kind and don’t make developers hunt around in your docs to figure +

    Be kind and don't make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -347,30 +360,30 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

      $ make tm
     
    -

    Running mocha’s tests

    +

    Running mocha's tests

    -

    Run the tests:

    +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    diff --git a/index.md b/index.md index 20ad6382bc..880a1908ba 100644 --- a/index.md +++ b/index.md @@ -171,11 +171,10 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ### Dot Matrix The Dot Matrix reporter is simply a series of dots - that represent test cases, failures highlight in red. + that represent test cases, failures highlight in red, + pending in blue, slow as yellow. - ![dot matrix reporter](http://f.cl.ly/items/3b3b471Z1p2U3D1P2Y1n/Screenshot.png) - - ![dot matrix failure](http://f.cl.ly/items/1P11330L033r423g1y1n/Screenshot.png) + ![dot matrix reporter](images/reporter-dot.png) ## TAP @@ -188,7 +187,8 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw - ![landing strip plane reporter](http://f.cl.ly/items/0z1k400K1N1Y2G3u2u0i/Screenshot.png) + ![landing strip plane reporter](images/reporter-landing.png) + ![landing strip with failure](images/reporter-landing-fail.png) ## List @@ -196,24 +196,20 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal test cases pass or fail, outputting the failure details at the bottom of the output. - ![list reporter](http://f.cl.ly/items/0Y0x1B3l3K0n3t3h3l0p/Screenshot.png) + ![list reporter](images/reporter-list.png) - ![failures](http://f.cl.ly/items/2Z0E150v20042G2d1J0i/Screenshot.png) - ## JSON The JSON reporter outputs a single large JSON object when the tests have completed (failures or not). + + ![json reporter](images/reporter-json.png) ## JSON Stream The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. - ["start",{"total":12}] - ["pass",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present","duration":0}] - ["pass",{"title":"should return the index when present","fullTitle":"Array #indexOf() should return the index when present","duration":0}] - ["fail",{"title":"should return -1 when not present","fullTitle":"Array #indexOf() should return -1 when not present"}] - ["end",{"start":"2011-08-29T03:21:02.050Z","suites":13,"passes":11,"tests":12,"failures":1,"end":"2011-08-29T03:21:02.052Z","duration":2}] + ![json stream reporter](images/reporter-json-stream.png) ## Doc @@ -221,6 +217,8 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation! + ![doc reporter](images/reporter-doc.png) + For example suppose you have the following JavaScript: describe('Array', function(){ @@ -252,6 +250,8 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. + ![HTML test reporter](images/reporter-html.png) + From 25dcc338efd9e798bd0a8ea4eda51d26e8b8d686 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:56:28 -0800 Subject: [PATCH 0007/1771] styling images --- style.css | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/style.css b/style.css index 1f84713615..956faa4539 100644 --- a/style.css +++ b/style.css @@ -39,7 +39,7 @@ h1 a:hover { } h2 { - margin-top: 40px; + margin-top: 80px; font-weight: 100; letter-spacing: 1px; border-bottom: 1px solid #eee; @@ -99,6 +99,7 @@ code { } pre { + margin: 30px; padding: 30px; border: 1px solid #eee; border-bottom-color: #ddd; @@ -106,6 +107,13 @@ pre { -webkit-box-shadow: inset 0 0 10px #eee; } +img { + margin: 30px; + padding: 1px; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; +} + @media all and (max-width: 600px) { #tag { margin-top: 0; From 63038a407b8e74912cc07f4cabaa6523a79cd2ff Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:57:01 -0800 Subject: [PATCH 0008/1771] fixed heading levels for reporters --- index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/index.md b/index.md index 880a1908ba..4874eff255 100644 --- a/index.md +++ b/index.md @@ -176,13 +176,13 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ![dot matrix reporter](images/reporter-dot.png) -## TAP +### TAP The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. ![test anything protocol](http://f.cl.ly/items/2O0X3h0d1Q430O1t1T3p/Screenshot.png) -## Landing Strip +### Landing Strip The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw @@ -190,7 +190,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ![landing strip plane reporter](images/reporter-landing.png) ![landing strip with failure](images/reporter-landing-fail.png) -## List +### List The "List" reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at @@ -198,20 +198,20 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ![list reporter](images/reporter-list.png) -## JSON +### JSON The JSON reporter outputs a single large JSON object when the tests have completed (failures or not). ![json reporter](images/reporter-json.png) -## JSON Stream +### JSON Stream The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. ![json stream reporter](images/reporter-json-stream.png) -## Doc +### Doc The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you From 373a257826fa825001a6dccbcaa60053ee9b906f Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 12:59:03 -0800 Subject: [PATCH 0009/1771] gen --- index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 42f4a5c3ea..c2cec5d97c 100644 --- a/index.html +++ b/index.html @@ -201,13 +201,13 @@

    Dot Matrix

    dot matrix reporter

    -

    TAP

    +

    TAP

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    test anything protocol

    -

    Landing Strip

    +

    Landing Strip

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    @@ -215,7 +215,7 @@

    Landing Strip

    landing strip plane reporter landing strip with failure

    -

    List

    +

    List

    The "List" reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at @@ -223,20 +223,20 @@

    List

    list reporter

    -

    JSON

    +

    JSON

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    json reporter

    -

    JSON Stream

    +

    JSON Stream

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    json stream reporter

    -

    Doc

    +

    Doc

    The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you From fad479a3cc0922194874d2688d001825e1b94b9a Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:01:56 -0800 Subject: [PATCH 0010/1771] resize --- style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/style.css b/style.css index 956faa4539..a239477f70 100644 --- a/style.css +++ b/style.css @@ -114,6 +114,12 @@ img { -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; } +@media all and (max-width: 800px) { + img { + max-width: 100%; + } +} + @media all and (max-width: 600px) { #tag { margin-top: 0; From 04ffdd31e08a179d724503ab0321c5c46ac6e639 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:02:50 -0800 Subject: [PATCH 0011/1771] misc --- style.css | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/style.css b/style.css index a239477f70..626ab20c34 100644 --- a/style.css +++ b/style.css @@ -112,12 +112,7 @@ img { padding: 1px; -webkit-border-radius: 3px; -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; -} - -@media all and (max-width: 800px) { - img { - max-width: 100%; - } + max-width: 100%; } @media all and (max-width: 600px) { From 0344a8385a9d05bdf1b0a4cc75654362e65e1af0 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:03:17 -0800 Subject: [PATCH 0012/1771] overflow-x --- style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/style.css b/style.css index 626ab20c34..bf6d3d8966 100644 --- a/style.css +++ b/style.css @@ -105,6 +105,7 @@ pre { border-bottom-color: #ddd; -webkit-border-radius: 2px; -webkit-box-shadow: inset 0 0 10px #eee; + overflow-x: auto; } img { From aba3089bf57e3a06a0993ba9ff6805d8e2aa04f3 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:04:55 -0800 Subject: [PATCH 0013/1771] first para styling --- style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/style.css b/style.css index bf6d3d8966..24351058e5 100644 --- a/style.css +++ b/style.css @@ -66,6 +66,12 @@ h2 { margin-left: 170px; } +#tag + p { + font-size: 22px; + font-weight: 100; + letter-spacing: 1px; +} + a { color: #8A6343; font-weight: bold; From 2b4eefba2bb986de413dd791e2471c6d2a80d87d Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:12:02 -0800 Subject: [PATCH 0014/1771] misc --- index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index 4874eff255..92b671cd21 100644 --- a/index.md +++ b/index.md @@ -1,11 +1,11 @@ -Mocha is a feature-rich JavaScript test framework running on [node](http://nodejs.org) and the browser, aiming to make async testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. +Mocha is a feature-rich JavaScript test framework running on [node](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. ## Features - browser support + - simple async support - proper exit status for CI support etc - - ideal for asynchronous APIs - auto-detects and disables coloring for non-ttys - maps uncaught exceptions to the correct test case - async test timeout support @@ -13,7 +13,6 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - reports test durations - highlights slow tests - global variable leak detection - - configurable test-case timeout - optionally run tests that match a regexp - auto-exit to prevent "hanging" with an active loop - easily meta-generate suites & test-cases From 2f1e45c22b07fb9ecd86938c86eb9301224f1df2 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:17:26 -0800 Subject: [PATCH 0015/1771] styling --- index.html | 5 ++--- style.css | 7 +++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index c2cec5d97c..916a0f032c 100644 --- a/index.html +++ b/index.html @@ -13,14 +13,14 @@

    Mocha

    simple, flexible, fun

    -

    Mocha is a feature-rich JavaScript test framework running on node and the browser, aiming to make async testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

    +

    Mocha is a feature-rich JavaScript test framework running on node and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

    Features

    • browser support
    • +
    • simple async support
    • proper exit status for CI support etc
    • -
    • ideal for asynchronous APIs
    • auto-detects and disables coloring for non-ttys
    • maps uncaught exceptions to the correct test case
    • async test timeout support
    • @@ -28,7 +28,6 @@

      Features

    • reports test durations
    • highlights slow tests
    • global variable leak detection
    • -
    • configurable test-case timeout
    • optionally run tests that match a regexp
    • auto-exit to prevent "hanging" with an active loop
    • easily meta-generate suites & test-cases
    • diff --git a/style.css b/style.css index 24351058e5..51e3f8cd2a 100644 --- a/style.css +++ b/style.css @@ -83,13 +83,20 @@ a:hover { } ul { + margin-top: 20px; + padding: 0 15px; width: 100%; } ul li { float: left; width: 40%; + margin-top: 5px; margin-right: 60px; + list-style: none; + border-bottom: 1px solid #eee; + padding: 5px 0; + font-size: 12px; } ul::after { From 2f1c0babdad66f14a03898017df457b4a0087c48 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:19:59 -0800 Subject: [PATCH 0016/1771] expand list-items at 850 --- style.css | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/style.css b/style.css index 51e3f8cd2a..69c67795b0 100644 --- a/style.css +++ b/style.css @@ -129,6 +129,12 @@ img { max-width: 100%; } +@media all and (max-width: 850px) { + ul li { + width: 100%; + } +} + @media all and (max-width: 600px) { #tag { margin-top: 0; @@ -139,8 +145,4 @@ img { .onload #tag { margin-left: 0; } - - ul li { - width: 100%; - } } From c574945f6393d93f745a717950a9def154c7b37d Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:27:49 -0800 Subject: [PATCH 0017/1771] footer --- foot.html | 4 ++++ head.html | 5 +++-- index.html | 9 +++++++-- style.css | 20 +++++++++++++++++++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/foot.html b/foot.html index 1fd5f4f290..e2879ae7aa 100644 --- a/foot.html +++ b/foot.html @@ -1,2 +1,6 @@ + +
      + © 2011 TJ Holowaychuk. All rights reserved. +
      \ No newline at end of file diff --git a/head.html b/head.html index 7f7f2fce4c..c86940cc28 100644 --- a/head.html +++ b/head.html @@ -11,5 +11,6 @@ -

      Mocha

      -

      simple, flexible, fun

      +
      +

      Mocha

      +

      simple, flexible, fun

      diff --git a/index.html b/index.html index 916a0f032c..609f459ca1 100644 --- a/index.html +++ b/index.html @@ -11,8 +11,9 @@ -

      Mocha

      -

      simple, flexible, fun

      +
      +

      Mocha

      +

      simple, flexible, fun

      Mocha is a feature-rich JavaScript test framework running on node and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

      Features

      @@ -386,5 +387,9 @@

      Running mocha's tests

         $ make test REPORTER=list
       
      +
      +
      + © 2011 TJ Holowaychuk. All rights reserved. +
      \ No newline at end of file diff --git a/style.css b/style.css index 69c67795b0..b3d276d5e6 100644 --- a/style.css +++ b/style.css @@ -2,11 +2,14 @@ body { font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0; - padding: 140px 110px; color: #2C2C2C; border-top: 2px solid #ddd; } +#content { + padding: 140px 110px 60px 110px; +} + h1 { position: relative; font-style: normal; @@ -129,6 +132,21 @@ img { max-width: 100%; } +footer { + background: #eee; + width: 100%; + padding: 50px 0; + text-align: right; + border-top: 1px solid #ddd; +} + +footer span { + display: block; + margin-right: 30px; + color: #888; + font-size: 12px; +} + @media all and (max-width: 850px) { ul li { width: 100%; From 58e04ee3bef237d36cc06d67c51c38587a7a4aa6 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:31:47 -0800 Subject: [PATCH 0018/1771] h1 font size --- style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/style.css b/style.css index b3d276d5e6..ebdd05738c 100644 --- a/style.css +++ b/style.css @@ -19,6 +19,7 @@ h1 { color: white; display: inline-block; padding: 48px 30px; + font-size: 2em; opacity: 0; -webkit-border-radius: 100px; -webkit-transition: opacity 1s, background-color 200ms; From 7b3a36f93de0cc4878c1eb7bcd7ad5c9caac28ce Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:37:18 -0800 Subject: [PATCH 0019/1771] docs --- index.html | 15 ++++++++++----- index.md | 17 +++++++++++------ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/index.html b/index.html index 609f459ca1..78f0c19340 100644 --- a/index.html +++ b/index.html @@ -273,12 +273,17 @@

      Doc

      </section>
    -

    Browser support

    +

    HTML

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    The HTML reporter is currently the only browser reporter + supported by Mocha, and it looks like this:

    HTML test reporter

    +

    Browser support

    + +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
     <link rel="stylesheet" href="style.css" />
     <script src="../mocha.js"></script>
    @@ -289,7 +294,7 @@ 

    Browser support

    <script>onload = mocha.run;</script>
    -

    mocha.opts

    +

    mocha.opts

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    @@ -306,7 +311,7 @@

    mocha.opts

    $ mocha --reporter list --growl
     
    -

    Suite merging

    +

    Suite merging

    Suites with common names are "merged" in order to produce unified reporting, especially when @@ -335,7 +340,7 @@

    Suite merging

    })
    -

    will produce the following:

    +

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    mocha suite merging

    diff --git a/index.md b/index.md index 92b671cd21..08721cce48 100644 --- a/index.md +++ b/index.md @@ -245,11 +245,16 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -### Browser support +### HTML - Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. + The __HTML__ reporter is currently the only browser reporter + supported by Mocha, and it looks like this: - ![HTML test reporter](images/reporter-html.png) + ![HTML test reporter](images/reporter-html.png) + +## Browser support + + Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. @@ -260,7 +265,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -### mocha.opts +## mocha.opts Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: @@ -275,7 +280,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal $ mocha --reporter list --growl -### Suite merging +## Suite merging Suites with common names are "merged" in order to produce unified reporting, especially when @@ -303,7 +308,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }) }) -will produce the following: +Instead of reporting these as distinct suites, they are merged, yielding the following: ![mocha suite merging](http://f.cl.ly/items/380R3S1t1t0b0O2K250V/Screenshot.png) From 30e83c6d2c7d1a346de76f6016e58c8c228ba218 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 13:40:12 -0800 Subject: [PATCH 0020/1771] gh --- index.html | 2 +- index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 78f0c19340..4e2572ade8 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@

    Mocha

    simple, flexible, fun

    -

    Mocha is a feature-rich JavaScript test framework running on node and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

    +

    Mocha is a feature-rich JavaScript test framework running on node and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.

    Features

    diff --git a/index.md b/index.md index 08721cce48..f0f246dfd8 100644 --- a/index.md +++ b/index.md @@ -1,5 +1,5 @@ -Mocha is a feature-rich JavaScript test framework running on [node](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. +Mocha is a feature-rich JavaScript test framework running on [node](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](http://github.com/visionmedia/mocha). ## Features From c13300c9a50bffa4de225ad8df0802f4378c0bf9 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 14:01:04 -0800 Subject: [PATCH 0021/1771] styling for FF --- style.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/style.css b/style.css index ebdd05738c..7eda937587 100644 --- a/style.css +++ b/style.css @@ -22,7 +22,9 @@ h1 { font-size: 2em; opacity: 0; -webkit-border-radius: 100px; + -moz-border-radius: 100px; -webkit-transition: opacity 1s, background-color 200ms; + -moz-transition: opacity 1s, background-color 200ms; } h1:hover { @@ -59,6 +61,7 @@ h2 { margin-bottom: 100px; letter-spacing: 2px; -webkit-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; + -moz-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; } #tag em { @@ -121,7 +124,9 @@ pre { border: 1px solid #eee; border-bottom-color: #ddd; -webkit-border-radius: 2px; + -moz-border-radius: 2px; -webkit-box-shadow: inset 0 0 10px #eee; + -moz-box-shadow: inset 0 0 10px #eee; overflow-x: auto; } @@ -129,7 +134,9 @@ img { margin: 30px; padding: 1px; -webkit-border-radius: 3px; + -moz-border-radius: 3px; -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; + -moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; max-width: 100%; } From 2df96afc00e2c5ea198c43326cae6f3463ba3102 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 14:24:27 -0800 Subject: [PATCH 0022/1771] docs for hooks --- index.html | 27 +++++++++++++++++++++++++++ index.md | 26 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/index.html b/index.html index 4e2572ade8..3df38dd9a6 100644 --- a/index.html +++ b/index.html @@ -97,6 +97,33 @@

    Asynchronous code

    })
    +

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    + +
    describe('Connection', function(){
    +  var db = new Connection
    +    , tobi = new User('tobi')
    +    , loki = new User('loki')
    +    , jane = new User('jane');
    +
    +  beforeEach(function(done){
    +    db.clear(function(err){
    +      if (err) return done(err);
    +      db.save([tobi, loki, jane], done);
    +    });
    +  })
    +
    +  describe('#find()', function(){
    +    it('respond with matching records', function(done){
    +      db.find({ type: 'User' }, function(err, res){
    +        if (err) return done(err);
    +        res.should.have.length(3);
    +        done();
    +      })
    +    })
    +  })
    +})
    +
    +

    Pending tests

    Pending test-cases are simply those without a callback:

    diff --git a/index.md b/index.md index f0f246dfd8..55105861a4 100644 --- a/index.md +++ b/index.md @@ -76,6 +76,32 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }) }) + All "hooks", that is `before()`, `after()`, `beforeEach()`, `afterEach()` may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test: + + describe('Connection', function(){ + var db = new Connection + , tobi = new User('tobi') + , loki = new User('loki') + , jane = new User('jane'); + + beforeEach(function(done){ + db.clear(function(err){ + if (err) return done(err); + db.save([tobi, loki, jane], done); + }); + }) + + describe('#find()', function(){ + it('respond with matching records', function(done){ + db.find({ type: 'User' }, function(err, res){ + if (err) return done(err); + res.should.have.length(3); + done(); + }) + }) + }) + }) + ## Pending tests Pending test-cases are simply those without a callback: From 8fb3c500207ccd8ab175de24ca69c5f60eec78f7 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 14:27:44 -0800 Subject: [PATCH 0023/1771] links --- index.html | 11 +++++++++++ index.md | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/index.html b/index.html index 3df38dd9a6..c6a79f62a4 100644 --- a/index.html +++ b/index.html @@ -403,6 +403,17 @@

    TextMate bundle

      $ make tm
     
    +

    Example test suites

    + +

    The following test suites are from real projects putting Mocha to use, + so they serve as good examples:

    + + +

    Running mocha's tests

    Run the tests:

    diff --git a/index.md b/index.md index 55105861a4..81411c3e9a 100644 --- a/index.md +++ b/index.md @@ -368,6 +368,15 @@ Instead of reporting these as distinct suites, they are merged, yielding the fol $ make tm +## Example test suites + + The following test suites are from real projects putting Mocha to use, + so they serve as good examples: + + - [Express](https://github.com/visionmedia/express/tree/master/test) + - [Connect](https://github.com/senchalabs/connect/tree/master/test) + - [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) + ## Running mocha's tests Run the tests: @@ -381,3 +390,4 @@ Instead of reporting these as distinct suites, they are merged, yielding the fol Alter the reporter: $ make test REPORTER=list + From 323a5ce8f20d87066278e855219f7109e61eb0a7 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sat, 19 Nov 2011 14:29:08 -0800 Subject: [PATCH 0024/1771] links --- index.html | 1 + index.md | 1 + 2 files changed, 2 insertions(+) diff --git a/index.html b/index.html index c6a79f62a4..f98997694e 100644 --- a/index.html +++ b/index.html @@ -412,6 +412,7 @@

    Example test suites

  • Express
  • Connect
  • SuperAgent
  • +
  • WebSocket.io
  • Running mocha's tests

    diff --git a/index.md b/index.md index 81411c3e9a..1d61a11452 100644 --- a/index.md +++ b/index.md @@ -376,6 +376,7 @@ Instead of reporting these as distinct suites, they are merged, yielding the fol - [Express](https://github.com/visionmedia/express/tree/master/test) - [Connect](https://github.com/senchalabs/connect/tree/master/test) - [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) + - [WebSocket.io](https://github.com/LearnBoost/websocket.io/tree/master/test) ## Running mocha's tests From 1f112bcdd977c8c698ab725d0cfd698fe3afccf7 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 19:59:02 -0800 Subject: [PATCH 0025/1771] Added quick n dirty syntax highlighting. Closes #54 --- highlight.js | 17 +++++++++++++++++ index.html | 8 +++++--- jquery.js | 4 ++++ style.css | 5 +++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 highlight.js create mode 100644 jquery.js diff --git a/highlight.js b/highlight.js new file mode 100644 index 0000000000..c7c15560e0 --- /dev/null +++ b/highlight.js @@ -0,0 +1,17 @@ + +$(function(){ + $('code').each(function(){ + $(this).html(highlight($(this).text())); + }); +}); + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/('.*')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} \ No newline at end of file diff --git a/index.html b/index.html index f98997694e..030a17b23e 100644 --- a/index.html +++ b/index.html @@ -4,10 +4,12 @@ Mocha - the fun, simple, flexible JavaScript test framework + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 0000000000..d2424e6528 --- /dev/null +++ b/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7 jquery.com | jquery.org/license */ +(function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p="
    "+""+"
    ";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&& +(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after" +,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/)<[^<]*)*<\/script>/gi,bQ=/^(?:select|textarea)/i,bR=/\s+/,bS=/([?&])_=[^&]*/,bT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bU=f.fn.load,bV={},bW={},bX,bY,bZ=["*/"]+["*"];try{bX=e.href}catch(b$){bX=c.createElement("a"),bX.href="",bX=bX.href}bY=bT.exec(bX.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bU)return bU.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bP,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bQ.test(this.nodeName)||bK.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bH,"\r\n")}}):{name:b.name,value:c.replace(bH,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?cb(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),cb(a,b);return a},ajaxSettings:{url:bX,isLocal:bL.test(bY[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bZ},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:b_(bV),ajaxTransport:b_(bW),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cd(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=ce(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bJ.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bI,"").replace(bN,bY[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bR),d.crossDomain==null&&(r=bT.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bY[1]&&r[2]==bY[2]&&(r[3]||(r[1]==="http:"?80:443))==(bY[3]||(bY[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),ca(bV,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bM.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bO.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bS,"$1_="+x);d.url=y+(y===d.url?(bO.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bZ+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=ca(bW,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)cc(g,a[g],c,e);return d.join("&").replace(bF,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cf=f.now(),cg=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cf++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cg.test(b.url)||e&&cg.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cg,l),b.url===j&&(e&&(k=k.replace(cg,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ch=a.ActiveXObject?function(){for(var a in cj)cj[a](0,1)}:!1,ci=0,cj;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ck()||cl()}:ck,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ch&&delete cj[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++ci,ch&&(cj||(cj={},f(a).unload(ch)),cj[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cm={},cn,co,cp=/^(?:toggle|show|hide)$/,cq=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cr,cs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],ct;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cw("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cz.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cz.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cA(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cA(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/style.css b/style.css index 7eda937587..14cd2733e5 100644 --- a/style.css +++ b/style.css @@ -172,3 +172,8 @@ footer span { margin-left: 0; } } + +code .init { color: #17B8E9 } +code .number { color: #17B8E9 } +code .string { color: #36A343 } +code .keyword { color: #8A6343 } From 8d6e547fc80deff434a4292383820db38f7eb4e4 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:00:00 -0800 Subject: [PATCH 0026/1771] typo --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 030a17b23e..f092e9f5af 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ From 1e74361ccdf7f54ca8db42c68788bc25b54f6eba Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:12:42 -0800 Subject: [PATCH 0027/1771] tweak colors --- style.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/style.css b/style.css index 14cd2733e5..be82399074 100644 --- a/style.css +++ b/style.css @@ -173,7 +173,7 @@ footer span { } } -code .init { color: #17B8E9 } -code .number { color: #17B8E9 } -code .string { color: #36A343 } +code .init { color: #2F6FAD } +code .string { color: #5890AD } code .keyword { color: #8A6343 } +code .number { color: #2F6FAD } \ No newline at end of file From bebeb35fd1075bd73cdd4267d3fa5a38d0fcee6f Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:14:09 -0800 Subject: [PATCH 0028/1771] comments --- highlight.js | 1 + style.css | 1 + 2 files changed, 2 insertions(+) diff --git a/highlight.js b/highlight.js index c7c15560e0..6df4a8d715 100644 --- a/highlight.js +++ b/highlight.js @@ -9,6 +9,7 @@ function highlight(js) { return js .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') .replace(/('.*')/gm, '$1') .replace(/(\d+\.\d+)/gm, '$1') .replace(/(\d+)/gm, '$1') diff --git a/style.css b/style.css index be82399074..aaba1d4adf 100644 --- a/style.css +++ b/style.css @@ -173,6 +173,7 @@ footer span { } } +code .comment { color: #ddd } code .init { color: #2F6FAD } code .string { color: #5890AD } code .keyword { color: #8A6343 } From 8285c43cb41db6a286209d26a575c7f793758407 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:43:32 -0800 Subject: [PATCH 0029/1771] docs --- index.html | 149 ++++++++++++++++++++++++++++++++--------------------- index.md | 30 +++++++++++ 2 files changed, 120 insertions(+), 59 deletions(-) diff --git a/index.html b/index.html index f092e9f5af..08553a09d7 100644 --- a/index.html +++ b/index.html @@ -4,12 +4,10 @@ Mocha - the fun, simple, flexible JavaScript test framework - - @@ -32,33 +30,34 @@

    Features

  • highlights slow tests
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent "hanging" with an active loop
  • +
  • auto-exit to prevent “hanging” with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • mocha-debug(1) for node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or "interfaces"
  • +
  • extensible test DSLs or “interfaces”
  • before, after, before each, after each hooks
  • TextMate bundle
  • and more!
  • +

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others.

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -87,7 +86,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -99,7 +98,7 @@ 

    Asynchronous code

    })
    -

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -128,7 +127,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -154,17 +153,48 @@ 

    mocha(1)

    -G, --growl enable growl support
    +

    -r, —require <name>

    + +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    + +

    -u, —ui <name>

    + +

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    + +

    -R, —reporter <name>

    + +

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    + +

    -g, —grep <pattern>

    + +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    + +

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    + +
    describe('api', function(){
    +  describe('GET /api/users', function(){
    +    it('respond with an array of users')
    +  })
    +})
    +
    +describe('app', function(){
    +  describe('GET /users', function(){
    +    it('respond with an array of users')
    +  })
    +})
    +
    +

    mocha-debug(1)

    -

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    +

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    Interfaces

    -

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    BDD

    -

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -181,7 +211,7 @@ 

    BDD

    TDD

    -

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    +

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -198,7 +228,7 @@ 

    TDD

    Exports

    -

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -218,62 +248,62 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The Dot Matrix reporter is simply a series of dots +

    The Dot Matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The “List” reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    +

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The "doc" reporter outputs a hierarchical HTML body representation +

    The “doc” reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -285,7 +315,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -304,14 +334,14 @@ 

    Doc

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
     <link rel="stylesheet" href="style.css" />
    @@ -325,14 +355,14 @@ 

    Browser support

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -342,7 +372,7 @@

    mocha.opts

    Suite merging

    -

    Suites with common names are "merged" in order +

    Suites with common names are “merged” in order to produce unified reporting, especially when meta-generating tests.

    @@ -369,20 +399,20 @@

    Suite merging

    })
    -

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    +

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    -

    mocha suite merging

    +

    mocha suite merging

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it's usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it’s usually a good place to put your tests.

    Makefiles

    -

    Be kind and don't make developers hunt around in your docs to figure +

    Be kind and don’t make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -394,11 +424,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -407,29 +437,30 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    -

    Running mocha's tests

    -

    Run the tests:

    +

    Running mocha’s tests

    + +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    diff --git a/index.md b/index.md index 1d61a11452..01d0c332c3 100644 --- a/index.md +++ b/index.md @@ -128,6 +128,36 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -s, --slow "slow" test threshold in milliseconds [75] -G, --growl enable growl support +### -r, --require <name> + + The `--require` option is useful for libraries such as [should.js](http://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. + +### -u, --ui <name> + + The `--ui` option lets you specify the interface to use, defaulting to "bdd". + +### -R, --reporter <name> + + The `--reporter` option allows you to specify the reporter that will be used, defaulting to "dot". + +### -g, --grep <pattern> + + The `--grep` option when specified will trigger mocha to only run tests matching the given `pattern` which is internally compiled to a `RegExp`. + + Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. + + describe('api', function(){ + describe('GET /api/users', function(){ + it('respond with an array of users') + }) + }) + + describe('app', function(){ + describe('GET /users', function(){ + it('respond with an array of users') + }) + }) + ## mocha-debug(1) `mocha-debug(1)` is identical to `mocha(1)`, however it enables node's debugger so you may step through tests with the __debugger__ statement. From 9b7ab196bb921cc34bc2e63e91c23726818dc1b5 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:45:35 -0800 Subject: [PATCH 0030/1771] fixed syntax highlighting again --- index.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 08553a09d7..778dd260a5 100644 --- a/index.html +++ b/index.html @@ -4,10 +4,12 @@ Mocha - the fun, simple, flexible JavaScript test framework + + From ffe675e8d779caddf6bb41579e661c63c52ced5e Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 21 Nov 2011 20:50:08 -0800 Subject: [PATCH 0031/1771] docs --- index.html | 16 +++++++++++----- index.md | 8 ++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index 778dd260a5..22217f2b13 100644 --- a/index.html +++ b/index.html @@ -4,12 +4,10 @@ Mocha - the fun, simple, flexible JavaScript test framework - - @@ -167,6 +165,14 @@

    -R, —reporter <name>

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    +

    -t, —timeout <ms>

    + +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    + +

    -s, —slow <ms>

    + +

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    -g, —grep <pattern>

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    diff --git a/index.md b/index.md index 01d0c332c3..5aa6c9d665 100644 --- a/index.md +++ b/index.md @@ -139,6 +139,14 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ### -R, --reporter <name> The `--reporter` option allows you to specify the reporter that will be used, defaulting to "dot". + +### -t, --timeout <ms> + + Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the `s` suffix, ex: `--timeout 2s` or `--timeout 2000` would be equivalent. + +### -s, --slow <ms> + + Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long. ### -g, --grep <pattern> From cdfd33984fea294e3c51a96fe0fcbfd88f70caad Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 22 Nov 2011 08:07:57 -0800 Subject: [PATCH 0032/1771] actually fixed --- head.html | 8 +++++--- index.html | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/head.html b/head.html index c86940cc28..d7af1bc520 100644 --- a/head.html +++ b/head.html @@ -4,10 +4,12 @@ Mocha - the fun, simple, flexible JavaScript test framework + + diff --git a/index.html b/index.html index 22217f2b13..db7a5c41ec 100644 --- a/index.html +++ b/index.html @@ -4,10 +4,12 @@ Mocha - the fun, simple, flexible JavaScript test framework + + From fdc2b05c2b287ea18a3e67a65a938130a414693b Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 22 Nov 2011 18:01:00 -0800 Subject: [PATCH 0033/1771] add link to mocha tests --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index 5aa6c9d665..afa405ed4a 100644 --- a/index.md +++ b/index.md @@ -415,6 +415,7 @@ Instead of reporting these as distinct suites, they are merged, yielding the fol - [Connect](https://github.com/senchalabs/connect/tree/master/test) - [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) - [WebSocket.io](https://github.com/LearnBoost/websocket.io/tree/master/test) + - [Mocha](https://github.com/visionmedia/mocha/tree/master/test) ## Running mocha's tests From 65816c893263a0e9555df0094d52e70f847f8c1c Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:01:32 -0800 Subject: [PATCH 0034/1771] coffee --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index afa405ed4a..7aea9adbcf 100644 --- a/index.md +++ b/index.md @@ -23,6 +23,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - extensible reporting, bundled with 9+ reporters - extensible test DSLs or "interfaces" - before, after, before each, after each hooks + - coffee-script support - TextMate bundle - and more! From 8f38bd140b9448def66ceec2ac2523fd29cf1dc7 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:02:19 -0800 Subject: [PATCH 0035/1771] cli --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index 7aea9adbcf..0650d42b37 100644 --- a/index.md +++ b/index.md @@ -127,6 +127,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -g, --grep only run tests matching -t, --timeout set test-case timeout in milliseconds [2000] -s, --slow "slow" test threshold in milliseconds [75] + -C, --no-colors force disabling of colors -G, --growl enable growl support ### -r, --require <name> From 5c1269ddfb7661993c5d20a259118a796c50456f Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:14:09 -0800 Subject: [PATCH 0036/1771] more images --- images/reporter-progress.png | Bin 0 -> 19996 bytes images/reporter-spec-duration.png | Bin 0 -> 22976 bytes images/reporter-tap.png | Bin 0 -> 23027 bytes index.html | 11 ++++++++++- index.md | 10 ++++++++-- 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 images/reporter-progress.png create mode 100644 images/reporter-spec-duration.png create mode 100644 images/reporter-tap.png diff --git a/images/reporter-progress.png b/images/reporter-progress.png new file mode 100644 index 0000000000000000000000000000000000000000..d23ba3654285b72cb34013347808d87849ed3687 GIT binary patch literal 19996 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 literal 0 HcmV?d00001 diff --git a/images/reporter-spec-duration.png b/images/reporter-spec-duration.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a59acf897ca0551d023119708e9d7c1be5e1d8 GIT binary patch literal 22976 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 lr|1SUl literal 0 HcmV?d00001 diff --git a/index.html b/index.html index db7a5c41ec..46018ad8fc 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,7 @@

    Features

  • extensible reporting, bundled with 9+ reporters
  • extensible test DSLs or “interfaces”
  • before, after, before each, after each hooks
  • +
  • coffee-script support
  • TextMate bundle
  • and more!
  • @@ -152,6 +153,7 @@

    mocha(1)

    -g, --grep <pattern> only run tests matching <pattern> -t, --timeout <ms> set test-case timeout in milliseconds [2000] -s, --slow <ms> "slow" test threshold in milliseconds [75] + -C, --no-colors force disabling of colors -G, --growl enable growl support
    @@ -274,7 +276,7 @@

    TAP

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    @@ -292,6 +294,12 @@

    List

    list reporter

    +

    Progress

    + +

    The progress reporter implements a simple progress-bar:

    + +

    progress bar

    +

    JSON

    The JSON reporter outputs a single large JSON object when @@ -455,6 +463,7 @@

    Example test suites

  • Connect
  • SuperAgent
  • WebSocket.io
  • +
  • Mocha
  • diff --git a/index.md b/index.md index 0650d42b37..f8c73e0424 100644 --- a/index.md +++ b/index.md @@ -245,7 +245,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. - ![test anything protocol](http://f.cl.ly/items/2O0X3h0d1Q430O1t1T3p/Screenshot.png) + ![test anything protocol](images/reporter-tap.png) ### Landing Strip @@ -262,7 +262,13 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal the bottom of the output. ![list reporter](images/reporter-list.png) - + +### Progress + + The progress reporter implements a simple progress-bar: + + ![progress bar](images/reporter-progress.png) + ### JSON The JSON reporter outputs a single large JSON object when From c33d473a2826d1e691c0fe1c0294f91ebec60a2b Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:16:27 -0800 Subject: [PATCH 0037/1771] spec --- index.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index f8c73e0424..9463114802 100644 --- a/index.md +++ b/index.md @@ -235,12 +235,20 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ### Dot Matrix - The Dot Matrix reporter is simply a series of dots + The "dot" matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow. ![dot matrix reporter](images/reporter-dot.png) +### Spec + + The "spec" reporter outputs a hierarchical view + nested just as the test cases are. + + ![spec reporter](images/reporter-spec.png) + ![spec reporter with failure](images/reporter-spec-fail.png) + ### TAP The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. From 2c9845064a3605c73c3050914c998b88c7430f13 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:17:39 -0800 Subject: [PATCH 0038/1771] durations --- index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/index.md b/index.md index 9463114802..46bd5f6743 100644 --- a/index.md +++ b/index.md @@ -113,6 +113,14 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }) }) +## Test duration + + Most of the reporters support some form of displaying + test duration, as well as flagging tests that are slow, + as shown here with the "spec" reporter: + + ![test duration](images/reporter-spec-duration.js) + ## mocha(1) Usage: mocha [options] [files] From ec298374b39fd4c8e3dac9d2683cae4d463c60eb Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:18:13 -0800 Subject: [PATCH 0039/1771] gen --- index.html | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 46018ad8fc..f878827ae8 100644 --- a/index.html +++ b/index.html @@ -139,6 +139,14 @@

    Pending tests

    })
    +

    Test duration

    + +

    Most of the reporters support some form of displaying + test duration, as well as flagging tests that are slow, + as shown here with the “spec” reporter:

    + +

    test duration

    +

    mocha(1)

    Usage: mocha [options] [files]
    @@ -266,12 +274,20 @@ 

    Reporters

    Dot Matrix

    -

    The Dot Matrix reporter is simply a series of dots +

    The “dot” matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    dot matrix reporter

    +

    Spec

    + +

    The “spec” reporter outputs a hierarchical view + nested just as the test cases are.

    + +

    spec reporter + spec reporter with failure

    +

    TAP

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    From 3001a0fcc8d392eb81127e3e62eb1b990919cfff Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 23 Nov 2011 17:22:39 -0800 Subject: [PATCH 0040/1771] typo --- index.html | 2 +- index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index f878827ae8..25c220ce21 100644 --- a/index.html +++ b/index.html @@ -210,7 +210,7 @@

    mocha-debug(1)

    Interfaces

    -

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and export flavoured interfaces.

    +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    diff --git a/index.md b/index.md index 46bd5f6743..bd714c685d 100644 --- a/index.md +++ b/index.md @@ -182,7 +182,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ## Interfaces - Mocha "interface" system allows developers to choose their style of DSL. Shipping with __BDD__, __TDD__, and __export__ flavoured interfaces. + Mocha "interface" system allows developers to choose their style of DSL. Shipping with __BDD__, __TDD__, and __exports__ flavoured interfaces. ### BDD From d05ca94f235b5ae228416713bb5a8d26b35f8586 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 28 Nov 2011 09:49:38 -0800 Subject: [PATCH 0041/1771] typo --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index bd714c685d..eaf64d3023 100644 --- a/index.md +++ b/index.md @@ -119,7 +119,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal test duration, as well as flagging tests that are slow, as shown here with the "spec" reporter: - ![test duration](images/reporter-spec-duration.js) + ![test duration](images/reporter-spec-duration.png) ## mocha(1) From a0fd26a73850737c1ae3b23db35cc6055be0b323 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Mon, 28 Nov 2011 09:49:45 -0800 Subject: [PATCH 0042/1771] udpated --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 25c220ce21..ad1225330c 100644 --- a/index.html +++ b/index.html @@ -145,7 +145,7 @@

    Test duration

    test duration, as well as flagging tests that are slow, as shown here with the “spec” reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    From 2fa3288e4f4443adaa1c612ffbbc04a38bf80511 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:10:53 -0800 Subject: [PATCH 0043/1771] updated cli help --- index.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index 5aa6c9d665..27a2c6dad9 100644 --- a/index.md +++ b/index.md @@ -114,10 +114,11 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ## mocha(1) - Usage: mocha [options] [files] + Usage: mocha [options] [files] + Options: - + -h, --help output usage information -V, --version output the version number -r, --require require the given module @@ -126,7 +127,14 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -g, --grep only run tests matching -t, --timeout set test-case timeout in milliseconds [2000] -s, --slow "slow" test threshold in milliseconds [75] - -G, --growl enable growl support + -w, --watch watch test files for changes + -C, --no-colors force disabling of colors + -c, --colors force enabling of colors + -G, --growl enable growl notification support + --globals allow the given comma-delimited global [names] + --ignore-leaks ignore global variable leaks + --interfaces display available interfaces + --reporters display available reporters ### -r, --require <name> From 210e6e71704684ded6d1482c0dcefba66c80dba8 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:13:40 -0800 Subject: [PATCH 0044/1771] globals --- index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/index.md b/index.md index 27a2c6dad9..c518d3781c 100644 --- a/index.md +++ b/index.md @@ -136,6 +136,14 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal --interfaces display available interfaces --reporters display available reporters +### --globals <names> + + Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--globals app,YUI`. + +### --ignore-leaks + + By default Mocha will fail when global variables are introduced, you may use `--globals` to specify a few, or use `--ignore-leaks` to disable this functionality. + ### -r, --require <name> The `--require` option is useful for libraries such as [should.js](http://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. From 30671352e6317f3ab99cf9df7d5d4c328e91cc68 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:18:19 -0800 Subject: [PATCH 0045/1771] misc --- index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.md b/index.md index c518d3781c..5a6d5c1b06 100644 --- a/index.md +++ b/index.md @@ -136,6 +136,10 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal --interfaces display available interfaces --reporters display available reporters +### -w, --watch + + Executes tests on changes to the test files. + ### --globals <names> Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--globals app,YUI`. From ed36bd335b2e3fc6733c290a9f0499602f17e299 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:18:47 -0800 Subject: [PATCH 0046/1771] misc --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index 5a6d5c1b06..0eab976fc3 100644 --- a/index.md +++ b/index.md @@ -12,6 +12,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - growl notification support - reports test durations - highlights slow tests + - file watcher support - global variable leak detection - optionally run tests that match a regexp - auto-exit to prevent "hanging" with an active loop From 6b150042f3051fe6b599c90c6cd1b37d17b46c25 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:19:29 -0800 Subject: [PATCH 0047/1771] grep --- index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.md b/index.md index 0eab976fc3..1663c7e852 100644 --- a/index.md +++ b/index.md @@ -350,6 +350,10 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal +### grep + + The client-side may utilize `--grep` as well, however you use the query-string, for example `?grep=api`. + ## mocha.opts Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: From 82765058ff574c4bc673fb70f0c85ebacfda856e Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Sun, 4 Dec 2011 09:20:45 -0800 Subject: [PATCH 0048/1771] build --- index.html | 179 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 79 deletions(-) diff --git a/index.html b/index.html index ad1225330c..3cc9248086 100644 --- a/index.html +++ b/index.html @@ -30,37 +30,37 @@

    Features

  • growl notification support
  • reports test durations
  • highlights slow tests
  • +
  • file watcher support
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent “hanging” with an active loop
  • +
  • auto-exit to prevent "hanging" with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • mocha-debug(1) for node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or “interfaces”
  • +
  • extensible test DSLs or "interfaces"
  • before, after, before each, after each hooks
  • coffee-script support
  • TextMate bundle
  • and more!
  • -

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others.

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -89,7 +89,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -101,7 +101,7 @@ 

    Asynchronous code

    })
    -

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -130,7 +130,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -141,11 +141,11 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the “spec” reporter:

    + as shown here with the "spec" reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    @@ -161,35 +161,53 @@

    mocha(1)

    -g, --grep <pattern> only run tests matching <pattern> -t, --timeout <ms> set test-case timeout in milliseconds [2000] -s, --slow <ms> "slow" test threshold in milliseconds [75] + -w, --watch watch test files for changes -C, --no-colors force disabling of colors - -G, --growl enable growl support + -c, --colors force enabling of colors + -G, --growl enable growl notification support + --globals <names> allow the given comma-delimited global [names] + --ignore-leaks ignore global variable leaks + --interfaces display available interfaces + --reporters display available reporters
    -

    -r, —require <name>

    +

    -w, --watch

    + +

    Executes tests on changes to the test files.

    + +

    --globals <names>

    + +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    + +

    --ignore-leaks

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -u, —ui <name>

    +

    -r, --require <name>

    -

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -R, —reporter <name>

    +

    -u, --ui <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    +

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    -

    -t, —timeout <ms>

    +

    -R, --reporter <name>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    -

    -s, —slow <ms>

    +

    -t, --timeout <ms>

    -

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -g, —grep <pattern>

    +

    -s, --slow <ms>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    -g, --grep <pattern>

    + +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    + +

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -206,15 +224,15 @@ 

    -g, —grep <pattern>

    mocha-debug(1)

    -

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    +

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    Interfaces

    -

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -231,7 +249,7 @@ 

    BDD

    TDD

    -

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    +

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -248,7 +266,7 @@ 

    TDD

    Exports

    -

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -268,76 +286,76 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The “dot” matrix reporter is simply a series of dots +

    The "dot" matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The “spec” reporter outputs a hierarchical view +

    The "spec" reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The “List” reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The "List" reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    +

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The “doc” reporter outputs a hierarchical HTML body representation +

    The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -349,7 +367,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -368,14 +386,14 @@ 

    Doc

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
     <link rel="stylesheet" href="style.css" />
    @@ -387,16 +405,20 @@ 

    Browser support

    <script>onload = mocha.run;</script>
    +

    grep

    + +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -406,7 +428,7 @@

    mocha.opts

    Suite merging

    -

    Suites with common names are “merged” in order +

    Suites with common names are "merged" in order to produce unified reporting, especially when meta-generating tests.

    @@ -433,20 +455,20 @@

    Suite merging

    })
    -

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    +

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    -

    mocha suite merging

    +

    mocha suite merging

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it’s usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it's usually a good place to put your tests.

    Makefiles

    -

    Be kind and don’t make developers hunt around in your docs to figure +

    Be kind and don't make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -458,11 +480,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -471,31 +493,30 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    +

    Running mocha's tests

    -

    Running mocha’s tests

    - -

    Run the tests:

    +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    From 4a112f3522b9b7aeb50dfca904a08a7f53f8cd71 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 9 Dec 2011 08:41:47 -0800 Subject: [PATCH 0049/1771] removed suite merging --- index.md | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/index.md b/index.md index 5ccd22f9fb..009b8bc350 100644 --- a/index.md +++ b/index.md @@ -392,38 +392,6 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal $ mocha --reporter list --growl -## Suite merging - - Suites with common names are "merged" in order - to produce unified reporting, especially when - meta-generating tests. - - describe('merge', function(){ - describe('stuff', function(){ - describe('one', function(){ - it('should do something', function(){}) - }) - }) - }) - - describe('merge', function(){ - describe('stuff', function(){ - describe('two', function(){ - it('should do something', function(){}) - }) - }) - }) - - describe('merge stuff', function(){ - describe('three', function(){ - it('should do something', function(){}) - }) - }) - -Instead of reporting these as distinct suites, they are merged, yielding the following: - - ![mocha suite merging](http://f.cl.ly/items/380R3S1t1t0b0O2K250V/Screenshot.png) - ## Best practices ### test/* From 073328fc5cec7b1e069b947029506bdcb4f908be Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 9 Dec 2011 08:46:37 -0800 Subject: [PATCH 0050/1771] update browser example --- index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index 009b8bc350..aa1a6bd269 100644 --- a/index.md +++ b/index.md @@ -371,7 +371,13 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal - + ### grep From 58f029482a0f71bd933d2efc10902902711ae5c0 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 9 Dec 2011 08:47:16 -0800 Subject: [PATCH 0051/1771] misc --- index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index aa1a6bd269..66e9235eec 100644 --- a/index.md +++ b/index.md @@ -365,8 +365,8 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. - - + + From 654a1db1dff78d3ec2355f0aa02851377441f7e1 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 9 Dec 2011 08:47:50 -0800 Subject: [PATCH 0052/1771] hotlink --- index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.md b/index.md index 66e9235eec..1948ae0ece 100644 --- a/index.md +++ b/index.md @@ -379,6 +379,8 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }; + Feel free to hot-link the [mocha.css](https://raw.github.com/visionmedia/mocha/master/mocha.css) and [mocha.js](https://raw.github.com/visionmedia/mocha/master/mocha.js) from GitHub. + ### grep The client-side may utilize `--grep` as well, however you use the query-string, for example `?grep=api`. From b8d4293e4d62edb77b273988934c41993ad3b2dc Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 9 Dec 2011 08:47:54 -0800 Subject: [PATCH 0053/1771] build --- index.html | 209 ++++++++++++++++++++++++----------------------------- 1 file changed, 93 insertions(+), 116 deletions(-) diff --git a/index.html b/index.html index 3cc9248086..3f97985cde 100644 --- a/index.html +++ b/index.html @@ -33,34 +33,35 @@

    Features

  • file watcher support
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent "hanging" with an active loop
  • +
  • auto-exit to prevent “hanging” with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • mocha-debug(1) for node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or "interfaces"
  • +
  • extensible test DSLs or “interfaces”
  • before, after, before each, after each hooks
  • coffee-script support
  • TextMate bundle
  • and more!
  • +

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others.

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -89,7 +90,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -101,7 +102,7 @@ 

    Asynchronous code

    })
    -

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -130,7 +131,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -141,11 +142,11 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the "spec" reporter:

    + as shown here with the “spec” reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    @@ -171,43 +172,43 @@

    mocha(1)

    --reporters display available reporters
    -

    -w, --watch

    +

    -w, —watch

    -

    Executes tests on changes to the test files.

    +

    Executes tests on changes to the test files.

    -

    --globals <names>

    +

    —globals <names>

    -

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    -

    --ignore-leaks

    +

    —ignore-leaks

    -

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -r, --require <name>

    +

    -r, —require <name>

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -u, --ui <name>

    +

    -u, —ui <name>

    -

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    +

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    -

    -R, --reporter <name>

    +

    -R, —reporter <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    -

    -t, --timeout <ms>

    +

    -t, —timeout <ms>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -s, --slow <ms>

    +

    -s, —slow <ms>

    -

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    -g, --grep <pattern>

    +

    -g, —grep <pattern>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    -

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -224,15 +225,15 @@ 

    -g, --grep <pattern>

    mocha-debug(1)

    -

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    +

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    Interfaces

    -

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -249,7 +250,7 @@ 

    BDD

    TDD

    -

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    +

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -266,7 +267,7 @@ 

    TDD

    Exports

    -

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -286,76 +287,76 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The "dot" matrix reporter is simply a series of dots +

    The “dot” matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The "spec" reporter outputs a hierarchical view +

    The “spec” reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The “List” reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    +

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The "doc" reporter outputs a hierarchical HTML body representation +

    The “doc” reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -367,7 +368,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -386,39 +387,47 @@ 

    Doc

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
    -<link rel="stylesheet" href="style.css" />
    -<script src="../mocha.js"></script>
    +<link rel="stylesheet" href="mocha.css" />
    +<script src="mocha.js"></script>
     <script>mocha.setup('bdd')</script>
     <script src="test.array.js"></script>
     <script src="test.object.js"></script>
     <script src="test.xhr.js"></script>
    -<script>onload = mocha.run;</script>
    +<script>
    +  onload = function(){
    +    mocha
    +      .run()
    +      .globals(['foo', 'bar']) // acceptable globals 
    +  };
    +</script>
     
    +

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    +

    grep

    -

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -426,49 +435,16 @@

    mocha.opts

    $ mocha --reporter list --growl
     
    -

    Suite merging

    - -

    Suites with common names are "merged" in order - to produce unified reporting, especially when - meta-generating tests.

    - -
    describe('merge', function(){
    -  describe('stuff', function(){
    -    describe('one', function(){
    -      it('should do something', function(){})
    -    })
    -  })
    -})
    -
    -describe('merge', function(){
    -  describe('stuff', function(){
    -    describe('two', function(){
    -      it('should do something', function(){})
    -    })
    -  })
    -})
    -
    -describe('merge stuff', function(){
    -  describe('three', function(){
    -    it('should do something', function(){})
    -  })
    -})
    -
    - -

    Instead of reporting these as distinct suites, they are merged, yielding the following:

    - -

    mocha suite merging

    -

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it's usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it’s usually a good place to put your tests.

    Makefiles

    -

    Be kind and don't make developers hunt around in your docs to figure +

    Be kind and don’t make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -480,11 +456,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -493,30 +469,31 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    -

    Running mocha's tests

    -

    Run the tests:

    +

    Running mocha’s tests

    + +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    From 4017398acdd9f2adb0066870208c16b19875a077 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 14 Dec 2011 16:29:39 -0800 Subject: [PATCH 0054/1771] docs --- index.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/index.md b/index.md index 1948ae0ece..2d162b4cf7 100644 --- a/index.md +++ b/index.md @@ -9,6 +9,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - auto-detects and disables coloring for non-ttys - maps uncaught exceptions to the correct test case - async test timeout support + - test-specific timeouts - growl notification support - reports test durations - highlights slow tests @@ -400,6 +401,15 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal $ mocha --reporter list --growl +## Test specific timeouts + + To compliment the global `--timeout` option, you may also specific test-specific timeouts via `this.timeout()`, or disable the timeout all-together with `this.timeout(0)`. + + it('should take less than 500ms', function(done){ + this.timeout(500); + setTimeout(done, 300); + }) + ## Best practices ### test/* From e5b88f7da43dc3b2f8bd416c25429616a03bd73a Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 14 Dec 2011 16:29:44 -0800 Subject: [PATCH 0055/1771] update --- index.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/index.html b/index.html index 3f97985cde..1a9940efa1 100644 --- a/index.html +++ b/index.html @@ -27,6 +27,7 @@

    Features

  • auto-detects and disables coloring for non-ttys
  • maps uncaught exceptions to the correct test case
  • async test timeout support
  • +
  • test-specific timeouts
  • growl notification support
  • reports test durations
  • highlights slow tests
  • @@ -435,6 +436,16 @@

    mocha.opts

    $ mocha --reporter list --growl
     
    +

    Test specific timeouts

    + +

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    + +
    it('should take less than 500ms', function(done){
    +  this.timeout(500);
    +  setTimeout(done, 300);
    +})
    +
    +

    Best practices

    test/*

    From 5def8885b7b741c572b259117dd0fcb378abe007 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 15 Dec 2011 08:35:19 -0800 Subject: [PATCH 0056/1771] chai link --- index.html | 8 +++++++- index.md | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 1a9940efa1..0f72dbfb42 100644 --- a/index.html +++ b/index.html @@ -58,7 +58,13 @@

    Installation

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others.

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    + +
      +
    • should.js should style shown throughout these docs
    • +
    • chai expect(), assert() and should style assertions
    • +
    +

    Synchronous code

    diff --git a/index.md b/index.md index 2d162b4cf7..01315688ca 100644 --- a/index.md +++ b/index.md @@ -37,7 +37,10 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej ## Assertions -Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. +Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: + + - [should.js](http://github.com/visionmedia/should.js) should style shown throughout these docs + - [chai](https://github.com/logicalparadox/chai) expect(), assert() and should style assertions ## Synchronous code From 059a1c8bd84cf76008e8eb17b982875a7d204ec9 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 16 Dec 2011 08:25:22 -0800 Subject: [PATCH 0057/1771] link to new chai site --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 01315688ca..f7e8b07fc6 100644 --- a/index.md +++ b/index.md @@ -40,7 +40,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: - [should.js](http://github.com/visionmedia/should.js) should style shown throughout these docs - - [chai](https://github.com/logicalparadox/chai) expect(), assert() and should style assertions + - [chai](http://chaijs.com/) expect(), assert() and should style assertions ## Synchronous code From 160ce348c292334d04de739d91161db3c8a5a585 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 16 Dec 2011 08:25:25 -0800 Subject: [PATCH 0058/1771] compile --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 0f72dbfb42..2e0c30cae5 100644 --- a/index.html +++ b/index.html @@ -62,7 +62,7 @@

    Assertions

    • should.js should style shown throughout these docs
    • -
    • chai expect(), assert() and should style assertions
    • +
    • chai expect(), assert() and should style assertions
    From e4dc2dd6e2c0a7cb54c815649676dc6fd4e694c1 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Thu, 22 Dec 2011 05:53:55 -0800 Subject: [PATCH 0059/1771] docs for doc --- index.html | 177 ++++++++++++++++++++++++++++------------------------- index.md | 9 +++ 2 files changed, 101 insertions(+), 85 deletions(-) diff --git a/index.html b/index.html index 2e0c30cae5..efcfe413ce 100644 --- a/index.html +++ b/index.html @@ -34,41 +34,39 @@

    Features

  • file watcher support
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent “hanging” with an active loop
  • +
  • auto-exit to prevent "hanging" with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • mocha-debug(1) for node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or “interfaces”
  • +
  • extensible test DSLs or "interfaces"
  • before, after, before each, after each hooks
  • coffee-script support
  • TextMate bundle
  • and more!
  • -

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    • should.js should style shown throughout these docs
    • chai expect(), assert() and should style assertions
    -

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -97,7 +95,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -109,7 +107,7 @@ 

    Asynchronous code

    })
    -

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -138,7 +136,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -149,11 +147,11 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the “spec” reporter:

    + as shown here with the "spec" reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    @@ -179,43 +177,43 @@

    mocha(1)

    --reporters display available reporters
    -

    -w, —watch

    +

    -w, --watch

    -

    Executes tests on changes to the test files.

    +

    Executes tests on changes to the test files.

    -

    —globals <names>

    +

    --globals <names>

    -

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    -

    —ignore-leaks

    +

    --ignore-leaks

    -

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -r, —require <name>

    +

    -r, --require <name>

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -u, —ui <name>

    +

    -u, --ui <name>

    -

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    +

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    -

    -R, —reporter <name>

    +

    -R, --reporter <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    -

    -t, —timeout <ms>

    +

    -t, --timeout <ms>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -s, —slow <ms>

    +

    -s, --slow <ms>

    -

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    -g, —grep <pattern>

    +

    -g, --grep <pattern>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    -

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -232,15 +230,15 @@ 

    -g, —grep <pattern>

    mocha-debug(1)

    -

    mocha-debug(1) is identical to mocha(1), however it enables node’s debugger so you may step through tests with the debugger statement.

    +

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    Interfaces

    -

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -257,7 +255,7 @@ 

    BDD

    TDD

    -

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    +

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -274,7 +272,7 @@ 

    TDD

    Exports

    -

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -294,76 +292,76 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The “dot” matrix reporter is simply a series of dots +

    The "dot" matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The “spec” reporter outputs a hierarchical view +

    The "spec" reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The “List” reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The "List" reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    +

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The “doc” reporter outputs a hierarchical HTML body representation +

    The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -375,7 +373,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -392,16 +390,26 @@ 

    Doc

    </section>
    +

    The SuperAgent request library test documentation was generated with Mocha's doc reporter using this simple make target:

    + +
    test-docs:
    +    make test REPORTER=doc \
    +        | cat docs/head.html - docs/tail.html \
    +        > docs/test.html
    +
    + +

    View the entire Makefile for reference.

    +

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
     <link rel="stylesheet" href="mocha.css" />
    @@ -419,22 +427,22 @@ 

    Browser support

    </script>
    -

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    +

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    grep

    -

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -444,7 +452,7 @@

    mocha.opts

    Test specific timeouts

    -

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    +

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    it('should take less than 500ms', function(done){
       this.timeout(500);
    @@ -456,12 +464,12 @@ 

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it’s usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it's usually a good place to put your tests.

    Makefiles

    -

    Be kind and don’t make developers hunt around in your docs to figure +

    Be kind and don't make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -473,11 +481,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -486,31 +494,30 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    +

    Running mocha's tests

    -

    Running mocha’s tests

    - -

    Run the tests:

    +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    diff --git a/index.md b/index.md index f7e8b07fc6..9e391e8726 100644 --- a/index.md +++ b/index.md @@ -357,6 +357,15 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal + The SuperAgent request library [test documentation](http://visionmedia.github.com/superagent/docs/test.html) was generated with Mocha's doc reporter using this simple make target: + + test-docs: + make test REPORTER=doc \ + | cat docs/head.html - docs/tail.html \ + > docs/test.html + + View the entire [Makefile](https://github.com/visionmedia/superagent/blob/master/Makefile) for reference. + ### HTML The __HTML__ reporter is currently the only browser reporter From aa494a2b438862d5e7aca6d44e4d8fb6b00277b6 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Thu, 22 Dec 2011 07:18:46 -0800 Subject: [PATCH 0060/1771] debug docs --- index.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/index.md b/index.md index 9e391e8726..92a54105f9 100644 --- a/index.md +++ b/index.md @@ -19,7 +19,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej - auto-exit to prevent "hanging" with an active loop - easily meta-generate suites & test-cases - mocha.opts file support - - `mocha-debug(1)` for node debugger support + - node debugger support - detects multiple calls to `done()` - use any assertion library you want - extensible reporting, bundled with 9+ reporters @@ -128,11 +128,10 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ## mocha(1) - Usage: mocha [options] [files] - + Options: - + -h, --help output usage information -V, --version output the version number -r, --require require the given module @@ -145,6 +144,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -C, --no-colors force disabling of colors -c, --colors force enabling of colors -G, --growl enable growl notification support + -d, --debug enable node's debugger --globals allow the given comma-delimited global [names] --ignore-leaks ignore global variable leaks --interfaces display available interfaces @@ -154,6 +154,10 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal Executes tests on changes to the test files. +### -d, --debug + + Enables node's debugger support, this executes your script(s) with `node debug ` allowing you to step through code and break with the __debugger__ statement. + ### --globals <names> Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--globals app,YUI`. @@ -200,10 +204,6 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }) }) -## mocha-debug(1) - - `mocha-debug(1)` is identical to `mocha(1)`, however it enables node's debugger so you may step through tests with the __debugger__ statement. - ## Interfaces Mocha "interface" system allows developers to choose their style of DSL. Shipping with __BDD__, __TDD__, and __exports__ flavoured interfaces. From 8b92dbc1c9675319efda5acac43f9f7aa0796ab0 Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Thu, 22 Dec 2011 07:18:50 -0800 Subject: [PATCH 0061/1771] build --- index.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index efcfe413ce..5778a6f2b2 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,7 @@

    Features

  • auto-exit to prevent "hanging" with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • -
  • mocha-debug(1) for node debugger support
  • +
  • node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • @@ -171,6 +171,7 @@

    mocha(1)

    -C, --no-colors force disabling of colors -c, --colors force enabling of colors -G, --growl enable growl notification support + -d, --debug enable node's debugger --globals <names> allow the given comma-delimited global [names] --ignore-leaks ignore global variable leaks --interfaces display available interfaces @@ -181,6 +182,10 @@

    -w, --watch

    Executes tests on changes to the test files.

    +

    -d, --debug

    + +

    Enables node's debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    +

    --globals <names>

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    @@ -228,10 +233,6 @@

    -g, --grep <pattern>

    })
    -

    mocha-debug(1)

    - -

    mocha-debug(1) is identical to mocha(1), however it enables node's debugger so you may step through tests with the debugger statement.

    -

    Interfaces

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    From 77354a33ed8bf8bd19f37631eec8cb72480cc8bb Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 3 Jan 2012 17:44:40 -0800 Subject: [PATCH 0062/1771] Added link to expect.js --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index 92a54105f9..45b4682756 100644 --- a/index.md +++ b/index.md @@ -40,6 +40,7 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: - [should.js](http://github.com/visionmedia/should.js) should style shown throughout these docs + - [expect.js](https://github.com/LearnBoost/expect.js) expect()-style assertions - [chai](http://chaijs.com/) expect(), assert() and should style assertions ## Synchronous code From edd17d929b259f5048605ff0d6bd39934b52337a Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 3 Jan 2012 17:46:24 -0800 Subject: [PATCH 0063/1771] build --- index.html | 174 +++++++++++++++++++++++++++-------------------------- 1 file changed, 89 insertions(+), 85 deletions(-) diff --git a/index.html b/index.html index 5778a6f2b2..deb6fec8e6 100644 --- a/index.html +++ b/index.html @@ -34,39 +34,42 @@

    Features

  • file watcher support
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent "hanging" with an active loop
  • +
  • auto-exit to prevent “hanging” with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or "interfaces"
  • +
  • extensible test DSLs or “interfaces”
  • before, after, before each, after each hooks
  • coffee-script support
  • TextMate bundle
  • and more!
  • +

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    • should.js should style shown throughout these docs
    • +
    • expect.js expect()-style assertions
    • chai expect(), assert() and should style assertions
    +

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -95,7 +98,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -107,7 +110,7 @@ 

    Asynchronous code

    })
    -

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -136,7 +139,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -147,11 +150,11 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the "spec" reporter:

    + as shown here with the “spec” reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    @@ -178,47 +181,47 @@

    mocha(1)

    --reporters display available reporters
    -

    -w, --watch

    +

    -w, —watch

    -

    Executes tests on changes to the test files.

    +

    Executes tests on changes to the test files.

    -

    -d, --debug

    +

    -d, —debug

    -

    Enables node's debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    +

    Enables node’s debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    -

    --globals <names>

    +

    —globals <names>

    -

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    -

    --ignore-leaks

    +

    —ignore-leaks

    -

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -r, --require <name>

    +

    -r, —require <name>

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -u, --ui <name>

    +

    -u, —ui <name>

    -

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    +

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    -

    -R, --reporter <name>

    +

    -R, —reporter <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    -

    -t, --timeout <ms>

    +

    -t, —timeout <ms>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -s, --slow <ms>

    +

    -s, —slow <ms>

    -

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    -g, --grep <pattern>

    +

    -g, —grep <pattern>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    -

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -235,11 +238,11 @@ 

    -g, --grep <pattern>

    Interfaces

    -

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -256,7 +259,7 @@ 

    BDD

    TDD

    -

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    +

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -273,7 +276,7 @@ 

    TDD

    Exports

    -

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -293,76 +296,76 @@ 

    Exports

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The "dot" matrix reporter is simply a series of dots +

    The “dot” matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The "spec" reporter outputs a hierarchical view +

    The “spec” reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The “List” reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    +

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The "doc" reporter outputs a hierarchical HTML body representation +

    The “doc” reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -374,7 +377,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -391,7 +394,7 @@ 

    Doc

    </section>
    -

    The SuperAgent request library test documentation was generated with Mocha's doc reporter using this simple make target:

    +

    The SuperAgent request library test documentation was generated with Mocha’s doc reporter using this simple make target:

    test-docs:
         make test REPORTER=doc \
    @@ -399,18 +402,18 @@ 

    Doc

    > docs/test.html
    -

    View the entire Makefile for reference.

    +

    View the entire Makefile for reference.

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
     <link rel="stylesheet" href="mocha.css" />
    @@ -428,22 +431,22 @@ 

    Browser support

    </script>
    -

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    +

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    grep

    -

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -453,7 +456,7 @@

    mocha.opts

    Test specific timeouts

    -

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    +

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    it('should take less than 500ms', function(done){
       this.timeout(500);
    @@ -465,12 +468,12 @@ 

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it's usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it’s usually a good place to put your tests.

    Makefiles

    -

    Be kind and don't make developers hunt around in your docs to figure +

    Be kind and don’t make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -482,11 +485,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -495,30 +498,31 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    -

    Running mocha's tests

    -

    Run the tests:

    +

    Running mocha’s tests

    + +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    From 07d59f5b2124f8b0a9057894eb087fce2a3192ab Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 3 Jan 2012 17:47:18 -0800 Subject: [PATCH 0064/1771] docs --- index.html | 4 ++-- index.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index deb6fec8e6..fcbe3eeed1 100644 --- a/index.html +++ b/index.html @@ -61,8 +61,8 @@

    Assertions

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

      -
    • should.js should style shown throughout these docs
    • -
    • expect.js expect()-style assertions
    • +
    • should.js BDD style shown throughout these docs
    • +
    • expect.js expect() style assertions
    • chai expect(), assert() and should style assertions
    diff --git a/index.md b/index.md index 45b4682756..f3f62f8cc2 100644 --- a/index.md +++ b/index.md @@ -39,8 +39,8 @@ Mocha is a feature-rich JavaScript test framework running on [node](http://nodej Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](http://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: - - [should.js](http://github.com/visionmedia/should.js) should style shown throughout these docs - - [expect.js](https://github.com/LearnBoost/expect.js) expect()-style assertions + - [should.js](http://github.com/visionmedia/should.js) BDD style shown throughout these docs + - [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions - [chai](http://chaijs.com/) expect(), assert() and should style assertions ## Synchronous code From 3bd2cb00f35c8841de2eec08dc90d4995aa765f9 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Tue, 3 Jan 2012 17:48:40 -0800 Subject: [PATCH 0065/1771] misc --- index.html | 8 ++++++++ index.md | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/index.html b/index.html index fcbe3eeed1..1729da7c5a 100644 --- a/index.html +++ b/index.html @@ -404,6 +404,14 @@

    Doc

    View the entire Makefile for reference.

    +

    XUnit

    + +

    Documentation needed.

    + +

    TeamCity

    + +

    Documentation needed.

    +

    HTML

    The HTML reporter is currently the only browser reporter diff --git a/index.md b/index.md index f3f62f8cc2..ae5eb17469 100644 --- a/index.md +++ b/index.md @@ -367,6 +367,14 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal View the entire [Makefile](https://github.com/visionmedia/superagent/blob/master/Makefile) for reference. +### XUnit + + Documentation needed. + +### TeamCity + + Documentation needed. + ### HTML The __HTML__ reporter is currently the only browser reporter From 62efe945e51c3abeca839bcbfcf191c12becf8b0 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 5 Jan 2012 16:47:20 -0800 Subject: [PATCH 0066/1771] update docs --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index ae5eb17469..95fa2d5907 100644 --- a/index.md +++ b/index.md @@ -141,7 +141,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal -g, --grep only run tests matching -t, --timeout set test-case timeout in milliseconds [2000] -s, --slow "slow" test threshold in milliseconds [75] - -w, --watch watch test files for changes + -w, --watch watch files for changes -C, --no-colors force disabling of colors -c, --colors force enabling of colors -G, --growl enable growl notification support From d1bf171129f7f7520edd4aae41ed5e6722555238 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 5 Jan 2012 16:47:23 -0800 Subject: [PATCH 0067/1771] misc --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 1729da7c5a..1fae789431 100644 --- a/index.html +++ b/index.html @@ -170,7 +170,7 @@

    mocha(1)

    -g, --grep <pattern> only run tests matching <pattern> -t, --timeout <ms> set test-case timeout in milliseconds [2000] -s, --slow <ms> "slow" test threshold in milliseconds [75] - -w, --watch watch test files for changes + -w, --watch watch files for changes -C, --no-colors force disabling of colors -c, --colors force enabling of colors -G, --growl enable growl notification support From 1be999ea2a1ab52fb4eeda6eb47c0af38a6a7fbf Mon Sep 17 00:00:00 2001 From: Will Langstroth Date: Fri, 6 Jan 2012 12:57:13 -0500 Subject: [PATCH 0068/1771] update browser example --- index.md | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/index.md b/index.md index 95fa2d5907..194da918be 100644 --- a/index.md +++ b/index.md @@ -385,21 +385,31 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ## Browser support Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. - - - - - - - - - + + + + + Mocha Tests + + + + + + + + + + + +
    + + Feel free to hot-link the [mocha.css](https://raw.github.com/visionmedia/mocha/master/mocha.css) and [mocha.js](https://raw.github.com/visionmedia/mocha/master/mocha.js) from GitHub. From 9f6db18ae94f24dfd4d4a60702564b688444762e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Fri, 13 Jan 2012 09:02:20 -0800 Subject: [PATCH 0069/1771] Updated CLI help on website. --- index.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 3cc9248086..665c7708c6 100644 --- a/index.html +++ b/index.html @@ -161,10 +161,13 @@

    mocha(1)

    -g, --grep <pattern> only run tests matching <pattern> -t, --timeout <ms> set test-case timeout in milliseconds [2000] -s, --slow <ms> "slow" test threshold in milliseconds [75] - -w, --watch watch test files for changes + -w, --watch watch files for changes -C, --no-colors force disabling of colors -c, --colors force enabling of colors -G, --growl enable growl notification support + -S, --say [voice] enable say notification support + -d, --debug enable node's debugger + -b, --bail bail after first test failure --globals <names> allow the given comma-delimited global [names] --ignore-leaks ignore global variable leaks --interfaces display available interfaces @@ -525,4 +528,4 @@

    Running mocha's tests

    © 2011 TJ Holowaychuk. All rights reserved. - \ No newline at end of file + From 6e93dc513c9f9770bdf24d259b62a583134c86f2 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 13 Jan 2012 09:23:30 -0800 Subject: [PATCH 0070/1771] --bail docs --- index.md | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/index.md b/index.md index 194da918be..aacbd5d80a 100644 --- a/index.md +++ b/index.md @@ -129,32 +129,37 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ## mocha(1) - Usage: mocha [options] [files] - - Options: - - -h, --help output usage information - -V, --version output the version number - -r, --require require the given module - -R, --reporter specify the reporter to use - -u, --ui specify user-interface (bdd|tdd|exports) - -g, --grep only run tests matching - -t, --timeout set test-case timeout in milliseconds [2000] - -s, --slow "slow" test threshold in milliseconds [75] - -w, --watch watch files for changes - -C, --no-colors force disabling of colors - -c, --colors force enabling of colors - -G, --growl enable growl notification support - -d, --debug enable node's debugger - --globals allow the given comma-delimited global [names] - --ignore-leaks ignore global variable leaks - --interfaces display available interfaces - --reporters display available reporters + Usage: mocha [options] [files] + + Options: + + -h, --help output usage information + -V, --version output the version number + -r, --require require the given module + -R, --reporter specify the reporter to use + -u, --ui specify user-interface (bdd|tdd|exports) + -g, --grep only run tests matching + -t, --timeout set test-case timeout in milliseconds [2000] + -s, --slow "slow" test threshold in milliseconds [75] + -w, --watch watch files for changes + -C, --no-colors force disabling of colors + -c, --colors force enabling of colors + -G, --growl enable growl notification support + -d, --debug enable node's debugger + -b, --bail bail after first test failure + --globals allow the given comma-delimited global [names] + --ignore-leaks ignore global variable leaks + --interfaces display available interfaces + --reporters display available reporters ### -w, --watch Executes tests on changes to the test files. +### -b, --bail + + Only interested in the first exception? use `--bail` ! + ### -d, --debug Enables node's debugger support, this executes your script(s) with `node debug ` allowing you to step through code and break with the __debugger__ statement. From 8574c67b1490232e75d55b5b8a4514f0a8760fb9 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 13 Jan 2012 09:25:08 -0800 Subject: [PATCH 0071/1771] qunit example --- index.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/index.md b/index.md index aacbd5d80a..3529ca3870 100644 --- a/index.md +++ b/index.md @@ -265,6 +265,34 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal } }; +### QUnit + + The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. + + function ok(expr, msg) { + if (!expr) throw new Error(msg); + } + + suite('Array'); + + test('#length', function(){ + var arr = [1,2,3]; + ok(arr.length == 3); + }); + + test('#indexOf()', function(){ + var arr = [1,2,3]; + ok(arr.indexOf(1) == 0); + ok(arr.indexOf(2) == 1); + ok(arr.indexOf(3) == 2); + }); + + suite('String'); + + test('#length', function(){ + ok('foo'.length == 3); + }); + ## Reporters Mocha reporters adjust to the terminal window, From 4c2b776c5d3ce3aa45287c7ecb6106ff0a621405 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 13 Jan 2012 09:25:32 -0800 Subject: [PATCH 0072/1771] update --swatch docs --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 3529ca3870..a0aea15f73 100644 --- a/index.md +++ b/index.md @@ -154,7 +154,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal ### -w, --watch - Executes tests on changes to the test files. + Executes tests on changes to JavaScript in the CWD. ### -b, --bail From 3e4b9fb4e0a07afe5b561b75f7c035f4cbcc4355 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 13 Jan 2012 09:26:11 -0800 Subject: [PATCH 0073/1771] build --- index.html | 120 ++++++++++++++++++++++++++++++++++++----------------- index.md | 36 ++++++++-------- 2 files changed, 99 insertions(+), 57 deletions(-) diff --git a/index.html b/index.html index 538da498e7..a40869096e 100644 --- a/index.html +++ b/index.html @@ -158,34 +158,37 @@

    Test duration

    mocha(1)

    -
    Usage: mocha [options] [files]
    -
    -Options:
    -
    -  -h, --help             output usage information
    -  -V, --version          output the version number
    -  -r, --require <name>   require the given module
    -  -R, --reporter <name>  specify the reporter to use
    -  -u, --ui <name>        specify user-interface (bdd|tdd|exports)
    -  -g, --grep <pattern>   only run tests matching <pattern>
    -  -t, --timeout <ms>     set test-case timeout in milliseconds [2000]
    -  -s, --slow <ms>        "slow" test threshold in milliseconds [75]
    -  -w, --watch            watch files for changes
    -  -C, --no-colors        force disabling of colors
    -  -c, --colors           force enabling of colors
    -  -G, --growl            enable growl notification support
    -  -S, --say [voice]      enable say notification support
    -  -d, --debug            enable node's debugger
    -  -b, --bail             bail after first test failure
    -  --globals <names>      allow the given comma-delimited global [names]
    -  --ignore-leaks         ignore global variable leaks
    -  --interfaces           display available interfaces
    -  --reporters            display available reporters
    +

    Usage: mocha [options] [files]

    + +

    Options:

    + +
    -h, --help             output usage information
    +-V, --version          output the version number
    +-r, --require <name>   require the given module
    +-R, --reporter <name>  specify the reporter to use
    +-u, --ui <name>        specify user-interface (bdd|tdd|exports)
    +-g, --grep <pattern>   only run tests matching <pattern>
    +-t, --timeout <ms>     set test-case timeout in milliseconds [2000]
    +-s, --slow <ms>        "slow" test threshold in milliseconds [75]
    +-w, --watch            watch files for changes
    +-C, --no-colors        force disabling of colors
    +-c, --colors           force enabling of colors
    +-G, --growl            enable growl notification support
    +-d, --debug            enable node's debugger
    +-b, --bail             bail after first test failure
    +--globals <names>      allow the given comma-delimited global [names]
    +--ignore-leaks         ignore global variable leaks
    +--interfaces           display available interfaces
    +--reporters            display available reporters
     

    -w, —watch

    -

    Executes tests on changes to the test files.

    +

    Executes tests on changes to JavaScript in the CWD.

    + +

    -b, —bail

    + +

    Only interested in the first exception? use --bail !

    -d, —debug

    @@ -296,6 +299,35 @@

    Exports

    };
    +

    QUnit

    + +

    The qunit-inspired interface matches the “flat” look of QUnit where the test suite title is simply defined before the test-cases.

    + +
    function ok(expr, msg) {
    +  if (!expr) throw new Error(msg);
    +}
    +
    +suite('Array');
    +
    +test('#length', function(){
    +  var arr = [1,2,3];
    +  ok(arr.length == 3);
    +});
    +
    +test('#indexOf()', function(){
    +  var arr = [1,2,3];
    +  ok(arr.indexOf(1) == 0);
    +  ok(arr.indexOf(2) == 1);
    +  ok(arr.indexOf(3) == 2);
    +});
    +
    +suite('String');
    +
    +test('#length', function(){
    +  ok('foo'.length == 3);
    +});
    +
    +

    Reporters

    Mocha reporters adjust to the terminal window, @@ -425,20 +457,30 @@

    Browser support

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    -
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
    -<link rel="stylesheet" href="mocha.css" />
    -<script src="mocha.js"></script>
    -<script>mocha.setup('bdd')</script>
    -<script src="test.array.js"></script>
    -<script src="test.object.js"></script>
    -<script src="test.xhr.js"></script>
    -<script>
    -  onload = function(){
    -    mocha
    -      .run()
    -      .globals(['foo', 'bar']) // acceptable globals 
    -  };
    -</script>
    +
    <html>
    +<head>
    +  <meta charset="utf-8">
    +  <title>Mocha Tests</title>
    +  <link rel="stylesheet" href="https://raw.github.com/visionmedia/mocha/master/mocha.css" />
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    +  <script src="https://raw.github.com/LearnBoost/expect.js/d2440da086bf8dc38c6085641f23b968a0f48b29/expect.js"></script>
    +  <script src="https://raw.github.com/visionmedia/mocha/master/mocha.js"></script>
    +  <script>mocha.setup('bdd')</script>
    +  <script src="test.array.js"></script>
    +  <script src="test.object.js"></script>
    +  <script src="test.xhr.js"></script>
    +  <script>
    +    $(function () {
    +      mocha
    +        .run()
    +        .globals(['foo', 'bar']) // acceptable globals
    +    })
    +  </script>
    +</head>
    +<body>
    +  <div id="mocha"></div>
    +</body>
    +</html>
     

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    @@ -541,4 +583,4 @@

    Running mocha’s tests

    © 2011 TJ Holowaychuk. All rights reserved. - + \ No newline at end of file diff --git a/index.md b/index.md index a0aea15f73..9db8c4eab8 100644 --- a/index.md +++ b/index.md @@ -269,29 +269,29 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. - function ok(expr, msg) { - if (!expr) throw new Error(msg); - } + function ok(expr, msg) { + if (!expr) throw new Error(msg); + } - suite('Array'); + suite('Array'); - test('#length', function(){ - var arr = [1,2,3]; - ok(arr.length == 3); - }); + test('#length', function(){ + var arr = [1,2,3]; + ok(arr.length == 3); + }); - test('#indexOf()', function(){ - var arr = [1,2,3]; - ok(arr.indexOf(1) == 0); - ok(arr.indexOf(2) == 1); - ok(arr.indexOf(3) == 2); - }); + test('#indexOf()', function(){ + var arr = [1,2,3]; + ok(arr.indexOf(1) == 0); + ok(arr.indexOf(2) == 1); + ok(arr.indexOf(3) == 2); + }); - suite('String'); + suite('String'); - test('#length', function(){ - ok('foo'.length == 3); - }); + test('#length', function(){ + ok('foo'.length == 3); + }); ## Reporters From 20eb2f5ee7fa983550dd370af083144e4195b58b Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Thu, 2 Feb 2012 19:33:38 -0800 Subject: [PATCH 0074/1771] added link to wiki --- index.html | 191 +++++++++++++++++++++++++++-------------------------- index.md | 3 + 2 files changed, 99 insertions(+), 95 deletions(-) diff --git a/index.html b/index.html index a40869096e..6bd181fd21 100644 --- a/index.html +++ b/index.html @@ -34,31 +34,30 @@

    Features

  • file watcher support
  • global variable leak detection
  • optionally run tests that match a regexp
  • -
  • auto-exit to prevent “hanging” with an active loop
  • +
  • auto-exit to prevent "hanging" with an active loop
  • easily meta-generate suites & test-cases
  • mocha.opts file support
  • node debugger support
  • detects multiple calls to done()
  • use any assertion library you want
  • extensible reporting, bundled with 9+ reporters
  • -
  • extensible test DSLs or “interfaces”
  • +
  • extensible test DSLs or "interfaces"
  • before, after, before each, after each hooks
  • coffee-script support
  • TextMate bundle
  • and more!
  • -

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    • should.js BDD style shown throughout these docs
    • @@ -66,10 +65,9 @@

      Assertions

    • chai expect(), assert() and should style assertions
    -

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -98,7 +96,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -110,7 +108,7 @@ 

    Asynchronous code

    })
    -

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -139,7 +137,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -150,17 +148,17 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the “spec” reporter:

    + as shown here with the "spec" reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    -

    Usage: mocha [options] [files]

    +

    Usage: mocha [options] [files]

    -

    Options:

    +

    Options:

    -h, --help             output usage information
     -V, --version          output the version number
    @@ -182,51 +180,51 @@ 

    mocha(1)

    --reporters display available reporters
    -

    -w, —watch

    +

    -w, --watch

    -

    Executes tests on changes to JavaScript in the CWD.

    +

    Executes tests on changes to JavaScript in the CWD.

    -

    -b, —bail

    +

    -b, --bail

    -

    Only interested in the first exception? use --bail !

    +

    Only interested in the first exception? use --bail !

    -

    -d, —debug

    +

    -d, --debug

    -

    Enables node’s debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    +

    Enables node's debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    -

    —globals <names>

    +

    --globals <names>

    -

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    -

    —ignore-leaks

    +

    --ignore-leaks

    -

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -r, —require <name>

    +

    -r, --require <name>

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -u, —ui <name>

    +

    -u, --ui <name>

    -

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    +

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    -

    -R, —reporter <name>

    +

    -R, --reporter <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    -

    -t, —timeout <ms>

    +

    -t, --timeout <ms>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -s, —slow <ms>

    +

    -s, --slow <ms>

    -

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    -g, —grep <pattern>

    +

    -g, --grep <pattern>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    -

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -243,11 +241,11 @@ 

    -g, —grep <pattern>

    Interfaces

    -

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -264,7 +262,7 @@ 

    BDD

    TDD

    -

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    +

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -281,7 +279,7 @@ 

    TDD

    Exports

    -

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -301,7 +299,7 @@ 

    Exports

    QUnit

    -

    The qunit-inspired interface matches the “flat” look of QUnit where the test suite title is simply defined before the test-cases.

    +

    The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases.

    function ok(expr, msg) {
       if (!expr) throw new Error(msg);
    @@ -330,76 +328,76 @@ 

    QUnit

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The “dot” matrix reporter is simply a series of dots +

    The "dot" matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The “spec” reporter outputs a hierarchical view +

    The "spec" reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The “List” reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The "List" reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    +

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    -

    json stream reporter

    +

    json stream reporter

    Doc

    -

    The “doc” reporter outputs a hierarchical HTML body representation +

    The "doc" reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -411,7 +409,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -428,7 +426,7 @@ 

    Doc

    </section>
    -

    The SuperAgent request library test documentation was generated with Mocha’s doc reporter using this simple make target:

    +

    The SuperAgent request library test documentation was generated with Mocha's doc reporter using this simple make target:

    test-docs:
         make test REPORTER=doc \
    @@ -436,26 +434,26 @@ 

    Doc

    > docs/test.html
    -

    View the entire Makefile for reference.

    +

    View the entire Makefile for reference.

    XUnit

    -

    Documentation needed.

    +

    Documentation needed.

    TeamCity

    -

    Documentation needed.

    +

    Documentation needed.

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <html>
     <head>
    @@ -483,22 +481,22 @@ 

    Browser support

    </html>
    -

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    +

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    grep

    -

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -508,7 +506,7 @@

    mocha.opts

    Test specific timeouts

    -

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    +

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    it('should take less than 500ms', function(done){
       this.timeout(500);
    @@ -520,12 +518,12 @@ 

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it’s usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it's usually a good place to put your tests.

    Makefiles

    -

    Be kind and don’t make developers hunt around in your docs to figure +

    Be kind and don't make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -537,11 +535,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -550,34 +548,37 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    +

    Running mocha's tests

    -

    Running mocha’s tests

    - -

    Run the tests:

    +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     
    + +

    More information

    + +

    For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub.

    © 2011 TJ Holowaychuk. All rights reserved. diff --git a/index.md b/index.md index 9db8c4eab8..2fc8c4b53e 100644 --- a/index.md +++ b/index.md @@ -529,3 +529,6 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal $ make test REPORTER=list +## More information + + For additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/visionmedia/mocha/wiki) on GitHub. \ No newline at end of file From e23fb9808069456370aebb4d02f90fb7d15b01cb Mon Sep 17 00:00:00 2001 From: TJ Holowaychuk Date: Thu, 23 Feb 2012 20:58:54 -0800 Subject: [PATCH 0075/1771] coverage docs --- coverage.html | 333 ++++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 202 ++++++++++++++++-------------- index.md | 13 ++ 3 files changed, 455 insertions(+), 93 deletions(-) create mode 100644 coverage.html diff --git a/coverage.html b/coverage.html new file mode 100644 index 0000000000..cbe9607e18 --- /dev/null +++ b/coverage.html @@ -0,0 +1,333 @@ +Coverage
    LineHitsSource
    1
    2/*!
    3 * Express
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Module dependencies.
    10 */
    11
    121var http = require('http')
    13 , connect = require('connect')
    14 , proto = require('./application')
    15 , Route = require('./router/route')
    16 , Router = require('./router')
    17 , req = require('./request')
    18 , res = require('./response')
    19 , utils = connect.utils;
    20
    21/**
    22 * Expose `createApplication()`.
    23 */
    24
    251exports = module.exports = createApplication;
    26
    27/**
    28 * Framework version.
    29 */
    30
    311exports.version = '3.0.0alpha1-pre';
    32
    33/**
    34 * Create an express application.
    35 *
    36 * @return {Function}
    37 * @api public
    38 */
    39
    401function createApplication() {
    41254 var app = connect();
    42254 utils.merge(app, proto);
    43254 app.request = { __proto__: req };
    44254 app.response = { __proto__: res };
    45254 app.init();
    46254 return app;
    47}
    48
    49/**
    50 * Expose connect.middleware as express.*
    51 * for example `express.logger` etc.
    52 */
    53
    541for (var key in connect.middleware) {
    5521 Object.defineProperty(
    56 exports
    57 , key
    58 , Object.getOwnPropertyDescriptor(connect.middleware, key));
    59}
    60
    61/**
    62 * Expose the prototypes.
    63 */
    64
    651exports.application = proto;
    661exports.request = req;
    671exports.response = res;
    68
    69/**
    70 * Expose constructors.
    71 */
    72
    731exports.Route = Route;
    741exports.Router = Router;
    75
    76/**
    77 * Expose HTTP methods.
    78 */
    79
    801exports.methods = require('./router/methods');
    81
    82// Error handler title
    83
    841exports.errorHandler.title = 'Express';
    85

    application.js

    86%
    136
    117
    19
    LineHitsSource
    1/*!
    2 * Express - proto
    3 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    4 * MIT Licensed
    5 */
    6
    7/**
    8 * Module dependencies.
    9 */
    10
    111var connect = require('connect')
    12 , Router = require('./router')
    13 , methods = Router.methods.concat('del', 'all')
    14 , middleware = require('./middleware')
    15 , debug = require('debug')('express:application')
    16 , View = require('./view')
    17 , url = require('url')
    18 , utils = connect.utils
    19 , path = require('path')
    20 , http = require('http')
    21 , join = path.join
    22 , fs = require('fs');
    23
    24/**
    25 * Application prototype.
    26 */
    27
    281var app = exports = module.exports = {};
    29
    30/**
    31 * Initialize the server.
    32 *
    33 * - setup default configuration
    34 * - setup default middleware
    35 * - setup route reflection methods
    36 *
    37 * @api private
    38 */
    39
    401app.init = function(){
    41254 var self = this;
    42254 this.cache = {};
    43254 this.settings = {};
    44254 this.engines = {};
    45254 this.viewCallbacks = [];
    46254 this.defaultConfiguration();
    47
    48 // route reflection methods
    49254 methods.forEach(function(method){
    506350 self.lookup[method] = function(path){
    510 return self._router.lookup(method, path);
    52 };
    53
    546350 self.remove[method] = function(path){
    550 return self._router.lookup(method, path).remove();
    56 };
    57 });
    58
    59 // del -> delete
    60254 self.lookup.del = self.lookup.delete;
    61254 self.remove.del = self.remove.delete;
    62};
    63
    64/**
    65 * Initialize application configuration.
    66 *
    67 * @api private
    68 */
    69
    701app.defaultConfiguration = function(){
    71254 var self = this;
    72
    73 // default settings
    74254 this.set('env', process.env.NODE_ENV || 'development');
    75254 debug('booting in %s mode', this.get('env'));
    76
    77 // implicit middleware
    78254 this.use(connect.query());
    79254 this.use(middleware.init(this));
    80
    81 // app locals
    82254 this.locals = function(obj){
    835 for (var key in obj) self.locals[key] = obj[key];
    842 return self;
    85 };
    86
    87 // response locals
    88254 this.locals.use = function(fn){
    894 if (3 == fn.length) {
    902 self.viewCallbacks.push(fn);
    91 } else {
    922 self.viewCallbacks.push(function(req, res, done){
    932 fn(req, res);
    942 done();
    95 });
    96 }
    974 return this;
    98 };
    99
    100 // router
    101254 this._router = new Router(this);
    102254 this.routes = this._router.routes;
    103254 this.__defineGetter__('router', function(){
    10467 this._usedRouter = true;
    10567 this._router.caseSensitive = this.enabled('case sensitive routing');
    10667 this._router.strict = this.enabled('strict routing');
    10767 return this._router.middleware;
    108 });
    109
    110 // default locals
    111254 this.locals.settings = this.settings;
    112
    113 // default configuration
    114254 this.configure('development', function(){
    1151 this.set('json spaces', 2);
    116 });
    117
    118254 this.configure('production', function(){
    1190 this.enable('view cache');
    120 });
    121};
    122
    123/**
    124 * Remove routes matching the given `path`.
    125 *
    126 * @param {Route} path
    127 * @return {Boolean}
    128 * @api public
    129 */
    130
    1311app.remove = function(path){
    1320 return this._router.lookup('all', path).remove();
    133};
    134
    135/**
    136 * Lookup routes defined with a path
    137 * equivalent to `path`.
    138 *
    139 * @param {String} path
    140 * @return {Array}
    141 * @api public
    142 */
    143
    1441app.lookup = function(path){
    1450 return this._router.lookup('all', path);
    146};
    147
    148/**
    149 * Proxy `connect#use()` to apply settings to
    150 * mounted applications.
    151 *
    152 * @param {String|Function|Server} route
    153 * @param {Function|Server} fn
    154 * @return {app} for chaining
    155 * @api public
    156 */
    157
    1581app.use = function(route, fn){
    159739 var app, home, handle;
    160
    161 // default route to '/'
    1621465 if ('string' != typeof route) fn = route, route = '/';
    163
    164 // express app
    165756 if (fn.handle && fn.set) app = fn;
    166
    167 // restore .app property on req and res
    168739 if (app) {
    16917 app.route = route;
    17017 fn = function(req, res, next) {
    1717 var orig = req.app;
    1727 app.handle(req, res, function(err){
    1730 req.app = res.app = orig;
    1740 next(err);
    175 });
    176 };
    177 }
    178
    179739 debug('use %s %s', route, fn.name || 'unnamed');
    180739 connect.proto.use.call(this, route, fn);
    181
    182 // mounted an app
    183739 if (app) {
    18417 app.parent = this;
    18517 app.emit('mount', this);
    186 }
    187
    188739 return this;
    189};
    190
    191/**
    192 * Register the given template engine callback `fn`
    193 * as `ext`. For example we may wish to map ".html"
    194 * files to ejs rather than using the ".ejs" extension.
    195 *
    196 * app.engine('.html', require('ejs').render);
    197 *
    198 * or
    199 *
    200 * app.engine('html', require('ejs').render);
    201 *
    202 * @param {String} ext
    203 * @param {Function} fn
    204 * @return {app} for chaining
    205 * @api public
    206 */
    207
    2081app.engine = function(ext, fn){
    2095 if ('.' != ext[0]) ext = '.' + ext;
    2103 this.engines[ext] = fn;
    2113 return this;
    212};
    213
    214/**
    215 * Map the given param placeholder `name`(s) to the given callback(s).
    216 *
    217 * Param mapping is used to provide pre-conditions to routes
    218 * which us normalized placeholders. This callback has the same
    219 * signature as regular middleware, for example below when ":userId"
    220 * is used this function will be invoked in an attempt to load the user.
    221 *
    222 * app.param('userId', function(req, res, next, id){
    223 * User.find(id, function(err, user){
    224 * if (err) {
    225 * next(err);
    226 * } else if (user) {
    227 * req.user = user;
    228 * next();
    229 * } else {
    230 * next(new Error('failed to load user'));
    231 * }
    232 * });
    233 * });
    234 *
    235 * Passing a single function allows you to map logic
    236 * to the values passed to `app.param()`, for example
    237 * this is useful to provide coercion support in a concise manner.
    238 *
    239 * The following example maps regular expressions to param values
    240 * ensuring that they match, otherwise passing control to the next
    241 * route:
    242 *
    243 * app.param(function(name, regexp){
    244 * if (regexp instanceof RegExp) {
    245 * return function(req, res, next, val){
    246 * var captures;
    247 * if (captures = regexp.exec(String(val))) {
    248 * req.params[name] = captures;
    249 * next();
    250 * } else {
    251 * next('route');
    252 * }
    253 * }
    254 * }
    255 * });
    256 *
    257 * We can now use it as shown below, where "/commit/:commit" expects
    258 * that the value for ":commit" is at 5 or more digits. The capture
    259 * groups are then available as `req.params.commit` as we defined
    260 * in the function above.
    261 *
    262 * app.param('commit', /^\d{5,}$/);
    263 *
    264 * For more of this useful functionality take a look
    265 * at [express-params](http://github.com/visionmedia/express-params).
    266 *
    267 * @param {String|Array|Function} name
    268 * @param {Function} fn
    269 * @return {app} for chaining
    270 * @api public
    271 */
    272
    2731app.param = function(name, fn){
    2740 var self = this
    275 , fns = [].slice.call(arguments, 1);
    276
    277 // array
    2780 if (Array.isArray(name)) {
    2790 name.forEach(function(name){
    2800 fns.forEach(function(fn){
    2810 self.param(name, fn);
    282 });
    283 });
    284 // param logic
    2850 } else if ('function' == typeof name) {
    2860 this._router.param(name);
    287 // single
    288 } else {
    2890 if (':' == name[0]) name = name.substr(1);
    2900 fns.forEach(function(fn){
    2910 self._router.param(name, fn);
    292 });
    293 }
    294
    2950 return this;
    296};
    297
    298/**
    299 * Assign `setting` to `val`, or return `setting`'s value.
    300 * Mounted servers inherit their parent server's settings.
    301 *
    302 * @param {String} setting
    303 * @param {String} val
    304 * @return {Server|Mixed} for chaining, or the setting value
    305 * @api public
    306 */
    307
    3081app.set = function(setting, val){
    309807 if (1 == arguments.length) {
    310494 if (this.settings.hasOwnProperty(setting)) {
    311302 return this.settings[setting];
    312192 } else if (this.parent) {
    3131 return this.parent.set(setting);
    314 }
    315 } else {
    316313 this.settings[setting] = val;
    317313 return this;
    318 }
    319};
    320
    321/**
    322 * Return the app's absolute pathname
    323 * based on the parent(s) that have
    324 * mounted it.
    325 *
    326 * @return {String}
    327 * @api private
    328 */
    329
    3301app.path = function(){
    33118 return this.parent
    332 ? this.parent.path() + this.route
    333 : '';
    334};
    335
    336/**
    337 * Check if `setting` is enabled.
    338 *
    339 * @param {String} setting
    340 * @return {Boolean}
    341 * @api public
    342 */
    343
    3441app.enabled = function(setting){
    345167 return !!this.set(setting);
    346};
    347
    348/**
    349 * Check if `setting` is disabled.
    350 *
    351 * @param {String} setting
    352 * @return {Boolean}
    353 * @api public
    354 */
    355
    3561app.disabled = function(setting){
    3572 return !this.set(setting);
    358};
    359
    360/**
    361 * Enable `setting`.
    362 *
    363 * @param {String} setting
    364 * @return {app} for chaining
    365 * @api public
    366 */
    367
    3681app.enable = function(setting){
    36910 return this.set(setting, true);
    370};
    371
    372/**
    373 * Disable `setting`.
    374 *
    375 * @param {String} setting
    376 * @return {app} for chaining
    377 * @api public
    378 */
    379
    3801app.disable = function(setting){
    3811 return this.set(setting, false);
    382};
    383
    384/**
    385 * Configure callback for zero or more envs,
    386 * when no env is specified that callback will
    387 * be invoked for all environments. Any combination
    388 * can be used multiple times, in any order desired.
    389 *
    390 * Examples:
    391 *
    392 * app.configure(function(){
    393 * // executed for all envs
    394 * });
    395 *
    396 * app.configure('stage', function(){
    397 * // executed staging env
    398 * });
    399 *
    400 * app.configure('stage', 'production', function(){
    401 * // executed for stage and production
    402 * });
    403 *
    404 * @param {String} env...
    405 * @param {Function} fn
    406 * @return {app} for chaining
    407 * @api public
    408 */
    409
    4101app.configure = function(env, fn){
    411521 var envs = 'all'
    412 , args = [].slice.call(arguments);
    413521 fn = args.pop();
    4141039 if (args.length) envs = args;
    415533 if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this);
    416521 return this;
    417};
    418
    419/**
    420 * Listen for connections.
    421 *
    422 * This method takes the same arguments
    423 * as node's `http.Server#listen()`.
    424 *
    425 * @return {http.Server}
    426 * @api public
    427 */
    428
    4291app.listen = function(){
    4301 var server = http.createServer(this);
    4311 return server.listen.apply(server, arguments);
    432};
    433
    434/**
    435 * Delegate `.VERB(...)` calls to `.route(VERB, ...)`.
    436 */
    437
    4381methods.forEach(function(method){
    43925 app[method] = function(path){
    440771 if ('get' == method && 1 == arguments.length) return this.set(path);
    441123 var args = [method].concat([].slice.call(arguments));
    442189 if (!this._usedRouter) this.use(this.router);
    443123 return this._router.route.apply(this._router, args);
    444 }
    445});
    446
    447/**
    448 * Special-cased "all" method, applying the given route `path`,
    449 * middleware, and callback to _every_ HTTP method.
    450 *
    451 * @param {String} path
    452 * @param {Function} ...
    453 * @return {app} for chaining
    454 * @api public
    455 */
    456
    4571app.all = function(path){
    4582 var args = arguments;
    4592 methods.forEach(function(method){
    46054 if ('all' == method || 'del' == method) return;
    46146 app[method].apply(this, args);
    462 }, this);
    4632 return this;
    464};
    465
    466// del -> delete alias
    467
    4681app.del = app.delete;
    469
    470/**
    471 * Render the given view `name` name with `options`
    472 * and a callback accepting an error and the
    473 * rendered template string.
    474 *
    475 * @param {String} name
    476 * @param {String|Function} options or fn
    477 * @param {Function} fn
    478 * @api public
    479 */
    480
    4811app.render = function(name, options, fn){
    48231 var self = this
    483 , opts = {}
    484 , cache = this.cache
    485 , engines = this.engines
    486 , view;
    487
    488 // support callback function as second arg
    48931 if ('function' == typeof options) {
    49010 fn = options, options = {};
    491 }
    492
    493 // merge app.locals
    49431 utils.merge(opts, this.locals);
    495
    496 // merge options.locals
    49749 if (options.locals) utils.merge(opts, options.locals);
    498
    499 // merge options
    50031 utils.merge(opts, options);
    501
    502 // set .cache unless explicitly provided
    50331 opts.cache = null == opts.cache
    504 ? this.enabled('view cache')
    505 : opts.cache;
    506
    507 // primed cache
    50831 if (opts.cache) view = cache[name];
    509
    510 // view
    51131 if (!view) {
    51231 view = new View(name, {
    513 defaultEngine: this.get('view engine')
    514 , root: this.get('views') || process.cwd() + '/views'
    515 , engines: engines
    516 });
    517
    518 // prime the cache
    51931 if (opts.cache) cache[name] = view;
    520 }
    521
    522 // render
    52331 try {
    52431 view.render(opts, fn);
    525 } catch (err) {
    5260 fn(err);
    527 }
    528};

    router/index.js

    71%
    138
    99
    39
    LineHitsSource
    1/*!
    2 * Express - Router
    3 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    4 * MIT Licensed
    5 */
    6
    7/**
    8 * Module dependencies.
    9 */
    10
    111var Route = require('./route')
    12 , Collection = require('./collection')
    13 , utils = require('../utils')
    14 , debug = require('debug')('express:router')
    15 , parse = require('url').parse;
    16
    17/**
    18 * Expose `Router` constructor.
    19 */
    20
    211exports = module.exports = Router;
    22
    23/**
    24 * Expose HTTP methods.
    25 */
    26
    271var methods = exports.methods = require('./methods');
    28
    29/**
    30 * Initialize a new `Router` with the given `options`.
    31 *
    32 * @param {Object} options
    33 * @api private
    34 */
    35
    361function Router(options) {
    37256 options = options || {};
    38256 var self = this;
    39256 this.routes = new Collection;
    40256 this.map = {};
    41256 this.params = {};
    42256 this._params = [];
    43256 this.caseSensitive = options.caseSensitive;
    44256 this.strict = options.strict;
    45
    46256 this.middleware = function router(req, res, next){
    4772 self._dispatch(req, res, next);
    48 };
    49}
    50
    51/**
    52 * Register a param callback `fn` for the given `name`.
    53 *
    54 * @param {String|Function} name
    55 * @param {Function} fn
    56 * @return {Router} for chaining
    57 * @api public
    58 */
    59
    601Router.prototype.param = function(name, fn){
    61 // param logic
    620 if ('function' == typeof name) {
    630 this._params.push(name);
    640 return;
    65 }
    66
    67 // apply param functions
    680 var params = this._params
    69 , len = params.length
    70 , ret;
    71
    720 for (var i = 0; i < len; ++i) {
    730 if (ret = params[i](name, fn)) {
    740 fn = ret;
    75 }
    76 }
    77
    78 // ensure we end up with a
    79 // middleware function
    800 if ('function' != typeof fn) {
    810 throw new Error('invalid param() call for ' + name + ', got ' + fn);
    82 }
    83
    840 (this.params[name] = this.params[name] || []).push(fn);
    850 return this;
    86};
    87
    88/**
    89 * Return a `Collection` of all routes defined.
    90 *
    91 * @return {Collection}
    92 * @api public
    93 */
    94
    951Router.prototype.all = function(){
    960 return this.find(function(){
    970 return true;
    98 });
    99};
    100
    101/**
    102 * Remove the given `route`, returns
    103 * a bool indicating if the route was present
    104 * or not.
    105 *
    106 * @param {Route} route
    107 * @return {Boolean}
    108 * @api public
    109 */
    110
    1111Router.prototype.remove = function(route){
    1120 var routes = this.map[route.method]
    113 , len = routes.length;
    114
    115 // remove from array
    1160 var i = this.routes.indexOf(route);
    1170 this.routes.splice(i, 1);
    118
    119 // remove from map
    1200 for (var i = 0; i < len; ++i) {
    1210 if (route == routes[i]) {
    1220 routes.splice(i, 1);
    1230 return true;
    124 }
    125 }
    126};
    127
    128/**
    129 * Return routes with route paths matching `path`.
    130 *
    131 * @param {String} method
    132 * @param {String} path
    133 * @return {Collection}
    134 * @api public
    135 */
    136
    1371Router.prototype.lookup = function(method, path){
    1380 return this.find(function(route){
    1390 return path == route.path
    140 && (route.method == method
    141 || method == 'all');
    142 });
    143};
    144
    145// /**
    146// * Return routes with regexps that match the given `url`.
    147// *
    148// * @param {String} method
    149// * @param {String} url
    150// * @return {Collection}
    151// * @api public
    152// */
    153//
    154// Router.prototype.match = function(method, url){
    155// return this.find(function(route){
    156// return route.match(url)
    157// && (route.method == method
    158// || method == 'all');
    159// });
    160// };
    161
    162/**
    163 * Find routes based on the return value of `fn`
    164 * which is invoked once per route.
    165 *
    166 * @param {Function} fn
    167 * @return {Collection}
    168 * @api public
    169 */
    170
    1711Router.prototype.find = function(fn){
    1720 var len = methods.length
    173 , ret = new Collection(this)
    174 , method
    175 , routes
    176 , route;
    177
    1780 for (var i = 0; i < len; ++i) {
    1790 method = methods[i];
    1800 routes = this.map[method];
    1810 if (!routes) continue;
    1820 for (var j = 0, jlen = routes.length; j < jlen; ++j) {
    1830 route = routes[j];
    1840 if (fn(route)) ret.push(route);
    185 }
    186 }
    187
    1880 return ret;
    189};
    190
    191/**
    192 * Route dispatcher aka the route "middleware".
    193 *
    194 * @param {IncomingMessage} req
    195 * @param {ServerResponse} res
    196 * @param {Function} next
    197 * @api private
    198 */
    199
    2001Router.prototype._dispatch = function(req, res, next){
    20172 var params = this.params
    202 , self = this;
    203
    20472 debug('dispatching %s %s', req.method, req.url);
    205
    206 // route dispatch
    20772 (function pass(i, err){
    20882 var paramCallbacks
    209 , paramIndex = 0
    210 , paramVal
    211 , route
    212 , keys
    213 , key
    214 , ret;
    215
    216 // match next route
    21782 function nextRoute(err) {
    21810 pass(req._route_index + 1, err);
    219 }
    220
    221 // match route
    22282 req.route = route = self.match(req, i);
    223
    224 // implied OPTIONS
    22583 if (!route && 'OPTIONS' == req.method) return self._options(req, res);
    226
    227 // no route
    22893 if (!route) return next(err);
    22969 debug('matched %s %s', route.method, route.path);
    230
    231 // we have a route
    232 // start at param 0
    23369 req.params = route.params;
    23469 keys = route.keys;
    23569 i = 0;
    236
    237 // param callbacks
    23869 function param(err) {
    23991 paramIndex = 0;
    24091 key = keys[i++];
    24191 paramVal = key && req.params[key.name];
    24291 paramCallbacks = key && params[key.name];
    243
    24491 try {
    24591 if ('route' == err) {
    2460 nextRoute();
    24791 } else if (err) {
    2481 i = 0;
    2491 callbacks(err);
    25090 } else if (paramCallbacks && undefined !== paramVal) {
    2510 paramCallback();
    25290 } else if (key) {
    25322 param();
    254 } else {
    25568 i = 0;
    25668 callbacks();
    257 }
    258 } catch (err) {
    2590 param(err);
    260 }
    26169 };
    262
    26369 param(err);
    264
    265 // single param callbacks
    26669 function paramCallback(err) {
    2670 var fn = paramCallbacks[paramIndex++];
    2680 if (err || !fn) return param(err);
    2690 fn(req, res, paramCallback, paramVal, key.name);
    270 }
    271
    272 // invoke route callbacks
    27369 function callbacks(err) {
    27479 var fn = route.callbacks[i++];
    27579 try {
    27679 if ('route' == err) {
    2770 nextRoute();
    27879 } else if (err && fn) {
    2792 if (fn.length < 4) return callbacks(err);
    2800 fn(err, req, res, callbacks);
    28178 } else if (fn) {
    28268 fn(req, res, callbacks);
    283 } else {
    28410 nextRoute(err);
    285 }
    286 } catch (err) {
    2871 callbacks(err);
    288 }
    289 }
    290 })(0);
    291};
    292
    293/**
    294 * Respond to __OPTIONS__ method.
    295 *
    296 * @param {IncomingMessage} req
    297 * @param {ServerResponse} res
    298 * @api private
    299 */
    300
    3011Router.prototype._options = function(req, res){
    3021 var path = parse(req.url).pathname
    303 , body = this._optionsFor(path).join(',');
    3041 res.set('Allow', body).send(body);
    305};
    306
    307/**
    308 * Return an array of HTTP verbs or "options" for `path`.
    309 *
    310 * @param {String} path
    311 * @return {Array}
    312 * @api private
    313 */
    314
    3151Router.prototype._optionsFor = function(path){
    3161 var self = this;
    3171 return methods.filter(function(method){
    31823 var routes = self.map[method];
    31943 if (!routes || 'options' == method) return;
    3203 for (var i = 0, len = routes.length; i < len; ++i) {
    3215 if (routes[i].match(path)) return true;
    322 }
    323 }).map(function(method){
    3242 return method.toUpperCase();
    325 });
    326};
    327
    328/**
    329 * Attempt to match a route for `req`
    330 * with optional starting index of `i`
    331 * defaulting to 0.
    332 *
    333 * @param {IncomingMessage} req
    334 * @param {Number} i
    335 * @return {Route}
    336 * @api private
    337 */
    338
    3391Router.prototype.match = function(req, i, head){
    34089 var method = req.method.toLowerCase()
    341 , url = parse(req.url)
    342 , path = url.pathname
    343 , routes = this.map
    344 , i = i || 0
    345 , captures
    346 , route
    347 , keys;
    348
    349 // HEAD support
    350 // TODO: clean this up
    35189 if (!head && 'head' == method) {
    352 // attempt lookup
    3533 route = this.match(req, i, true);
    3545 if (route) return route;
    355
    356 // default to GET as res.render() / res.send()
    357 // etc support HEAD
    3581 method = 'get';
    359 }
    360
    361 // routes for this method
    36287 if (routes = routes[method]) {
    363
    364 // matching routes
    36585 for (var len = routes.length; i < len; ++i) {
    36684 route = routes[i];
    36784 if (captures = route.match(path)) {
    36872 keys = route.keys;
    36972 route.params = [];
    370
    371 // params from capture groups
    37272 for (var j = 1, jlen = captures.length; j < jlen; ++j) {
    37333 var key = keys[j-1]
    374 , val = 'string' == typeof captures[j]
    375 ? decodeURIComponent(captures[j])
    376 : captures[j];
    37733 if (key) {
    37822 route.params[key.name] = val;
    379 } else {
    38011 route.params.push(val);
    381 }
    382 }
    383
    384 // all done
    38572 req._route_index = i;
    38672 return route;
    387 }
    388 }
    389 }
    390};
    391
    392/**
    393 * Route `method`, `path`, and one or more callbacks.
    394 *
    395 * @param {String} method
    396 * @param {String} path
    397 * @param {Function} callback...
    398 * @return {Router} for chaining
    399 * @api private
    400 */
    401
    4021Router.prototype.route = function(method, path, callbacks){
    403127 var app = this.app
    404 , method = method.toLowerCase()
    405 , callbacks = utils.flatten([].slice.call(arguments, 2));
    406
    407 // ensure path was given
    408127 if (!path) throw new Error('Router#' + method + '() requires a path');
    409
    410 // create the route
    411127 debug('defined %s %s', method, path);
    412127 var route = new Route(method, path, callbacks, {
    413 sensitive: this.caseSensitive
    414 , strict: this.strict
    415 });
    416
    417 // add it
    418127 (this.map[method] = this.map[method] || []).push(route);
    419127 this.routes.push(route);
    420127 return this;
    421};

    router/route.js

    100%
    18
    18
    0
    LineHitsSource
    1/*!
    2 * Express - router - Route
    3 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    4 * MIT Licensed
    5 */
    6
    7/**
    8 * Expose `Route`.
    9 */
    10
    111module.exports = Route;
    12
    13/**
    14 * Initialize `Route` with the given HTTP `method`, `path`,
    15 * and an array of `callbacks` and `options`.
    16 *
    17 * Options:
    18 *
    19 * - `sensitive` enable case-sensitive routes
    20 * - `strict` enable strict matching for trailing slashes
    21 *
    22 * @param {String} method
    23 * @param {String} path
    24 * @param {Array} callbacks
    25 * @param {Object} options.
    26 * @api private
    27 */
    28
    291function Route(method, path, callbacks, options) {
    30127 options = options || {};
    31127 this.path = path;
    32127 this.method = method;
    33127 this.callbacks = callbacks;
    34127 this.regexp = normalize(path
    35 , this.keys = []
    36 , options.sensitive
    37 , options.strict);
    38}
    39
    40/**
    41 * Check if this route matches `path` and return captures made.
    42 *
    43 * @param {String} path
    44 * @return {Array}
    45 * @api private
    46 */
    47
    481Route.prototype.match = function(path){
    4987 return this.regexp.exec(path);
    50};
    51
    52/**
    53 * Normalize the given path string,
    54 * returning a regular expression.
    55 *
    56 * An empty array should be passed,
    57 * which will contain the placeholder
    58 * key names. For example "/user/:id" will
    59 * then contain ["id"].
    60 *
    61 * @param {String|RegExp|Array} path
    62 * @param {Array} keys
    63 * @param {Boolean} sensitive
    64 * @param {Boolean} strict
    65 * @return {RegExp}
    66 * @api private
    67 */
    68
    691function normalize(path, keys, sensitive, strict) {
    70129 if (path instanceof RegExp) return path;
    71125 if (path instanceof Array)
    721 path = '(' + path.join('|') + ')';
    73125 path = path
    74 .concat(strict ? '' : '/?')
    75 .replace(/\/\(/g, '(?:/')
    76 .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional){
    7721 keys.push({ name: key, optional: !! optional });
    7821 slash = slash || '';
    7921 return ''
    80 + (optional ? '' : slash)
    81 + '(?:'
    82 + (optional ? slash : '')
    83 + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')'
    84 + (optional || '');
    85 })
    86 .replace(/([\/.])/g, '\\$1')
    87 .replace(/\*/g, '(.*)');
    88125 return new RegExp('^' + path + '$', sensitive ? '' : 'i');
    89}

    router/collection.js

    50%
    10
    5
    5
    LineHitsSource
    1
    2/*!
    3 * Express - router - Collection
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Expose `Collection`.
    10 */
    11
    121module.exports = Collection;
    13
    14/**
    15 * Initialize a new route `Collection`
    16 * with the given `router`.
    17 *
    18 * @param {Router} router
    19 * @api private
    20 */
    21
    221function Collection(router) {
    23256 Object.defineProperty(this, 'router', { value: router });
    24}
    25
    26/**
    27 * Inherit from `Array.prototype`.
    28 */
    29
    301Collection.prototype.__proto__ = Array.prototype;
    31
    32/**
    33 * Remove the routes in this collection.
    34 *
    35 * @return {Collection} of routes removed
    36 * @api public
    37 */
    38
    391Collection.prototype.remove = function(){
    400 var router = this.router
    41 , len = this.length
    42 , ret = new Collection(this.router);
    43
    440 for (var i = 0; i < len; ++i) {
    450 if (router.remove(this[i])) {
    460 ret.push(this[i]);
    47 }
    48 }
    49
    500 return ret;
    51};
    52

    utils.js

    94%
    38
    36
    2
    LineHitsSource
    1
    2/*!
    3 * Express - utils
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Module dependencies.
    10 */
    11
    121var mime = require('mime');
    13
    14/**
    15 * Check if `path` looks absolute.
    16 *
    17 * @param {String} path
    18 * @return {Boolean}
    19 * @api private
    20 */
    21
    221exports.isAbsolute = function(path){
    2335 if ('/' == path[0]) return true;
    2427 if (':' == path[1] && '\\' == path[2]) return true;
    25};
    26
    27/**
    28 * Flatten the given `arr`.
    29 *
    30 * @param {Array} arr
    31 * @return {Array}
    32 * @api private
    33 */
    34
    351exports.flatten = function(arr, ret){
    36127 var ret = ret || []
    37 , len = arr.length;
    38127 for (var i = 0; i < len; ++i) {
    39127 if (Array.isArray(arr[i])) {
    400 exports.flatten(arr[i], ret);
    41 } else {
    42127 ret.push(arr[i]);
    43 }
    44 }
    45127 return ret;
    46};
    47
    48/**
    49 * Check if `type` is acceptable based on
    50 * the given `str`.
    51 *
    52 * @param {String} type
    53 * @param {String} str
    54 * @return {Boolean}
    55 * @api private
    56 */
    57
    581exports.accepts = function(type, str){
    59 // accept anything when Accept is not present
    604 if (!str) return true;
    61
    62 // resolve mime
    634 if (!~type.indexOf('/')) type = mime.lookup(type);
    64
    65 // split type/subtype
    662 type = type.split('/');
    67
    68 // parse
    692 var accepted = exports.parseAccept(str)
    70 , len = accepted.length
    71 , obj
    72 , ok;
    73
    742 for (var i = 0; i < len; ++i) {
    752 obj = accepted[i];
    763 if (exports.accept(type, obj)) return true;
    77 }
    78
    791 return false;
    80};
    81
    82/**
    83 * Check if `type` array is acceptable for `other`.
    84 *
    85 * @param {Array} type
    86 * @param {Object} other
    87 * @return {Boolean}
    88 * @api private
    89 */
    90
    911exports.accept = function(type, other){
    9225 return (type[0] == other.type || '*' == other.type)
    93 && (type[1] == other.subtype || '*' == other.subtype);
    94};
    95
    96/**
    97 * Parse accept `str`, returning
    98 * an array objects containing
    99 * `.type` and `.subtype` along
    100 * with the values provided by
    101 * `parseQuality()`.
    102 *
    103 * @param {Type} name
    104 * @return {Type}
    105 * @api private
    106 */
    107
    1081exports.parseAccept = function(str){
    10914 return exports
    110 .parseQuality(str)
    111 .map(function(obj){
    11227 var parts = obj.value.split('/');
    11327 obj.type = parts[0];
    11427 obj.subtype = parts[1];
    11527 return obj;
    116 });
    117};
    118
    119/**
    120 * Parse quality `str`, returning an
    121 * array of objects with `.value` and
    122 * `.quality`.
    123 *
    124 * @param {Type} name
    125 * @return {Type}
    126 * @api private
    127 */
    128
    1291exports.parseQuality = function(str){
    13020 return str
    131 .split(/ *, */)
    132 .map(quality)
    133 .filter(function(obj){
    13440 return obj.quality;
    135 })
    136 .sort(function(a, b){
    13720 return b.quality - a.quality;
    138 });
    139};
    140
    141/**
    142 * Parse quality `str` returning an
    143 * object with `.value` and `.quality`.
    144 *
    145 * @param {String} str
    146 * @return {Object}
    147 * @api private
    148 */
    149
    1501function quality(str) {
    15140 var parts = str.split(/ *; */)
    152 , val = parts[0];
    153
    15440 var q = parts[1]
    155 ? parseFloat(parts[1].split(/ *= */)[1])
    156 : 1;
    157
    15840 return { value: val, quality: q };
    159}
    160
    161/**
    162 * Escape special characters in the given string of html.
    163 *
    164 * @param {String} html
    165 * @return {String}
    166 * @api private
    167 */
    168
    1691exports.escape = function(html) {
    1700 return String(html)
    171 .replace(/&/g, '&amp;')
    172 .replace(/"/g, '&quot;')
    173 .replace(/</g, '&lt;')
    174 .replace(/>/g, '&gt;');
    175};

    router/methods.js

    100%
    1
    1
    0
    LineHitsSource
    1
    2/*!
    3 * Express - router - methods
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * HTTP methods supported by node.
    10 */
    11
    121module.exports = [
    13 'get'
    14 , 'post'
    15 , 'put'
    16 , 'head'
    17 , 'delete'
    18 , 'options'
    19 , 'trace'
    20 , 'copy'
    21 , 'lock'
    22 , 'mkcol'
    23 , 'move'
    24 , 'propfind'
    25 , 'proppatch'
    26 , 'unlock'
    27 , 'report'
    28 , 'mkactivity'
    29 , 'checkout'
    30 , 'merge'
    31 , 'm-search'
    32 , 'notify'
    33 , 'subscribe'
    34 , 'unsubscribe'
    35 , 'patch'
    36];

    middleware.js

    100%
    14
    14
    0
    LineHitsSource
    1
    2/*!
    3 * Express - middleware - init
    4 * Copyright(c) 2010-2011 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Initialization middleware, exposing the
    10 * request and response to eachother, as well
    11 * as defaulting the X-Powered-By header field.
    12 *
    13 * @param {Function} app
    14 * @return {Function}
    15 * @api private
    16 */
    17
    181exports.init = function(app){
    19254 return function(req, res, next){
    20215 var charset;
    21215 res.setHeader('X-Powered-By', 'Express');
    22215 req.app = res.app = app;
    23215 req.res = res;
    24215 res.req = req;
    25215 req.next = next;
    26
    27215 req.__proto__ = app.request;
    28215 res.__proto__ = app.response;
    29
    30215 res.locals = function(obj){
    313 for (var key in obj) res.locals[key] = obj[key];
    321 return res;
    33 };
    34
    35215 next();
    36 }
    37};

    view.js

    100%
    20
    20
    0
    LineHitsSource
    1
    2/*!
    3 * Express - View
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Module dependencies.
    10 */
    11
    121var path = require('path')
    13 , utils = require('./utils')
    14 , fs = require('fs')
    15 , dirname = path.dirname
    16 , basename = path.basename
    17 , extname = path.extname
    18 , exists = path.existsSync
    19 , join = path.join;
    20
    21/**
    22 * Expose `View`.
    23 */
    24
    251module.exports = View;
    26
    27/**
    28 * Initialize a new `View` with the given `name`.
    29 *
    30 * Options:
    31 *
    32 * - `defaultEngine` the default template engine name
    33 * - `engines` template engine require() cache
    34 * - `root` root path for view lookup
    35 *
    36 * @param {String} name
    37 * @param {Object} options
    38 * @api private
    39 */
    40
    411function View(name, options) {
    4231 options = options || {};
    4331 this.name = name;
    4431 this.root = options.root;
    4531 var engines = options.engines;
    4631 this.defaultEngine = options.defaultEngine;
    4731 var ext = this.ext = extname(name);
    4838 if (!ext) name += (ext = this.ext = '.' + this.defaultEngine);
    4931 this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
    5031 this.path = this.lookup(name);
    51}
    52
    53/**
    54 * Lookup view by the given `path`
    55 *
    56 * @param {String} path
    57 * @return {String}
    58 * @api private
    59 */
    60
    611View.prototype.lookup = function(path){
    6231 var ext = this.ext;
    63
    64 // <path>.<engine>
    6558 if (!utils.isAbsolute(path)) path = join(this.root, path);
    6660 if (exists(path)) return path;
    67
    68 // <path>/index.<engine>
    692 path = join(dirname(path), basename(path, ext), 'index' + ext);
    704 if (exists(path)) return path;
    71};
    72
    73/**
    74 * Render with the given `options` and callback `fn(err, str)`.
    75 *
    76 * @param {Object} options
    77 * @param {Function} fn
    78 * @api private
    79 */
    80
    811View.prototype.render = function(options, fn){
    8231 this.engine(this.path, options, fn);
    83};

    request.js

    96%
    59
    57
    2
    LineHitsSource
    1
    2/*!
    3 * Express - request
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Module dependencies.
    10 */
    11
    121var http = require('http')
    13 , utils = require('./utils')
    14 , connect = require('connect')
    15 , parse = require('url').parse
    16 , mime = require('mime');
    17
    18/**
    19 * Request prototype.
    20 */
    21
    221var req = exports = module.exports = {
    23 __proto__: http.IncomingMessage.prototype
    24};
    25
    26/**
    27 * Return request header.
    28 *
    29 * The `Referrer` header field is special-cased,
    30 * both `Referrer` and `Referer` will yield are
    31 * interchangeable.
    32 *
    33 * Examples:
    34 *
    35 * req.get('Content-Type');
    36 * // => "text/plain"
    37 *
    38 * req.get('content-type');
    39 * // => "text/plain"
    40 *
    41 * req.get('Something');
    42 * // => undefined
    43 *
    44 * @param {String} name
    45 * @return {String}
    46 * @api public
    47 */
    48
    491req.get = function(name){
    5084 switch (name = name.toLowerCase()) {
    51 case 'referer':
    52 case 'referrer':
    5314 return this.headers.referrer
    54 || this.headers.referer;
    55 default:
    5670 return this.headers[name];
    57 }
    58};
    59
    60/**
    61 * Check if the given `type` is acceptable,
    62 * otherwise you should respond with 406 "Not Acceptable".
    63 *
    64 * Examples:
    65 *
    66 * // Accept: text/html
    67 * req.accepts('html');
    68 * // => true
    69 *
    70 * // Accept: text/*; application/json
    71 * req.accepts('html');
    72 * req.accepts('text/html');
    73 * req.accepts('text/plain');
    74 * req.accepts('application/json');
    75 * // => true
    76 *
    77 * req.accepts('image/png');
    78 * req.accepts('png');
    79 * // => false
    80 *
    81 * @param {String} type
    82 * @return {Boolean}
    83 * @api public
    84 */
    85
    861req.accepts = function(type){
    873 return utils.accepts(type, this.get('Accept'));
    88};
    89
    90/**
    91 * Check if the given `charset` is acceptable,
    92 * otherwise you should respond with 406 "Not Acceptable".
    93 *
    94 * @param {String} charset
    95 * @return {Boolean}
    96 * @api public
    97 */
    98
    991req.acceptsCharset = function(charset){
    1003 var accepted = this.acceptedCharsets;
    1013 return accepted.length
    102 ? ~accepted.indexOf(charset)
    103 : true;
    104};
    105
    106/**
    107 * Check if the given `lang` is acceptable,
    108 * otherwise you should respond with 406 "Not Acceptable".
    109 *
    110 * @param {String} lang
    111 * @return {Boolean}
    112 * @api public
    113 */
    114
    1151req.acceptsLanguage = function(lang){
    1160 var accepted = this.acceptedLanguages;
    1170 return accepted.length
    118 ? ~accepted.indexOf(lang)
    119 : true;
    120};
    121
    122/**
    123 * Return an array of Accepted media types
    124 * ordered from highest quality to lowest.
    125 *
    126 * Examples:
    127 *
    128 * [ { value: 'application/json',
    129 * quality: 1,
    130 * type: 'application',
    131 * subtype: 'json' },
    132 * { value: 'text/html',
    133 * quality: 0.5,
    134 * type: 'text',
    135 * subtype: 'html' } ]
    136 *
    137 * @return {Array}
    138 * @api public
    139 */
    140
    1411req.__defineGetter__('accepted', function(){
    14226 var accept = this.get('Accept');
    14326 return accept
    144 ? utils.parseAccept(accept)
    145 : [];
    146});
    147
    148/**
    149 * Return an array of Accepted languages
    150 * ordered from highest quality to lowest.
    151 *
    152 * Examples:
    153 *
    154 * Accept-Language: en;q=.5, en-us
    155 * ['en-us', 'en']
    156 *
    157 * @return {Array}
    158 * @api public
    159 */
    160
    1611req.__defineGetter__('acceptedLanguages', function(){
    1623 var accept = this.get('Accept-Language');
    1633 return accept
    164 ? utils
    165 .parseQuality(accept)
    166 .map(function(obj){
    1674 return obj.value;
    168 })
    169 : [];
    170});
    171
    172/**
    173 * Return an array of Accepted charsets
    174 * ordered from highest quality to lowest.
    175 *
    176 * Examples:
    177 *
    178 * Accept-Charset: iso-8859-5;q=.2, unicode-1-1;q=0.8
    179 * ['unicode-1-1', 'iso-8859-5']
    180 *
    181 * @return {Array}
    182 * @api public
    183 */
    184
    1851req.__defineGetter__('acceptedCharsets', function(){
    1866 var accept = this.get('Accept-Charset');
    1876 return accept
    188 ? utils
    189 .parseQuality(accept)
    190 .map(function(obj){
    1919 return obj.value;
    192 })
    193 : [];
    194});
    195
    196/**
    197 * Return the value of param `name` when present or `defaultValue`.
    198 *
    199 * - Checks body params, ex: id=12, {"id":12}
    200 * - Checks route placeholders, ex: _/user/:id_
    201 * - Checks query string params, ex: ?id=12
    202 *
    203 * To utilize request bodies, `req.body`
    204 * should be an object. This can be done by using
    205 * the `connect.bodyParser()` middleware.
    206 *
    207 * @param {String} name
    208 * @param {Mixed} defaultValue
    209 * @return {String}
    210 * @api public
    211 */
    212
    2131req.param = function(name, defaultValue){
    214 // req.body
    2155 if (this.body && undefined !== this.body[name]) return this.body[name];
    216
    217 // route params
    2183 if (this.params
    219 && this.params.hasOwnProperty(name)
    220 && undefined !== this.params[name]) {
    2211 return this.params[name];
    222 }
    223
    224 // query-string
    2253 if (undefined !== this.query[name]) return this.query[name];
    226
    2271 return defaultValue;
    228};
    229
    230/**
    231 * Check if the incoming request contains the "Content-Type"
    232 * header field, and it contains the give mime `type`.
    233 *
    234 * Examples:
    235 *
    236 * // With Content-Type: text/html; charset=utf-8
    237 * req.is('html');
    238 * req.is('text/html');
    239 * req.is('text/*');
    240 * // => true
    241 *
    242 * // When Content-Type is application/json
    243 * req.is('json');
    244 * req.is('application/json');
    245 * req.is('application/*');
    246 * // => true
    247 *
    248 * req.is('html');
    249 * // => false
    250 *
    251 * Now within our route callbacks, we can use to to assert content types
    252 * such as "image/jpeg", "image/png", etc.
    253 *
    254 * app.post('/image/upload', function(req, res, next){
    255 * if (req.is('image/*')) {
    256 * // do something
    257 * } else {
    258 * next();
    259 * }
    260 * });
    261 *
    262 * @param {String} type
    263 * @return {Boolean}
    264 * @api public
    265 */
    266
    2671req.is = function(type){
    26814 var ct = this.get('Content-Type');
    26915 if (!ct) return false;
    27013 ct = ct.split(';')[0];
    27116 if (!~type.indexOf('/')) type = mime.lookup(type);
    27213 if (~type.indexOf('*')) {
    2738 type = type.split('/');
    2748 ct = ct.split('/');
    27510 if ('*' == type[0] && type[1] == ct[1]) return true;
    2768 if ('*' == type[1] && type[0] == ct[0]) return true;
    2774 return false;
    278 }
    2795 return !! ~ct.indexOf(type);
    280};
    281
    282/**
    283 * Return the protocol string "http" or "https"
    284 * when requested with TLS. When the "trust proxy"
    285 * setting is enabled the "X-Forwarded-Proto" header
    286 * field will be trusted. If you're running behind
    287 * a reverse proxy that supplies https for you this
    288 * may be enabled.
    289 *
    290 * @return {String}
    291 * @api public
    292 */
    293
    2941req.__defineGetter__('protocol', function(trustProxy){
    29512 var trustProxy = this.app.settings['trust proxy'];
    29612 return this.secure
    297 ? 'https'
    298 : trustProxy
    299 ? (this.get('X-Forwarded-Proto') || 'http')
    300 : 'http';
    301});
    302
    303/**
    304 * Short-hand for `req.connection.encrypted`.
    305 *
    306 * @return {Boolean}
    307 * @api public
    308 */
    309
    3101req.__defineGetter__('secure', function(){
    31112 return this.connection.encrypted;
    312});
    313
    314/**
    315 * Return subdomains as an array.
    316 *
    317 * For example "tobi.ferrets.example.com"
    318 * would provide `["ferrets", "tobi"]`.
    319 *
    320 * @return {Array}
    321 * @api public
    322 */
    323
    3241req.__defineGetter__('subdomains', function(){
    3252 return this.get('Host')
    326 .split('.')
    327 .slice(0, -2)
    328 .reverse();
    329});
    330
    331/**
    332 * Short-hand for `require('url').parse(req.url).pathname`.
    333 *
    334 * @return {String}
    335 * @api public
    336 */
    337
    3381req.__defineGetter__('path', function(){
    3393 return parse(this.url).pathname;
    340});
    341
    342/**
    343 * Check if the request is fresh, aka
    344 * Last-Modified and/or the ETag
    345 * still match.
    346 *
    347 * @return {Boolean}
    348 * @api public
    349 */
    350
    3511req.__defineGetter__('fresh', function(){
    3522 return ! this.stale;
    353});
    354
    355/**
    356 * Check if the request is stale, aka
    357 * "Last-Modified" and / or the "ETag" for the
    358 * resource has changed.
    359 *
    360 * @return {Boolean}
    361 * @api public
    362 */
    363
    3641req.__defineGetter__('stale', function(){
    3654 return connect.utils.modified(this, this.res);
    366});
    367
    368/**
    369 * Check if the request was an _XMLHttpRequest_.
    370 *
    371 * @return {Boolean}
    372 * @api public
    373 */
    374
    3751req.__defineGetter__('xhr', function(){
    3764 var val = this.get('X-Requested-With') || '';
    3774 return 'xmlhttprequest' == val.toLowerCase();
    378});

    response.js

    94%
    165
    156
    9
    LineHitsSource
    1
    2/*!
    3 * Express - response
    4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
    5 * MIT Licensed
    6 */
    7
    8/**
    9 * Module dependencies.
    10 */
    11
    121var fs = require('fs')
    13 , http = require('http')
    14 , path = require('path')
    15 , connect = require('connect')
    16 , utils = connect.utils
    17 , accept = require('./utils').accept
    18 , statusCodes = http.STATUS_CODES
    19 , send = connect.static.send
    20 , mime = require('mime')
    21 , basename = path.basename
    22 , join = path.join;
    23
    24/**
    25 * Response prototype.
    26 */
    27
    281var res = module.exports = {
    29 __proto__: http.ServerResponse.prototype
    30};
    31
    32/**
    33 * Set status `code`.
    34 *
    35 * @param {Number} code
    36 * @return {ServerResponse}
    37 * @api public
    38 */
    39
    401res.status = function(code){
    413 this.statusCode = code;
    423 return this;
    43};
    44
    45/**
    46 * Set Cache-Control to the given `type` and `options`.
    47 *
    48 * Options:
    49 *
    50 * - `maxAge` in milliseconds
    51 *
    52 * @param {String} type
    53 * @param {Object} options
    54 * @return {ServerResponse}
    55 * @api public
    56 */
    57
    581res.cache = function(type, options){
    592 var val = type;
    602 options = options || {};
    613 if (options.maxAge) val += ', max-age=' + (options.maxAge / 1000);
    622 return this.set('Cache-Control', val);
    63};
    64
    65/**
    66 * Send a response.
    67 *
    68 * Examples:
    69 *
    70 * res.send(new Buffer('wahoo'));
    71 * res.send({ some: 'json' });
    72 * res.send('<p>some html</p>');
    73 * res.send(404, 'Sorry, cant find that');
    74 * res.send(404);
    75 *
    76 * @param {Mixed} body or status
    77 * @param {Mixed} body
    78 * @return {ServerResponse}
    79 * @api public
    80 */
    81
    821res.send = function(body){
    8371 var req = this.req
    84 , head = 'HEAD' == req.method;
    85
    86 // allow status / body
    8771 if (2 == arguments.length) {
    883 this.statusCode = body;
    893 body = arguments[1];
    90 }
    91
    9271 switch (typeof body) {
    93 // response status
    94 case 'number':
    951 this.get('Content-Type') || this.contentType('.txt');
    961 this.statusCode = body;
    971 body = http.STATUS_CODES[body];
    981 break;
    99 // string defaulting to html
    100 case 'string':
    10155 if (!this.get('Content-Type')) {
    10234 this.charset = this.charset || 'utf-8';
    10334 this.contentType('.html');
    104 }
    10555 break;
    106 case 'boolean':
    107 case 'object':
    10814 if (null == body) {
    1091 body = '';
    11013 } else if (Buffer.isBuffer(body)) {
    1112 this.get('Content-Type') || this.contentType('.bin');
    112 } else {
    11311 return this.json(body);
    114 }
    1153 break;
    116 }
    117
    118 // populate Content-Length
    11960 if (undefined !== body && !this.get('Content-Length')) {
    12059 this.set('Content-Length', Buffer.isBuffer(body)
    121 ? body.length
    122 : Buffer.byteLength(body));
    123 }
    124
    125 // strip irrelevant headers
    12660 if (204 == this.statusCode || 304 == this.statusCode) {
    1272 this.removeHeader('Content-Type');
    1282 this.removeHeader('Content-Length');
    1292 body = '';
    130 }
    131
    132 // respond
    13360 this.end(head ? null : body);
    13460 return this;
    135};
    136
    137/**
    138 * Send JSON response.
    139 *
    140 * Examples:
    141 *
    142 * res.json(null);
    143 * res.json({ user: 'tj' });
    144 * res.json(500, 'oh noes!');
    145 * res.json(404, 'I dont have that');
    146 *
    147 * @param {Mixed} obj or status
    148 * @param {Mixed} obj
    149 * @return {ServerResponse}
    150 * @api public
    151 */
    152
    1531res.json = function(obj){
    154 // allow status / body
    15516 if (2 == arguments.length) {
    1561 this.statusCode = obj;
    1571 obj = arguments[1];
    158 }
    159
    16016 var settings = this.app.settings
    161 , jsonp = settings['jsonp callback']
    162 , replacer = settings['json replacer']
    163 , spaces = settings['json spaces']
    164 , body = JSON.stringify(obj, replacer, spaces)
    165 , callback = this.req.query.callback;
    166
    16716 this.charset = this.charset || 'utf-8';
    16816 this.set('Content-Type', 'application/json');
    169
    17016 if (callback && jsonp) {
    1710 this.set('Content-Type', 'text/javascript');
    1720 body = callback.replace(/[^\w$.]/g, '') + '(' + body + ');';
    173 }
    174
    17516 return this.send(body);
    176};
    177
    178/**
    179 * Transfer the file at the given `path`.
    180 *
    181 * Automatically sets the _Content-Type_ response header field.
    182 * The callback `fn(err)` is invoked when the transfer is complete
    183 * or when an error occurs. Be sure to check `res.sentHeader`
    184 * if you wish to attempt responding, as the header and some data
    185 * may have already been transferred.
    186 *
    187 * Options:
    188 *
    189 * - `maxAge` defaulting to 0
    190 * - `root` root directory for relative filenames
    191 *
    192 * @param {String} path
    193 * @param {Object|Function} options or fn
    194 * @param {Function} fn
    195 * @api public
    196 */
    197
    1981res.sendfile = function(path, options, fn){
    19912 var self = this
    200 , req = self.req
    201 , next = this.req.next
    202 , options = options || {};
    203
    204 // support function as second arg
    20512 if ('function' == typeof options) {
    2063 fn = options;
    2073 options = {};
    208 }
    209
    210 // callback
    21112 options.callback = function(err){
    21212 if (err) {
    213 // cast ENOENT
    2147 if ('ENOENT' == err.code) err = 404;
    215
    216 // coerce numeric error to an Error
    217 // TODO: remove
    218 // TODO: remove docs for headerSent?
    2197 if ('number' == typeof err) err = utils.error(err);
    220
    221 // ditch content-disposition to prevent funky responses
    22210 if (!self.headerSent) self.removeHeader('Content-Disposition');
    223
    224 // woot! callback available
    2257 if (fn) return fn(err);
    226
    227 // lost in limbo if there's no callback
    2283 if (self.headerSent) return;
    229
    2303 return req.next(err);
    231 }
    232
    2337 fn && fn();
    234 };
    235
    236 // transfer
    23712 options.path = encodeURIComponent(path);
    23812 send(this.req, this, next, options);
    239};
    240
    241/**
    242 * Transfer the file at the given `path` as an attachment.
    243 *
    244 * Optionally providing an alternate attachment `filename`,
    245 * and optional callback `fn(err)`. The callback is invoked
    246 * when the data transfer is complete, or when an error has
    247 * ocurred. Be sure to check `res.headerSent` if you plan to respond.
    248 *
    249 * @param {String} path
    250 * @param {String|Function} filename or fn
    251 * @param {Function} fn
    252 * @api public
    253 */
    254
    2551res.download = function(path, filename, fn){
    256 // support function as second arg
    2570 if ('function' == typeof filename) {
    2580 fn = filename;
    2590 filename = null;
    260 }
    261
    2620 return this.attachment(filename || path).sendfile(path, fn);
    263};
    264
    265/**
    266 * Set _Content-Type_ response header passed through `mime.lookup()`.
    267 *
    268 * Examples:
    269 *
    270 * var filename = 'path/to/image.png';
    271 * res.contentType(filename);
    272 * // res.headers['Content-Type'] is now "image/png"
    273 *
    274 * res.contentType('.html');
    275 * res.contentType('html');
    276 * res.contentType('json');
    277 * res.contentType('png');
    278 * res.type('png');
    279 *
    280 * @param {String} type
    281 * @return {ServerResponse} for chaining
    282 * @api public
    283 */
    284
    2851res.contentType =
    286res.type = function(type){
    28740 return this.set('Content-Type', mime.lookup(type));
    288};
    289
    290/**
    291 * Respond to the Acceptable formats using an `obj`
    292 * of mime-type callbacks.
    293 *
    294 * This method uses `req.accepted`, an array of
    295 * acceptable types ordered by their quality values.
    296 * When "Accept" is not present the _first_ callback
    297 * is invoked, otherwise the first match is used. When
    298 * no match is performed the server responds with
    299 * 406 "Not Acceptable".
    300 *
    301 * Content-Type is set for you, however if you choose
    302 * you may alter this within the callback using `res.type()`
    303 * or `res.set('Content-Type', ...)`.
    304 *
    305 * res.format({
    306 * 'text/plain': function(){
    307 * res.send('hey');
    308 * },
    309 *
    310 * 'text/html': function(){
    311 * res.send('<p>hey</p>');
    312 * },
    313 *
    314 * 'appliation/json': function(){
    315 * res.send({ message: 'hey' });
    316 * }
    317 * });
    318 *
    319 * In addition to canonicalized MIME types you may
    320 * also use extnames mapped to these types:
    321 *
    322 * res.format({
    323 * text: function(){
    324 * res.send('hey');
    325 * },
    326 *
    327 * html: function(){
    328 * res.send('<p>hey</p>');
    329 * },
    330 *
    331 * json: function(){
    332 * res.send({ message: 'hey' });
    333 * }
    334 * });
    335 *
    336 * @param {Object} obj
    337 * @return {ServerResponse} for chaining
    338 * @api public
    339 */
    340
    3411res.format = function(obj){
    34223 var keys = Object.keys(obj)
    343 , types = []
    344 , req = this.req
    345 , next = req.next
    346 , accepted = req.accepted
    347 , acceptedlen = accepted.length
    348 , type
    349 , key;
    350
    351 // normalize extnames -> mime
    35223 if (acceptedlen) {
    35310 for (var i = 0; i < keys.length; ++i) {
    35428 types.push(~keys[i].indexOf('/')
    355 ? keys[i]
    356 : mime.lookup(keys[i]));
    357 }
    358 }
    359
    360 // determine most acceptable format
    36123 out:
    362 for (var i = 0; i < acceptedlen; ++i) {
    36310 for (var j = 0, jlen = types.length; j < jlen; ++j) {
    36423 if (accept(types[j].split('/'), accepted[i])) {
    3658 key = keys[j];
    3668 type = types[j];
    3678 break out;
    368 }
    369 }
    370 }
    371
    372 // default to the first
    37323 if (!acceptedlen) {
    37413 key = keys[0];
    37513 type = types[0];
    376 }
    377
    37823 if (key) {
    37921 this.set('Content-Type', type);
    38021 obj[key](req, this, next);
    381 } else {
    3822 var err = new Error('Not Acceptable');
    3832 err.status = 406;
    3842 err.types = types;
    3852 next(err);
    386 }
    387
    38823 return this;
    389};
    390
    391/**
    392 * Set _Content-Disposition_ header to _attachment_ with optional `filename`.
    393 *
    394 * @param {String} filename
    395 * @return {ServerResponse}
    396 * @api public
    397 */
    398
    3991res.attachment = function(filename){
    4005 if (filename) this.type(filename);
    4013 this.set('Content-Disposition', filename
    402 ? 'attachment; filename="' + basename(filename) + '"'
    403 : 'attachment');
    4043 return this;
    405};
    406
    407/**
    408 * Set header `field` to `val`, or pass
    409 * an object of of header fields.
    410 *
    411 * Examples:
    412 *
    413 * res.set('Accept', 'application/json');
    414 * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' });
    415 *
    416 * @param {String|Object} field
    417 * @param {String} val
    418 * @return {ServerResponse} for chaining
    419 * @api public
    420 */
    421
    4221res.set = function(field, val){
    423175 if (2 == arguments.length) {
    424174 this.setHeader(field, val);
    425 } else {
    4261 for (var key in field) {
    4272 this.setHeader(key, field[key]);
    428 }
    429 }
    430175 return this;
    431};
    432
    433/**
    434 * Get value for header `field`.
    435 *
    436 * @param {String} field
    437 * @return {String}
    438 * @api public
    439 */
    440
    4411res.get = function(field){
    442119 return this.getHeader(field);
    443};
    444
    445/**
    446 * Clear cookie `name`.
    447 *
    448 * @param {String} name
    449 * @param {Object} options
    450 * @param {ServerResponse} for chaining
    451 * @api public
    452 */
    453
    4541res.clearCookie = function(name, options){
    4552 var opts = { expires: new Date(1), path: '/' };
    4562 return this.cookie(name, '', options
    457 ? utils.merge(opts, options)
    458 : opts);
    459};
    460
    461/**
    462 * Set a signed cookie with the given `name` and `val`.
    463 * See `res.cookie()` for details.
    464 *
    465 * @param {String} name
    466 * @param {String|Object} val
    467 * @param {Object} options
    468 * @api public
    469 */
    470
    4711res.signedCookie = function(name, val, options){
    4722 var secret = this.req.secret;
    4732 if (!secret) throw new Error('connect.cookieParser("secret") required for signed cookies');
    4743 if ('object' == typeof val) val = 'j:' + JSON.stringify(val);
    4752 val = utils.sign(val, secret);
    4762 return this.cookie(name, val, options);
    477};
    478
    479/**
    480 * Set cookie `name` to `val`, with the given `options`.
    481 *
    482 * Options:
    483 *
    484 * - `maxAge` max-age in milliseconds, converted to `expires`
    485 * - `path` defaults to "/"
    486 *
    487 * Examples:
    488 *
    489 * // "Remember Me" for 15 minutes
    490 * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
    491 *
    492 * // save as above
    493 * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
    494 *
    495 * @param {String} name
    496 * @param {String|Object} val
    497 * @param {Options} options
    498 * @api public
    499 */
    500
    5011res.cookie = function(name, val, options){
    50210 options = options || {};
    50311 if ('object' == typeof val) val = 'j:' + JSON.stringify(val);
    50411 if ('maxAge' in options) options.expires = new Date(Date.now() + options.maxAge);
    50518 if (null == options.path) options.path = '/';
    50610 var cookie = utils.serializeCookie(name, val, options);
    50710 this.set('Set-Cookie', cookie);
    50810 return this;
    509};
    510
    511/**
    512 * Redirect to the given `url` with optional response `status`
    513 * defaulting to 302.
    514 *
    515 * The given `url` can also be the name of a mapped url, for
    516 * example by default express supports "back" which redirects
    517 * to the _Referrer_ or _Referer_ headers or "/".
    518 *
    519 * Examples:
    520 *
    521 * res.redirect('/foo/bar');
    522 * res.redirect('http://example.com');
    523 * res.redirect(301, 'http://example.com');
    524 *
    525 * Mounting:
    526 *
    527 * When an application is mounted, and `res.redirect()`
    528 * is given a path that does _not_ lead with "/". For
    529 * example suppose a "blog" app is mounted at "/blog",
    530 * the following redirect would result in "/blog/login":
    531 *
    532 * res.redirect('login');
    533 *
    534 * While the leading slash would result in a redirect to "/login":
    535 *
    536 * res.redirect('/login');
    537 *
    538 * @param {String} url
    539 * @param {Number} code
    540 * @api public
    541 */
    542
    5431res.redirect = function(url){
    54413 var app = this.app
    545 , req = this.req
    546 , head = 'HEAD' == req.method
    547 , status = 302
    548 , body;
    549
    550 // allow status / url
    55113 if (2 == arguments.length) {
    5521 status = url;
    5531 url = arguments[1];
    554 }
    555
    556 // setup redirect map
    55713 var map = { back: req.get('Referrer') || '/' };
    558
    559 // perform redirect
    56013 url = map[url] || url;
    561
    562 // relative
    56313 if (!~url.indexOf('://')) {
    5648 var path = app.path();
    565
    566 // relative to path
    5678 if (0 == url.indexOf('./') || 0 == url.indexOf('..')) {
    5682 url = req.path + '/' + url;
    569 // relative to mount-point
    5706 } else if ('/' != url[0]) {
    5713 url = path + '/' + url;
    572 }
    573
    574 // Absolute
    5758 var host = req.get('Host');
    5768 url = req.protocol + '://' + host + url;
    577 }
    578
    579 // Support text/{plain,html} by default
    58013 this.format({
    581 'text/plain': function(){
    58212 body = statusCodes[status] + '. Redirecting to ' + url;
    583 },
    584
    585 'text/html': function(){
    5861 body = '<p>' + statusCodes[status] + '. Redirecting to <a href="' + url + '">' + url + '</a></p>';
    587 }
    588 })
    589
    590 // Respond
    59113 this.statusCode = status;
    59213 this.set('Location', url);
    59313 this.end(head ? null : body);
    594};
    595
    596/**
    597 * Render `view` with the given `options` and optional callback `fn`.
    598 * When a callback function is given a response will _not_ be made
    599 * automatically, otherwise a response of _200_ and _text/html_ is given.
    600 *
    601 * Options:
    602 *
    603 * - `status` Response status code (`res.statusCode`)
    604 * - `charset` Set the charset (`res.charset`)
    605 *
    606 * Reserved locals:
    607 *
    608 * - `cache` boolean hinting to the engine it should cache
    609 * - `filename` filename of the view being rendered
    610 *
    611 * @param {String} view
    612 * @param {Object|Function} options or callback function
    613 * @param {Function} fn
    614 * @api public
    615 */
    616
    6171res.render = function(view, options, fn){
    61818 var self = this
    619 , options = options || {}
    620 , req = this.req
    621 , app = req.app;
    622
    623 // support callback function as second arg
    62418 if ('function' == typeof options) {
    6252 fn = options, options = {};
    626 }
    627
    62818 function render() {
    629 // merge res.locals
    63018 options.locals = self.locals;
    631
    632 // default callback to respond
    63318 fn = fn || function(err, str){
    63416 if (err) return req.next(err);
    63514 self.send(str);
    636 };
    637
    638 // render
    63918 app.render(view, options, fn);
    640 }
    641
    642 // invoke view callbacks
    64318 var callbacks = app.viewCallbacks
    644 , pending = callbacks.length
    645 , len = pending
    646 , done;
    647
    64818 if (len) {
    6493 for (var i = 0; i < len; ++i) {
    6504 callbacks[i](req, self, function(err){
    6514 if (done) return;
    652
    6534 if (err) {
    6540 req.next(err);
    6550 done = true;
    6560 return;
    657 }
    658
    6594 --pending || render();
    660 });
    661 }
    662 } else {
    66315 render();
    664 }
    665};
    \ No newline at end of file diff --git a/index.html b/index.html index 6bd181fd21..1679a56103 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,7 @@

    Features

    • browser support
    • simple async support
    • +
    • test coverage reporting
    • proper exit status for CI support etc
    • auto-detects and disables coloring for non-ttys
    • maps uncaught exceptions to the correct test case
    • @@ -34,30 +35,31 @@

      Features

    • file watcher support
    • global variable leak detection
    • optionally run tests that match a regexp
    • -
    • auto-exit to prevent "hanging" with an active loop
    • +
    • auto-exit to prevent “hanging” with an active loop
    • easily meta-generate suites & test-cases
    • mocha.opts file support
    • node debugger support
    • detects multiple calls to done()
    • use any assertion library you want
    • extensible reporting, bundled with 9+ reporters
    • -
    • extensible test DSLs or "interfaces"
    • +
    • extensible test DSLs or “interfaces”
    • before, after, before each, after each hooks
    • coffee-script support
    • TextMate bundle
    • and more!
    +

    Installation

    -

    Install with npm:

    +

    Install with npm:

    $ npm install -g mocha
     

    Assertions

    -

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    +

    Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node’s regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

    • should.js BDD style shown throughout these docs
    • @@ -65,9 +67,10 @@

      Assertions

    • chai expect(), assert() and should style assertions
    +

    Synchronous code

    -

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    +

    When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -96,7 +99,7 @@ 

    Asynchronous code

    })
    -

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    +

    To make things even easier, the done() callback accepts an error, so we may use this directly:

    describe('User', function(){
       describe('#save()', function(){
    @@ -108,7 +111,7 @@ 

    Asynchronous code

    })
    -

    All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    +

    All “hooks”, that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

    describe('Connection', function(){
       var db = new Connection
    @@ -137,7 +140,7 @@ 

    Asynchronous code

    Pending tests

    -

    Pending test-cases are simply those without a callback:

    +

    Pending test-cases are simply those without a callback:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -148,17 +151,17 @@ 

    Pending tests

    Test duration

    -

    Most of the reporters support some form of displaying +

    Most of the reporters support some form of displaying test duration, as well as flagging tests that are slow, - as shown here with the "spec" reporter:

    + as shown here with the “spec” reporter:

    -

    test duration

    +

    test duration

    mocha(1)

    -

    Usage: mocha [options] [files]

    +

    Usage: mocha [options] [files]

    -

    Options:

    +

    Options:

    -h, --help             output usage information
     -V, --version          output the version number
    @@ -180,51 +183,51 @@ 

    mocha(1)

    --reporters display available reporters
    -

    -w, --watch

    +

    -w, –watch

    -

    Executes tests on changes to JavaScript in the CWD.

    +

    Executes tests on changes to JavaScript in the CWD.

    -

    -b, --bail

    +

    -b, –bail

    -

    Only interested in the first exception? use --bail !

    +

    Only interested in the first exception? use --bail !

    -

    -d, --debug

    +

    -d, –debug

    -

    Enables node's debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    +

    Enables node’s debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement.

    -

    --globals <names>

    +

    –globals <names>

    -

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    +

    Accepts a comma-delimited list of accepted global variable names. For example suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI.

    -

    --ignore-leaks

    +

    –ignore-leaks

    -

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    +

    By default Mocha will fail when global variables are introduced, you may use --globals to specify a few, or use --ignore-leaks to disable this functionality.

    -

    -r, --require <name>

    +

    -r, –require <name>

    -

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    +

    The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file.

    -

    -u, --ui <name>

    +

    -u, –ui <name>

    -

    The --ui option lets you specify the interface to use, defaulting to "bdd".

    +

    The --ui option lets you specify the interface to use, defaulting to “bdd”.

    -

    -R, --reporter <name>

    +

    -R, –reporter <name>

    -

    The --reporter option allows you to specify the reporter that will be used, defaulting to "dot".

    +

    The --reporter option allows you to specify the reporter that will be used, defaulting to “dot”.

    -

    -t, --timeout <ms>

    +

    -t, –timeout <ms>

    -

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    +

    Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

    -

    -s, --slow <ms>

    +

    -s, –slow <ms>

    -

    Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    +

    Specify the “slow” test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

    -

    -g, --grep <pattern>

    +

    -g, –grep <pattern>

    -

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    +

    The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

    -

    Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    +

    Suppose for example you have “api” related tests, as well as “app” related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

    describe('api', function(){
       describe('GET /api/users', function(){
    @@ -241,11 +244,11 @@ 

    -g, --grep <pattern>

    Interfaces

    -

    Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    +

    Mocha “interface” system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

    BDD

    -

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The “BDD” interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    describe('Array', function(){
       before(function(){
    @@ -262,7 +265,7 @@ 

    BDD

    TDD

    -

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    +

    The “TDD” interface provides suite(), test(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -279,7 +282,7 @@ 

    TDD

    Exports

    -

    The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values +

    The “exports” interface is much like Mocha’s predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values are suites, and function values are test-cases.

    module.exports = {
    @@ -299,7 +302,7 @@ 

    Exports

    QUnit

    -

    The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases.

    +

    The qunit-inspired interface matches the “flat” look of QUnit where the test suite title is simply defined before the test-cases.

    function ok(expr, msg) {
       if (!expr) throw new Error(msg);
    @@ -328,76 +331,88 @@ 

    QUnit

    Reporters

    -

    Mocha reporters adjust to the terminal window, +

    Mocha reporters adjust to the terminal window, and always disable ansi-escape colouring when the stdio streams are not associated with a tty.

    Dot Matrix

    -

    The "dot" matrix reporter is simply a series of dots +

    The “dot” matrix reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow.

    -

    dot matrix reporter

    +

    dot matrix reporter

    Spec

    -

    The "spec" reporter outputs a hierarchical view +

    The “spec” reporter outputs a hierarchical view nested just as the test cases are.

    -

    spec reporter - spec reporter with failure

    +

    spec reporter + spec reporter with failure

    TAP

    -

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    +

    The TAP reporter emits lines for a Test-Anything-Protocol consumer.

    -

    test anything protocol

    +

    test anything protocol

    Landing Strip

    -

    The Landing Strip reporter is a gimmicky test reporter simulating +

    The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw

    -

    landing strip plane reporter - landing strip with failure

    +

    landing strip plane reporter + landing strip with failure

    List

    -

    The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at +

    The “List” reporter outputs a simple specifications list as + test cases pass or fail, outputting the failure details at the bottom of the output.

    -

    list reporter

    +

    list reporter

    Progress

    -

    The progress reporter implements a simple progress-bar:

    +

    The progress reporter implements a simple progress-bar:

    -

    progress bar

    +

    progress bar

    JSON

    -

    The JSON reporter outputs a single large JSON object when +

    The JSON reporter outputs a single large JSON object when the tests have completed (failures or not).

    -

    json reporter

    +

    json reporter

    JSON Stream

    -

    The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

    +

    The JSON Stream reporter outputs newline-delimited JSON “events” as they occur, beginning with a “start” event, followed by test passes or failures, and then the final “end” event.

    + +

    json stream reporter

    + +

    JSONCov

    + +

    The JSONCov reporter is similar to the JSON reporter, however when run against a library instrumented by node-jscoverage it will produce coverage output.

    -

    json stream reporter

    +

    HTMLCov

    + +

    The HTMLCov reporter extends the JSONCov reporter. The library being tested should first be instrumented by node-jscoverage, this allows Mocha to capture the coverage information necessary to produce a single-page HTML report.

    + +

    Click to view the current Express test coverage report. For an integration example view the mcoha test coverage support commit for Express.

    + +

    code coverage reporting

    Doc

    -

    The "doc" reporter outputs a hierarchical HTML body representation +

    The “doc” reporter outputs a hierarchical HTML body representation of your tests, wrap it with a header, footer, some styling and you have some fantastic documentation!

    -

    doc reporter

    +

    doc reporter

    -

    For example suppose you have the following JavaScript:

    +

    For example suppose you have the following JavaScript:

    describe('Array', function(){
       describe('#indexOf()', function(){
    @@ -409,7 +424,7 @@ 

    Doc

    })
    -

    The command mocha --reporter doc array would yield:

    +

    The command mocha --reporter doc array would yield:

    <section class="suite">
       <h1>Array</h1>
    @@ -426,7 +441,7 @@ 

    Doc

    </section>
    -

    The SuperAgent request library test documentation was generated with Mocha's doc reporter using this simple make target:

    +

    The SuperAgent request library test documentation was generated with Mocha’s doc reporter using this simple make target:

    test-docs:
         make test REPORTER=doc \
    @@ -434,26 +449,26 @@ 

    Doc

    > docs/test.html
    -

    View the entire Makefile for reference.

    +

    View the entire Makefile for reference.

    XUnit

    -

    Documentation needed.

    +

    Documentation needed.

    TeamCity

    -

    Documentation needed.

    +

    Documentation needed.

    HTML

    -

    The HTML reporter is currently the only browser reporter +

    The HTML reporter is currently the only browser reporter supported by Mocha, and it looks like this:

    -

    HTML test reporter

    +

    HTML test reporter

    Browser support

    -

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    +

    Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

    <html>
     <head>
    @@ -481,22 +496,22 @@ 

    Browser support

    </html>
    -

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    +

    Feel free to hot-link the mocha.css and mocha.js from GitHub.

    grep

    -

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    +

    The client-side may utilize --grep as well, however you use the query-string, for example ?grep=api.

    mocha.opts

    -

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    +

    Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

    --require should
     --reporter dot
     --ui bdd
     
    -

    This will default the reporter to dot, require the should library, +

    This will default the reporter to dot, require the should library, and use bdd as the interface. With this you may then invoke mocha(1) with additional arguments, here enabling growl support and changing the reporter to spec:

    @@ -506,7 +521,7 @@

    mocha.opts

    Test specific timeouts

    -

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    +

    To compliment the global --timeout option, you may also specific test-specific timeouts via this.timeout(), or disable the timeout all-together with this.timeout(0).

    it('should take less than 500ms', function(done){
       this.timeout(500);
    @@ -518,12 +533,12 @@ 

    Best practices

    test/*

    -

    By default mocha(1) will use the pattern ./test/*.js, so - it's usually a good place to put your tests.

    +

    By default mocha(1) will use the pattern ./test/*.js, so + it’s usually a good place to put your tests.

    Makefiles

    -

    Be kind and don't make developers hunt around in your docs to figure +

    Be kind and don’t make developers hunt around in your docs to figure out how to run the tests, add a make test target to your Makefile:

     test:
    @@ -535,11 +550,11 @@ 

    Makefiles

    Editors

    -

    The following editor-related packages are available:

    +

    The following editor-related packages are available:

    TextMate bundle

    -

    The Mocha TextMate bundle includes snippets to +

    The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle run:

    @@ -548,37 +563,38 @@

    TextMate bundle

    Example test suites

    -

    The following test suites are from real projects putting Mocha to use, +

    The following test suites are from real projects putting Mocha to use, so they serve as good examples:

    -

    Running mocha's tests

    -

    Run the tests:

    +

    Running mocha’s tests

    + +

    Run the tests:

       $ make test
     
    -

    Run all tests, including interfaces:

    +

    Run all tests, including interfaces:

       $ make test-all
     
    -

    Alter the reporter:

    +

    Alter the reporter:

       $ make test REPORTER=list
     

    More information

    -

    For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub.

    +

    For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub.

    - + \ No newline at end of file From be8a7b82bb530774ebac8e27f140a86b18bb2c74 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Mon, 20 Oct 2014 15:18:02 -0500 Subject: [PATCH 0172/1771] rebuild pages From e312dc0084728b9caa58af40dbacce55ccd24916 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 20 Oct 2014 13:58:48 -0700 Subject: [PATCH 0173/1771] updating repo url --- head.html | 2 +- index.html | 12 ++++++------ index.md | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/head.html b/head.html index 33acb6da40..c93fcfaee2 100644 --- a/head.html +++ b/head.html @@ -20,5 +20,5 @@
    -

    Mocha

    +

    Mocha

    simple, flexible, fun

    diff --git a/index.html b/index.html index 21925e9b60..c56810dd49 100644 --- a/index.html +++ b/index.html @@ -20,9 +20,9 @@
    -

    Mocha

    +

    Mocha

    simple, flexible, fun

    -

    Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.

    +

    Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.

    Features

    @@ -754,7 +754,7 @@

    Mocha Setup in the Browser

    Mocha options can be set via mocha.setup(). Examples:

    -
    // Use "tdd" interface.  This is a shortcut to setting the interface; 
    +
    // Use "tdd" interface.  This is a shortcut to setting the interface;
     // any other options must be passed via an object.
     mocha.setup('tdd');
     
    @@ -873,7 +873,7 @@ 

    Example test suites

  • Connect
  • SuperAgent
  • WebSocket.io
  • -
  • Mocha
  • +
  • Mocha
  • Running mocha's tests

    @@ -895,10 +895,10 @@

    Running mocha's tests

    More information

    -

    For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub. For discussions join the Google Group. For a running example of mocha view example/tests.html. For the JavaScript API view the source.

    +

    For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub. For discussions join the Google Group. For a running example of mocha view example/tests.html. For the JavaScript API view the source.

    © 2011 TJ Holowaychuk. All rights reserved.
    - \ No newline at end of file + diff --git a/index.md b/index.md index 7872bfa809..0b3d68dba7 100644 --- a/index.md +++ b/index.md @@ -1,4 +1,4 @@ -Mocha is a feature-rich JavaScript test framework running on [node.js](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/visionmedia/mocha). +Mocha is a feature-rich JavaScript test framework running on [node.js](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha).

    Features

    @@ -817,7 +817,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal - [Connect](https://github.com/senchalabs/connect/tree/master/test) - [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) - [WebSocket.io](https://github.com/LearnBoost/websocket.io/tree/master/test) - - [Mocha](https://github.com/visionmedia/mocha/tree/master/test) + - [Mocha](https://github.com/mochajs/mocha/tree/master/test)

    Running mocha's tests

    @@ -835,4 +835,4 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

    More information

    - For additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/visionmedia/mocha/wiki) on GitHub. For discussions join the [Google Group](http://groups.google.com/group/mochajs). For a running example of mocha view [example/tests.html](example/tests.html). For the JavaScript API view the [source](https://github.com/visionmedia/mocha/blob/master/lib/mocha.js#L51). + For additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/mochajs/mocha/wiki) on GitHub. For discussions join the [Google Group](http://groups.google.com/group/mochajs). For a running example of mocha view [example/tests.html](example/tests.html). For the JavaScript API view the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js#L51). From 82843b327f3addfb2c61de8d4fb2bfe50b342e3f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Oct 2014 00:20:30 -0700 Subject: [PATCH 0174/1771] trying a CNAME file again --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..f596d46df1 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +mochajs.org From f3bcdc05d21591cbf75dc530468aa48ca8a351de Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Oct 2014 00:38:52 -0700 Subject: [PATCH 0175/1771] trash CNAME GitHub seems broken --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index f596d46df1..0000000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -mochajs.org From 7f9704fa2c558949e429e40f711488492c6613df Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Oct 2014 02:09:25 -0700 Subject: [PATCH 0176/1771] make CNAME again 3rd try's the charm? --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..f596d46df1 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +mochajs.org From ce0aa8e54734cf436b7a3da8bd65449034dc6563 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 21 Nov 2014 04:07:18 -0800 Subject: [PATCH 0177/1771] add www.mochajs.org to CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) diff --git a/CNAME b/CNAME index f596d46df1..fcf16becd4 100644 --- a/CNAME +++ b/CNAME @@ -1 +1,2 @@ mochajs.org +www.mochajs.org From e4f4371f448899cad8859ddcab4b24996e89ad52 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 21 Nov 2014 04:09:37 -0800 Subject: [PATCH 0178/1771] revert change to CNAME I don't think this is how it works; I need to update the DNS record on my end. --- CNAME | 1 - 1 file changed, 1 deletion(-) diff --git a/CNAME b/CNAME index fcf16becd4..f596d46df1 100644 --- a/CNAME +++ b/CNAME @@ -1,2 +1 @@ mochajs.org -www.mochajs.org From 1b2e9bc5ae4bc8c3ab9671ff14c6b7c041af77ce Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Fri, 21 Nov 2014 17:20:29 -0500 Subject: [PATCH 0179/1771] Fix test running output truncation on async STDIO --- bin/_mocha | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/bin/_mocha b/bin/_mocha index 3032690e9c..2aa69620b7 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -377,12 +377,32 @@ if (program.watch) { // load mocha.files = files; -runner = mocha.run(program.exit ? process.exit : exitLater); +runner = mocha.run(program.exit ? exit : exitLater); function exitLater(code) { process.on('exit', function() { process.exit(code) }) } +function exit(code) { + // flush output for Node.js Windows pipe bug + // https://github.com/joyent/node/issues/6247 is just one bug example + // https://github.com/visionmedia/mocha/issues/333 has a good discussion + function done() { + if (!(draining--)) process.exit(code); + } + + var draining = 0; + var streams = [process.stdout, process.stderr]; + + streams.forEach(function(stream){ + // submit empty write request and wait for completion + draining += 1; + stream.write('', done); + }); + + done(); +} + process.on('SIGINT', function() { runner.abort(); }) // enable growl notifications From c3caa248b392c62c07942b4fce32856d287783eb Mon Sep 17 00:00:00 2001 From: oveddan Date: Mon, 15 Dec 2014 23:24:35 -0500 Subject: [PATCH 0180/1771] Documented the context feature in BDD interface --- index.html | 24 +++++++++++++++++++----- index.md | 20 +++++++++++++++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index c56810dd49..594e84f80d 100644 --- a/index.html +++ b/index.html @@ -452,7 +452,9 @@

    Interfaces

    BDD

    -

    The "BDD" interface provides describe(), it(), before(), after(), beforeEach(), and afterEach():

    +

    The "BDD" interface provides describe(), context(), it(), before(), after(), beforeEach(), and afterEach():

    + +

    context() is just an alias for describe(), and behaves the same way; it just provides a way to keep tests easier to read and organized.

    describe('Array', function(){
       before(function(){
    @@ -460,8 +462,20 @@ 

    BDD

    }); describe('#indexOf()', function(){ - it('should return -1 when not present', function(){ - [1,2,3].indexOf(4).should.equal(-1); + context('when not present', function(){ + it('should not throw an error', function(){ + (function(){ + [1,2,3].indexOf(4); + }).should.not.throw(); + }); + it('should return -1', function(){ + [1,2,3].indexOf(4).should.equal(-1); + }); + }); + context('when present', function(){ + it('should return the index where the element first appears in the array', function(){ + [1,2,3].indexOf(3).should.equal(2); + }); }); }); }); @@ -754,7 +768,7 @@

    Mocha Setup in the Browser

    Mocha options can be set via mocha.setup(). Examples:

    -
    // Use "tdd" interface.  This is a shortcut to setting the interface;
    +
    // Use "tdd" interface.  This is a shortcut to setting the interface; 
     // any other options must be passed via an object.
     mocha.setup('tdd');
     
    @@ -901,4 +915,4 @@ 

    More information

    © 2011 TJ Holowaychuk. All rights reserved. - + \ No newline at end of file diff --git a/index.md b/index.md index 0b3d68dba7..ba1a4a2a4b 100644 --- a/index.md +++ b/index.md @@ -412,7 +412,9 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

    BDD

    - The "__BDD__" interface provides `describe()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`: + The "__BDD__" interface provides `describe()`, `context()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`: + + `context()` is just an alias for `describe()`, and behaves the same way; it just provides a way to keep tests easier to read and organized. describe('Array', function(){ before(function(){ @@ -420,8 +422,20 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal }); describe('#indexOf()', function(){ - it('should return -1 when not present', function(){ - [1,2,3].indexOf(4).should.equal(-1); + context('when not present', function(){ + it('should not throw an error', function(){ + (function(){ + [1,2,3].indexOf(4); + }).should.not.throw(); + }); + it('should return -1', function(){ + [1,2,3].indexOf(4).should.equal(-1); + }); + }); + context('when present', function(){ + it('should return the index where the element first appears in the array', function(){ + [1,2,3].indexOf(3).should.equal(2); + }); }); }); }); From 7aa996a15dbd7200abf5f21bc7c1cf0cf37295b1 Mon Sep 17 00:00:00 2001 From: Roman Shtylman Date: Sat, 20 Dec 2014 19:21:26 -0800 Subject: [PATCH 0181/1771] fix require example usage Example for require interface was incorrect. This fixes the erroneous documentation. --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 0b3d68dba7..3837d6a228 100644 --- a/index.md +++ b/index.md @@ -500,7 +500,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal var testCase = require('mocha').describe var pre = require('mocha').before - var assertions = require('mocha').assertions + var assertions = require('mocha').it var assert = require('assert') testCase('Array', function(){ From a2562627fc5af6be86855f4c0d11d8f1a6b5b117 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 22 Dec 2014 03:44:47 +0100 Subject: [PATCH 0182/1771] in runnable test, comparing to undefined error's message rather than a literal --- test/runnable.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/runnable.js b/test/runnable.js index dd05a7543b..2508a5fa25 100644 --- a/test/runnable.js +++ b/test/runnable.js @@ -1,4 +1,5 @@ var mocha = require('../') + , utils = mocha.utils , Runnable = mocha.Runnable , EventEmitter = require('events').EventEmitter; @@ -232,7 +233,7 @@ describe('Runnable(title, fn)', function(){ }); test.run(function(err) { - err.message.should.equal('Caught undefined error, did you throw without specifying what?'); + err.message.should.equal(utils.undefinedError().message); done(); }) }); From 1e096caa3e2e531fae438b3027a1b154f474ae3a Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Thu, 1 Jan 2015 00:19:47 +0200 Subject: [PATCH 0183/1771] fix(LICENSE): update copyright year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 1c5d7fa873..ca47f261b3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2011-2014 TJ Holowaychuk +Copyright (c) 2011-2015 TJ Holowaychuk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From a562608f99db1bfe3d3269f0eab904aae31af2d2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 2 Jan 2015 11:38:11 -0800 Subject: [PATCH 0184/1771] add Gitter badge to README.md (for now) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a3a948936..e8dcd34d23 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - [![Build Status](https://secure.travis-ci.org/mochajs/mocha.png)](http://travis-ci.org/mochajs/mocha) + [![Build Status](https://secure.travis-ci.org/mochajs/mocha.png)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://mochajs.org) From 1472a68c63110fcab590177c9490a0fb8202f8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Zugmeyer?= Date: Sun, 4 Jan 2015 23:01:01 +0100 Subject: [PATCH 0185/1771] utils.stringify should handle objects without an Object prototype --- lib/utils.js | 2 +- test/acceptance/utils.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index c624375025..7059b9de7f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -380,7 +380,7 @@ exports.stringify = function(value) { } for (prop in value) { - if (value.hasOwnProperty(prop)) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { return JSON.stringify(exports.canonicalize(value), null, 2).replace(/,(\n|$)/g, '$1'); } } diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index 4442c59213..c268466818 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -212,6 +212,13 @@ stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}}).should.equal('{\n "foo": stringify(date).should.equal('[Date: 1970-01-01T00:00:00.000Z]'); stringify({date: date}).should.equal('{\n "date": "[Date: 1970-01-01T00:00:00.000Z]"\n}'); }); + + it('should handle object without an Object prototype', function () { + var a = Object.create(null); + a.foo = 1; + + stringify(a).should.equal('{\n "foo": 1\n}'); + }); }); describe('type', function () { From 83bd5b4b1d95838a602f99add7a46a1ea3c5646b Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Mon, 5 Jan 2015 03:46:37 -0500 Subject: [PATCH 0186/1771] Use grep as regexp (close #1381) --- lib/runner.js | 4 +- mocha.js | 8 +-- support/tail.js | 2 +- test/browser/grep.html | 51 +++++++++++++++++++ test/browser/grep.js | 108 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 test/browser/grep.html create mode 100644 test/browser/grep.js diff --git a/lib/runner.js b/lib/runner.js index ba02d9a53e..0c9cc551a7 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -574,8 +574,8 @@ Runner.prototype.uncaught = function(err){ */ Runner.prototype.run = function(fn){ - var self = this - , fn = fn || function(){}; + var self = this; + fn = fn || function(){}; function uncaught(err){ self.uncaught(err); diff --git a/mocha.js b/mocha.js index 22d1a9f324..6352ac702b 100644 --- a/mocha.js +++ b/mocha.js @@ -5092,8 +5092,8 @@ Runner.prototype.uncaught = function(err){ */ Runner.prototype.run = function(fn){ - var self = this - , fn = fn || function(){}; + var self = this; + fn = fn || function(){}; function uncaught(err){ self.uncaught(err); @@ -5968,7 +5968,7 @@ exports.stringify = function(value) { } for (prop in value) { - if (value.hasOwnProperty(prop)) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { return JSON.stringify(exports.canonicalize(value), null, 2).replace(/,(\n|$)/g, '$1'); } } @@ -6277,7 +6277,7 @@ mocha.run = function(fn){ mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(query.grep); + if (query.grep) mocha.grep(new RegExp(query.grep)); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ diff --git a/support/tail.js b/support/tail.js index e9c0c0d22f..5e1d59be68 100644 --- a/support/tail.js +++ b/support/tail.js @@ -139,7 +139,7 @@ mocha.run = function(fn){ mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(query.grep); + if (query.grep) mocha.grep(new RegExp(query.grep)); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ diff --git a/test/browser/grep.html b/test/browser/grep.html new file mode 100644 index 0000000000..0ba47c8533 --- /dev/null +++ b/test/browser/grep.html @@ -0,0 +1,51 @@ + + + Mocha + + + + + + + + + +
    + + + diff --git a/test/browser/grep.js b/test/browser/grep.js new file mode 100644 index 0000000000..9531b87aa9 --- /dev/null +++ b/test/browser/grep.js @@ -0,0 +1,108 @@ +// numbers +describe('21', function() { + it('1', function() { + assert(true); + }); + it('2', function() { + assert(true); + }); +}); +// symbols +describe('@Array', function() { + it('.pop()', function() { + assert(true); + }); + it('.push()', function() { + assert(true); + }); + it('.length', function() { + assert(true); + }); +}); + +describe('@Function', function() { + it('.call()', function() { + assert(true); + }); + it('.apply()', function() { + assert(true); + }); + it('.length', function() { + assert(true); + }); + it('.name', function() { + assert(true); + }); + it('.prototype', function() { + assert(true); + }); +}); + +//url with hashtags +describe('#Services',function() { + describe('#http', function() { + it('.createClient()', function() { + assert(true); + }); + it('.Server()', function() { + assert(true); + }); + }); + describe('#crypto', function() { + it('.randomBytes()', function() { + assert(true); + }); + it('.Hmac()', function() { + assert(true); + }); + }); +}); + +// Uppercase +describe('CONSTANTS', function() { + it('.STATUS_CODES', function() { + assert(true); + }); +}); + +// Dates +describe('Date:', function() { + it('01/02/2015', function() { + assert(true); + }); + it('01/03/2015', function() { + assert(true); + }); + it('01/06/2015', function() { + assert(true); + }); +}); + +// etc.. +describe('booking/summary', function() { + it('should be run last', function() { + assert(true); + }); +}); + +describe('component/booking/summary', function() { + it('should be run second', function() { + assert(true); + }); +}); + +describe('component/booking/intro', function() { + it('should be run first', function() { + assert(true); + }); +}); + +describe('contains numbers', function() { + it('should run if the number 92 matching', function() { + assert(true); + }); + + it('should run if the number 8 matching', function() { + assert(true); + }); +}); \ No newline at end of file From 12b6ed9d6efcff0504b13148b27556027c1ba894 Mon Sep 17 00:00:00 2001 From: Vlad Magdalin Date: Wed, 7 Jan 2015 15:46:09 -0800 Subject: [PATCH 0187/1771] Prevent multiple 'grep=' querystring params in html reporter --- lib/reporters/html.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 31ec106106..aec2af0d39 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -183,6 +183,12 @@ function HTML(runner) { */ var makeUrl = function makeUrl(s) { var search = window.location.search; + + // Remove previous grep query parameter if present + if (search) { + search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); + } + return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s); }; From f664483e45391fda011d502486d9e9b6531d5119 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Mon, 12 Jan 2015 17:16:03 -0500 Subject: [PATCH 0188/1771] Remove slack link --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e8dcd34d23..aabc1e8512 100644 --- a/README.md +++ b/README.md @@ -222,5 +222,3 @@ - [Google Group](http://groups.google.com/group/mochajs) - [Wiki](https://github.com/mochajs/mocha/wiki) - Mocha [Extensions and reporters](https://github.com/mochajs/mocha/wiki) - -Mocha also has a chat room on [Slack](https://slack.com). If you'd like to join, [shoot us an email](mailto:tj@travisjeffery.com?subject=mocha%20slack%20room%20invite) from the address you want us to invite you under and we'll happily send you an invite! From f43006aec9bff54e1d71cd6f7513dd6352d1410c Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Tue, 13 Jan 2015 10:01:42 +0200 Subject: [PATCH 0189/1771] fix(utils.stringify): issue #1229, diff viewer --- lib/reporters/base.js | 3 +- lib/utils.js | 137 +++++++++++++++++++++++++++++-------- test/acceptance/utils.js | 144 ++++++++++++++++++++++++++++++++++----- 3 files changed, 236 insertions(+), 48 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 97b12ba5c5..b6a230588f 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -175,7 +175,6 @@ exports.list = function(failures){ if (err.uncaught) { msg = 'Uncaught ' + msg; } - // explicitly show diff if (err.showDiff && sameType(actual, expected)) { @@ -386,7 +385,7 @@ function unifiedDiff(err, escape) { function notBlank(line) { return line != null; } - msg = diff.createPatch('string', err.actual, err.expected); + var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); return '\n ' + colorLines('diff added', '+ expected') + ' ' diff --git a/lib/utils.js b/lib/utils.js index 7059b9de7f..f300cd9516 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -127,7 +127,7 @@ exports.filter = function(arr, fn){ exports.keys = Object.keys || function(obj) { var keys = [] - , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + , has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 for (var key in obj) { if (has.call(obj, key)) { @@ -157,6 +157,26 @@ exports.watch = function(files, fn){ }); }; +/** + * Array.isArray (<=IE8) + * + * @param {Object} obj + * @return {Boolean} + * @api private + */ +var isArray = Array.isArray || function (obj) { + return '[object Array]' == {}.toString.call(obj); +}; + +/** + * @description + * Buffer.prototype.toJSON polyfill + * @type {Function} + */ +Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { + return Array.prototype.slice.call(this, 0); +}; + /** * Ignored files. */ @@ -179,15 +199,15 @@ exports.files = function(dir, ext, ret){ var re = new RegExp('\\.(' + ext.join('|') + ')$'); fs.readdirSync(dir) - .filter(ignored) - .forEach(function(path){ - path = join(dir, path); - if (fs.statSync(path).isDirectory()) { - exports.files(path, ext, ret); - } else if (path.match(re)) { - ret.push(path); - } - }); + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ext, ret); + } else if (path.match(re)) { + ret.push(path); + } + }); return ret; }; @@ -364,30 +384,94 @@ exports.type = function type(value) { */ exports.stringify = function(value) { - var prop, - type = exports.type(value); - - if (type === 'null' || type === 'undefined') { - return '[' + type + ']'; - } - - if (type === 'date') { - return '[Date: ' + value.toISOString() + ']'; - } + var type = exports.type(value); if (!~exports.indexOf(['object', 'array', 'function'], type)) { - return value.toString(); + if(type != 'buffer') { + return jsonStringify(value); + } + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); } - for (prop in value) { + for (var prop in value) { if (Object.prototype.hasOwnProperty.call(value, prop)) { - return JSON.stringify(exports.canonicalize(value), null, 2).replace(/,(\n|$)/g, '$1'); + return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); } } return emptyRepresentation(value, type); }; +/** + * @description + * like JSON.stringify but more sense. + * @param {Object} object + * @param {Number=} spaces + * @param {number=} depth + * @returns {*} + * @private + */ +function jsonStringify(object, spaces, depth) { + if(typeof spaces == 'undefined') return _stringify(object); // primitive types + + depth = depth || 1; + var space = spaces * depth + , str = isArray(object) ? '[' : '{' + , end = isArray(object) ? ']' : '}' + , length = object.length || exports.keys(object).length + , repeat = function(s, n) { return new Array(n).join(s); }; // `.repeat()` polyfill + + function _stringify(val) { + switch (exports.type(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'number': + val = val === 0 && (1/val) === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'date': + val = '[Date: ' + val.toISOString() + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = (val == '[Function]' || val == '[Circular]') + ? val + : '"' + val + '"'; //string + } + return val; + } + + for(var i in object) { + if(!object.hasOwnProperty(i)) continue; // not my business + --length; + str += '\n ' + repeat(' ', space) + + (isArray(object) ? '' : '"' + i + '": ') // key + + _stringify(object[i]) // value + + (length ? ',' : ''); // comma + } + + return str + (str.length != 1 // [], {} + ? '\n' + repeat(' ', --space) + end + : end); +} + /** * Return if obj is a Buffer * @param {Object} arg @@ -434,8 +518,6 @@ exports.canonicalize = function(value, stack) { switch(type) { case 'undefined': - canonicalizedObj = '[undefined]'; - break; case 'buffer': case 'null': canonicalizedObj = value; @@ -447,9 +529,6 @@ exports.canonicalize = function(value, stack) { }); }); break; - case 'date': - canonicalizedObj = '[Date: ' + value.toISOString() + ']'; - break; case 'function': for (prop in value) { canonicalizedObj = {}; @@ -468,7 +547,9 @@ exports.canonicalize = function(value, stack) { }); }); break; + case 'date': case 'number': + case 'regexp': case 'boolean': canonicalizedObj = value; break; diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index c268466818..6b373a45e3 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -35,8 +35,8 @@ describe('lib/utils', function () { it("should format functions saved in windows style - spaces", function () { var fn = [ "function (one) {" - , " do {", - , ' "nothing";', + , " do {" + , ' "nothing";' , " } while (false);" , ' }' ].join("\r\n"); @@ -75,6 +75,115 @@ describe('lib/utils', function () { var stringify = utils.stringify; + it('should return Buffer with .toJSON representation', function() { + stringify(new Buffer([0x01])).should.equal('[\n 1\n]'); + stringify(new Buffer([0x01, 0x02])).should.equal('[\n 1\n 2\n]'); + + stringify(new Buffer('ABCD')).should.equal('[\n 65\n 66\n 67\n 68\n]'); + }); + + it('should return Date object with .toISOString() + string prefix', function() { + stringify(new Date(0)).should.equal('[Date: ' + new Date(0).toISOString() + ']'); + + var date = new Date(); // now + stringify(date).should.equal('[Date: ' + date.toISOString() + ']'); + }); + + describe('#Number', function() { + it('should show the handle -0 situations', function() { + stringify(-0).should.eql('-0'); + stringify(0).should.eql('0'); + stringify('-0').should.eql('"-0"'); + }); + + it('should work well with `NaN` and `Infinity`', function() { + stringify(NaN).should.equal('NaN'); + stringify(Infinity).should.equal('Infinity'); + stringify(-Infinity).should.equal('-Infinity'); + }); + + it('floats and ints', function() { + stringify(1).should.equal('1'); + stringify(1.2).should.equal('1.2'); + stringify(1e9).should.equal('1000000000'); + }); + }); + + describe('canonicalize example', function() { + it('should represent the actual full result', function() { + var expected = { + str: 'string', + int: 90, + float: 9.99, + boolean: false, + nil: null, + undef: undefined, + regex: /^[a-z|A-Z]/, + date: new Date(0), + func: function() {}, + infi: Infinity, + nan: NaN, + zero: -0, + buffer: new Buffer([0x01, 0x02]), + array: [1,2,3], + empArr: [], + matrix: [[1], [2,3,4] ], + object: { a: 1, b: 2 }, + canObj: { a: { b: 1, c: 2 }, b: {} }, + empObj: {} + }; + expected.circular = expected; // Make `Circular` situation + var actual = ['{' + , ' "array": [' + , ' 1' + , ' 2' + , ' 3' + , ' ]' + , ' "boolean": false' + , ' "buffer": [Buffer: [' + , ' 1' + , ' 2' + , ' ]]' + , ' "canObj": {' + , ' "a": {' + , ' "b": 1' + , ' "c": 2' + , ' }' + , ' "b": {}' + , ' }' + , ' "circular": [Circular]' + , ' "date": [Date: 1970-01-01T00:00:00.000Z]' + , ' "empArr": []' + , ' "empObj": {}' + , ' "float": 9.99' + , ' "func": [Function]' + , ' "infi": Infinity' + , ' "int": 90' + , ' "matrix": [' + , ' [' + , ' 1' + , ' ]' + , ' [' + , ' 2' + , ' 3' + , ' 4' + , ' ]' + , ' ]' + , ' "nan": NaN' + , ' "nil": [null]' + , ' "object": {' + , ' "a": 1' + , ' "b": 2' + , ' }' + , ' "regex": /^[a-z|A-Z]/' + , ' "str": "string"' + , ' "undef": [undefined]' + , ' "zero": -0' + , '}'].join('\n'); + stringify(expected).should.equal(actual); + }); + }); + it('should canonicalize the object', function(){ var travis = { name: 'travis', age: 24 }; var travis2 = { age: 24, name: 'travis' }; @@ -86,21 +195,21 @@ describe('lib/utils', function () { var travis = { name: 'travis' }; travis.whoami = travis; - stringify(travis).should.equal('{\n "name": "travis"\n "whoami": "[Circular]"\n}'); + stringify(travis).should.equal('{\n "name": "travis"\n "whoami": [Circular]\n}'); }); it('should handle circular structures in arrays', function(){ var travis = ['travis']; travis.push(travis); - stringify(travis).should.equal('[\n "travis"\n "[Circular]"\n]'); + stringify(travis).should.equal('[\n "travis"\n [Circular]\n]'); }); it('should handle circular structures in functions', function(){ var travis = function () {}; travis.fn = travis; - stringify(travis).should.equal('{\n "fn": "[Circular]"\n}'); + stringify(travis).should.equal('{\n "fn": [Circular]\n}'); }); @@ -109,7 +218,7 @@ describe('lib/utils', function () { regExpObj = { regexp: regexp }, regexpString = '/(?:)/'; - stringify(regExpObj).should.equal('{\n "regexp": "' + regexpString + '"\n}'); + stringify(regExpObj).should.equal('{\n "regexp": ' + regexpString + '\n}'); stringify(regexp).should.equal(regexpString); var number = 1, @@ -130,15 +239,14 @@ describe('lib/utils', function () { stringObj = { string: string }; stringify(stringObj).should.equal('{\n "string": "' + string + '"\n}'); - stringify(string).should.equal(string); + stringify(string).should.equal(JSON.stringify(string)); var nullValue = null, nullObj = { 'null': null }, nullString = '[null]'; - stringify(nullObj).should.equal('{\n "null": null\n}'); + stringify(nullObj).should.equal('{\n "null": [null]\n}'); stringify(nullValue).should.equal(nullString); - }); it('should handle arrays', function () { @@ -157,7 +265,7 @@ describe('lib/utils', function () { fnObj = {fn: fn}, fnString = '[Function]'; - stringify(fnObj).should.equal('{\n "fn": "' + fnString + '"\n}'); + stringify(fnObj).should.equal('{\n "fn": ' + fnString + '\n}'); stringify(fn).should.equal('[Function]'); }); @@ -177,8 +285,8 @@ describe('lib/utils', function () { it('should handle empty functions (with no properties)', function () { stringify(function(){}).should.equal('[Function]'); - stringify({foo: function() {}}).should.equal('{\n "foo": "[Function]"\n}'); - stringify({foo: function() {}, bar: 'baz'}).should.equal('{\n "bar": "baz"\n "foo": "[Function]"\n}'); + stringify({foo: function() {}}).should.equal('{\n "foo": [Function]\n}'); + stringify({foo: function() {}, bar: 'baz'}).should.equal('{\n "bar": "baz"\n "foo": [Function]\n}'); }); it('should handle functions w/ properties', function () { @@ -189,28 +297,28 @@ describe('lib/utils', function () { }); it('should handle undefined values', function () { - stringify({foo: undefined}).should.equal('{\n "foo": "[undefined]"\n}'); - stringify({foo: 'bar', baz: undefined}).should.equal('{\n "baz": "[undefined]"\n "foo": "bar"\n}'); + stringify({foo: undefined}).should.equal('{\n "foo": [undefined]\n}'); + stringify({foo: 'bar', baz: undefined}).should.equal('{\n "baz": [undefined]\n "foo": "bar"\n}'); stringify().should.equal('[undefined]'); }); it('should recurse', function () { -stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}}).should.equal('{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}'); + stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}}).should.equal('{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}'); }); it('might get confusing', function () { - stringify(null).should.equal(stringify('[null]')); + stringify(null).should.equal('[null]'); }); it('should not freak out if it sees a primitive twice', function () { - stringify({foo: null, bar: null}).should.equal('{\n "bar": null\n "foo": null\n}'); + stringify({foo: null, bar: null}).should.equal('{\n "bar": [null]\n "foo": [null]\n}'); stringify({foo: 1, bar: 1}).should.equal('{\n "bar": 1\n "foo": 1\n}'); }); it('should stringify dates', function () { var date = new Date(0); stringify(date).should.equal('[Date: 1970-01-01T00:00:00.000Z]'); - stringify({date: date}).should.equal('{\n "date": "[Date: 1970-01-01T00:00:00.000Z]"\n}'); + stringify({date: date}).should.equal('{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}'); }); it('should handle object without an Object prototype', function () { From 122577c89b1dd4c8638f4e71cfb96cbb00a39824 Mon Sep 17 00:00:00 2001 From: Moshe Kolodny Date: Mon, 19 Jan 2015 00:26:12 -0500 Subject: [PATCH 0190/1771] add support for some iojs flags --- bin/_mocha | 2 ++ bin/mocha | 2 ++ 2 files changed, 4 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 3032690e9c..bc9a09126a 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -85,6 +85,8 @@ program .option('--harmony-collections', 'enable harmony collections (sets, maps, and weak maps)') .option('--harmony-generators', 'enable harmony generators') .option('--harmony-proxies', 'enable harmony proxies') + .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)') + .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') diff --git a/bin/mocha b/bin/mocha index b5dbc72fba..beb8268fd2 100755 --- a/bin/mocha +++ b/bin/mocha @@ -31,6 +31,8 @@ process.argv.slice(2).forEach(function(arg){ case '--harmony-proxies': case '--harmony-collections': case '--harmony-generators': + case '--harmony_shipping': + case '--harmony_arrow_functions': case '--no-deprecation': case '--prof': case '--throw-deprecation': From b70ef757473991e51876eb292054f58ade75f72a Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sat, 24 Jan 2015 16:53:20 +0200 Subject: [PATCH 0191/1771] test(utils|ms|*): test existing units --- lib/utils.js | 2 +- test/ms.js | 82 ++++++++++++++++++++++++++++++++++++++++++ test/reporters/json.js | 6 ++-- test/reporters/nyan.js | 2 +- test/utils.js | 55 ++++++++++++++++++++++++---- 5 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 test/ms.js diff --git a/lib/utils.js b/lib/utils.js index f300cd9516..d3efc42bb0 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -58,7 +58,7 @@ exports.forEach = function(arr, fn, scope){ exports.map = function(arr, fn, scope){ var result = []; for (var i = 0, l = arr.length; i < l; i++) - result.push(fn.call(scope, arr[i], i)); + result.push(fn.call(scope, arr[i], i, arr)); return result; }; diff --git a/test/ms.js b/test/ms.js new file mode 100644 index 0000000000..1fd9740a62 --- /dev/null +++ b/test/ms.js @@ -0,0 +1,82 @@ +'use strict'; +var ms = require('../lib/ms'); + +describe('.ms()', function() { + // Helpers + var time = { + minutes: function(n) { return n * 60 * 1000; }, + hours: function (n) { return n * this.minutes(60); }, + days: function(n) { return n * this.hours(24); }, + years: function(n) { return n * this.days(365.25); } + }; + describe('get a value that less than 1 second', function() { + it('should return milliseconds representation', function() { + ms(200).should.equal('200ms'); + ms(30).should.equal('30ms'); + ms(2000).should.not.equal('2000ms'); + }); + }); + + describe('seconds representation', function() { + it('should return short format', function() { + ms(2000).should.equal('2s'); + }); + + it('should return long format', function() { + ms(2000, { long: true }).should.equal('2 seconds'); + ms(1000, { long: true }).should.equal('1 second'); + ms(1010, { long: true }).should.equal('1 second'); + }); + }); + + describe('minutess representation', function() { + it('should return short format', function() { + ms(time.minutes(1)).should.equal('1m'); + }); + + it('should return long format', function() { + ms(time.minutes(1), { long: true }).should.equal('1 minute'); + ms(time.minutes(3), { long: true }).should.equal('3 minutes'); + }); + }); + + describe('hours representation', function() { + it('should return short format', function() { + ms(time.hours(1)).should.equal('1h'); + }); + + it('should return long format', function() { + ms(time.hours(1), { long: true }).should.equal('1 hour'); + ms(time.hours(3), { long: true }).should.equal('3 hours'); + }); + }); + + describe('days representation', function() { + it('should return short format', function() { + ms(time.days(1)).should.equal('1d'); + }); + + it('should return long format', function() { + ms(time.days(1), { long: true }).should.equal('1 day'); + ms(time.days(3), { long: true }).should.equal('3 days'); + }); + }); + + describe('Getting string value', function() { + it('should return the milliseconds representation(Number)', function() { + ms('1 second').should.equal(1000); + + ms('1 minute').should.equal(time.minutes(1)); + ms('6 minutes').should.equal(time.minutes(6)); + + ms('1 hour').should.equal(time.hours(1)); + ms('5 hours').should.equal(time.hours(5)); + + ms('1 day').should.equal(time.days(1)); + ms('3 days').should.equal(time.days(3)); + + ms('1 year').should.equal(time.years(1)); + ms('2 years').should.equal(time.years(2)); + }); + }); +}); diff --git a/test/reporters/json.js b/test/reporters/json.js index f071e75480..e7b8955757 100644 --- a/test/reporters/json.js +++ b/test/reporters/json.js @@ -13,7 +13,7 @@ describe('json reporter', function(){ suite = new Suite('JSON suite', 'root'); runner = new Runner(suite); var mochaReporter = new mocha._reporter(runner); - }) + }); it('should have 1 test failure', function(done){ var testTitle = 'json test 1'; @@ -37,7 +37,7 @@ describe('json reporter', function(){ done(); }); - }) + }); it('should have 1 test pending', function(done) { var testTitle = 'json test 1'; @@ -58,4 +58,4 @@ describe('json reporter', function(){ }); }) -}) +}); diff --git a/test/reporters/nyan.js b/test/reporters/nyan.js index 8a54458961..e574808d66 100644 --- a/test/reporters/nyan.js +++ b/test/reporters/nyan.js @@ -27,4 +27,4 @@ describe('nyan face', function () { nyanCat.face.call(nyanCat).should.equal('( - .-)'); done(); }); -}) +}); diff --git a/test/utils.js b/test/utils.js index 3810c777b4..f60b42fc9f 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,26 +1,67 @@ var mocha = require('..'); var utils = mocha.utils; -var clean = utils.clean; -var isBuffer = utils.isBuffer; describe('utils', function() { - describe('.clean()', function(){ - it('should remove the wrapping function declaration', function(){ + describe('.clean()', function() { + var clean = utils.clean; + it('should remove the wrapping function declaration', function() { clean('function (one, two, three) {\n//code\n}').should.equal('//code'); }); - it('should remove space character indentation from the function body', function(){ + it('should remove space character indentation from the function body', function() { clean(' //line1\n //line2').should.equal('//line1\n //line2'); }); - it('should remove tab character indentation from the function body', function(){ + it('should remove tab character indentation from the function body', function() { clean('\t//line1\n\t\t//line2').should.equal('//line1\n\t//line2'); }); }); - describe('.isBuffer()', function(){ + + describe('.isBuffer()', function() { + var isBuffer = utils.isBuffer; it('should test if object is a Buffer', function() { isBuffer(new Buffer([0x01])).should.equal(true); isBuffer({}).should.equal(false); }) }); + + describe('.map()', function() { + var map = utils.map; + it('should behave same as Array.prototype.map', function() { + var arr = [1, 2, 3]; + map(arr, JSON.stringify).should.eql(arr.map(JSON.stringify)); + }); + + it('should call the callback with 3 arguments[currentValue, index, array]', function() { + var index = 0; + map([1, 2, 3], function(e, i, arr) { + e.should.equal(arr[index]); + i.should.equal(index++); + }) + }); + + it('should apply with the given scope', function() { + var scope = {}; + map(['a', 'b', 'c'], function() { + this.should.equal(scope); + }, scope); + }); + }); + + describe('.parseQuery()', function() { + var parseQuery = utils.parseQuery; + it('should get queryString and return key-value object', function() { + parseQuery('?foo=1&bar=2&baz=3').should.eql({ + foo: 1, + bar: 2, + baz: 3 + }); + + parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*').should.eql({ + r1: '^@(?!.*\\)$)', + r2: 'm{2}', + r3: '^co.*' + }); + }) + }); }); From e52387ddd6d9e1e48b879343370aa6003a07bb53 Mon Sep 17 00:00:00 2001 From: Tom Coquereau Date: Fri, 30 Jan 2015 00:27:14 +0100 Subject: [PATCH 0192/1771] Add Harmony Proxy flag for iojs --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 85397076e3..6ed6f8a905 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -84,6 +84,7 @@ program .option('--harmony-proxies', 'enable harmony proxies') .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)') .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)') + .option('--harmony_proxies', 'enable "harmony proxies" (iojs)') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') diff --git a/bin/mocha b/bin/mocha index c5ddfe0dd1..de5942ab9d 100755 --- a/bin/mocha +++ b/bin/mocha @@ -33,6 +33,7 @@ process.argv.slice(2).forEach(function(arg){ case '--harmony-generators': case '--harmony_shipping': case '--harmony_arrow_functions': + case '--harmony_proxies': case '--no-deprecation': case '--prof': case '--throw-deprecation': From cd956e5b6b73548fd4331caaf96c7781fc2b7149 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 19 Jan 2015 12:13:16 -0800 Subject: [PATCH 0193/1771] More comprehensive documentation for QUnit and TDD reporters --- index.html | 8 ++++---- index.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index c56810dd49..d806131a1f 100644 --- a/index.html +++ b/index.html @@ -469,7 +469,7 @@

    BDD

    TDD

    -

    The "TDD" interface provides suite(), test(), setup(), and teardown().

    +

    The "TDD" interface provides suite(), test(), suiteSetup(), suiteTeardown(), setup(), and teardown().

    suite('Array', function(){
       setup(function(){
    @@ -506,7 +506,7 @@ 

    Exports

    QUnit

    -

    The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases.

    +

    The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. Like TDD, it uses suite() and test(), but resembling BDD it also contains before(), after(), beforeEach(), and afterEach().

    function ok(expr, msg) {
       if (!expr) throw new Error(msg);
    @@ -544,7 +544,7 @@ 

    Require

    var testCase = require('mocha').describe
     var pre = require('mocha').before
    -var assertions = require('mocha').assertions
    +var assertions = require('mocha').it
     var assert = require('assert')
     
     testCase('Array', function(){
    @@ -754,7 +754,7 @@ 

    Mocha Setup in the Browser

    Mocha options can be set via mocha.setup(). Examples:

    -
    // Use "tdd" interface.  This is a shortcut to setting the interface;
    +
    // Use "tdd" interface.  This is a shortcut to setting the interface; 
     // any other options must be passed via an object.
     mocha.setup('tdd');
     
    diff --git a/index.md b/index.md
    index 3837d6a228..a08ea296ac 100644
    --- a/index.md
    +++ b/index.md
    @@ -428,7 +428,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal
     
     

    TDD

    - The "__TDD__" interface provides `suite()`, `test()`, `setup()`, and `teardown()`. + The "__TDD__" interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`. suite('Array', function(){ setup(function(){ @@ -463,7 +463,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

    QUnit

    - The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. + The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. Like TDD, it uses `suite()` and `test()`, but resembling BDD it also contains `before()`, `after()`, `beforeEach()`, and `afterEach()`. function ok(expr, msg) { if (!expr) throw new Error(msg); From fc2414d3d2913a7f1e820c17055e599ae86e2266 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Sat, 31 Jan 2015 15:27:00 -0800 Subject: [PATCH 0194/1771] fixes #1496, in Mocha.run(fn), check if fn exists before executing it, added tests too --- Makefile | 5 +++++ lib/mocha.js | 4 +--- test/mocha.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 test/mocha.js diff --git a/Makefile b/Makefile index 72c4814c10..f7542a11f5 100644 --- a/Makefile +++ b/Makefile @@ -164,6 +164,11 @@ test-sort: --sort \ test/acceptance/sort +test-mocha: + @./bin/mocha \ + --reporter $(REPORTER) \ + test/mocha + non-tty: @./bin/mocha \ --reporter dot \ diff --git a/lib/mocha.js b/lib/mocha.js index 27b45021df..fa05ce5976 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -410,9 +410,7 @@ Mocha.prototype.run = function(fn){ function done(failures) { if (reporter.done) { reporter.done(failures, fn); - } else { - fn(failures); - } + } else fn && fn(failures); } return runner.run(done); diff --git a/test/mocha.js b/test/mocha.js new file mode 100644 index 0000000000..46411fc18b --- /dev/null +++ b/test/mocha.js @@ -0,0 +1,33 @@ +var Mocha = require('../'); +var Test = Mocha.Test; + +describe('Mocha', function(){ + var blankOpts = { reporter: function(){} }; // no output + + describe('.run(fn)', function(){ + it('should not raise errors if callback was not provided', function(){ + var mocha = new Mocha(blankOpts); + mocha.run(); + }) + + it('should execute the callback when complete', function(done) { + var mocha = new Mocha(blankOpts); + mocha.run(function(){ + done(); + }) + }) + + it('should execute the callback with the number of failures '+ + 'as parameter', function(done) { + var mocha = new Mocha(blankOpts); + var failingTest = new Test('failing test', function(){ + throw new Error('such fail'); + }); + mocha.suite.addTest(failingTest); + mocha.run(function(failures) { + failures.should.equal(1); + done(); + }); + }) + }) +}) From e827a793b8128821630d2845a364f0f993d9e0d0 Mon Sep 17 00:00:00 2001 From: Ian Zamojc Date: Mon, 2 Feb 2015 02:51:48 -0500 Subject: [PATCH 0195/1771] Added a reminder about the done() callback to test timeout error messages updated all timeout errors with reminder --- lib/runnable.js | 4 ++-- mocha.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/runnable.js b/lib/runnable.js index cad9dc78b2..9b216abbde 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -156,7 +156,7 @@ Runnable.prototype.resetTimeout = function(){ this.clearTimeout(); this.timer = setTimeout(function(){ if (!self._enableTimeouts) return; - self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.')); self.timedOut = true; }, ms); }; @@ -203,7 +203,7 @@ Runnable.prototype.run = function(fn){ self.clearTimeout(); self.duration = new Date - start; finished = true; - if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded'); + if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); fn(err); } diff --git a/mocha.js b/mocha.js index 6352ac702b..128dbd844e 100644 --- a/mocha.js +++ b/mocha.js @@ -4401,7 +4401,7 @@ Runnable.prototype.resetTimeout = function(){ this.clearTimeout(); this.timer = setTimeout(function(){ if (!self._enableTimeouts) return; - self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.')); self.timedOut = true; }, ms); }; @@ -4448,7 +4448,7 @@ Runnable.prototype.run = function(fn){ self.clearTimeout(); self.duration = new Date - start; finished = true; - if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded'); + if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); fn(err); } From 67a3f9ac9273da63a0d7ab8dcb26ebeaded055f9 Mon Sep 17 00:00:00 2001 From: Martin Marko Date: Mon, 2 Feb 2015 23:07:27 +0100 Subject: [PATCH 0196/1771] [JSHINT] Unnecessary semicolon fixed in bin/_mocha --- bin/_mocha | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 6ed6f8a905..338ed1ec9d 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -456,7 +456,7 @@ function list(str) { function hideCursor(){ process.stdout.write('\u001b[?25l'); -}; +} /** * Show the cursor. @@ -464,7 +464,7 @@ function hideCursor(){ function showCursor(){ process.stdout.write('\u001b[?25h'); -}; +} /** * Stop play()ing. From 718c411a2cae7975ec4cbb7ac3ff8bb13524d395 Mon Sep 17 00:00:00 2001 From: Chris Buckley Date: Tue, 6 Aug 2013 23:45:51 +0100 Subject: [PATCH 0197/1771] Allow skip from test context for #332 --- lib/context.js | 12 ++++++++++++ lib/pending.js | 16 ++++++++++++++++ lib/runnable.js | 11 +++++++++++ lib/runner.js | 27 +++++++++++++++++++++++---- test/acceptance/pending.js | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 lib/pending.js diff --git a/lib/context.js b/lib/context.js index c983b6eb6a..3885218db9 100644 --- a/lib/context.js +++ b/lib/context.js @@ -67,6 +67,18 @@ Context.prototype.slow = function(ms){ return this; }; +/** + * Mark a test as skipped. + * + * @return {Context} self + * @api private + */ + +Context.prototype.skip = function(){ + this.runnable().skip(); + return this; +}; + /** * Inspect the context void of `._runnable`. * diff --git a/lib/pending.js b/lib/pending.js new file mode 100644 index 0000000000..265ec73c18 --- /dev/null +++ b/lib/pending.js @@ -0,0 +1,16 @@ + +/** + * Expose `Pending`. + */ + +module.exports = Pending; + +/** + * Initialize a new `Pending` error with the given message. + * + * @param {String} message + */ + +function Pending(message) { + this.message = message; +} diff --git a/lib/runnable.js b/lib/runnable.js index 9b216abbde..7ce2f5cf90 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -4,6 +4,7 @@ var EventEmitter = require('events').EventEmitter , debug = require('debug')('mocha:runnable') + , Pending = require('./pending') , milliseconds = require('./ms') , utils = require('./utils'); @@ -104,6 +105,16 @@ Runnable.prototype.enableTimeouts = function(enabled){ return this; }; +/** + * Halt and mark as pending. + * + * @api private + */ + +Runnable.prototype.skip = function(){ + throw new Pending(); +}; + /** * Return the full title generated by recursively * concatenating the parent's full title. diff --git a/lib/runner.js b/lib/runner.js index 0c9cc551a7..1c006ca275 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -4,6 +4,7 @@ var EventEmitter = require('events').EventEmitter , debug = require('debug')('mocha:runner') + , Pending = require('./pending') , Test = require('./test') , utils = require('./utils') , filter = utils.filter @@ -261,10 +262,14 @@ Runner.prototype.hook = function(name, fn){ var testError = hook.error(); if (testError) self.fail(self.test, testError); if (err) { - self.failHook(hook, err); + if (err instanceof Pending) { + suite.pending = true; + } else { + self.failHook(hook, err); - // stop executing hooks, notify callee of hook err - return fn(err); + // stop executing hooks, notify callee of hook err + return fn(err); + } } self.emit('hook end', hook); delete hook.ctx.currentTest; @@ -446,6 +451,11 @@ Runner.prototype.runTests = function(suite, fn){ self.emit('test', self.test = test); self.hookDown('beforeEach', function(err, errSuite){ + if (suite.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } if (err) return hookErr(err, errSuite, false); self.currentRunnable = self.test; @@ -453,8 +463,17 @@ Runner.prototype.runTests = function(suite, fn){ test = self.test; if (err) { - self.fail(test, err); + if (err instanceof Pending) { + self.emit('pending', test); + } else { + self.fail(test, err); + } self.emit('test end', test); + + if (err instanceof Pending) { + return next(); + } + return self.hookUp('afterEach', next); } diff --git a/test/acceptance/pending.js b/test/acceptance/pending.js index 4ef963709c..b40b3c03ed 100644 --- a/test/acceptance/pending.js +++ b/test/acceptance/pending.js @@ -1,3 +1,41 @@ describe('pending', function(){ it('should be allowed') }) + +describe('skip in test', function(){ + it('should skip immediately', function(){ + this.skip(); + throw new Error('never thrown'); + }) + + it('should run other tests in the suite', function(){ + }) +}) + +describe('skip in before', function(){ + before(function(){ + this.skip(); + }) + + it('should never run this test', function(){ + throw new Error('never thrown'); + }) + + it('should never run this test', function(){ + throw new Error('never thrown'); + }) +}) + +describe('skip in beforeEach', function(){ + beforeEach(function(){ + this.skip(); + }) + + it('should never run this test', function(){ + throw new Error('never thrown'); + }) + + it('should never run this test', function(){ + throw new Error('never thrown'); + }) +}) From ec7b2fe1b2107960bd3982b7f82c281c0141b544 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 3 Feb 2015 17:54:28 -0800 Subject: [PATCH 0198/1771] added gitter badge to website --- index.html | 8 +++++--- index.md | 16 +++++++++------- style.css | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index d806131a1f..8bab127039 100644 --- a/index.html +++ b/index.html @@ -24,6 +24,8 @@

    Mocha

    simple, flexible, fun

    Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.

    +

    +

    Features

      @@ -754,7 +756,7 @@

      Mocha Setup in the Browser

      Mocha options can be set via mocha.setup(). Examples:

      -
      // Use "tdd" interface.  This is a shortcut to setting the interface; 
      +
      // Use "tdd" interface.  This is a shortcut to setting the interface;
       // any other options must be passed via an object.
       mocha.setup('tdd');
       
      @@ -775,7 +777,7 @@ 

      Browser-specific option(s)

      The following option(s) only function in a browser context:

      -

      noHighlighting : If set to true, do not attempt to use syntax highlighting on output test code.

      +

      noHighlighting : If set to true, do not attempt to use syntax highlighting on output test code.

      mocha.opts

      @@ -901,4 +903,4 @@

      More information

      © 2011 TJ Holowaychuk. All rights reserved. - + \ No newline at end of file diff --git a/index.md b/index.md index a08ea296ac..ead7bf52a3 100644 --- a/index.md +++ b/index.md @@ -1,5 +1,7 @@ Mocha is a feature-rich JavaScript test framework running on [node.js](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). + +

      Features

      - browser support @@ -704,28 +706,28 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

      Mocha Setup in the Browser

      Mocha options can be set via `mocha.setup()`. Examples: - - // Use "tdd" interface. This is a shortcut to setting the interface; + + // Use "tdd" interface. This is a shortcut to setting the interface; // any other options must be passed via an object. mocha.setup('tdd'); - + // This is equivalent to the above. mocha.setup({ ui: 'tdd' }); - + // Use "tdd" interface, ignore leaks, and force all tests to be asynchronous mocha.setup({ ui: 'tdd', ignoreLeaks: true, asyncOnly: true - }); + });

      Browser-specific option(s)

      The following option(s) *only* function in a browser context: - - `noHighlighting` : If set to `true`, do not attempt to use syntax highlighting on output test code. + + `noHighlighting` : If set to `true`, do not attempt to use syntax highlighting on output test code.

      mocha.opts

      diff --git a/style.css b/style.css index ea6ed144b6..982fa08f57 100644 --- a/style.css +++ b/style.css @@ -157,6 +157,24 @@ img { max-width: 100%; } +.badge { + margin-right: 8px; + display: inline-block; +} + +.badge > img { + margin: 0px; + padding: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + -o-border-radius: 0px; + border-radius: 0px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + display: block; +} + footer { background-color: #eee; width: 100%; From 1197fa7cb050b7d67468ae612a14f9c0d553db34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20da=20Silva=20Cont=C3=ADn?= Date: Tue, 3 Feb 2015 19:46:47 -0800 Subject: [PATCH 0199/1771] updated travis badge, uses svg instead of img --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aabc1e8512..5e6e486138 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - [![Build Status](https://secure.travis-ci.org/mochajs/mocha.png)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Build Status](https://api.travis-ci.org/mochajs/mocha.svg?branch=master)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://mochajs.org) From 02d421b1b548c55ce8c0bd12aae3e94f635aa4ba Mon Sep 17 00:00:00 2001 From: Jake Craige Date: Fri, 6 Feb 2015 08:58:52 -0600 Subject: [PATCH 0200/1771] Improve error output when a test fails with a non-error closes issue #1532 --- lib/runner.js | 6 +++++- test/runner.js | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index 1c006ca275..80246a1285 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -8,7 +8,9 @@ var EventEmitter = require('events').EventEmitter , Test = require('./test') , utils = require('./utils') , filter = utils.filter - , keys = utils.keys; + , keys = utils.keys + , type = utils.type + , stringify = utils.stringify; /** * Non-enumerable globals. @@ -197,6 +199,8 @@ Runner.prototype.fail = function(test, err){ if ('string' == typeof err) { err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } else if (!(err instanceof Error)) { + err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } this.emit('fail', test, err); diff --git a/test/runner.js b/test/runner.js index a11aeedabf..89cb8216b4 100644 --- a/test/runner.js +++ b/test/runner.js @@ -219,6 +219,42 @@ describe('Runner', function(){ }); runner.fail(test, err); }) + + it('should emit a helpful message when failed with a string', function(done){ + var test = {}, err = 'string'; + runner.on('fail', function(test, err){ + err.message.should.equal('the string "string" was thrown, throw an Error :)'); + done(); + }); + runner.fail(test, err); + }) + + it('should emit a the error when failed with an Error', function(done){ + var test = {}, err = new Error('an error message'); + runner.on('fail', function(test, err){ + err.message.should.equal('an error message'); + done(); + }); + runner.fail(test, err); + }) + + it('should emit a helpful message when failed with an Object', function(done){ + var test = {}, err = { x: 1 }; + runner.on('fail', function(test, err){ + err.message.should.equal('the object {\n "x": 1\n} was thrown, throw an Error :)'); + done(); + }); + runner.fail(test, err); + }) + + it('should emit a helpful message when failed with an Array', function(done){ + var test = {}, err = [1,2]; + runner.on('fail', function(test, err){ + err.message.should.equal('the array [\n 1\n 2\n] was thrown, throw an Error :)'); + done(); + }); + runner.fail(test, err); + }) }) describe('.failHook(hook, err)', function(){ From 4067c0658e3e354b74a3614cfc4e50e4a8735512 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 7 Feb 2015 18:55:14 -0500 Subject: [PATCH 0201/1771] Ignore asynchronous errors after global failure `Runner#uncaught` labels the currently-executing `Runnable` instance as "failed" in response to uncaught exceptions. If the the `Runnable` instance later signals failure through Mocha's asynchronous interface, the `Runner` counts this as a distinct test failure. Consequently, reporters generate inaccurate reports (and in some cases, this triggers uncaught exceptions causing the process itself to crash). When a runnabe completes, explicitly check that it has not already been labeled as failing before reporting any additional errors. --- Makefile | 6 +++--- lib/runnable.js | 4 ++++ test/acceptance/failing/uncaught-and-async.js | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 test/acceptance/failing/uncaught-and-async.js diff --git a/Makefile b/Makefile index f7542a11f5..451ba3300c 100644 --- a/Makefile +++ b/Makefile @@ -60,11 +60,11 @@ test-outputs/issue1327/case-out.json: test/regression/issue1327/case.js test-failing: ./bin/mocha \ --reporter $(REPORTER) \ - test/acceptance/failing/timeout.js > /dev/null 2>&1 ; \ + test/acceptance/failing > /dev/null 2>&1 ; \ failures="$$?" ; \ - if [ "$$failures" != '2' ] ; then \ + if [ "$$failures" != '3' ] ; then \ echo 'test-failing:' ; \ - echo " expected 2 failing tests but saw $$failures" ; \ + echo " expected 3 failing tests but saw $$failures" ; \ exit 1 ; \ fi diff --git a/lib/runnable.js b/lib/runnable.js index 7ce2f5cf90..6e4803fd7f 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -211,6 +211,10 @@ Runnable.prototype.run = function(fn){ var ms = self.timeout(); if (self.timedOut) return; if (finished) return multiple(err || self._trace); + + // Discard the resolution if this test has already failed asynchronously + if (self.state) return; + self.clearTimeout(); self.duration = new Date - start; finished = true; diff --git a/test/acceptance/failing/uncaught-and-async.js b/test/acceptance/failing/uncaught-and-async.js new file mode 100644 index 0000000000..531e3dbe42 --- /dev/null +++ b/test/acceptance/failing/uncaught-and-async.js @@ -0,0 +1,15 @@ +'use strict'; + +/** + * This file should only generate one test error despite the fact that Mocha is + * capable of detecting two distinct exceptions during test execution. + */ + +it('fails exactly once', function(done) { + setTimeout(function() { + setTimeout(function() { + done(new Error('test error')); + }, 0); + throw new Error('global error'); + }, 0); +}); From 09ecbfb9710fd3ab88480b7cfb91ef592074b899 Mon Sep 17 00:00:00 2001 From: Fede Ramirez Date: Tue, 10 Feb 2015 06:42:26 -0300 Subject: [PATCH 0202/1771] small fix: commander option for --expose-gc --- bin/_mocha | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/_mocha b/bin/_mocha index 338ed1ec9d..a73c9540ae 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -67,7 +67,7 @@ program .option('-b, --bail', "bail after first test failure") .option('-d, --debug', "enable node's debugger, synonym for node --debug") .option('-g, --grep ', 'only run tests matching ') - .option('-gc', '--expose-gc', 'expose gc extension') + .option('-gc, --expose-gc', 'expose gc extension') .option('-i, --invert', 'inverts --grep matches') .option('-r, --require ', 'require the given module') .option('-s, --slow ', '"slow" test threshold in milliseconds [75]') From ebaeb54a5e443e6391ffafc7d864f5463167ebfc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 10 Feb 2015 09:20:00 -0800 Subject: [PATCH 0203/1771] travis: use docker containers The docker containers are far more abundant and offer vastly reduced boot time and some increased CPU power. As long as you don't require 'sudo', this is the way to go. http://blog.travis-ci.com/2014-12-17-faster-builds-with-container-based-infrastructure/ --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c33b3fa3a1..07551718b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ node_js: - '0.11' - '0.10' - '0.8' +sudo: false notifications: slack: secure: Xov4Q/jpmTr6p5E/kYeC0HF1tWm0YqBWvCUbNuJiti3CtFpVmOwXEvxGFcvZNAXApEVrs1uhLZLifuL3oJ/TNdqzM5nT5jDGawPYgf8ly+fTaEiCpsRCdQhFLVqYoN671eyx7QILtre9b51SeaFVVksMrfTmvh4aKJCN01iuJm4= From 04ba4971192f287195a7a4e32273bfde324fe57a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 9 Feb 2015 23:20:19 -0800 Subject: [PATCH 0204/1771] reporters/base: use supports-color to detect colorable term This replaces https://github.com/mochajs/mocha/pull/1497. Detecting whether a terminal is TTY is not enough to ensure that it can also support color. This module, supports-color, is a wholistic solution which captures the greatest range of possible terminals with the greatest accuracy. The module is extremely lightweight and does not represent a burdern to Mocha users. --- lib/reporters/base.js | 5 +++-- package.json | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 97b12ba5c5..0c6e85d789 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -5,7 +5,8 @@ var tty = require('tty') , diff = require('diff') , ms = require('../ms') - , utils = require('../utils'); + , utils = require('../utils') + , supportsColor = require('supports-color'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -33,7 +34,7 @@ exports = module.exports = Base; * Enable coloring by default. */ -exports.useColors = isatty || (process.env.MOCHA_COLORS !== undefined); +exports.useColors = supportsColor || (process.env.MOCHA_COLORS !== undefined); /** * Inline diffs instead of +/- diff --git a/package.json b/package.json index 8c4a148b47..bfa8926a31 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,8 @@ "glob": "3.2.3", "growl": "1.8.1", "jade": "0.26.3", - "mkdirp": "0.5.0" + "mkdirp": "0.5.0", + "supports-color": "~1.2.0" }, "devDependencies": { "coffee-script": "~1.8.0", @@ -70,4 +71,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} \ No newline at end of file +} From 1430c2b5102e9d355119a643e9b2be2e76e91d1f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 15 Feb 2015 18:22:42 -0800 Subject: [PATCH 0205/1771] resolve #1548: ensure the environment's "node" executable is used - `mocha` uses `child_process.spawn()` to execute `_mocha` - `child_process.spawn()` does not run in a shell - so `/usr/bin/env node` is not guaranteed to have the same value - use the value of `process.execFile` to find what `mocha` was executed with, then run `_mocha` with that executable - solves some iojs issues --- bin/_mocha | 2 -- bin/mocha | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index a73c9540ae..190c9f04de 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -1,5 +1,3 @@ -#!/usr/bin/env node - /** * Module dependencies. */ diff --git a/bin/mocha b/bin/mocha index de5942ab9d..e82e0b6d82 100755 --- a/bin/mocha +++ b/bin/mocha @@ -5,8 +5,9 @@ * when found, before invoking the "real" _mocha(1) executable. */ -var spawn = require('child_process').spawn - , args = [ __dirname + '/_mocha' ]; +var spawn = require('child_process').spawn, + path = require('path'), + args = [process.execPath, path.join(__dirname, '_mocha')]; process.argv.slice(2).forEach(function(arg){ var flag = arg.split('=')[0]; @@ -47,7 +48,7 @@ process.argv.slice(2).forEach(function(arg){ } }); -var proc = spawn(process.argv[0], args, { stdio: 'inherit' }); +var proc = spawn(args[0], args.slice(1), { stdio: 'inherit' }); proc.on('exit', function (code, signal) { process.on('exit', function(){ if (signal) { From eab389f3f106290e8386520a2f3b8206c18c486e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 15 Feb 2015 18:25:28 -0800 Subject: [PATCH 0206/1771] building --- mocha.js | 250 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 193 insertions(+), 57 deletions(-) diff --git a/mocha.js b/mocha.js index 128dbd844e..5039bfaf15 100644 --- a/mocha.js +++ b/mocha.js @@ -223,22 +223,7 @@ var JsDiff = (function() { var LineDiff = new Diff(); LineDiff.tokenize = function(value) { - var retLines = [], - lines = value.split(/^/m); - - for(var i = 0; i < lines.length; i++) { - var line = lines[i], - lastLine = lines[i - 1]; - - // Merge lines that may contain windows new lines - if (line == '\n' && lastLine && lastLine[lastLine.length - 1] === '\r') { - retLines[retLines.length - 1] += '\n'; - } else if (line) { - retLines.push(line); - } - } - - return retLines; + return value.split(/^/m); }; return { @@ -851,6 +836,18 @@ Context.prototype.slow = function(ms){ return this; }; +/** + * Mark a test as skipped. + * + * @return {Context} self + * @api private + */ + +Context.prototype.skip = function(){ + this.runnable().skip(); + return this; +}; + /** * Inspect the context void of `._runnable`. * @@ -1825,9 +1822,7 @@ Mocha.prototype.run = function(fn){ function done(failures) { if (reporter.done) { reporter.done(failures, fn); - } else { - fn(failures); - } + } else fn && fn(failures); } return runner.run(done); @@ -1948,6 +1943,26 @@ function plural(ms, n, name) { }); // module: ms.js +require.register("pending.js", function(module, exports, require){ + +/** + * Expose `Pending`. + */ + +module.exports = Pending; + +/** + * Initialize a new `Pending` error with the given message. + * + * @param {String} message + */ + +function Pending(message) { + this.message = message; +} + +}); // module: pending.js + require.register("reporters/base.js", function(module, exports, require){ /** * Module dependencies. @@ -1956,7 +1971,8 @@ require.register("reporters/base.js", function(module, exports, require){ var tty = require('browser/tty') , diff = require('browser/diff') , ms = require('../ms') - , utils = require('../utils'); + , utils = require('../utils') + , supportsColor = require('supports-color'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -1984,7 +2000,7 @@ exports = module.exports = Base; * Enable coloring by default. */ -exports.useColors = isatty || (process.env.MOCHA_COLORS !== undefined); +exports.useColors = supportsColor || (process.env.MOCHA_COLORS !== undefined); /** * Inline diffs instead of +/- @@ -2126,7 +2142,6 @@ exports.list = function(failures){ if (err.uncaught) { msg = 'Uncaught ' + msg; } - // explicitly show diff if (err.showDiff && sameType(actual, expected)) { @@ -2337,7 +2352,7 @@ function unifiedDiff(err, escape) { function notBlank(line) { return line != null; } - msg = diff.createPatch('string', err.actual, err.expected); + var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); return '\n ' + colorLines('diff added', '+ expected') + ' ' @@ -2785,6 +2800,12 @@ function HTML(runner) { */ var makeUrl = function makeUrl(s) { var search = window.location.search; + + // Remove previous grep query parameter if present + if (search) { + search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); + } + return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s); }; @@ -4245,6 +4266,7 @@ require.register("runnable.js", function(module, exports, require){ var EventEmitter = require('browser/events').EventEmitter , debug = require('browser/debug')('mocha:runnable') + , Pending = require('./pending') , milliseconds = require('./ms') , utils = require('./utils'); @@ -4349,6 +4371,16 @@ Runnable.prototype.enableTimeouts = function(enabled){ return this; }; +/** + * Halt and mark as pending. + * + * @api private + */ + +Runnable.prototype.skip = function(){ + throw new Pending(); +}; + /** * Return the full title generated by recursively * concatenating the parent's full title. @@ -4518,10 +4550,13 @@ require.register("runner.js", function(module, exports, require){ var EventEmitter = require('browser/events').EventEmitter , debug = require('browser/debug')('mocha:runner') + , Pending = require('./pending') , Test = require('./test') , utils = require('./utils') , filter = utils.filter - , keys = utils.keys; + , keys = utils.keys + , type = utils.type + , stringify = utils.stringify; /** * Non-enumerable globals. @@ -4714,6 +4749,8 @@ Runner.prototype.fail = function(test, err){ if ('string' == typeof err) { err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } else if (!(err instanceof Error)) { + err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } this.emit('fail', test, err); @@ -4779,10 +4816,14 @@ Runner.prototype.hook = function(name, fn){ var testError = hook.error(); if (testError) self.fail(self.test, testError); if (err) { - self.failHook(hook, err); + if (err instanceof Pending) { + suite.pending = true; + } else { + self.failHook(hook, err); - // stop executing hooks, notify callee of hook err - return fn(err); + // stop executing hooks, notify callee of hook err + return fn(err); + } } self.emit('hook end', hook); delete hook.ctx.currentTest; @@ -4964,6 +5005,11 @@ Runner.prototype.runTests = function(suite, fn){ self.emit('test', self.test = test); self.hookDown('beforeEach', function(err, errSuite){ + if (suite.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } if (err) return hookErr(err, errSuite, false); self.currentRunnable = self.test; @@ -4971,8 +5017,17 @@ Runner.prototype.runTests = function(suite, fn){ test = self.test; if (err) { - self.fail(test, err); + if (err instanceof Pending) { + self.emit('pending', test); + } else { + self.fail(test, err); + } self.emit('test end', test); + + if (err instanceof Pending) { + return next(); + } + return self.hookUp('afterEach', next); } @@ -5646,7 +5701,7 @@ exports.forEach = function(arr, fn, scope){ exports.map = function(arr, fn, scope){ var result = []; for (var i = 0, l = arr.length; i < l; i++) - result.push(fn.call(scope, arr[i], i)); + result.push(fn.call(scope, arr[i], i, arr)); return result; }; @@ -5715,7 +5770,7 @@ exports.filter = function(arr, fn){ exports.keys = Object.keys || function(obj) { var keys = [] - , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + , has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 for (var key in obj) { if (has.call(obj, key)) { @@ -5745,6 +5800,26 @@ exports.watch = function(files, fn){ }); }; +/** + * Array.isArray (<=IE8) + * + * @param {Object} obj + * @return {Boolean} + * @api private + */ +var isArray = Array.isArray || function (obj) { + return '[object Array]' == {}.toString.call(obj); +}; + +/** + * @description + * Buffer.prototype.toJSON polyfill + * @type {Function} + */ +Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { + return Array.prototype.slice.call(this, 0); +}; + /** * Ignored files. */ @@ -5767,15 +5842,15 @@ exports.files = function(dir, ext, ret){ var re = new RegExp('\\.(' + ext.join('|') + ')$'); fs.readdirSync(dir) - .filter(ignored) - .forEach(function(path){ - path = join(dir, path); - if (fs.statSync(path).isDirectory()) { - exports.files(path, ext, ret); - } else if (path.match(re)) { - ret.push(path); - } - }); + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ext, ret); + } else if (path.match(re)) { + ret.push(path); + } + }); return ret; }; @@ -5952,30 +6027,94 @@ exports.type = function type(value) { */ exports.stringify = function(value) { - var prop, - type = exports.type(value); - - if (type === 'null' || type === 'undefined') { - return '[' + type + ']'; - } - - if (type === 'date') { - return '[Date: ' + value.toISOString() + ']'; - } + var type = exports.type(value); if (!~exports.indexOf(['object', 'array', 'function'], type)) { - return value.toString(); + if(type != 'buffer') { + return jsonStringify(value); + } + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); } - for (prop in value) { + for (var prop in value) { if (Object.prototype.hasOwnProperty.call(value, prop)) { - return JSON.stringify(exports.canonicalize(value), null, 2).replace(/,(\n|$)/g, '$1'); + return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); } } return emptyRepresentation(value, type); }; +/** + * @description + * like JSON.stringify but more sense. + * @param {Object} object + * @param {Number=} spaces + * @param {number=} depth + * @returns {*} + * @private + */ +function jsonStringify(object, spaces, depth) { + if(typeof spaces == 'undefined') return _stringify(object); // primitive types + + depth = depth || 1; + var space = spaces * depth + , str = isArray(object) ? '[' : '{' + , end = isArray(object) ? ']' : '}' + , length = object.length || exports.keys(object).length + , repeat = function(s, n) { return new Array(n).join(s); }; // `.repeat()` polyfill + + function _stringify(val) { + switch (exports.type(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'number': + val = val === 0 && (1/val) === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'date': + val = '[Date: ' + val.toISOString() + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = (val == '[Function]' || val == '[Circular]') + ? val + : '"' + val + '"'; //string + } + return val; + } + + for(var i in object) { + if(!object.hasOwnProperty(i)) continue; // not my business + --length; + str += '\n ' + repeat(' ', space) + + (isArray(object) ? '' : '"' + i + '": ') // key + + _stringify(object[i]) // value + + (length ? ',' : ''); // comma + } + + return str + (str.length != 1 // [], {} + ? '\n' + repeat(' ', --space) + end + : end); +} + /** * Return if obj is a Buffer * @param {Object} arg @@ -6022,8 +6161,6 @@ exports.canonicalize = function(value, stack) { switch(type) { case 'undefined': - canonicalizedObj = '[undefined]'; - break; case 'buffer': case 'null': canonicalizedObj = value; @@ -6035,9 +6172,6 @@ exports.canonicalize = function(value, stack) { }); }); break; - case 'date': - canonicalizedObj = '[Date: ' + value.toISOString() + ']'; - break; case 'function': for (prop in value) { canonicalizedObj = {}; @@ -6056,7 +6190,9 @@ exports.canonicalize = function(value, stack) { }); }); break; + case 'date': case 'number': + case 'regexp': case 'boolean': canonicalizedObj = value; break; From a11b3778d1aabd16df7accc784b695aa1d4df1f9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 15 Feb 2015 18:37:46 -0800 Subject: [PATCH 0207/1771] update travis: add node 0.12, add gitter, remove slack --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 07551718b0..5e0ed944a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,13 @@ language: node_js script: travis_retry npm test node_js: +- '0.12' - '0.11' - '0.10' - '0.8' sudo: false notifications: - slack: - secure: Xov4Q/jpmTr6p5E/kYeC0HF1tWm0YqBWvCUbNuJiti3CtFpVmOwXEvxGFcvZNAXApEVrs1uhLZLifuL3oJ/TNdqzM5nT5jDGawPYgf8ly+fTaEiCpsRCdQhFLVqYoN671eyx7QILtre9b51SeaFVVksMrfTmvh4aKJCN01iuJm4= + urls: + - secure: "EmycFlk48bUvOQ07mxnbcn6T+n3G4wVWuXgrDsUUp6EhJ9866wQK9i+qVhqogWuSEQrGoVaS/vpc/NEYxDP30BD/+nqgvOhVhLVEgtziI85imyV/oUVpArdW3AUmuzCrx7rQCivygjpBmWV9ZcUT5Km4qp1iQhuumy2WbplxrZ4=" + on_success: change + on_failure: always From 838b95f4364ee4fe6b90b1fb4068bc50b389601b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 16 Feb 2015 01:46:00 -0800 Subject: [PATCH 0208/1771] fix insanity in http tests --- test/http.meta.2.js | 15 ++++++++++++--- test/http.meta.js | 20 +++++++++++++++----- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/test/http.meta.2.js b/test/http.meta.2.js index 31b779322f..fe9662b2e6 100644 --- a/test/http.meta.2.js +++ b/test/http.meta.2.js @@ -1,5 +1,7 @@ var http = require('http'); +var PORT = 8899; + var server = http.createServer(function(req, res){ var accept = req.headers.accept || '' , json = ~accept.indexOf('json'); @@ -18,15 +20,13 @@ var server = http.createServer(function(req, res){ } }) -server.listen(8899); - function get(url) { var fields , expected , header = {}; function request(done) { - http.get({ path: url, port: 8899, headers: header }, function(res){ + http.get({ path: url, port: PORT, headers: header }, function(res){ var buf = ''; res.should.have.property('statusCode', 200); res.setEncoding('utf8'); @@ -67,6 +67,15 @@ function get(url) { } describe('http server', function(){ + + before(function(done) { + server.listen(PORT, done); + }); + + after(function() { + server.close(); + }); + get('/') .should .respond('hello') diff --git a/test/http.meta.js b/test/http.meta.js index 00c3f9c8b6..5d1fb6750b 100644 --- a/test/http.meta.js +++ b/test/http.meta.js @@ -1,5 +1,7 @@ var http = require('http'); +var PORT = 8889; + var server = http.createServer(function(req, res){ var accept = req.headers.accept || '' , json = ~accept.indexOf('json'); @@ -16,13 +18,12 @@ var server = http.createServer(function(req, res){ } break; } -}) +}); -server.listen(8889); function get(url, body, header) { return function(done){ - http.get({ path: url, port: 8889, headers: header }, function(res){ + http.get({ path: url, port: PORT, headers: header || {}}, function(res){ var buf = ''; res.should.have.property('statusCode', 200); res.setEncoding('utf8'); @@ -35,8 +36,17 @@ function get(url, body, header) { } } -describe('http requests', function(){ - describe('GET /', function(){ +describe('http requests', function () { + + before(function(done) { + server.listen(PORT, done); + }); + + after(function() { + server.close(); + }); + + describe('GET /', function () { it('should respond with hello', get('/', 'hello')) }) From b4312b0e6e6d0c1b88a80683189bba92017a1824 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 21 Nov 2014 03:12:05 -0800 Subject: [PATCH 0209/1771] add ability to delay root suite; closes #362, closes #1124 modifies http tests to avoid race conditions --- Makefile | 6 + bin/_mocha | 5 + lib/interfaces/bdd.js | 38 ++---- lib/interfaces/common.js | 58 +++++++++ lib/interfaces/qunit.js | 44 ++----- lib/interfaces/tdd.js | 45 ++----- lib/mocha.js | 14 ++- lib/runner.js | 35 ++++-- lib/suite.js | 10 ++ mocha.js | 248 +++++++++++++++++++++------------------ test/delay/delay.js | 19 +++ 11 files changed, 288 insertions(+), 234 deletions(-) create mode 100644 lib/interfaces/common.js create mode 100644 test/delay/delay.js diff --git a/Makefile b/Makefile index f7542a11f5..f62d0023af 100644 --- a/Makefile +++ b/Makefile @@ -142,6 +142,12 @@ test-reporters: --reporter $(REPORTER) \ test/reporters/*.js +test-delay: + @./bin/mocha \ + --reporter $(REPORTER) \ + --delay \ + test/delay/*.js + test-only: @./bin/mocha \ --reporter $(REPORTER) \ diff --git a/bin/_mocha b/bin/_mocha index 190c9f04de..477b844f6f 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -96,6 +96,7 @@ program .option('--trace', 'trace function calls') .option('--trace-deprecation', 'show stack traces on deprecations') .option('--watch-extensions ,...', 'additional extensions to monitor with --watch', list, []) + .option('--delay', 'wait for async suite definition') program.name = 'mocha'; @@ -281,6 +282,10 @@ if (program.growl) mocha.growl(); if (program.asyncOnly) mocha.asyncOnly(); +// --delay + +if (program.delay) mocha.delay(); + // --globals mocha.globals(globals); diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index d212da29fa..f9f08a3ed0 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -29,38 +29,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before running tests. - */ - - context.before = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(name, fn){ - suites[0].afterAll(name, fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(name, fn){ - suites[0].afterEach(name, fn); - }; + var common = require('./common')(suites, context); + context.before = common.before; + context.after = common.after; + context.beforeEach = common.beforeEach; + context.afterEach = common.afterEach; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites @@ -135,5 +110,6 @@ module.exports = function(suite){ context.it.skip = function(title){ context.it(title); }; + }); }; diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js new file mode 100644 index 0000000000..1ccd3390f7 --- /dev/null +++ b/lib/interfaces/common.js @@ -0,0 +1,58 @@ +/** + * Functions common to more than one interface + * @module lib/interfaces/common + */ + +'use strict'; + +module.exports = function (suites, context) { + + return { + /** + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. Returns a function which runs the root suite. + */ + runWithSuite: function runWithSuite(suite) { + return function run() { + suite.run(); + }; + }, + + /** + * Execute before running tests. + */ + before: function (name, fn) { + suites[0].beforeAll(name, fn); + }, + + /** + * Execute after running tests. + */ + after: function (name, fn) { + suites[0].afterAll(name, fn); + }, + + /** + * Execute before each test case. + */ + beforeEach: function (name, fn) { + suites[0].beforeEach(name, fn); + }, + + /** + * Execute after each test case. + */ + afterEach: function (name, fn) { + suites[0].afterEach(name, fn); + }, + + test: { + /** + * Pending test case. + */ + skip: function (title) { + context.test(title); + } + } + } +}; diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index fee8ac4499..6668967ca3 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -37,38 +37,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before running tests. - */ - - context.before = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(name, fn){ - suites[0].afterAll(name, fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(name, fn){ - suites[0].afterEach(name, fn); - }; + var common = require('./common')(suites, context); + context.before = common.before; + context.after = common.after; + context.beforeEach = common.beforeEach; + context.afterEach = common.afterEach; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title`. */ @@ -113,12 +88,7 @@ module.exports = function(suite){ mocha.grep(new RegExp(reString)); }; - /** - * Pending test case. - */ + context.test.skip = common.test.skip; - context.test.skip = function(title){ - context.test(title); - }; }); }; diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index 951fc9e1ac..13bc2a33be 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -37,38 +37,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before each test case. - */ - - context.setup = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.teardown = function(name, fn){ - suites[0].afterEach(name, fn); - }; - - /** - * Execute before the suite. - */ - - context.suiteSetup = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after the suite. - */ - - context.suiteTeardown = function(name, fn){ - suites[0].afterAll(name, fn); - }; + var common = require('./common')(suites, context); + context.setup = common.beforeEach; + context.teardown = common.afterEach; + context.suiteSetup = common.before; + context.suiteTeardown = common.after; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites @@ -129,12 +104,6 @@ module.exports = function(suite){ mocha.grep(new RegExp(reString)); }; - /** - * Pending test case. - */ - - context.test.skip = function(title){ - context.test(title); - }; + context.test.skip = common.test.skip; }); }; diff --git a/lib/mocha.js b/lib/mocha.js index fa05ce5976..4795d82fff 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -99,6 +99,7 @@ function Mocha(options) { exports.suite = context.suite || context.describe; exports.teardown = context.teardown || context.afterEach; exports.test = context.test || context.it; + exports.run = context.run; }); } @@ -382,6 +383,16 @@ Mocha.prototype.noHighlighting = function() { return this; }; +/** + * Delay root suite execution. + * @returns {Mocha} + * @api public + */ +Mocha.prototype.delay = function delay() { + this.options.delay = true; + return this; +}; + /** * Run tests and invoke `fn()` when complete. * @@ -389,13 +400,12 @@ Mocha.prototype.noHighlighting = function() { * @return {Runner} * @api public */ - Mocha.prototype.run = function(fn){ if (this.files.length) this.loadFiles(); var suite = this.suite; var options = this.options; options.files = this.files; - var runner = new exports.Runner(suite); + var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); runner.ignoreLeaks = false !== options.ignoreLeaks; runner.asyncOnly = options.asyncOnly; diff --git a/lib/runner.js b/lib/runner.js index 80246a1285..634c4b2882 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -50,13 +50,17 @@ module.exports = Runner; * - `fail` (test, err) test failed * - `pending` (test) test pending * + * @param {Suite} suite Root suite + * @param {boolean} [delay] Whether or not to delay execution of root suite + * until ready. * @api public */ -function Runner(suite) { +function Runner(suite, delay) { var self = this; this._globals = []; this._abort = false; + this._delay = delay; this.suite = suite; this.total = suite.total(); this.failures = 0; @@ -597,13 +601,23 @@ Runner.prototype.uncaught = function(err){ */ Runner.prototype.run = function(fn){ - var self = this; + var self = this, + rootSuite = this.suite; + fn = fn || function(){}; function uncaught(err){ self.uncaught(err); } + function start() { + self.emit('start'); + self.runSuite(rootSuite, function(){ + debug('finished running'); + self.emit('end'); + }); + } + debug('start'); // callback @@ -613,16 +627,19 @@ Runner.prototype.run = function(fn){ fn(self.failures); }); - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - debug('finished running'); - self.emit('end'); - }); - // uncaught exception process.on('uncaughtException', uncaught); + if (this._delay) { + // for reporters, I guess. + // might be nice to debounce some dots while we wait. + this.emit('waiting', rootSuite); + rootSuite.once('run', start); + } + else { + start(); + } + return this; }; diff --git a/lib/suite.js b/lib/suite.js index 65cdbffc0e..edc820e23a 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -62,6 +62,7 @@ function Suite(title, parentContext) { this._enableTimeouts = true; this._slow = 75; this._bail = false; + this.delayed = false; } /** @@ -343,3 +344,12 @@ Suite.prototype.eachTest = function(fn){ }); return this; }; + +/** + * This will run the root suite if we happen to be running in delayed mode. + */ +Suite.prototype.run = function run() { + if (this.root) { + this.emit('run'); + } +}; diff --git a/mocha.js b/mocha.js index 5039bfaf15..fe1a02dab5 100644 --- a/mocha.js +++ b/mocha.js @@ -953,38 +953,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before running tests. - */ - - context.before = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(name, fn){ - suites[0].afterAll(name, fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(name, fn){ - suites[0].afterEach(name, fn); - }; + var common = require('./common')(suites, context); + context.before = common.before; + context.after = common.after; + context.beforeEach = common.beforeEach; + context.afterEach = common.afterEach; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites @@ -1059,11 +1034,74 @@ module.exports = function(suite){ context.it.skip = function(title){ context.it(title); }; + }); }; }); // module: interfaces/bdd.js +require.register("interfaces/common.js", function(module, exports, require){ +/** + * Functions common to more than one interface + * @module lib/interfaces/common + */ + +'use strict'; + +module.exports = function (suites, context) { + + return { + /** + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. Returns a function which runs the root suite. + */ + runWithSuite: function runWithSuite(suite) { + return function run() { + suite.run(); + }; + }, + + /** + * Execute before running tests. + */ + before: function (name, fn) { + suites[0].beforeAll(name, fn); + }, + + /** + * Execute after running tests. + */ + after: function (name, fn) { + suites[0].afterAll(name, fn); + }, + + /** + * Execute before each test case. + */ + beforeEach: function (name, fn) { + suites[0].beforeEach(name, fn); + }, + + /** + * Execute after each test case. + */ + afterEach: function (name, fn) { + suites[0].afterEach(name, fn); + }, + + test: { + /** + * Pending test case. + */ + skip: function (title) { + context.test(title); + } + } + } +}; + +}); // module: interfaces/common.js + require.register("interfaces/exports.js", function(module, exports, require){ /** * Module dependencies. @@ -1177,38 +1215,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before running tests. - */ - - context.before = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(name, fn){ - suites[0].afterAll(name, fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(name, fn){ - suites[0].afterEach(name, fn); - }; + var common = require('./common')(suites, context); + context.before = common.before; + context.after = common.after; + context.beforeEach = common.beforeEach; + context.afterEach = common.afterEach; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title`. */ @@ -1253,13 +1266,8 @@ module.exports = function(suite){ mocha.grep(new RegExp(reString)); }; - /** - * Pending test case. - */ + context.test.skip = common.test.skip; - context.test.skip = function(title){ - context.test(title); - }; }); }; @@ -1305,38 +1313,13 @@ module.exports = function(suite){ suite.on('pre-require', function(context, file, mocha){ - /** - * Execute before each test case. - */ - - context.setup = function(name, fn){ - suites[0].beforeEach(name, fn); - }; - - /** - * Execute after each test case. - */ - - context.teardown = function(name, fn){ - suites[0].afterEach(name, fn); - }; - - /** - * Execute before the suite. - */ - - context.suiteSetup = function(name, fn){ - suites[0].beforeAll(name, fn); - }; - - /** - * Execute after the suite. - */ - - context.suiteTeardown = function(name, fn){ - suites[0].afterAll(name, fn); - }; + var common = require('./common')(suites, context); + context.setup = common.beforeEach; + context.teardown = common.afterEach; + context.suiteSetup = common.before; + context.suiteTeardown = common.after; + context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites @@ -1397,13 +1380,7 @@ module.exports = function(suite){ mocha.grep(new RegExp(reString)); }; - /** - * Pending test case. - */ - - context.test.skip = function(title){ - context.test(title); - }; + context.test.skip = common.test.skip; }); }; @@ -1511,6 +1488,7 @@ function Mocha(options) { exports.suite = context.suite || context.describe; exports.teardown = context.teardown || context.afterEach; exports.test = context.test || context.it; + exports.run = context.run; }); } @@ -1794,6 +1772,16 @@ Mocha.prototype.noHighlighting = function() { return this; }; +/** + * Delay root suite execution. + * @returns {Mocha} + * @api public + */ +Mocha.prototype.delay = function delay() { + this.options.delay = true; + return this; +}; + /** * Run tests and invoke `fn()` when complete. * @@ -1801,13 +1789,12 @@ Mocha.prototype.noHighlighting = function() { * @return {Runner} * @api public */ - Mocha.prototype.run = function(fn){ if (this.files.length) this.loadFiles(); var suite = this.suite; var options = this.options; options.files = this.files; - var runner = new exports.Runner(suite); + var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); runner.ignoreLeaks = false !== options.ignoreLeaks; runner.asyncOnly = options.asyncOnly; @@ -4596,13 +4583,17 @@ module.exports = Runner; * - `fail` (test, err) test failed * - `pending` (test) test pending * + * @param {Suite} suite Root suite + * @param {boolean} [delay] Whether or not to delay execution of root suite + * until ready. * @api public */ -function Runner(suite) { +function Runner(suite, delay) { var self = this; this._globals = []; this._abort = false; + this._delay = delay; this.suite = suite; this.total = suite.total(); this.failures = 0; @@ -5147,13 +5138,23 @@ Runner.prototype.uncaught = function(err){ */ Runner.prototype.run = function(fn){ - var self = this; + var self = this, + rootSuite = this.suite; + fn = fn || function(){}; function uncaught(err){ self.uncaught(err); } + function start() { + self.emit('start'); + self.runSuite(rootSuite, function(){ + debug('finished running'); + self.emit('end'); + }); + } + debug('start'); // callback @@ -5163,16 +5164,19 @@ Runner.prototype.run = function(fn){ fn(self.failures); }); - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - debug('finished running'); - self.emit('end'); - }); - // uncaught exception process.on('uncaughtException', uncaught); + if (this._delay) { + // for reporters, I guess. + // might be nice to debounce some dots while we wait. + this.emit('waiting', rootSuite); + rootSuite.once('run', start); + } + else { + start(); + } + return this; }; @@ -5313,6 +5317,7 @@ function Suite(title, parentContext) { this._enableTimeouts = true; this._slow = 75; this._bail = false; + this.delayed = false; } /** @@ -5599,6 +5604,15 @@ Suite.prototype.eachTest = function(fn){ return this; }; +/** + * This will run the root suite if we happen to be running in delayed mode. + */ +Suite.prototype.run = function run() { + if (this.root) { + this.emit('run'); + } +}; + }); // module: suite.js require.register("test.js", function(module, exports, require){ diff --git a/test/delay/delay.js b/test/delay/delay.js new file mode 100644 index 0000000000..ce74db51f8 --- /dev/null +++ b/test/delay/delay.js @@ -0,0 +1,19 @@ +var MS = 500, + start = new Date().getTime(); + +setTimeout(function () { + describe('delayed execution', function () { + it('should have waited ' + MS + 'ms to run this suite', function () { + (new Date().getTime() - MS >= start).should.be.true; + }); + + it('should have no effect if attempted twice in the same suite', + function () { + true.should.be.true; + run(); + true.should.be.true; + }); + }); + run(); + +}, MS); From 00ef54cd41d46b1c29358942dc0874e2ae7da0ff Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Wed, 18 Feb 2015 20:24:38 +0200 Subject: [PATCH 0210/1771] fix(utils): issue #1558 + make --- lib/utils.js | 14 ++++++++------ mocha.js | 31 ++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index d3efc42bb0..081c512e63 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -173,9 +173,11 @@ var isArray = Array.isArray || function (obj) { * Buffer.prototype.toJSON polyfill * @type {Function} */ -Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { - return Array.prototype.slice.call(this, 0); -}; +if(Buffer && Buffer.prototype) { + Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { + return Array.prototype.slice.call(this, 0); + }; +} /** * Ignored files. @@ -585,7 +587,7 @@ exports.lookupFiles = function lookupFiles(path, extensions, recursive) { return; } - fs.readdirSync(path).forEach(function(file){ + fs.readdirSync(path).forEach(function(file) { file = join(path, file); try { var stat = fs.statSync(file); @@ -612,7 +614,7 @@ exports.lookupFiles = function lookupFiles(path, extensions, recursive) { * @return {Error} */ -exports.undefinedError = function(){ +exports.undefinedError = function() { return new Error('Caught undefined error, did you throw without specifying what?'); }; @@ -623,7 +625,7 @@ exports.undefinedError = function(){ * @return {Error} */ -exports.getError = function(err){ +exports.getError = function(err) { return err || exports.undefinedError(); }; diff --git a/mocha.js b/mocha.js index fe1a02dab5..178e24950e 100644 --- a/mocha.js +++ b/mocha.js @@ -223,7 +223,22 @@ var JsDiff = (function() { var LineDiff = new Diff(); LineDiff.tokenize = function(value) { - return value.split(/^/m); + var retLines = [], + lines = value.split(/^/m); + + for(var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1]; + + // Merge lines that may contain windows new lines + if (line == '\n' && lastLine && lastLine[lastLine.length - 1] === '\r') { + retLines[retLines.length - 1] += '\n'; + } else if (line) { + retLines.push(line); + } + } + + return retLines; }; return { @@ -5830,9 +5845,11 @@ var isArray = Array.isArray || function (obj) { * Buffer.prototype.toJSON polyfill * @type {Function} */ -Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { - return Array.prototype.slice.call(this, 0); -}; +if(Buffer && Buffer.prototype) { + Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { + return Array.prototype.slice.call(this, 0); + }; +} /** * Ignored files. @@ -6242,7 +6259,7 @@ exports.lookupFiles = function lookupFiles(path, extensions, recursive) { return; } - fs.readdirSync(path).forEach(function(file){ + fs.readdirSync(path).forEach(function(file) { file = join(path, file); try { var stat = fs.statSync(file); @@ -6269,7 +6286,7 @@ exports.lookupFiles = function lookupFiles(path, extensions, recursive) { * @return {Error} */ -exports.undefinedError = function(){ +exports.undefinedError = function() { return new Error('Caught undefined error, did you throw without specifying what?'); }; @@ -6280,7 +6297,7 @@ exports.undefinedError = function(){ * @return {Error} */ -exports.getError = function(err){ +exports.getError = function(err) { return err || exports.undefinedError(); }; From e3ba0ae812c8faa03dddc3f895cf0c2aa16745dc Mon Sep 17 00:00:00 2001 From: Vlad Magdalin Date: Wed, 18 Feb 2015 11:44:01 -0800 Subject: [PATCH 0211/1771] Fixing errors that prevent mocha.js from loading in the browser - fixes #1558 --- lib/reporters/base.js | 8 +++++--- lib/utils.js | 2 +- mocha.js | 10 ++++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 6ef22bbbd1..c253c11f1e 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -6,7 +6,7 @@ var tty = require('tty') , diff = require('diff') , ms = require('../ms') , utils = require('../utils') - , supportsColor = require('supports-color'); + , supportsColor = process.env ? require('supports-color') : null; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -31,10 +31,12 @@ var isatty = tty.isatty(1) && tty.isatty(2); exports = module.exports = Base; /** - * Enable coloring by default. + * Enable coloring by default, except in the browser interface. */ -exports.useColors = supportsColor || (process.env.MOCHA_COLORS !== undefined); +exports.useColors = process.env + ? (supportsColor || (process.env.MOCHA_COLORS !== undefined)) + : false; /** * Inline diffs instead of +/- diff --git a/lib/utils.js b/lib/utils.js index 081c512e63..bda5b8e84c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -173,7 +173,7 @@ var isArray = Array.isArray || function (obj) { * Buffer.prototype.toJSON polyfill * @type {Function} */ -if(Buffer && Buffer.prototype) { +if(typeof Buffer !== 'undefined' && Buffer.prototype) { Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { return Array.prototype.slice.call(this, 0); }; diff --git a/mocha.js b/mocha.js index 178e24950e..82f1c0bf43 100644 --- a/mocha.js +++ b/mocha.js @@ -1974,7 +1974,7 @@ var tty = require('browser/tty') , diff = require('browser/diff') , ms = require('../ms') , utils = require('../utils') - , supportsColor = require('supports-color'); + , supportsColor = process.env ? require('supports-color') : null; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -1999,10 +1999,12 @@ var isatty = tty.isatty(1) && tty.isatty(2); exports = module.exports = Base; /** - * Enable coloring by default. + * Enable coloring by default, except in the browser interface. */ -exports.useColors = supportsColor || (process.env.MOCHA_COLORS !== undefined); +exports.useColors = process.env + ? (supportsColor || (process.env.MOCHA_COLORS !== undefined)) + : false; /** * Inline diffs instead of +/- @@ -5845,7 +5847,7 @@ var isArray = Array.isArray || function (obj) { * Buffer.prototype.toJSON polyfill * @type {Function} */ -if(Buffer && Buffer.prototype) { +if(typeof Buffer !== 'undefined' && Buffer.prototype) { Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { return Array.prototype.slice.call(this, 0); }; From 8cb64e93492079007594a301da00559fe6e47463 Mon Sep 17 00:00:00 2001 From: Todd Agulnick Date: Tue, 24 Feb 2015 15:45:15 -0800 Subject: [PATCH 0212/1771] Fix passing of args intended for node/iojs. --- bin/mocha | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/mocha b/bin/mocha index e82e0b6d82..74d471a03c 100755 --- a/bin/mocha +++ b/bin/mocha @@ -7,7 +7,7 @@ var spawn = require('child_process').spawn, path = require('path'), - args = [process.execPath, path.join(__dirname, '_mocha')]; + args = [path.join(__dirname, '_mocha')]; process.argv.slice(2).forEach(function(arg){ var flag = arg.split('=')[0]; @@ -48,7 +48,7 @@ process.argv.slice(2).forEach(function(arg){ } }); -var proc = spawn(args[0], args.slice(1), { stdio: 'inherit' }); +var proc = spawn(process.execPath, args, { stdio: 'inherit' }); proc.on('exit', function (code, signal) { process.on('exit', function(){ if (signal) { From 210803c12c459ba857e7160be0c79e6658b3f44b Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Thu, 5 Mar 2015 21:34:39 -0800 Subject: [PATCH 0213/1771] Ignore async global errors after spec resolution --- Makefile | 4 ++-- lib/runner.js | 7 +++---- test/acceptance/failing/uncaught-and-async.js | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 451ba3300c..9e6e83180a 100644 --- a/Makefile +++ b/Makefile @@ -62,9 +62,9 @@ test-failing: --reporter $(REPORTER) \ test/acceptance/failing > /dev/null 2>&1 ; \ failures="$$?" ; \ - if [ "$$failures" != '3' ] ; then \ + if [ "$$failures" != '4' ] ; then \ echo 'test-failing:' ; \ - echo " expected 3 failing tests but saw $$failures" ; \ + echo " expected 4 failing tests but saw $$failures" ; \ exit 1 ; \ fi diff --git a/lib/runner.js b/lib/runner.js index 80246a1285..dfa398f60c 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -569,12 +569,11 @@ Runner.prototype.uncaught = function(err){ var runnable = this.currentRunnable; if (!runnable) return; - var wasAlreadyDone = runnable.state; - this.fail(runnable, err); - runnable.clearTimeout(); - if (wasAlreadyDone) return; + // Ignore errors if complete + if (runnable.state) return; + this.fail(runnable, err); // recover from test if ('test' == runnable.type) { diff --git a/test/acceptance/failing/uncaught-and-async.js b/test/acceptance/failing/uncaught-and-async.js index 531e3dbe42..054d1d857b 100644 --- a/test/acceptance/failing/uncaught-and-async.js +++ b/test/acceptance/failing/uncaught-and-async.js @@ -1,15 +1,26 @@ 'use strict'; /** - * This file should only generate one test error despite the fact that Mocha is - * capable of detecting two distinct exceptions during test execution. + * This file should only generate one failure per spec despite the fact that + * Mocha is capable of detecting two distinct exceptions during test execution. */ -it('fails exactly once', function(done) { +it('fails exactly once when a global error is thrown first', function(done) { setTimeout(function() { + throw new Error('global error'); + setTimeout(function() { done(new Error('test error')); }, 0); + }, 0); +}); + +it('fails exactly once when a global error is thrown second', function(done) { + setTimeout(function() { + done(new Error('test error')); + }, 0); + + setTimeout(function() { throw new Error('global error'); }, 0); }); From 0348ff39382ca33b7b583de556b9e0e38373420e Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Thu, 5 Mar 2015 22:44:20 -0800 Subject: [PATCH 0214/1771] Add --fgrep. Use grep for RegExp, fgrep for str --- bin/_mocha | 7 ++++++- lib/mocha.js | 3 ++- support/tail.js | 1 + test/grep.js | 17 ++++++++++++----- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 477b844f6f..3ab4812d34 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -65,8 +65,9 @@ program .option('-b, --bail', "bail after first test failure") .option('-d, --debug', "enable node's debugger, synonym for node --debug") .option('-g, --grep ', 'only run tests matching ') + .option('-f, --fgrep ', 'only run tests containing ') .option('-gc, --expose-gc', 'expose gc extension') - .option('-i, --invert', 'inverts --grep matches') + .option('-i, --invert', 'inverts --grep and --fgrep matches') .option('-r, --require ', 'require the given module') .option('-s, --slow ', '"slow" test threshold in milliseconds [75]') .option('-t, --timeout ', 'set test-case timeout in milliseconds [2000]') @@ -266,6 +267,10 @@ mocha.suite.bail(program.bail); if (program.grep) mocha.grep(new RegExp(program.grep)); +// --fgrep + +if (program.fgrep) mocha.grep(program.fgrep); + // --invert if (program.invert) mocha.invert(); diff --git a/lib/mocha.js b/lib/mocha.js index 4795d82fff..0c411190a1 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -76,7 +76,8 @@ function Mocha(options) { options = options || {}; this.files = []; this.options = options; - this.grep(options.grep); + if (options.grep) this.grep(new RegExp(options.grep)); + if (options.fgrep) this.grep(options.fgrep); this.suite = new exports.Suite('', new exports.Context); this.ui(options.ui); this.bail(options.bail); diff --git a/support/tail.js b/support/tail.js index 5e1d59be68..030177aad7 100644 --- a/support/tail.js +++ b/support/tail.js @@ -140,6 +140,7 @@ mocha.run = function(fn){ var query = Mocha.utils.parseQuery(global.location.search || ''); if (query.grep) mocha.grep(new RegExp(query.grep)); + if (query.fgrep) mocha.grep(query.fgrep); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ diff --git a/test/grep.js b/test/grep.js index c2a88217f0..633aab4e63 100644 --- a/test/grep.js +++ b/test/grep.js @@ -3,13 +3,20 @@ var Mocha = require('../'); describe('Mocha', function(){ describe('"grep" option', function(){ it('should add a RegExp to the mocha.options object', function(){ - var mocha = new Mocha({ grep: /foo/ }); - mocha.options.grep.toString().should.equal('/foo/'); + var mocha = new Mocha({ grep: /foo.*/ }); + mocha.options.grep.toString().should.equal('/foo.*/'); }) - it('should convert grep string to a RegExp', function(){ - var mocha = new Mocha({ grep: 'foo' }); - mocha.options.grep.toString().should.equal('/foo/'); + it('should convert string to a RegExp', function(){ + var mocha = new Mocha({ grep: 'foo.*' }); + mocha.options.grep.toString().should.equal('/foo.*/'); + }) + }) + + describe('"fgrep" option', function(){ + it('should escape and convert string to a RegExp', function(){ + var mocha = new Mocha({ fgrep: 'foo.*' }); + mocha.options.grep.toString().should.equal('/foo\\.\\*/'); }) }) From 521b7e443e3a0feed3091c0378973c4faab42160 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Fri, 6 Mar 2015 01:56:56 -0500 Subject: [PATCH 0215/1771] Update mocha.js --- mocha.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mocha.js b/mocha.js index 82f1c0bf43..c6af05d4e9 100644 --- a/mocha.js +++ b/mocha.js @@ -1480,7 +1480,8 @@ function Mocha(options) { options = options || {}; this.files = []; this.options = options; - this.grep(options.grep); + if (options.grep) this.grep(new RegExp(options.grep)); + if (options.fgrep) this.grep(options.fgrep); this.suite = new exports.Suite('', new exports.Context); this.ui(options.ui); this.bail(options.bail); @@ -4481,6 +4482,10 @@ Runnable.prototype.run = function(fn){ var ms = self.timeout(); if (self.timedOut) return; if (finished) return multiple(err || self._trace); + + // Discard the resolution if this test has already failed asynchronously + if (self.state) return; + self.clearTimeout(); self.duration = new Date - start; finished = true; @@ -5127,12 +5132,11 @@ Runner.prototype.uncaught = function(err){ var runnable = this.currentRunnable; if (!runnable) return; - var wasAlreadyDone = runnable.state; - this.fail(runnable, err); - runnable.clearTimeout(); - if (wasAlreadyDone) return; + // Ignore errors if complete + if (runnable.state) return; + this.fail(runnable, err); // recover from test if ('test' == runnable.type) { @@ -6447,6 +6451,7 @@ mocha.run = function(fn){ var query = Mocha.utils.parseQuery(global.location.search || ''); if (query.grep) mocha.grep(new RegExp(query.grep)); + if (query.fgrep) mocha.grep(query.fgrep); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ From e0fc1b2d7e1d8b54c4054165d38a36ca0dc499c1 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Fri, 6 Mar 2015 16:44:50 +0800 Subject: [PATCH 0216/1771] Readme: update instructions for 2015 --- README.md | 44 +++++++++----------------------------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index f2a27f4853..50c7c569cc 100644 --- a/README.md +++ b/README.md @@ -11,49 +11,23 @@ There's two: ### Mac OS X -1. Get [Homebrew](http://brew.sh). Install it. Great. Command at the time of writing was: +Install `markdown` via Homebrew: - ```sh - ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" - ``` - -2. Assert `make` exists by executing: - - ```sh - which make - ``` - -3. If `which` did not return a path to the `make` executable, choose your own adventure: - - - Download & install "Command Line Tools for Xcode" which is [buried somewhere in here](https://developer.apple.com/downloads/index.action#), and requires an Apple ID, or - - - Install `make` via Homebrew: - - ```sh - brew install make - ``` - - *Homebrew will not let you install `make` via the second method if it is already installed via the first method.* - -4. Install `markdown`: - - ```sh - brew install markdown - ``` +```sh +brew install markdown +``` - Or download from [here](http://daringfireball.net/projects/markdown/). +Or download from [here](http://daringfireball.net/projects/markdown/). -5. Celebrate with tequila! Or try to build first. Probably want to build first. +Celebrate with tequila! Or try to build first. Probably want to build first. ### Linux #### Ubuntu 14.04 -You should have `make`, so you need `markdown`. - -1. `sudo apt-get install markdown` - -2. That seems to do it. It's just a Perl script, so you can [get it from here](http://daringfireball.net/projects/markdown/) otherwise. +1. `sudo apt-get install build-essential` to install make. +2. `sudo apt-get install markdown` to install markdown. +3. That seems to do it. It's just a Perl script, so you can [get it from here](http://daringfireball.net/projects/markdown/) otherwise. ### Windows From 65fc80ecd96ca2159a792aff089bbc273d4bd86d Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Fri, 6 Mar 2015 19:33:28 -0500 Subject: [PATCH 0217/1771] Release 2.2.0 --- HISTORY.md | 34 ++++++++++++++++++++++++++++++++++ bower.json | 2 +- component.json | 2 +- package.json | 4 ++-- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 95f0f0f9db..e0ede017a2 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,37 @@ +2.2.0 / 2015-03-06 +================== + + * Update mocha.js + * Add --fgrep. Use grep for RegExp, fgrep for str + * Ignore async global errors after spec resolution + * Fixing errors that prevent mocha.js from loading in the browser - fixes #1558 + * fix(utils): issue #1558 + make + * add ability to delay root suite; closes #362, closes #1124 + * fix insanity in http tests + * update travis: add node 0.12, add gitter, remove slack + * building + * resolve #1548: ensure the environment's "node" executable is used + * reporters/base: use supports-color to detect colorable term + * travis: use docker containers + * small fix: commander option for --expose-gc + * Ignore asynchronous errors after global failure + * Improve error output when a test fails with a non-error + * updated travis badge, uses svg instead of img + * Allow skip from test context for #332 + * [JSHINT] Unnecessary semicolon fixed in bin/_mocha + * Added a reminder about the done() callback to test timeout error messages + * fixes #1496, in Mocha.run(fn), check if fn exists before executing it, added tests too + * Add Harmony Proxy flag for iojs + * test(utils|ms|*): test existing units + * add support for some iojs flags + * fix(utils.stringify): issue #1229, diff viewer + * Remove slack link + * Prevent multiple 'grep=' querystring params in html reporter + * Use grep as regexp (close #1381) + * utils.stringify should handle objects without an Object prototype + * in runnable test, comparing to undefined error's message rather than a literal + * Fix test running output truncation on async STDIO + * ammended for deprecated customFds option in child_process 2.1.0 / 2014-12-23 ================== diff --git a/bower.json b/bower.json index 3ec9d01958..6adf74c852 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.1.0", + "version": "2.2.0", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index e0c07a2664..938c717579 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.1.0", + "version": "2.2.0", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index bfa8926a31..9c45483651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.1.0", + "version": "2.2.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -71,4 +71,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} +} \ No newline at end of file From b1ba05875f7348938563d1bdf0b1fbdc64e4fef2 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sat, 7 Mar 2015 09:01:40 +0200 Subject: [PATCH 0218/1771] docs(website): update all relevant flags --- index.html | 61 ++++++++++++++++++++++++++++++++++-------------------- index.md | 61 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 46 deletions(-) diff --git a/index.html b/index.html index 8bab127039..a6b92660ac 100644 --- a/index.html +++ b/index.html @@ -357,29 +357,44 @@

      mocha(1)

      Options: - -h, --help output usage information - -V, --version output the version number - -r, --require <name> require the given module - -R, --reporter <name> specify the reporter to use - -u, --ui <name> specify user-interface (bdd|tdd|exports) - -g, --grep <pattern> only run tests matching <pattern> - -i, --invert inverts --grep matches - -t, --timeout <ms> set test-case timeout in milliseconds [2000] - -s, --slow <ms> "slow" test threshold in milliseconds [75] - -w, --watch watch files for changes - -c, --colors force enabling of colors - -C, --no-colors force disabling of colors - -G, --growl enable growl notification support - -d, --debug enable node's debugger, synonym for node --debug - -b, --bail bail after first test failure - -A, --async-only force all tests to take a callback (async) - --recursive include sub directories - --debug-brk enable node's debugger breaking on the first line - --globals <names> allow the given comma-delimited global [names] - --check-leaks check for global variable leaks - --interfaces display available interfaces - --reporters display available reporters - --compilers <ext>:<module>,... use the given module(s) to compile files + -h, --help output usage information + -V, --version output the version number + -A, --async-only force all tests to take a callback (async) + -c, --colors force enabling of colors + -C, --no-colors force disabling of colors + -G, --growl enable growl notification support + -O, --reporter-options <k=v,k2=v2,...> reporter-specific options + -R, --reporter <name> specify the reporter to use + -S, --sort sort test files + -b, --bail bail after first test failure + -d, --debug enable node's debugger, synonym for node --debug + -g, --grep <pattern> only run tests matching <pattern> + -f, --fgrep <string> only run tests containing <string> + -gc, --expose-gc expose gc extension + -i, --invert inverts --grep and --fgrep matches + -r, --require <name> require the given module + -s, --slow <ms> "slow" test threshold in milliseconds [75] + -t, --timeout <ms> set test-case timeout in milliseconds [2000] + -u, --ui <name> specify user-interface (bdd|tdd|exports) + -w, --watch watch files for changes + --check-leaks check for global variable leaks + --compilers <ext>:<module>,... use the given module(s) to compile files + --debug-brk enable node's debugger breaking on the first line + --globals <names> allow the given comma-delimited global [names] + --inline-diffs display actual/expected differences inline within each string + --interfaces display available interfaces + --no-deprecation silence deprecation warnings + --no-exit require a clean shutdown of the event loop: mocha will exit + --no-timeouts disables timeouts, given implicitly with --debug + --opts <path> specify opts path + --prof log statistical profiling information + --recursive include sub directories + --reporters display available reporters + --throw-deprecation throw an exception anytime a deprecated function is used + --trace trace function calls + --trace-deprecation show stack traces on deprecations + --watch-extensions <ext>,... additional extensions to monitor with --watch + --delay wait for async suite definition

      -w, --watch

      diff --git a/index.md b/index.md index ead7bf52a3..61c46afb92 100644 --- a/index.md +++ b/index.md @@ -319,29 +319,44 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal Options: - -h, --help output usage information - -V, --version output the version number - -r, --require require the given module - -R, --reporter specify the reporter to use - -u, --ui specify user-interface (bdd|tdd|exports) - -g, --grep only run tests matching - -i, --invert inverts --grep matches - -t, --timeout set test-case timeout in milliseconds [2000] - -s, --slow "slow" test threshold in milliseconds [75] - -w, --watch watch files for changes - -c, --colors force enabling of colors - -C, --no-colors force disabling of colors - -G, --growl enable growl notification support - -d, --debug enable node's debugger, synonym for node --debug - -b, --bail bail after first test failure - -A, --async-only force all tests to take a callback (async) - --recursive include sub directories - --debug-brk enable node's debugger breaking on the first line - --globals allow the given comma-delimited global [names] - --check-leaks check for global variable leaks - --interfaces display available interfaces - --reporters display available reporters - --compilers :,... use the given module(s) to compile files + -h, --help output usage information + -V, --version output the version number + -A, --async-only force all tests to take a callback (async) + -c, --colors force enabling of colors + -C, --no-colors force disabling of colors + -G, --growl enable growl notification support + -O, --reporter-options reporter-specific options + -R, --reporter specify the reporter to use + -S, --sort sort test files + -b, --bail bail after first test failure + -d, --debug enable node's debugger, synonym for node --debug + -g, --grep only run tests matching + -f, --fgrep only run tests containing + -gc, --expose-gc expose gc extension + -i, --invert inverts --grep and --fgrep matches + -r, --require require the given module + -s, --slow "slow" test threshold in milliseconds [75] + -t, --timeout set test-case timeout in milliseconds [2000] + -u, --ui specify user-interface (bdd|tdd|exports) + -w, --watch watch files for changes + --check-leaks check for global variable leaks + --compilers :,... use the given module(s) to compile files + --debug-brk enable node's debugger breaking on the first line + --globals allow the given comma-delimited global [names] + --inline-diffs display actual/expected differences inline within each string + --interfaces display available interfaces + --no-deprecation silence deprecation warnings + --no-exit require a clean shutdown of the event loop: mocha will exit + --no-timeouts disables timeouts, given implicitly with --debug + --opts specify opts path + --prof log statistical profiling information + --recursive include sub directories + --reporters display available reporters + --throw-deprecation throw an exception anytime a deprecated function is used + --trace trace function calls + --trace-deprecation show stack traces on deprecations + --watch-extensions ,... additional extensions to monitor with --watch + --delay wait for async suite definition

      -w, --watch

      From 9123d7ae63107588245c0d8db43721112f1abe66 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sun, 8 Mar 2015 00:18:04 +0200 Subject: [PATCH 0219/1771] style(*): indentation, etc. --- lib/mocha.js | 8 ++++---- lib/runner.js | 26 +++++++++++++------------- mocha.js | 34 +++++++++++++++++----------------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 4795d82fff..61febc1ddb 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -82,7 +82,7 @@ function Mocha(options) { this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); if (null != options.timeout) this.timeout(options.timeout); - this.useColors(options.useColors) + this.useColors(options.useColors); if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts); if (options.slow) this.slow(options.slow); @@ -141,8 +141,8 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ } else { reporter = reporter || 'spec'; var _reporter; - try { _reporter = require('./reporters/' + reporter); } catch (err) {}; - if (!_reporter) try { _reporter = require(reporter); } catch (err) {}; + try { _reporter = require('./reporters/' + reporter); } catch (err) {} + if (!_reporter) try { _reporter = require(reporter); } catch (err) {} if (!_reporter && reporter === 'teamcity') console.warn('The Teamcity reporter was moved to a package named ' + 'mocha-teamcity-reporter ' + @@ -164,7 +164,7 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ Mocha.prototype.ui = function(name){ name = name || 'bdd'; this._ui = exports.interfaces[name]; - if (!this._ui) try { this._ui = require(name); } catch (err) {}; + if (!this._ui) try { this._ui = require(name); } catch (err) {} if (!this._ui) throw new Error('invalid interface "' + name + '"'); this._ui = this._ui(this.suite); return this; diff --git a/lib/runner.js b/lib/runner.js index 634c4b2882..7911896935 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -695,20 +695,20 @@ function filterLeaks(ok, globals) { * @api private */ - function extraGlobals() { - if (typeof(process) === 'object' && - typeof(process.version) === 'string') { +function extraGlobals() { + if (typeof(process) === 'object' && + typeof(process.version) === 'string') { - var nodeVersion = process.version.split('.').reduce(function(a, v) { - return a << 8 | v; - }); - - // 'errno' was renamed to process._errno in v0.9.11. + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); - if (nodeVersion < 0x00090B) { - return ['errno']; - } - } + // 'errno' was renamed to process._errno in v0.9.11. - return []; + if (nodeVersion < 0x00090B) { + return ['errno']; + } } + + return []; +} diff --git a/mocha.js b/mocha.js index 82f1c0bf43..e355cd9da6 100644 --- a/mocha.js +++ b/mocha.js @@ -1486,7 +1486,7 @@ function Mocha(options) { this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); if (null != options.timeout) this.timeout(options.timeout); - this.useColors(options.useColors) + this.useColors(options.useColors); if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts); if (options.slow) this.slow(options.slow); @@ -1545,8 +1545,8 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ } else { reporter = reporter || 'spec'; var _reporter; - try { _reporter = require('./reporters/' + reporter); } catch (err) {}; - if (!_reporter) try { _reporter = require(reporter); } catch (err) {}; + try { _reporter = require('./reporters/' + reporter); } catch (err) {} + if (!_reporter) try { _reporter = require(reporter); } catch (err) {} if (!_reporter && reporter === 'teamcity') console.warn('The Teamcity reporter was moved to a package named ' + 'mocha-teamcity-reporter ' + @@ -1568,7 +1568,7 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ Mocha.prototype.ui = function(name){ name = name || 'bdd'; this._ui = exports.interfaces[name]; - if (!this._ui) try { this._ui = require(name); } catch (err) {}; + if (!this._ui) try { this._ui = require(name); } catch (err) {} if (!this._ui) throw new Error('invalid interface "' + name + '"'); this._ui = this._ui(this.suite); return this; @@ -5249,24 +5249,24 @@ function filterLeaks(ok, globals) { * @api private */ - function extraGlobals() { - if (typeof(process) === 'object' && - typeof(process.version) === 'string') { +function extraGlobals() { + if (typeof(process) === 'object' && + typeof(process.version) === 'string') { - var nodeVersion = process.version.split('.').reduce(function(a, v) { - return a << 8 | v; - }); - - // 'errno' was renamed to process._errno in v0.9.11. + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); - if (nodeVersion < 0x00090B) { - return ['errno']; - } - } + // 'errno' was renamed to process._errno in v0.9.11. - return []; + if (nodeVersion < 0x00090B) { + return ['errno']; + } } + return []; +} + }); // module: runner.js require.register("suite.js", function(module, exports, require){ From 558191d964e860eaddd6432e8fe5a86bad7781be Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sun, 8 Mar 2015 00:18:44 +0200 Subject: [PATCH 0220/1771] feat(runner/stack-trace): solve issue #545 + test --- bin/_mocha | 5 ++ lib/mocha.js | 14 ++++++ lib/runner.js | 13 +++-- lib/utils.js | 65 +++++++++++++++++++++++++ mocha.js | 91 +++++++++++++++++++++++++++++++++-- test/browser/stack-trace.html | 24 +++++++++ test/browser/stack-trace.js | 20 ++++++++ test/runner.js | 50 ++++++++++++++++++- test/utils.js | 77 +++++++++++++++++++++++++++++ 9 files changed, 347 insertions(+), 12 deletions(-) create mode 100644 test/browser/stack-trace.html create mode 100644 test/browser/stack-trace.js diff --git a/bin/_mocha b/bin/_mocha index 477b844f6f..45ec3cebce 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -73,6 +73,7 @@ program .option('-u, --ui ', 'specify user-interface (bdd|tdd|exports)', 'bdd') .option('-w, --watch', 'watch files for changes') .option('--check-leaks', 'check for global variable leaks') + .option('--full-trace', 'display the full stack trace') .option('--compilers :,...', 'use the given module(s) to compile files', list, []) .option('--debug-brk', "enable node's debugger breaking on the first line") .option('--globals ', 'allow the given comma-delimited global [names]', list, []) @@ -274,6 +275,10 @@ if (program.invert) mocha.invert(); if (program.checkLeaks) mocha.checkLeaks(); +// --stack-trace + +if(program.fullTrace) mocha.fullTrace(); + // --growl if (program.growl) mocha.growl(); diff --git a/lib/mocha.js b/lib/mocha.js index 61febc1ddb..3e29711a85 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -66,6 +66,7 @@ function image(name) { * - `bail` bail on the first test failure * - `slow` milliseconds to wait before considering a test slow * - `ignoreLeaks` ignore global leaks + * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * * @param {Object} options @@ -265,6 +266,18 @@ Mocha.prototype.checkLeaks = function(){ return this; }; +/** + * Display long stack-trace on failing + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.fullTrace = function() { + this.options.fullStackTrace = true; + return this; +}; + /** * Enable growl support. * @@ -408,6 +421,7 @@ Mocha.prototype.run = function(fn){ var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; if (options.grep) runner.grep(options.grep, options.invert); if (options.globals) runner.globals(options.globals); diff --git a/lib/runner.js b/lib/runner.js index 7911896935..a555e8b69f 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -10,7 +10,8 @@ var EventEmitter = require('events').EventEmitter , filter = utils.filter , keys = utils.keys , type = utils.type - , stringify = utils.stringify; + , stringify = utils.stringify + , stackFilter = utils.stackTraceFilter(); /** * Non-enumerable globals. @@ -197,16 +198,18 @@ Runner.prototype.checkGlobals = function(test){ * @api private */ -Runner.prototype.fail = function(test, err){ +Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; - if ('string' == typeof err) { - err = new Error('the string "' + err + '" was thrown, throw an Error :)'); - } else if (!(err instanceof Error)) { + if (!(err instanceof Error)) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } + err.stack = this.fullStackTrace + ? err.stack + : stackFilter(err.stack); + this.emit('fail', test, err); }; diff --git a/lib/utils.js b/lib/utils.js index bda5b8e84c..cb28b674e6 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -629,3 +629,68 @@ exports.getError = function(err) { return err || exports.undefinedError(); }; + +/** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). + * @returns {Function} + */ + +exports.stackTraceFilter = function() { + var slash = '/' + , is = typeof document === 'undefined' + ? { node: true } + : { browser: true } + , cwd = is.node + ? process.cwd() + slash + : location.href.replace(/\/[^\/]*$/, '/'); + + function isNodeModule (line) { + return (~line.indexOf('node_modules')); + } + + function isMochaInternal (line) { + return (~line.indexOf('node_modules' + slash + 'mocha')) || + (~line.indexOf('components' + slash + 'mochajs')) || + (~line.indexOf('components' + slash + 'mocha')); + } + + // node_modules, bower, componentJS + function isBrowserModule(line) { + return (~line.indexOf('node_modules')) || + (~line.indexOf('components')); + } + + function isNodeInternal (line) { + return (~line.indexOf('(timers.js:')) || + (~line.indexOf('(events.js:')) || + (~line.indexOf('(node.js:')) || + (~line.indexOf('(module.js:')) || + (~line.indexOf('GeneratorFunctionPrototype.next (native)')) || + false + } + + return function(stack) { + stack = stack.split('\n'); + + stack = stack.reduce(function (list, line) { + if (is.node && (isNodeModule(line) || + isMochaInternal(line) || + isNodeInternal(line))) + return list; + + if (is.browser && (isBrowserModule(line))) + return list; + + // Clean up cwd(absolute) + list.push(line.replace(cwd, '')); + return list; + }, []); + + return stack.join('\n'); + } +}; \ No newline at end of file diff --git a/mocha.js b/mocha.js index e355cd9da6..bf761a7834 100644 --- a/mocha.js +++ b/mocha.js @@ -1470,6 +1470,7 @@ function image(name) { * - `bail` bail on the first test failure * - `slow` milliseconds to wait before considering a test slow * - `ignoreLeaks` ignore global leaks + * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * * @param {Object} options @@ -1669,6 +1670,18 @@ Mocha.prototype.checkLeaks = function(){ return this; }; +/** + * Display long stack-trace on failing + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.fullTrace = function() { + this.options.fullStackTrace = true; + return this; +}; + /** * Enable growl support. * @@ -1812,6 +1825,7 @@ Mocha.prototype.run = function(fn){ var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; if (options.grep) runner.grep(options.grep, options.invert); if (options.globals) runner.globals(options.globals); @@ -4560,7 +4574,8 @@ var EventEmitter = require('browser/events').EventEmitter , filter = utils.filter , keys = utils.keys , type = utils.type - , stringify = utils.stringify; + , stringify = utils.stringify + , stackFilter = utils.stackTraceFilter(); /** * Non-enumerable globals. @@ -4751,16 +4766,18 @@ Runner.prototype.checkGlobals = function(test){ * @api private */ -Runner.prototype.fail = function(test, err){ +Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; - if ('string' == typeof err) { - err = new Error('the string "' + err + '" was thrown, throw an Error :)'); - } else if (!(err instanceof Error)) { + if (!(err instanceof Error)) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } + err.stack = this.fullStackTrace + ? err.stack + : stackFilter(err.stack); + this.emit('fail', test, err); }; @@ -6304,6 +6321,70 @@ exports.getError = function(err) { }; +/** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). + * @returns {Function} + */ + +exports.stackTraceFilter = function() { + var slash = '/' + , is = typeof document === 'undefined' + ? { node: true } + : { browser: true } + , cwd = is.node + ? process.cwd() + slash + : location.href.replace(/\/[^\/]*$/, '/'); + + function isNodeModule (line) { + return (~line.indexOf('node_modules')); + } + + function isMochaInternal (line) { + return (~line.indexOf('node_modules' + slash + 'mocha')) || + (~line.indexOf('components' + slash + 'mochajs')) || + (~line.indexOf('components' + slash + 'mocha')); + } + + // node_modules, bower, componentJS + function isBrowserModule(line) { + return (~line.indexOf('node_modules')) || + (~line.indexOf('components')); + } + + function isNodeInternal (line) { + return (~line.indexOf('(timers.js:')) || + (~line.indexOf('(events.js:')) || + (~line.indexOf('(node.js:')) || + (~line.indexOf('(module.js:')) || + (~line.indexOf('GeneratorFunctionPrototype.next (native)')) || + false + } + + return function(stack) { + stack = stack.split('\n'); + + stack = stack.reduce(function (list, line) { + if (is.node && (isNodeModule(line) || + isMochaInternal(line) || + isNodeInternal(line))) + return list; + + if (is.browser && (isBrowserModule(line))) + return list; + + // Clean up cwd(absolute) + list.push(line.replace(cwd, '')); + return list; + }, []); + + return stack.join('\n'); + } +}; }); // module: utils.js // The global object is "self" in Web Workers. var global = (function() { return this; })(); diff --git a/test/browser/stack-trace.html b/test/browser/stack-trace.html new file mode 100644 index 0000000000..0f267dab98 --- /dev/null +++ b/test/browser/stack-trace.html @@ -0,0 +1,24 @@ + + + Mocha + + + + + + + + + + +
      + + diff --git a/test/browser/stack-trace.js b/test/browser/stack-trace.js new file mode 100644 index 0000000000..b39944db09 --- /dev/null +++ b/test/browser/stack-trace.js @@ -0,0 +1,20 @@ +'use strict'; +describe('Stack trace', function() { + it('should prettify the stack-trace', function() { + var err = new Error(); + // We do this fake stack-trace because we under development, + // and our root isn't `node_modules`, `bower` or `components` + err.stack = ['Error: failed' + , 'at assert (stack-trace.html:11:30)' + , 'at Context. (stack-trace.js:5:5)' + , 'at callFn (http://localhost:63342/node_modules/mocha.js:4546:21)' + , 'at Test.require.register.Runnable.run (http://localhost:63342/node_modules/mocha.js:4539:7)' + , 'at Runner.require.register.Runner.runTest (http://localhost:63342/node_modules/mocha.js:4958:10)' + , 'at http://localhost:63342/bower_components/mocha.js:5041:12' + , 'at next (http://localhost:63342/bower_components/mocha.js:4883:14)' + , 'at http://localhost:63342/bower_components/mocha.js:4893:7' + , 'at next (http://localhost:63342/bower_components/mocha.js:4828:23)' + , 'at http://localhost:63342/bower_components/mocha.js:4860:5'].join('\n'); + assert(false, err); + }); +}); \ No newline at end of file diff --git a/test/runner.js b/test/runner.js index 89cb8216b4..a2ce512514 100644 --- a/test/runner.js +++ b/test/runner.js @@ -290,5 +290,51 @@ describe('Runner', function(){ runner.failHook(hook, err); done(); }) - }) -}) + }); + + describe('stackTrace', function() { + var stack = [ 'AssertionError: foo bar' + , 'at EventEmitter. (/usr/local/dev/test.js:16:12)' + , 'at Context. (/usr/local/dev/test.js:19:5)' + , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)' + , 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)' + , '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12' + , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)' + , '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7' + , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' + , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' + , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; + + describe('shortStackTrace', function() { + it('should prettify the stack-trace', function(done) { + var hook = {}, + err = new Error(); + // Fake stack-trace + err.stack = stack.join('\n'); + + runner.on('fail', function(hook, err){ + err.stack.should.equal(stack.slice(0,3).join('\n')); + done(); + }); + runner.failHook(hook, err); + }); + }); + + describe('longStackTrace', function() { + it('should display the full stack-trace', function(done) { + var hook = {}, + err = new Error(); + // Fake stack-trace + err.stack = stack.join('\n'); + // Add --stack-trace option + runner.fullStackTrace = true; + + runner.on('fail', function(hook, err){ + err.stack.should.equal(stack.join('\n')); + done(); + }); + runner.failHook(hook, err); + }); + }); + }); +}); diff --git a/test/utils.js b/test/utils.js index f60b42fc9f..780d8c324c 100644 --- a/test/utils.js +++ b/test/utils.js @@ -64,4 +64,81 @@ describe('utils', function() { }); }) }); + + describe('.stackTraceFilter()', function() { + describe('on node', function() { + var filter = utils.stackTraceFilter(); + it('should get a stack-trace as a string and prettify it', function() { + var stack = [ 'AssertionError: foo bar' + , 'at EventEmitter. (/usr/local/dev/test.js:16:12)' + , 'at Context. (/usr/local/dev/test.js:19:5)' + , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)' + , 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)' + , '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12' + , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)' + , '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7' + , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' + , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' + , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; + filter(stack.join('\n')).should.equal(stack.slice(0,3).join('\n')); + + stack = [ 'AssertionError: bar baz' + , 'at /usr/local/dev/some-test-file.js:25:8' + , 'at tryCatcher (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/util.js:24:31)' + , 'at Promise._resolveFromResolver (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:439:31)' + , 'at new Promise (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:53:37)' + , 'at yourFunction (/usr/local/dev/own/tmp/test1.js:24:13)' + , 'at Context. (/usr/local/dev/some-test-file:30:4)' + , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:218:15)' + , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' + , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' + , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; + filter(stack.join('\n')).should.equal(stack.slice(0,2).concat(stack.slice(5,7)).join('\n')); + }); + + it('should ignore bower and components files', function() { + var stack = ['Error: failed' + , 'at assert (index.html:11:26)' + , 'at Context. (test.js:17:18)' + , 'at bower_components/should/should.js:4827:7' + , 'at next (file:///.../bower_components/should/should.js:4766:23)' + , 'at components/should/5.0.0/should.js:4827:7' + , 'at next (file:///.../components/should/5.0.0/should.js:4766:23)' + , 'at file:///.../bower_components/mocha/mocha.js:4794:5' + , 'at timeslice (.../components/mocha/mocha.js:6218:27)' + , 'at Test.require.register.Runnable.run (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4463:15)' + , 'at Runner.require.register.Runner.runTest (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4892:10)' + , 'at file:///.../components/mochajs/mocha/2.1.0/mocha.js:4970:12' + , 'at next (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4817:14)']; + filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); + }); + }); + + describe('on browser', function() { + var filter; + before(function() { + global.document = true; + global.location = { href: 'localhost:3000/foo/bar/index.html' }; + filter = utils.stackTraceFilter(); + }); + it('should strip out bower and components too', function() { + var stack = ['Error: failed' + , 'at assert (index.html:11:26)' + , 'at Context. (test.js:17:18)' + , 'at bower_components/should/should.js:4827:7' + , 'at next (localhost:3000/foo/bar/bower_components/should/should.js:4766:23)' + , 'at components/should/5.0.0/should.js:4827:7' + , 'at next (localhost:3000/foo/bar/components/should/5.0.0/should.js:4766:23)' + , 'at Runner.require.register.Runner.runTest (localhost:3000/foo/bar/node_modules/mocha.js:4892:10)' + , 'at localhost:3000/foo/bar/node_modules/mocha.js:4970:12' + , 'at next (localhost:3000/foo/bar/node_modules/mocha.js:4817:14)']; + filter(stack.join('\n')).should.equal(stack.slice(0,3).join('\n')); + }); + + after(function() { + delete global.document; + delete global.location; + }); + }); + }); }); From 3102c9bc395c3a542b492fb56011a3eba15f3b76 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Mon, 9 Mar 2015 01:06:43 -0500 Subject: [PATCH 0221/1771] Release 2.2.1 --- HISTORY.md | 5 +++++ bower.json | 2 +- component.json | 2 +- package.json | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index e0ede017a2..5b3cc3dc55 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,8 @@ +2.2.1 / 2015-03-09 +================== + + * Fix passing of args intended for node/iojs. + 2.2.0 / 2015-03-06 ================== diff --git a/bower.json b/bower.json index 6adf74c852..e0c06b03b3 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.0", + "version": "2.2.1", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index 938c717579..aee1a76f3f 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.0", + "version": "2.2.1", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index 9c45483651..38fc115346 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.0", + "version": "2.2.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 83e1bc8f7cd1dcba5436c2c5c1bff9d6279521bc Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Mon, 9 Mar 2015 08:14:11 -0500 Subject: [PATCH 0222/1771] fix: support node args in mocha.opts (close #1573) --- bin/_mocha | 21 --------------------- bin/mocha | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 3ab4812d34..e0cc6cdb65 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -170,27 +170,6 @@ program.on('require', function(mod){ requires.push(mod); }); -// --opts - -var optsPath = process.argv.indexOf('--opts') !== -1 - ? process.argv[process.argv.indexOf('--opts') + 1] - : 'test/mocha.opts'; - -try { - var opts = fs.readFileSync(optsPath, 'utf8') - .trim() - .split(/\s+/) - .filter(function(value) { - return value ? true : false; - }); - - process.argv = process.argv - .slice(0, 2) - .concat(opts.concat(process.argv.slice(2))); -} catch (err) { - // ignore -} - // parse args program.parse(process.argv); diff --git a/bin/mocha b/bin/mocha index 74d471a03c..556aa36136 100755 --- a/bin/mocha +++ b/bin/mocha @@ -7,8 +7,30 @@ var spawn = require('child_process').spawn, path = require('path'), + fs = require('fs'), args = [path.join(__dirname, '_mocha')]; +// --opts + +var optsPath = process.argv.indexOf('--opts') !== -1 + ? process.argv[process.argv.indexOf('--opts') + 1] + : 'test/mocha.opts'; + +try { + var opts = fs.readFileSync(optsPath, 'utf8') + .trim() + .split(/\s+/) + .filter(function(value) { + return value ? true : false; + }); + + process.argv = process.argv + .slice(0, 2) + .concat(opts.concat(process.argv.slice(2))); +} catch (err) { + // ignore +} + process.argv.slice(2).forEach(function(arg){ var flag = arg.split('=')[0]; From 8a607872c1ea63ac745f3782a1f08cd0885d06c6 Mon Sep 17 00:00:00 2001 From: Anis Safine Date: Mon, 9 Mar 2015 11:04:47 +0100 Subject: [PATCH 0223/1771] [Fix] Exclude not own properties when looping on options --- mocha.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 mocha.js diff --git a/mocha.js b/mocha.js old mode 100644 new mode 100755 index c6b62d3752..cffddcbc13 --- a/mocha.js +++ b/mocha.js @@ -6518,7 +6518,11 @@ mocha.ui = function(ui){ mocha.setup = function(opts){ if ('string' == typeof opts) opts = { ui: opts }; - for (var opt in opts) this[opt](opts[opt]); + for (var opt in opts) { + if (opts.hasOwnProperty(opt)) { + this[opt](opts[opt]); + } + } return this; }; From ca84810498fe1b32d2ab237b1f0b98db4a9f9da5 Mon Sep 17 00:00:00 2001 From: Adam Gruber Date: Mon, 9 Feb 2015 11:27:31 -0500 Subject: [PATCH 0224/1771] log third-party reporter errors --- lib/mocha.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/mocha.js b/lib/mocha.js index 577a36f38d..8a11124cb1 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -144,7 +144,11 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ reporter = reporter || 'spec'; var _reporter; try { _reporter = require('./reporters/' + reporter); } catch (err) {} - if (!_reporter) try { _reporter = require(reporter); } catch (err) {} + if (!_reporter) try { _reporter = require(reporter); } catch (err) { + err.message.indexOf('Cannot find module') !== -1 + ? console.warn('"' + reporter + '" reporter not found') + : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + } if (!_reporter && reporter === 'teamcity') console.warn('The Teamcity reporter was moved to a package named ' + 'mocha-teamcity-reporter ' + From 3669774a2934e2d7bebdd0e12c6d618adb67e106 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 14 Mar 2015 00:52:38 -0700 Subject: [PATCH 0225/1771] Remove contributors list from readme --- README.md | 213 ------------------------------------------------------ 1 file changed, 213 deletions(-) diff --git a/README.md b/README.md index 5e6e486138..44692d3514 100644 --- a/README.md +++ b/README.md @@ -4,219 +4,6 @@ Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://mochajs.org). -## Contributors - -``` - project : mocha - repo age : 3 years, 4 months - active : 509 days - commits : 1575 - files : 153 - authors : - 977 TJ Holowaychuk 62.0% - 132 Travis Jeffery 8.4% - 63 Christopher Hiller 4.0% - 31 Guillermo Rauch 2.0% - 27 Joshua Appelman 1.7% - 13 Attila Domokos 0.8% - 10 John Firebaugh 0.6% - 8 Nathan Rajlich 0.5% - 8 Jo Liss 0.5% - 6 Mike Pennisi 0.4% - 6 Brendan Nee 0.4% - 6 James Carr 0.4% - 5 Aaron Heckmann 0.3% - 5 Raynos 0.3% - 5 Ryunosuke SATO 0.3% - 4 hokaccha 0.3% - 4 Jonathan Ong 0.3% - 4 Joshua Krall 0.3% - 4 Domenic Denicola 0.3% - 4 Forbes Lindesay 0.3% - 4 Xavier Antoviaque 0.3% - 4 David da Silva 0.3% - 3 Ariel Mashraki 0.2% - 3 Ben Bradley 0.2% - 3 Merrick Christensen 0.2% - 3 Andreas Lind Petersen 0.2% - 3 Nathan Bowser 0.2% - 3 Cory Thomas 0.2% - 3 Benjie Gillam 0.2% - 3 Wil Moore III 0.2% - 3 Ben Lindsey 0.2% - 3 Tyson Tate 0.2% - 3 Paul Miller 0.2% - 3 eiji.ienaga 0.2% - 3 Mathieu Desvé 0.2% - 3 Jesse Dailey 0.2% - 3 fool2fish 0.2% - 3 Fredrik Enestad 0.2% - 3 Sindre Sorhus 0.2% - 3 Valentin Agachi 0.2% - 2 jsdevel 0.1% - 2 Arian Stolwijk 0.1% - 2 Juzer Ali 0.1% - 2 David Henderson 0.1% - 2 Justin DuJardin 0.1% - 2 Paul Armstrong 0.1% - 2 Pete Hawkins 0.1% - 2 Jonas Westerlund 0.1% - 2 Quang Van 0.1% - 2 Simon Gaeremynck 0.1% - 2 travis jeffery 0.1% - 2 Dominique Quatravaux 0.1% - 2 Jacob Wejendorp 0.1% - 2 Shawn Krisman 0.1% - 2 FARKAS Máté 0.1% - 2 Konstantin Käfer 0.1% - 2 Timo Tijhof 0.1% - 2 Sean Lang 0.1% - 2 Quanlong He 0.1% - 2 Glen Mailer 0.1% - 2 Alexander Early 0.1% - 2 Ian Storm Taylor 0.1% - 2 Brian Beck 0.1% - 2 Michael Riley 0.1% - 2 Michael Schoonmaker 0.1% - 2 domenic 0.1% - 2 fcrisci 0.1% - 2 Buck Doyle 0.1% - 2 Nathan Alderson 0.1% - 1 Mal Graty 0.1% - 1 Marc Kuo 0.1% - 1 Matija Marohnić 0.1% - 1 Matt Robenolt 0.1% - 1 Matt Smith 0.1% - 1 Matthew Shanley 0.1% - 1 Mattias Tidlund 0.1% - 1 Michael Jackson 0.1% - 1 Michael Olson 0.1% - 1 Michal Charemza 0.1% - 1 Nathan Black 0.1% - 1 Nick Fitzgerald 0.1% - 1 Noshir Patel 0.1% - 1 Panu Horsmalahti 0.1% - 1 Phil Sung 0.1% - 1 R56 0.1% - 1 Refael Ackermann 0.1% - 1 Richard Dingwall 0.1% - 1 Richard Knop 0.1% - 1 Rob Wu 0.1% - 1 Romain Prieto 0.1% - 1 Roman Neuhauser 0.1% - 1 Roman Shtylman 0.1% - 1 Russ Bradberry 0.1% - 1 Russell Munson 0.1% - 1 Rustem Mustafin 0.1% - 1 Salehen Shovon Rahman 0.1% - 1 Sasha Koss 0.1% - 1 Seiya Konno 0.1% - 1 Shaine Hatch 0.1% - 1 Simon Goumaz 0.1% - 1 Standa Opichal 0.1% - 1 Stephen Mathieson 0.1% - 1 Steve Mason 0.1% - 1 Tapiwa Kelvin 0.1% - 1 Teddy Zeenny 0.1% - 1 Tim Ehat 0.1% - 1 Vadim Nikitin 0.1% - 1 Victor Costan 0.1% - 1 Will Langstroth 0.1% - 1 Yanis Wang 0.1% - 1 Yuest Wang 0.1% - 1 Zsolt Takács 0.1% - 1 abrkn 0.1% - 1 airportyh 0.1% - 1 badunk 0.1% - 1 claudyus 0.1% - 1 dasilvacontin 0.1% - 1 fengmk2 0.1% - 1 gaye 0.1% - 1 grasGendarme 0.1% - 1 lakmeer 0.1% - 1 lodr 0.1% - 1 mrShturman 0.1% - 1 nishigori 0.1% - 1 omardelarosa 0.1% - 1 qiuzuhui 0.1% - 1 samuel goldszmidt 0.1% - 1 sebv 0.1% - 1 startswithaj 0.1% - 1 tgautier@yahoo.com 0.1% - 1 traleig1 0.1% - 1 vlad 0.1% - 1 yuitest 0.1% - 1 zhiyelee 0.1% - 1 Adam Crabtree 0.1% - 1 Andreas Brekken 0.1% - 1 Andrew Nesbitt 0.1% - 1 Andrey Popp 0.1% - 1 Arnaud Brousseau 0.1% - 1 Atsuya Takagi 0.1% - 1 Austin Birch 0.1% - 1 Ben Noordhuis 0.1% - 1 Bjørge Næss 0.1% - 1 Brian Lalor 0.1% - 1 Brian M. Carlson 0.1% - 1 Brian Moore 0.1% - 1 Bryan Donovan 0.1% - 1 C. Scott Ananian 0.1% - 1 Casey Foster 0.1% - 1 ChrisWren 0.1% - 1 Connor Dunn 0.1% - 1 Corey Butler 0.1% - 1 Daniel Stockman 0.1% - 1 Dave McKenna 0.1% - 1 Denis Bardadym 0.1% - 1 Devin Weaver 0.1% - 1 Di Wu 0.1% - 1 Diogo Monteiro 0.1% - 1 Dmitry Shirokov 0.1% - 1 Dr. Travis Jeffery 0.1% - 1 Fedor Indutny 0.1% - 1 Florian Margaine 0.1% - 1 Frederico Silva 0.1% - 1 Fredrik Lindin 0.1% - 1 Gareth Aye 0.1% - 1 Gareth Murphy 0.1% - 1 Gavin Mogan 0.1% - 1 Giovanni Bassi 0.1% - 1 Glen Huang 0.1% - 1 Greg Perkins 0.1% - 1 Harish 0.1% - 1 Harry Brundage 0.1% - 1 Herman Junge 0.1% - 1 Ian Young 0.1% - 1 Ivan 0.1% - 1 JP Bochi 0.1% - 1 Jaakko Salonen 0.1% - 1 Jakub Nešetřil 0.1% - 1 James Bowes 0.1% - 1 James Lal 0.1% - 1 Jan Kopriva 0.1% - 1 Jason Barry 0.1% - 1 Javier Aranda 0.1% - 1 Jean Ponchon 0.1% - 1 Jeff Kunkle 0.1% - 1 Jeremy Martin 0.1% - 1 Jimmy Cuadra 0.1% - 1 John Doty 0.1% - 1 Jonathan Creamer 0.1% - 1 Jonathan Park 0.1% - 1 Jussi Virtanen 0.1% - 1 Katie Gengler 0.1% - 1 Kazuhito Hokamura 0.1% - 1 Kent C. Dodds 0.1% - 1 Kevin Conway 0.1% - 1 Kirill Korolyov 0.1% - 1 Koen Punt 0.1% - 1 Laszlo Bacsi 0.1% - 1 Liam Newman 0.1% - 1 Linus Unnebäck 0.1% - 1 László Bácsi 0.1% - 1 Maciej Małecki 0.1% -``` - ## Links - [Google Group](http://groups.google.com/group/mochajs) From 3901ba4226793f26ac2a46fef014781028f485b2 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 14 Mar 2015 14:39:15 -0700 Subject: [PATCH 0226/1771] Remove trailing whitespace from reporter output --- lib/reporters/dot.js | 2 +- lib/reporters/spec.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index 3c7445760d..42a45ee2b5 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -27,7 +27,7 @@ function Dot(runner) { , n = -1; runner.on('start', function(){ - process.stdout.write('\n '); + process.stdout.write('\n'); }); runner.on('pending', function(test){ diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index e74f4ace7c..3debffe26f 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -54,14 +54,14 @@ function Spec(runner) { if ('fast' == test.speed) { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) - + color('pass', ' %s '); + + color('pass', ' %s'); cursor.CR(); console.log(fmt, test.title); } else { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); cursor.CR(); console.log(fmt, test.title, test.duration); } From f656fded951d27293f93f4b489e7d0d3f92c7a74 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 14 Mar 2015 20:50:12 -0700 Subject: [PATCH 0227/1771] update contributors in package.json --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 38fc115346..c3cd8af4d6 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,12 @@ "author": "TJ Holowaychuk ", "contributors": [ "Joshua Appelman ", - "Oleg Gaidarenko ", "Christoffer Hallas ", "Christopher Hiller ", "Travis Jeffery ", - "Johnathan Ong ", - "Guillermo Rauch ", - "Nathan Rajlich " + "Daniel St. Jules ", + "David da Silva Contín ", + "Pawel Kozlowski " ], "repository": { "type": "git", @@ -71,4 +70,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} \ No newline at end of file +} From 86f85bd66a67063acb859b4321762c95dff77b5a Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 14 Mar 2015 19:13:23 -0700 Subject: [PATCH 0228/1771] Fix #57: Add section on meta-generated tests --- README.md | 4 ++-- index.html | 43 ++++++++++++++++++++++++++++++++++++++++++- index.md | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50c7c569cc..a89c99485d 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ Install `markdown` via Homebrew: ```sh brew install markdown ``` - + Or download from [here](http://daringfireball.net/projects/markdown/). - + Celebrate with tequila! Or try to build first. Probably want to build first. ### Linux diff --git a/index.html b/index.html index f8307d822e..a8c4aa137e 100644 --- a/index.html +++ b/index.html @@ -72,6 +72,7 @@

      Table of contents

    • Pending tests
    • Exclusive tests
    • Inclusive tests
    • +
    • Meta-Generated tests
    • Test duration
    • String diffs
    • mocha(1)
    • @@ -329,6 +330,46 @@

      Inclusive tests

      })
      +

      Meta-Generated tests

      + +

      Given mocha's use of call statements and function expressions to define + suites and specs, it's rather straightforward to generate your tests. No + special syntax is required - plain JavaScript can be used to achieve + similar functionality as parameterized tests in other test frameworks. + Take the following example:

      + +
      var assert = require('assert');
      +
      +function add() {
      +  return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
      +    return prev + curr;
      +  }, 0);
      +}
      +
      +describe('add()', function() {
      +  var tests = [
      +    {args: [1, 2],       expected: 3},
      +    {args: [1, 2, 3],    expected: 6},
      +    {args: [1, 2, 3, 4], expected: 10}
      +  ];
      +
      +  tests.forEach(function(test) {
      +    it('correctly adds ' + test.args.length + ' args', function() {
      +      var res = add.apply(null, test.args);
      +      assert.equal(res, test.expected);
      +    });
      +  });
      +});
      +
      + +

      The code above will output a suite with three specs:

      + +
      add()
      +  ✓ correctly adds 2 args
      +  ✓ correctly adds 3 args
      +  ✓ correctly adds 4 args
      +
      +

      Test duration

      Most of the reporters support some form of displaying @@ -785,7 +826,7 @@

      Mocha Setup in the Browser

      Mocha options can be set via mocha.setup(). Examples:

      -
      // Use "tdd" interface.  This is a shortcut to setting the interface; 
      +
      // Use "tdd" interface.  This is a shortcut to setting the interface;
       // any other options must be passed via an object.
       mocha.setup('tdd');
       
      diff --git a/index.md b/index.md
      index 8455e1472f..379a08e3a3 100644
      --- a/index.md
      +++ b/index.md
      @@ -45,6 +45,7 @@ Mocha is a feature-rich JavaScript test framework running on [node.js](http://no
         - [Pending tests](#pending-tests)
         - [Exclusive tests](#exclusive-tests)
         - [Inclusive tests](#inclusive-tests)
      +  - [Meta-Generated tests](#meta-generated-test)
         - [Test duration](#test-duration)
         - [String diffs](#string-diffs)
         - [mocha(1)](#usage)
      @@ -290,6 +291,44 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal
             })
           })
       
      +

      Meta-Generated tests

      + + Given mocha's use of call statements and function expressions to define + suites and specs, it's rather straightforward to generate your tests. No + special syntax is required - plain JavaScript can be used to achieve + similar functionality as parameterized tests in other test frameworks. + Take the following example: + + var assert = require('assert'); + + function add() { + return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { + return prev + curr; + }, 0); + } + + describe('add()', function() { + var tests = [ + {args: [1, 2], expected: 3}, + {args: [1, 2, 3], expected: 6}, + {args: [1, 2, 3, 4], expected: 10} + ]; + + tests.forEach(function(test) { + it('correctly adds ' + test.args.length + ' args', function() { + var res = add.apply(null, test.args); + assert.equal(res, test.expected); + }); + }); + }); + + The code above will output a suite with three specs: + + add() + ✓ correctly adds 2 args + ✓ correctly adds 3 args + ✓ correctly adds 4 args +

      Test duration

      Most of the reporters support some form of displaying From 4df3768b7aefcf2bb9fddd674549daa931090d77 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 14 Mar 2015 23:28:24 -0700 Subject: [PATCH 0229/1771] Fix #267, document relative require --- index.html | 2 +- index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index f8307d822e..7e6f6c233c 100644 --- a/index.html +++ b/index.html @@ -426,7 +426,7 @@

      --check-leaks

      -r, --require <name>

      -

      The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file. Note that this works well for should as it augments Object.prototype, however if you wish to access a module's exports you will have to require them, for example var should = require('should').

      +

      The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file. Note that this works well for should as it augments Object.prototype, however if you wish to access a module's exports you will have to require them, for example var should = require('should'). Furthermore, it can be used with relative paths, e.g. --require ./test/helper.js

      -u, --ui <name>

      diff --git a/index.md b/index.md index 8455e1472f..d05beee337 100644 --- a/index.md +++ b/index.md @@ -387,7 +387,7 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal

      -r, --require <name>

      - The `--require` option is useful for libraries such as [should.js](https://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. + The `--require` option is useful for libraries such as [should.js](https://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. Furthermore, it can be used with relative paths, e.g. `--require ./test/helper.js`

      -u, --ui <name>

      From 731b5aaef07bb7caa65e9a839d37c2f69aca849f Mon Sep 17 00:00:00 2001 From: Sam Mussell Date: Sun, 15 Mar 2015 14:15:59 -0700 Subject: [PATCH 0230/1771] fix issue where menu overlaps content. There are more improvements that could be made, for example it'd be nice to be able to collapse the menu all together, but at least the fixes the current issue I'm having which is, if my file names are long, the menu covers up the content and I am not able to scroll so my content is completely hidden. --- lib/reporters/templates/style.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/reporters/templates/style.html b/lib/reporters/templates/style.html index 4b1f6826c6..4c9c37cfd9 100644 --- a/lib/reporters/templates/style.html +++ b/lib/reporters/templates/style.html @@ -8,7 +8,7 @@ } #coverage { - padding: 60px; + padding: 60px 400px 60px 60px; } h1 a { @@ -124,6 +124,10 @@ padding: 15px 0; text-align: right; border-left: 1px solid #eee; + max-width: 400px; + overflow: auto; + white-space: nowrap; + -moz-box-shadow: 0 0 2px #888 , inset 5px 0 20px rgba(0,0,0,.5) , inset 5px 0 3px rgba(0,0,0,.3); From fe15f19369e578379e13a28e1307b88c238fb3c8 Mon Sep 17 00:00:00 2001 From: klaemo Date: Mon, 16 Mar 2015 10:46:38 +0100 Subject: [PATCH 0231/1771] support --es_staging flag --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 716cb4464e..ee974439ee 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -79,6 +79,7 @@ program .option('--debug-brk', "enable node's debugger breaking on the first line") .option('--globals ', 'allow the given comma-delimited global [names]', list, []) .option('--harmony', 'enable all harmony features (except typeof)') + .option('--es_staging', 'enable all staged features') .option('--harmony-collections', 'enable harmony collections (sets, maps, and weak maps)') .option('--harmony-generators', 'enable harmony generators') .option('--harmony-proxies', 'enable harmony proxies') diff --git a/bin/mocha b/bin/mocha index 556aa36136..08c47afe98 100755 --- a/bin/mocha +++ b/bin/mocha @@ -51,6 +51,7 @@ process.argv.slice(2).forEach(function(arg){ break; case '--gc-global': case '--harmony': + case '--es_staging': case '--harmony-proxies': case '--harmony-collections': case '--harmony-generators': From 7665dbb8c5b33cd063015dad4f6b6783dff0f1d6 Mon Sep 17 00:00:00 2001 From: Stewart Taylor Date: Fri, 20 Mar 2015 14:17:56 -0700 Subject: [PATCH 0232/1771] Fixed broken link on html-cov reporter --- lib/reporters/templates/menu.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/templates/menu.jade b/lib/reporters/templates/menu.jade index e9ba4648a6..c682e3f0ee 100644 --- a/lib/reporters/templates/menu.jade +++ b/lib/reporters/templates/menu.jade @@ -10,4 +10,4 @@ if segments.length span.dirname= segments.join('/') + '/' span.basename= basename - a#logo(href='http://visionmedia.github.io/mocha/') m + a#logo(href='http://mochajs.org/') m From ac89c2091c0bc4994ee16c1f76edd73ba83428e6 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sun, 22 Mar 2015 15:22:24 +0200 Subject: [PATCH 0233/1771] chore(package.json): add a8m as a contributor --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c3cd8af4d6..41976579bd 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "Travis Jeffery ", "Daniel St. Jules ", "David da Silva Contín ", + "Ariel Mashraki ", "Pawel Kozlowski " ], "repository": { From fd70450258388b866091218763fa54b54aebb150 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sun, 22 Mar 2015 12:13:05 -0700 Subject: [PATCH 0234/1771] Fix 1585: make _mocha executable again --- bin/_mocha | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index ee974439ee..b060f5a6ec 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -1,3 +1,5 @@ +#!/usr/bin/env node + /** * Module dependencies. */ From 537d019be6c0ac959b2045a97b9a3175ec0664b0 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sun, 22 Mar 2015 23:18:15 -0700 Subject: [PATCH 0235/1771] Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers --- lib/runner.js | 2 +- lib/utils.js | 2 +- mocha.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index a985ce9736..3199dc921a 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -206,7 +206,7 @@ Runner.prototype.fail = function(test, err) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } - err.stack = this.fullStackTrace + err.stack = (this.fullStackTrace || !err.stack) ? err.stack : stackFilter(err.stack); diff --git a/lib/utils.js b/lib/utils.js index cb28b674e6..cef8d0fe9c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -677,7 +677,7 @@ exports.stackTraceFilter = function() { return function(stack) { stack = stack.split('\n'); - stack = stack.reduce(function (list, line) { + stack = exports.reduce(stack, function(list, line) { if (is.node && (isNodeModule(line) || isMochaInternal(line) || isNodeInternal(line))) diff --git a/mocha.js b/mocha.js index cffddcbc13..017b9018bb 100755 --- a/mocha.js +++ b/mocha.js @@ -4779,7 +4779,7 @@ Runner.prototype.fail = function(test, err) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } - err.stack = this.fullStackTrace + err.stack = (this.fullStackTrace || !err.stack) ? err.stack : stackFilter(err.stack); @@ -6372,7 +6372,7 @@ exports.stackTraceFilter = function() { return function(stack) { stack = stack.split('\n'); - stack = stack.reduce(function (list, line) { + stack = exports.reduce(stack, function(list, line) { if (is.node && (isNodeModule(line) || isMochaInternal(line) || isNodeInternal(line))) From d15caceb7e93e397344dc6e4e93670ffbc713a43 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Mon, 23 Mar 2015 01:04:41 -0700 Subject: [PATCH 0236/1771] Fix 1556: Update utils.clean to handle newlines in func declarations --- lib/utils.js | 2 +- mocha.js | 2 +- test/utils.js | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index cef8d0fe9c..c1393a9c62 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -237,7 +237,7 @@ exports.slug = function(str){ exports.clean = function(str) { str = str .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') - .replace(/^function *\(.*\) *{|\(.*\) *=> *{?/, '') + .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '') .replace(/\s+\}$/, ''); var spaces = str.match(/^\n?( *)/)[1].length diff --git a/mocha.js b/mocha.js index 017b9018bb..bcca1acb18 100755 --- a/mocha.js +++ b/mocha.js @@ -5932,7 +5932,7 @@ exports.slug = function(str){ exports.clean = function(str) { str = str .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') - .replace(/^function *\(.*\) *{|\(.*\) *=> *{?/, '') + .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '') .replace(/\s+\}$/, ''); var spaces = str.match(/^\n?( *)/)[1].length diff --git a/test/utils.js b/test/utils.js index 780d8c324c..524a0e0519 100644 --- a/test/utils.js +++ b/test/utils.js @@ -8,6 +8,10 @@ describe('utils', function() { clean('function (one, two, three) {\n//code\n}').should.equal('//code'); }); + it('should handle newlines in the function declaration', function() { + clean('function (one, two, three)\n {\n//code\n}').should.equal('//code'); + }); + it('should remove space character indentation from the function body', function() { clean(' //line1\n //line2').should.equal('//line1\n //line2'); }); From b3da04fdc983d734a58071c932fddfb2a9a0ae33 Mon Sep 17 00:00:00 2001 From: Jordan Sexton Date: Sat, 21 Mar 2015 06:31:12 -0500 Subject: [PATCH 0237/1771] Support --harmony_classes flag for io.js --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index ee974439ee..62f6b031e9 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -86,6 +86,7 @@ program .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)') .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)') .option('--harmony_proxies', 'enable "harmony proxies" (iojs)') + .option('--harmony_classes', 'enable "harmony classes" (iojs)') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') diff --git a/bin/mocha b/bin/mocha index 08c47afe98..886d225ccd 100755 --- a/bin/mocha +++ b/bin/mocha @@ -58,6 +58,7 @@ process.argv.slice(2).forEach(function(arg){ case '--harmony_shipping': case '--harmony_arrow_functions': case '--harmony_proxies': + case '--harmony_classes': case '--no-deprecation': case '--prof': case '--throw-deprecation': From 4a1195a4efbf0bad07f139beeba16fef3d924462 Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Tue, 24 Mar 2015 10:38:25 +0000 Subject: [PATCH 0238/1771] Pass `--allow-natives-syntax` flag to node. --- bin/mocha | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/mocha b/bin/mocha index 886d225ccd..a88de85792 100755 --- a/bin/mocha +++ b/bin/mocha @@ -63,6 +63,7 @@ process.argv.slice(2).forEach(function(arg){ case '--prof': case '--throw-deprecation': case '--trace-deprecation': + case '--allow-natives-syntax': args.unshift(arg); break; default: From 4c43d6a84c843a17d5f26f5c75e5cda8c16f3785 Mon Sep 17 00:00:00 2001 From: Andrii Shumada Date: Tue, 24 Mar 2015 13:05:10 +0200 Subject: [PATCH 0239/1771] Add iojs to travis build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5e0ed944a9..2789c51dab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: node_js script: travis_retry npm test node_js: +- 'iojs' - '0.12' - '0.11' - '0.10' From 88fa08f200f1eb01f604d6e48272e12f963d0b65 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Wed, 25 Mar 2015 19:55:28 +0200 Subject: [PATCH 0240/1771] fix(reporter/base): explicitly ignore showDiff #1614 --- lib/reporters/base.js | 2 +- test/reporters/base.js | 147 +++++++++++++++++++++++------------------ 2 files changed, 83 insertions(+), 66 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index c253c11f1e..9cae455b5d 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -179,7 +179,7 @@ exports.list = function(failures){ msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff && sameType(actual, expected)) { + if (err.showDiff !== false && sameType(actual, expected)) { if ('string' !== typeof actual) { escape = false; diff --git a/test/reporters/base.js b/test/reporters/base.js index d285bf8845..d8ca2c7b78 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -1,40 +1,90 @@ -var Base = require('../../lib/reporters/base'); +var Base = require('../../lib/reporters/base') + , Assert = require('assert').AssertionError; describe('Base reporter', function () { - it('should show diffs with showDiff property set', function () { - var err = new Error('test'), - stdout = [], - stdoutWrite = process.stdout.write, - errOut; - - err.actual = "a1"; - err.expected = "e1"; - err.showDiff = true; - var test = { - err: err, - fullTitle: function () { - return 'title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; - - Base.list([test]); - - process.stdout.write = stdoutWrite; - - errOut = stdout.join('\n'); - - errOut.should.match(/test/); - errOut.should.match(/actual/); - errOut.should.match(/expected/); - + describe('showDiff', function() { + it('should show diffs by default', function () { + var err = new Assert({ actual: 'foo', expected: 'bar' }) + , stdout = [] + , stdoutWrite = process.stdout.write + , errOut; + + var test = { + err: err, + fullTitle: function () { + return 'test title'; + } + }; + + process.stdout.write = function (string) { + stdout.push(string); + }; + + Base.list([test]); + + process.stdout.write = stdoutWrite; + + errOut = stdout.join('\n'); + errOut.should.match(/actual/); + errOut.should.match(/expected/); + }); + + it('should show diffs if property set to `true`', function () { + var err = new Assert({ actual: 'foo', expected: 'bar' }) + , stdout = [] + , stdoutWrite = process.stdout.write + , errOut; + + err.showDiff = true; + var test = { + err: err, + fullTitle: function () { + return 'test title'; + } + }; + + process.stdout.write = function (string) { + stdout.push(string); + }; + + Base.list([test]); + + process.stdout.write = stdoutWrite; + + errOut = stdout.join('\n'); + errOut.should.match(/actual/); + errOut.should.match(/expected/); + }); + + it('should not show diffs when showDiff property set to `false`', function () { + var err = new Assert({ actual: 'foo', expected: 'bar' }) + , stdout = [] + , stdoutWrite = process.stdout.write + , errOut; + + err.showDiff = false; + var test = { + err: err, + fullTitle: function () { + return 'test title'; + } + }; + + process.stdout.write = function (string) { + stdout.push(string); + }; + + Base.list([test]); + + process.stdout.write = stdoutWrite; + + errOut = stdout.join('\n'); + errOut.should.not.match(/actual/); + errOut.should.not.match(/expected/); + }); }); - it('should not stringify strings', function () { var err = new Error('test'), stdout = [], @@ -99,38 +149,5 @@ describe('Base reporter', function () { errOut.should.match(/test/); errOut.should.match(/actual/); errOut.should.match(/expected/); - - }); - - it('should not show diffs when showDiff property set', function () { - var err = new Error('test'), - stdout = [], - stdoutWrite = process.stdout.write, - errOut; - - err.actual = "a1"; - err.expected = "e1"; - err.showDiff = false; - var test = { - err: err, - fullTitle: function () { - return 'title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; - - Base.list([test]); - - process.stdout.write = stdoutWrite; - - errOut = stdout.join('\n'); - - errOut.should.match(/test/); - errOut.should.not.match(/actual/); - errOut.should.not.match(/expected/); - }); }); From a83c6cfda4e9459e677d0d8add3de00061137388 Mon Sep 17 00:00:00 2001 From: Dominic Barnes Date: Thu, 26 Mar 2015 15:15:43 -0700 Subject: [PATCH 0241/1771] support underscored flags as well --- bin/mocha | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/mocha b/bin/mocha index 886d225ccd..2c14ed5688 100755 --- a/bin/mocha +++ b/bin/mocha @@ -53,8 +53,11 @@ process.argv.slice(2).forEach(function(arg){ case '--harmony': case '--es_staging': case '--harmony-proxies': + case '--harmony_proxies': case '--harmony-collections': + case '--harmony_collections': case '--harmony-generators': + case '--harmony_generators': case '--harmony_shipping': case '--harmony_arrow_functions': case '--harmony_proxies': From f8e2b0fdd145dd97f855bce29e62c56e8ed79869 Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Sat, 28 Mar 2015 21:07:56 +0100 Subject: [PATCH 0242/1771] improve: dry up reporter/base test --- test/reporters/base.js | 106 +++++++++++++---------------------------- 1 file changed, 33 insertions(+), 73 deletions(-) diff --git a/test/reporters/base.js b/test/reporters/base.js index d8ca2c7b78..cb8a6a6707 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -1,30 +1,44 @@ var Base = require('../../lib/reporters/base') , Assert = require('assert').AssertionError; +function makeTest(err) { + return { + err: err, + fullTitle: function () { + return 'test title'; + } + }; +} + describe('Base reporter', function () { + var stdout + , stdoutWrite + , useColors; + + beforeEach(function () { + stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function (string) { + stdout.push(string); + }; + useColors = Base.useColors; + Base.useColors = false; + }); + + afterEach(function () { + process.stdout.write = stdoutWrite; + Base.useColors = useColors; + }); describe('showDiff', function() { it('should show diffs by default', function () { var err = new Assert({ actual: 'foo', expected: 'bar' }) - , stdout = [] - , stdoutWrite = process.stdout.write , errOut; - var test = { - err: err, - fullTitle: function () { - return 'test title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; + var test = makeTest(err); Base.list([test]); - process.stdout.write = stdoutWrite; - errOut = stdout.join('\n'); errOut.should.match(/actual/); errOut.should.match(/expected/); @@ -32,26 +46,14 @@ describe('Base reporter', function () { it('should show diffs if property set to `true`', function () { var err = new Assert({ actual: 'foo', expected: 'bar' }) - , stdout = [] - , stdoutWrite = process.stdout.write , errOut; err.showDiff = true; - var test = { - err: err, - fullTitle: function () { - return 'test title'; - } - }; + var test = makeTest(err); - process.stdout.write = function (string) { - stdout.push(string); - }; Base.list([test]); - process.stdout.write = stdoutWrite; - errOut = stdout.join('\n'); errOut.should.match(/actual/); errOut.should.match(/expected/); @@ -59,26 +61,13 @@ describe('Base reporter', function () { it('should not show diffs when showDiff property set to `false`', function () { var err = new Assert({ actual: 'foo', expected: 'bar' }) - , stdout = [] - , stdoutWrite = process.stdout.write , errOut; err.showDiff = false; - var test = { - err: err, - fullTitle: function () { - return 'test title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; + var test = makeTest(err); Base.list([test]); - process.stdout.write = stdoutWrite; - errOut = stdout.join('\n'); errOut.should.not.match(/actual/); errOut.should.not.match(/expected/); @@ -87,67 +76,38 @@ describe('Base reporter', function () { it('should not stringify strings', function () { var err = new Error('test'), - stdout = [], - stdoutWrite = process.stdout.write, errOut; err.actual = "a1"; err.expected = "e2"; err.showDiff = true; - var test = { - err: err, - fullTitle: function () { - return 'title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; + var test = makeTest(err); Base.list([test]); - process.stdout.write = stdoutWrite; - errOut = stdout.join('\n'); - errOut.should.not.match(/"/); errOut.should.match(/test/); errOut.should.match(/actual/); errOut.should.match(/expected/); - }); - it('should stringify objects', function () { var err = new Error('test'), - stdout = [], - stdoutWrite = process.stdout.write, errOut; err.actual = {key:"a1"}; err.expected = {key:"e1"}; err.showDiff = true; - var test = { - err: err, - fullTitle: function () { - return 'title'; - } - }; - - process.stdout.write = function (string) { - stdout.push(string); - }; + var test = makeTest(err); Base.list([test]); - process.stdout.write = stdoutWrite; - errOut = stdout.join('\n'); - errOut.should.match(/"key"/); errOut.should.match(/test/); errOut.should.match(/actual/); errOut.should.match(/expected/); }); + }); From 8307cb4373ecede12975c04daa97e41cf34221ad Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Fri, 27 Mar 2015 00:50:45 +0100 Subject: [PATCH 0243/1771] fix(reporter/base): don't assume error message is first line of stack The current implementation assumes that the first line of the err.stack is the error message. This is not the case for Safari. When using Mocha with a different HTML generator (e.g. Consolify) this produces weirdly formatted output with no error message. --- lib/reporters/base.js | 16 +++++++++++----- test/reporters/base.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 9cae455b5d..19637a91dc 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -168,11 +168,18 @@ exports.list = function(failures){ var err = test.err , message = err.message || '' , stack = err.stack || message - , index = stack.indexOf(message) + message.length - , msg = stack.slice(0, index) + , index = stack.indexOf(message) , actual = err.actual , expected = err.expected , escape = true; + if (index === -1) { + msg = message; + } else { + index += message.length; + msg = stack.slice(0, index); + // remove msg from stack + stack = stack.slice(index + 1); + } // uncaught if (err.uncaught) { @@ -198,9 +205,8 @@ exports.list = function(failures){ } } - // indent stack trace without msg - stack = stack.slice(index ? index + 1 : index) - .replace(/^/gm, ' '); + // indent stack trace + stack = stack.replace(/^/gm, ' '); console.log(fmt, (i + 1), test.fullTitle(), msg, stack); }); diff --git a/test/reporters/base.js b/test/reporters/base.js index cb8a6a6707..57c0d1683c 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -110,4 +110,32 @@ describe('Base reporter', function () { errOut.should.match(/expected/); }); + it('should remove message from stack', function () { + var err = { + message: 'Error', + stack: 'Error\nfoo\nbar', + showDiff: false + }; + var test = makeTest(err); + + Base.list([test]); + + var errOut = stdout.join('\n').trim(); + errOut.should.equal('1) test title:\n Error\n foo\n bar') + }); + + it('should not modify stack if it does not contain message', function () { + var err = { + message: 'Error', + stack: 'foo\nbar', + showDiff: false + }; + var test = makeTest(err); + + Base.list([test]); + + var errOut = stdout.join('\n').trim(); + errOut.should.equal('1) test title:\n Error\n foo\n bar') + }); + }); From 18d2e05253f0cba3c7396ffb0727ec96327cedbb Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Sun, 29 Mar 2015 12:45:37 +0200 Subject: [PATCH 0244/1771] fix(reporter/base): don't show diffs for errors without expectation Standard JavaScript error objects should not show the "+ expected" and "- actual" titles becuase there is nothing to show. Currently the diff is not shown if the types of `actual` and `expected` differ. This patch adds an additional check to make sure `expected` is defined. --- lib/reporters/base.js | 3 ++- test/reporters/base.js | 34 ++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 19637a91dc..c3ffe6a974 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -186,7 +186,8 @@ exports.list = function(failures){ msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff !== false && sameType(actual, expected)) { + if (err.showDiff !== false && sameType(actual, expected) + && expected !== undefined) { if ('string' !== typeof actual) { escape = false; diff --git a/test/reporters/base.js b/test/reporters/base.js index 57c0d1683c..3b06f34ad1 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -40,8 +40,8 @@ describe('Base reporter', function () { Base.list([test]); errOut = stdout.join('\n'); - errOut.should.match(/actual/); - errOut.should.match(/expected/); + errOut.should.match(/\- actual/); + errOut.should.match(/\+ expected/); }); it('should show diffs if property set to `true`', function () { @@ -55,8 +55,8 @@ describe('Base reporter', function () { Base.list([test]); errOut = stdout.join('\n'); - errOut.should.match(/actual/); - errOut.should.match(/expected/); + errOut.should.match(/\- actual/); + errOut.should.match(/\+ expected/); }); it('should not show diffs when showDiff property set to `false`', function () { @@ -69,9 +69,23 @@ describe('Base reporter', function () { Base.list([test]); errOut = stdout.join('\n'); - errOut.should.not.match(/actual/); - errOut.should.not.match(/expected/); + errOut.should.not.match(/\- actual/); + errOut.should.not.match(/\+ expected/); }); + + it('should not show diffs when expected is not defined', function () { + var err = new Error('ouch') + , errOut; + + var test = makeTest(err); + + Base.list([test]); + + errOut = stdout.join('\n'); + errOut.should.not.match(/\- actual/); + errOut.should.not.match(/\+ expected/); + }); + }); it('should not stringify strings', function () { @@ -88,8 +102,8 @@ describe('Base reporter', function () { errOut = stdout.join('\n'); errOut.should.not.match(/"/); errOut.should.match(/test/); - errOut.should.match(/actual/); - errOut.should.match(/expected/); + errOut.should.match(/\- actual/); + errOut.should.match(/\+ expected/); }); it('should stringify objects', function () { @@ -106,8 +120,8 @@ describe('Base reporter', function () { errOut = stdout.join('\n'); errOut.should.match(/"key"/); errOut.should.match(/test/); - errOut.should.match(/actual/); - errOut.should.match(/expected/); + errOut.should.match(/\- actual/); + errOut.should.match(/\+ expected/); }); it('should remove message from stack', function () { From 73e49676cc9200292fd5eabd80616130d7a9cf68 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Mon, 6 Apr 2015 22:59:20 +0300 Subject: [PATCH 0245/1771] fix(reporter/base): string diff - issue #1241 Show string diff as a raw data, this fix issue #1241. --- lib/reporters/base.js | 8 +++----- lib/utils.js | 2 +- test/reporters/base.js | 14 ++++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index c3ffe6a974..bec43e58f5 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -189,11 +189,9 @@ exports.list = function(failures){ if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { - if ('string' !== typeof actual) { - escape = false; - err.actual = actual = utils.stringify(actual); - err.expected = expected = utils.stringify(expected); - } + escape = false; + err.actual = actual = utils.stringify(actual); + err.expected = expected = utils.stringify(expected); fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); var match = message.match(/^([^:]+): expected/); diff --git a/lib/utils.js b/lib/utils.js index c1393a9c62..3650a707cc 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -455,7 +455,7 @@ function jsonStringify(object, spaces, depth) { default: val = (val == '[Function]' || val == '[Circular]') ? val - : '"' + val + '"'; //string + : JSON.stringify(val); //string } return val; } diff --git a/test/reporters/base.js b/test/reporters/base.js index 3b06f34ad1..b5de60b3f2 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -88,22 +88,24 @@ describe('Base reporter', function () { }); - it('should not stringify strings', function () { + it('should show string diff as raw data', function () { var err = new Error('test'), errOut; - err.actual = "a1"; - err.expected = "e2"; + err.actual = 'foo\nbar'; + err.expected = 'foo\nbaz'; err.showDiff = true; var test = makeTest(err); Base.list([test]); errOut = stdout.join('\n'); - errOut.should.not.match(/"/); + + errOut.should.match(/"foo\\nbar"/); + errOut.should.match(/"foo\\nbaz"/); errOut.should.match(/test/); - errOut.should.match(/\- actual/); - errOut.should.match(/\+ expected/); + errOut.should.match(/actual/); + errOut.should.match(/expected/); }); it('should stringify objects', function () { From 8970ede0bfd33218546ce560a525b082decd5fef Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Tue, 7 Apr 2015 13:49:54 -0500 Subject: [PATCH 0246/1771] Update mocha.js --- mocha.js | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) mode change 100755 => 100644 mocha.js diff --git a/mocha.js b/mocha.js old mode 100755 new mode 100644 index bcca1acb18..5ff1385758 --- a/mocha.js +++ b/mocha.js @@ -1548,7 +1548,11 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ reporter = reporter || 'spec'; var _reporter; try { _reporter = require('./reporters/' + reporter); } catch (err) {} - if (!_reporter) try { _reporter = require(reporter); } catch (err) {} + if (!_reporter) try { _reporter = require(reporter); } catch (err) { + err.message.indexOf('Cannot find module') !== -1 + ? console.warn('"' + reporter + '" reporter not found') + : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + } if (!_reporter && reporter === 'teamcity') console.warn('The Teamcity reporter was moved to a package named ' + 'mocha-teamcity-reporter ' + @@ -2151,18 +2155,26 @@ exports.list = function(failures){ var err = test.err , message = err.message || '' , stack = err.stack || message - , index = stack.indexOf(message) + message.length - , msg = stack.slice(0, index) + , index = stack.indexOf(message) , actual = err.actual , expected = err.expected , escape = true; + if (index === -1) { + msg = message; + } else { + index += message.length; + msg = stack.slice(0, index); + // remove msg from stack + stack = stack.slice(index + 1); + } // uncaught if (err.uncaught) { msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff && sameType(actual, expected)) { + if (err.showDiff !== false && sameType(actual, expected) + && expected !== undefined) { if ('string' !== typeof actual) { escape = false; @@ -2181,9 +2193,8 @@ exports.list = function(failures){ } } - // indent stack trace without msg - stack = stack.slice(index ? index + 1 : index) - .replace(/^/gm, ' '); + // indent stack trace + stack = stack.replace(/^/gm, ' '); console.log(fmt, (i + 1), test.fullTitle(), msg, stack); }); @@ -2539,7 +2550,7 @@ function Dot(runner) { , n = -1; runner.on('start', function(){ - process.stdout.write('\n '); + process.stdout.write('\n'); }); runner.on('pending', function(test){ @@ -4012,14 +4023,14 @@ function Spec(runner) { if ('fast' == test.speed) { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) - + color('pass', ' %s '); + + color('pass', ' %s'); cursor.CR(); console.log(fmt, test.title); } else { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); cursor.CR(); console.log(fmt, test.title, test.duration); } @@ -6518,11 +6529,7 @@ mocha.ui = function(ui){ mocha.setup = function(opts){ if ('string' == typeof opts) opts = { ui: opts }; - for (var opt in opts) { - if (opts.hasOwnProperty(opt)) { - this[opt](opts[opt]); - } - } + for (var opt in opts) this[opt](opts[opt]); return this; }; From f174a473101ac452f4c5612448e105488e25f218 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Tue, 7 Apr 2015 13:50:04 -0500 Subject: [PATCH 0247/1771] Release 2.2.2 --- bower.json | 2 +- component.json | 2 +- package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bower.json b/bower.json index e0c06b03b3..0c711c5c5f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.1", + "version": "2.2.2", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index aee1a76f3f..165acc685d 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.1", + "version": "2.2.2", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index 41976579bd..f8deb1078d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.1", + "version": "2.2.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -71,4 +71,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} +} \ No newline at end of file From 1ecda1d749e082a4ef02950e540370ffd9bbab2a Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Tue, 7 Apr 2015 13:53:29 -0500 Subject: [PATCH 0248/1771] Release 2.2.3 --- HISTORY.md | 28 ++++++++++++++++++++++++++++ bower.json | 2 +- component.json | 2 +- package.json | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 5b3cc3dc55..cb3a8cad97 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,31 @@ + +2.2.3 / 2015-04-07 +================== + + * fix(reporter/base): string diff - issue #1241 + * fix(reporter/base): string diff - issue #1241 + * fix(reporter/base): don't show diffs for errors without expectation + * fix(reporter/base): don't assume error message is first line of stack + * improve: dry up reporter/base test + * fix(reporter/base): explicitly ignore showDiff #1614 + * Add iojs to travis build + * Pass `--allow-natives-syntax` flag to node. + * Support --harmony_classes flag for io.js + * Fix 1556: Update utils.clean to handle newlines in func declarations + * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers + * Fix 1585: make _mocha executable again + * chore(package.json): add a8m as a contributor + * Fixed broken link on html-cov reporter + * support --es_staging flag + * fix issue where menu overlaps content. + * update contributors in package.json + * Remove trailing whitespace from reporter output + * Remove contributors list from readme + * log third-party reporter errors + * [Fix] Exclude not own properties when looping on options + * fix: support node args in mocha.opts (close #1573) + * fix(reporter/base): string diff - issue #1241 + 2.2.1 / 2015-03-09 ================== diff --git a/bower.json b/bower.json index 0c711c5c5f..8040675934 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.2", + "version": "2.2.3", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index 165acc685d..4a35c8ef60 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.2", + "version": "2.2.3", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index f8deb1078d..2b71c1df71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.2", + "version": "2.2.3", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 3a718587115a8578c1d0a283bbe214d09a35831b Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Wed, 8 Apr 2015 02:33:46 -0500 Subject: [PATCH 0249/1771] Load mocha.opts in _mocha for now (close #1645) --- bin/_mocha | 25 +++++++++++++++---------- bin/mocha | 24 ++++-------------------- bin/options.js | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 bin/options.js diff --git a/bin/_mocha b/bin/_mocha index e0e50a6f9b..5b3c0c5b29 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -4,16 +4,17 @@ * Module dependencies. */ -var program = require('commander') - , path = require('path') - , fs = require('fs') - , resolve = path.resolve - , exists = fs.existsSync || path.existsSync - , Mocha = require('../') - , utils = Mocha.utils - , join = path.join - , cwd = process.cwd() - , mocha = new Mocha; +var program = require('commander'), + path = require('path'), + fs = require('fs'), + resolve = path.resolve, + exists = fs.existsSync || path.existsSync, + Mocha = require('../'), + utils = Mocha.utils, + join = path.join, + cwd = process.cwd(), + getOptions = require('./options'), + mocha = new Mocha; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -175,6 +176,10 @@ program.on('require', function(mod){ requires.push(mod); }); +// load mocha.opts into process.argv + +getOptions(); + // parse args program.parse(process.argv); diff --git a/bin/mocha b/bin/mocha index a88de85792..daa8fd910b 100755 --- a/bin/mocha +++ b/bin/mocha @@ -8,28 +8,12 @@ var spawn = require('child_process').spawn, path = require('path'), fs = require('fs'), - args = [path.join(__dirname, '_mocha')]; + args = [path.join(__dirname, '_mocha')], + getOptions = require('./options'); -// --opts +// load mocha.opts into process.argv -var optsPath = process.argv.indexOf('--opts') !== -1 - ? process.argv[process.argv.indexOf('--opts') + 1] - : 'test/mocha.opts'; - -try { - var opts = fs.readFileSync(optsPath, 'utf8') - .trim() - .split(/\s+/) - .filter(function(value) { - return value ? true : false; - }); - - process.argv = process.argv - .slice(0, 2) - .concat(opts.concat(process.argv.slice(2))); -} catch (err) { - // ignore -} +getOptions(); process.argv.slice(2).forEach(function(arg){ var flag = arg.split('=')[0]; diff --git a/bin/options.js b/bin/options.js new file mode 100644 index 0000000000..3b31798b8d --- /dev/null +++ b/bin/options.js @@ -0,0 +1,36 @@ +/** + * Dependencies. + */ + +var fs = require('fs'); + +/** + * Export `getOptions`. + */ + +module.exports = getOptions; + +/** + * Get options. + */ + +function getOptions() { + var optsPath = process.argv.indexOf('--opts') !== -1 + ? process.argv[process.argv.indexOf('--opts') + 1] + : 'test/mocha.opts'; + + try { + var opts = fs.readFileSync(optsPath, 'utf8') + .trim() + .split(/\s+/) + .filter(function(value) { + return value ? true : false; + }); + + process.argv = process.argv + .slice(0, 2) + .concat(opts.concat(process.argv.slice(2))); + } catch (err) { + // ignore + } +} From f9fad1bf64c97ea82d3210c604a502c5ac662927 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Wed, 8 Apr 2015 02:34:05 -0500 Subject: [PATCH 0250/1771] Release 2.2.4 --- HISTORY.md | 5 +++++ bower.json | 2 +- component.json | 2 +- package.json | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index cb3a8cad97..305bfd1edf 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,9 @@ +2.2.4 / 2015-04-08 +================== + + * Load mocha.opts in _mocha for now (close #1645) + 2.2.3 / 2015-04-07 ================== diff --git a/bower.json b/bower.json index 8040675934..dec090f19d 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.3", + "version": "2.2.4", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index 4a35c8ef60..a280cb60cc 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.3", + "version": "2.2.4", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index 2b71c1df71..83118a3306 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.3", + "version": "2.2.4", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From d55221bc967f62d1d8dd4cd8ce4c550c15eba57f Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Tue, 14 Apr 2015 20:55:58 +0300 Subject: [PATCH 0251/1771] fix(reporter/base): issue #1241 --- lib/reporters/base.js | 6 ++++-- lib/utils.js | 11 +++++++++++ test/reporters/base.js | 33 ++++++++++++++++++--------------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index bec43e58f5..fac16f3b24 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -190,8 +190,10 @@ exports.list = function(failures){ && expected !== undefined) { escape = false; - err.actual = actual = utils.stringify(actual); - err.expected = expected = utils.stringify(expected); + if (!(utils.isString(actual) && utils.isString(expected))) { + err.actual = actual = utils.stringify(actual); + err.expected = expected = utils.stringify(expected); + } fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); var match = message.match(/^([^:]+): expected/); diff --git a/lib/utils.js b/lib/utils.js index 3650a707cc..12c4ea6850 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -46,6 +46,17 @@ exports.forEach = function(arr, fn, scope){ fn.call(scope, arr[i], i); }; +/** + * Test if the given obj is type of string + * + * @param {Object} obj + * @returns Boolean + */ + +exports.isString = function(obj) { + return 'string' === typeof obj; +}; + /** * Array#map (<=IE8) * diff --git a/test/reporters/base.js b/test/reporters/base.js index b5de60b3f2..527697971c 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -88,24 +88,27 @@ describe('Base reporter', function () { }); - it('should show string diff as raw data', function () { - var err = new Error('test'), - errOut; - - err.actual = 'foo\nbar'; - err.expected = 'foo\nbaz'; - err.showDiff = true; - var test = makeTest(err); + describe('Getting two strings', function() { + // Fix regression V1.2.1(see: issue #1241) + it('should show strings diff as is', function () { + var err = new Error('test'), + errOut; + + err.actual = 'foo\nbar'; + err.expected = 'foo\nbaz'; + err.showDiff = true; + var test = makeTest(err); - Base.list([test]); + Base.list([test]); - errOut = stdout.join('\n'); + errOut = stdout.join('\n'); - errOut.should.match(/"foo\\nbar"/); - errOut.should.match(/"foo\\nbaz"/); - errOut.should.match(/test/); - errOut.should.match(/actual/); - errOut.should.match(/expected/); + errOut.should.not.match(/"foo\\nbar"/); + errOut.should.match(/foo/).and.match(/bar/); + errOut.should.match(/test/); + errOut.should.match(/actual/); + errOut.should.match(/expected/); + }); }); it('should stringify objects', function () { From ac13adf0149f1cb5e353abec02f5c35746130b86 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sat, 18 Apr 2015 18:07:24 +0300 Subject: [PATCH 0252/1771] fix(utils/stringify): fix issue #1660 Use toString for invalid date object --- lib/utils.js | 5 ++++- test/acceptance/utils.js | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 3650a707cc..7e44edf28a 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -444,7 +444,10 @@ function jsonStringify(object, spaces, depth) { : val.toString(); break; case 'date': - val = '[Date: ' + val.toISOString() + ']'; + var sDate = isNaN(val.getTime()) // Invalid date + ? val.toString() + : val.toISOString(); + val = '[Date: ' + sDate + ']'; break; case 'buffer': var json = val.toJSON(); diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index 6b373a45e3..e67250b6d1 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -89,6 +89,10 @@ describe('lib/utils', function () { stringify(date).should.equal('[Date: ' + date.toISOString() + ']'); }); + it('should return invalid Date object with .toString() + string prefix', function() { + stringify(new Date('')).should.equal('[Date: ' + new Date('').toString() + ']'); + }); + describe('#Number', function() { it('should show the handle -0 situations', function() { stringify(-0).should.eql('-0'); From 68ba3b24acb980939c5310c8daf38a96721a7008 Mon Sep 17 00:00:00 2001 From: Sune Simonsen Date: Sun, 7 Sep 2014 12:54:20 +0200 Subject: [PATCH 0253/1771] Split message and stack into two separate variables This refactoring is to first step towards supporting error.htmlMessage. We restructured the code to have a variable for the error message and the error stack. This will allow us to use error.htmlMessage instead of error.message as the message displayed to the user. The next commit will take advantage of this separation. --- lib/reporters/html.js | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index aec2af0d39..af383c9b65 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -136,23 +136,28 @@ function HTML(runner) { var el = fragment('
    • %e

    • ', test.title); } else { var el = fragment('
    • %e

    • ', test.title, self.testURL(test)); - var str = test.err.stack || test.err.toString(); - - // FF / Opera do not add the message - if (!~str.indexOf(test.err.message)) { - str = test.err.message + '\n' + str; - } + var stackString, // Note: Includes leading newline + message = test.err.toString(); // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we // check for the result of the stringifying. - if ('[object Error]' == str) str = test.err.message; - - // Safari doesn't give you a stack. Let's at least provide a source line. - if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { - str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + if ('[object Error]' === message) message = test.err.message; + + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; + } else { + stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); + } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; } - el.appendChild(fragment('
      %e
      ', str)); + stackString = stackString || ''; + + el.appendChild(fragment('
      %e%e
      ', message, stackString)); } // toggle code From a93f9fe8120d46a7c5d9b12741eab9eaaef1ec87 Mon Sep 17 00:00:00 2001 From: Sune Simonsen Date: Sun, 7 Sep 2014 20:56:20 +0200 Subject: [PATCH 0254/1771] Handling of error.htmlMessage in the HTML reporter If an error has a htmlMessage property it will be inserted verbatim into the DOM. That gives assertion libraries complete control over the formatting of the error message shown by the HTML test runner. --- lib/reporters/html.js | 8 +++++++- mocha.css | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index af383c9b65..40ec685096 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -157,7 +157,13 @@ function HTML(runner) { stackString = stackString || ''; - el.appendChild(fragment('
      %e%e
      ', message, stackString)); + if (test.err.htmlMessage && stackString) { + el.appendChild(fragment('
      %s\n
      %e
      ', test.err.htmlMessage, stackString)); + } else if (test.err.htmlMessage) { + el.appendChild(fragment('
      %s
      ', test.err.htmlMessage)); + } else { + el.appendChild(fragment('
      %e%e
      ', message, stackString)); + } } // toggle code diff --git a/mocha.css b/mocha.css index 42b9798fa4..3b82ae915c 100644 --- a/mocha.css +++ b/mocha.css @@ -136,6 +136,41 @@ body { overflow: auto; } +#mocha .test .html-error { + overflow: auto; + color: black; + line-height: 1.5; + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: calc(100% - 42px); /*(2)*/ + max-height: 300px; + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-border-radius: 3px; + -moz-box-shadow: 0 1px 3px #eee; + border-radius: 3px; +} + +#mocha .test .html-error pre.error { + border: none; + -webkit-border-radius: none; + -webkit-box-shadow: none; + -moz-border-radius: none; + -moz-box-shadow: none; + padding: 0; + margin: 0; + margin-top: 18px; + max-height: none; +} + /** * (1): approximate for browsers not supporting calc * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) From 69e3ba6e68817a9f04a82defb446d05fbde56288 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 29 Apr 2015 01:23:57 -0700 Subject: [PATCH 0255/1771] Add integration tests --- Makefile | 60 +------- test.js | 9 ++ test/acceptance/diffs.js | 93 ------------ test/acceptance/failing/timeout.js | 17 --- test/acceptance/misc/asyncOnly.js | 9 -- test/acceptance/misc/bail.js | 20 --- test/acceptance/misc/cascade.js | 57 ------- test/acceptance/misc/grep.js | 21 --- test/acceptance/multiple.done.js | 23 --- test/acceptance/pending.js | 41 ----- test/acceptance/uncaught.js | 16 -- test/delay/delay.js | 19 --- test/integration/diffs.js | 45 ++++++ test/integration/fixtures/cascade.js | 57 +++++++ .../fixtures/diffs/diffs.css.in} | 0 .../fixtures/diffs/diffs.css.out} | 0 test/integration/fixtures/diffs/diffs.js | 84 +++++++++++ test/integration/fixtures/diffs/output | 91 +++++++++++ test/integration/fixtures/multiple.done.js | 18 +++ .../fixtures/options/async-only.async.js | 3 + .../fixtures/options/async-only.sync.js | 1 + test/integration/fixtures/options/bail.js | 25 +++ test/integration/fixtures/options/delay.js | 19 +++ test/integration/fixtures/options/grep.js | 12 ++ .../fixtures/options/sort.alpha.js} | 0 .../fixtures/options/sort.beta.js} | 0 .../fixtures/pending/skip.sync.before.js | 13 ++ .../fixtures/pending/skip.sync.beforeEach.js | 13 ++ .../fixtures/pending/skip.sync.spec.js | 10 ++ test/integration/fixtures/pending/spec.js | 3 + .../fixtures/regression/issue-1327.js | 11 ++ test/integration/fixtures/timeout.js | 17 +++ test/integration/fixtures/uncaught.hook.js | 15 ++ .../fixtures/uncaught.js} | 0 test/integration/helpers.js | 142 ++++++++++++++++++ test/integration/hooks.js | 44 ++++++ test/integration/multiple.done.js | 28 ++++ test/integration/options.js | 140 +++++++++++++++++ test/integration/pending.js | 63 ++++++++ test/integration/regression.js | 22 +++ test/integration/timeout.js | 18 +++ test/integration/uncaught.js | 37 +++++ test/jsapi/index.js | 1 - test/regression/issue1327/case.js | 14 -- test/regression/issue1327/control.js | 10 -- 45 files changed, 944 insertions(+), 397 deletions(-) create mode 100644 test.js delete mode 100644 test/acceptance/diffs.js delete mode 100644 test/acceptance/failing/timeout.js delete mode 100644 test/acceptance/misc/asyncOnly.js delete mode 100644 test/acceptance/misc/bail.js delete mode 100644 test/acceptance/misc/cascade.js delete mode 100644 test/acceptance/misc/grep.js delete mode 100644 test/acceptance/multiple.done.js delete mode 100644 test/acceptance/pending.js delete mode 100644 test/acceptance/uncaught.js delete mode 100644 test/delay/delay.js create mode 100644 test/integration/diffs.js create mode 100644 test/integration/fixtures/cascade.js rename test/{acceptance/fixtures/css.in => integration/fixtures/diffs/diffs.css.in} (100%) rename test/{acceptance/fixtures/css.out => integration/fixtures/diffs/diffs.css.out} (100%) create mode 100644 test/integration/fixtures/diffs/diffs.js create mode 100644 test/integration/fixtures/diffs/output create mode 100644 test/integration/fixtures/multiple.done.js create mode 100644 test/integration/fixtures/options/async-only.async.js create mode 100644 test/integration/fixtures/options/async-only.sync.js create mode 100644 test/integration/fixtures/options/bail.js create mode 100644 test/integration/fixtures/options/delay.js create mode 100644 test/integration/fixtures/options/grep.js rename test/{acceptance/sort/alpha.js => integration/fixtures/options/sort.alpha.js} (100%) rename test/{acceptance/sort/beta.js => integration/fixtures/options/sort.beta.js} (100%) create mode 100644 test/integration/fixtures/pending/skip.sync.before.js create mode 100644 test/integration/fixtures/pending/skip.sync.beforeEach.js create mode 100644 test/integration/fixtures/pending/skip.sync.spec.js create mode 100644 test/integration/fixtures/pending/spec.js create mode 100644 test/integration/fixtures/regression/issue-1327.js create mode 100644 test/integration/fixtures/timeout.js create mode 100644 test/integration/fixtures/uncaught.hook.js rename test/{acceptance/failing/uncaught-and-async.js => integration/fixtures/uncaught.js} (100%) create mode 100644 test/integration/helpers.js create mode 100644 test/integration/hooks.js create mode 100644 test/integration/multiple.done.js create mode 100644 test/integration/options.js create mode 100644 test/integration/pending.js create mode 100644 test/integration/regression.js create mode 100644 test/integration/timeout.js create mode 100644 test/integration/uncaught.js delete mode 100644 test/regression/issue1327/case.js delete mode 100644 test/regression/issue1327/control.js diff --git a/Makefile b/Makefile index 6afdbac32c..cde16486a1 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ lib-cov: test: test-unit -test-all: test-bdd test-tdd test-qunit test-exports test-unit test-grep test-jsapi test-compilers test-sort test-glob test-requires test-reporters test-only test-failing test-regression +test-all: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-jsapi: @node test/jsapi @@ -48,25 +48,10 @@ test-unit: --growl \ test/*.js -test-regression: test-outputs/issue1327/case-out.json +test-integration: @./bin/mocha \ --reporter $(REPORTER) \ - test/regression/issue*/control.js - -test-outputs/issue1327/case-out.json: test/regression/issue1327/case.js - @mkdir -p $(dir $@) || true - @./bin/mocha --reporter json $< > $@ || true - -test-failing: - ./bin/mocha \ - --reporter $(REPORTER) \ - test/acceptance/failing > /dev/null 2>&1 ; \ - failures="$$?" ; \ - if [ "$$failures" != '4' ] ; then \ - echo 'test-failing:' ; \ - echo " expected 4 failing tests but saw $$failures" ; \ - exit 1 ; \ - fi + test/integration/*.js test-compilers: @./bin/mocha \ @@ -109,31 +94,6 @@ test-exports: --ui exports \ test/acceptance/interfaces/exports -test-grep: - @./bin/mocha \ - --reporter $(REPORTER) \ - --grep fast \ - test/acceptance/misc/grep - -test-invert: - @./bin/mocha \ - --reporter $(REPORTER) \ - --grep slow \ - --invert \ - test/acceptance/misc/grep - -test-bail: - @./bin/mocha \ - --reporter $(REPORTER) \ - --bail \ - test/acceptance/misc/bail - -test-async-only: - @./bin/mocha \ - --reporter $(REPORTER) \ - --async-only \ - test/acceptance/misc/asyncOnly - test-glob: @./test/acceptance/glob/glob.sh @@ -142,12 +102,6 @@ test-reporters: --reporter $(REPORTER) \ test/reporters/*.js -test-delay: - @./bin/mocha \ - --reporter $(REPORTER) \ - --delay \ - test/delay/*.js - test-only: @./bin/mocha \ --reporter $(REPORTER) \ @@ -164,12 +118,6 @@ test-only: --ui qunit \ test/acceptance/misc/only/qunit -test-sort: - @./bin/mocha \ - --reporter $(REPORTER) \ - --sort \ - test/acceptance/sort - test-mocha: @./bin/mocha \ --reporter $(REPORTER) \ @@ -200,4 +148,4 @@ non-tty: tm: @open editors/$(TM_BUNDLE) -.PHONY: test-cov test-jsapi test-compilers watch test test-all test-bdd test-tdd test-qunit test-exports test-unit non-tty test-grep test-failing tm clean +.PHONY: test-cov test-jsapi test-compilers watch test test-all test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean diff --git a/test.js b/test.js new file mode 100644 index 0000000000..47de23e5e6 --- /dev/null +++ b/test.js @@ -0,0 +1,9 @@ +function usedToBeAsync (cb) { + cb() +} + +it('test', function() { + this.timeout(4294967296); + usedToBeAsync(done) +}); + diff --git a/test/acceptance/diffs.js b/test/acceptance/diffs.js deleted file mode 100644 index c87ffe0cce..0000000000 --- a/test/acceptance/diffs.js +++ /dev/null @@ -1,93 +0,0 @@ -var fs = require('fs') - , cssin = fs.readFileSync('test/acceptance/fixtures/css.in', 'ascii') - , cssout = fs.readFileSync('test/acceptance/fixtures/css.out', 'ascii'); - -describe('diffs', function(){ - // uncomment the assertions, and run with different params to check the output - // ex: --color, --no-color, --unified-diff - - it('should display a diff for small strings', function(){ - var expected = 'foo bar baz' - , actual = 'foo rar baz'; - - // expected.should.eql(actual); - }); - - it('should display a diff of canonicalized objects', function(){ - var actual = { name: 'travis j', age: 23 } - , expected = { age: 23, name: 'travis' }; - - // actual.should.eql(expected); - }); - - it('should display a diff for medium strings', function(){ - var expected = 'foo bar baz\nfoo bar baz\nfoo bar baz' - , actual = 'foo bar baz\nfoo rar baz\nfoo bar raz'; - - // expected.should.eql(actual); - }); - - it('should display a diff for entire object dumps', function(){ - var expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }} - , actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }}; - - // actual.should.eql(expected); - }); - - it('should display a diff for multi-line strings', function(){ - var expected = 'one two three\nfour five six\nseven eight nine'; - var actual = 'one two three\nfour zzzz six\nseven eight nine'; - - // actual.should.eql(expected); - }); - - it('should display a diff for entire object dumps', function(){ - var expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }} - var actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }}; - - // actual.should.eql(expected); - }); - - it('should display a full-comparison with escaped special characters', function(){ - var expected = 'one\ttab\ntwo\t\ttabs'; - var actual = 'one\ttab\ntwo\t\t\ttabs'; - - //actual.should.equal(expected); - }); - - it('should display a word diff for large strings', function(){ - // cssin.should.equal(cssout); - }); - - it('should work with objects', function(){ - var tobi = { - name: 'tobi', - species: 'ferret', - color: 'white', - age: 2 - }; - - var loki = { - name: 'loki', - species: 'ferret', - color: 'brown', - age: 2 - }; - - // tobi.should.eql(loki); - }); - - it('should show value diffs and not be affected by commas', function(){ - var obj1 = { a: 123 }; - var obj2 = { a: 123, b: 456 }; - - // obj1.should.equal(obj2); - }); - - it('should display diff by data and not like an objects', function(){ - var buf1 = new Buffer([0x01]); - var buf2 = new Buffer([0x02]); - -// buf1.should.equal(buf2); - }); -}); diff --git a/test/acceptance/failing/timeout.js b/test/acceptance/failing/timeout.js deleted file mode 100644 index e52dde4c24..0000000000 --- a/test/acceptance/failing/timeout.js +++ /dev/null @@ -1,17 +0,0 @@ -describe('timeout', function(){ - this.timeout(1); - - it('should be honored with sync suites', function(){ - sleep(2); - }); - - it('should be honored with async suites', function(done){ - sleep(2); - done(); - }); - - function sleep(ms){ - var start = Date.now(); - while(start + ms > Date.now())continue; - } -}); diff --git a/test/acceptance/misc/asyncOnly.js b/test/acceptance/misc/asyncOnly.js deleted file mode 100644 index 7b7086a7ea..0000000000 --- a/test/acceptance/misc/asyncOnly.js +++ /dev/null @@ -1,9 +0,0 @@ -describe('asyncOnly', function(){ - it('should display an error', function(){ - - }) - - it('should pass', function(done){ - done(); - }) -}) diff --git a/test/acceptance/misc/bail.js b/test/acceptance/misc/bail.js deleted file mode 100644 index a2c0c1396f..0000000000 --- a/test/acceptance/misc/bail.js +++ /dev/null @@ -1,20 +0,0 @@ -describe('bail', function(){ - it('should only display this error', function(done){ - throw new Error('this should be displayed'); - }) - - it('should not display this error', function(done){ - throw new Error('this should not be displayed'); - }) -}) - -describe('bail-2', function(){ - - before(function(done){ - throw new Error('this hook should not be displayed'); - }) - - it('should not display this error', function(done){ - throw new Error('this should not be displayed'); - }) -}) diff --git a/test/acceptance/misc/cascade.js b/test/acceptance/misc/cascade.js deleted file mode 100644 index b2dda4df11..0000000000 --- a/test/acceptance/misc/cascade.js +++ /dev/null @@ -1,57 +0,0 @@ -describe('one', function(){ - before(function(){ - console.log('before one'); - }) - - after(function(){ - console.log('after one'); - }) - - beforeEach(function(){ - console.log(' before each one'); - }) - - afterEach(function(){ - console.log(' after each one'); - }) - - describe('two', function(){ - before(function(){ - console.log(' before two'); - }) - - after(function(){ - console.log(' after two'); - }) - - beforeEach(function(){ - console.log(' before each two'); - }) - - afterEach(function(){ - console.log(' after each two'); - }) - - describe('three', function(){ - before(function(){ - console.log(' before three'); - }) - - after(function(){ - console.log(' after three'); - }) - - beforeEach(function(){ - console.log(' before each three'); - }) - - afterEach(function(){ - console.log(' after each three'); - }) - - it('should three', function(){ - console.log(' TEST three'); - }) - }) - }) -}) diff --git a/test/acceptance/misc/grep.js b/test/acceptance/misc/grep.js deleted file mode 100644 index ec9f78f3cd..0000000000 --- a/test/acceptance/misc/grep.js +++ /dev/null @@ -1,21 +0,0 @@ -describe('grep', function(){ - describe('fast', function(){ - it('should run fast', function(){ - - }) - - it('should run fast again', function(){ - - }) - }) - - describe('slow', function(){ - it('should run slow', function(done){ - setTimeout(done, 1000); - }) - - it('should run slow again', function(done){ - setTimeout(done, 1000); - }) - }) -}) diff --git a/test/acceptance/multiple.done.js b/test/acceptance/multiple.done.js deleted file mode 100644 index 79874995f5..0000000000 --- a/test/acceptance/multiple.done.js +++ /dev/null @@ -1,23 +0,0 @@ -describe('multiple calls to done()', function(){ - beforeEach(function(done){ - done() - // uncomment - // done() - }) - - it('should fail in a test-case', function(done){ - process.nextTick(function(){ - done(); - // uncomment - // done(); - }); - }) - - it('should produce a reasonable trace', function (done) { - process.nextTick(function() { - done(); - // uncomment - // done() - }) - }); -}) diff --git a/test/acceptance/pending.js b/test/acceptance/pending.js deleted file mode 100644 index b40b3c03ed..0000000000 --- a/test/acceptance/pending.js +++ /dev/null @@ -1,41 +0,0 @@ -describe('pending', function(){ - it('should be allowed') -}) - -describe('skip in test', function(){ - it('should skip immediately', function(){ - this.skip(); - throw new Error('never thrown'); - }) - - it('should run other tests in the suite', function(){ - }) -}) - -describe('skip in before', function(){ - before(function(){ - this.skip(); - }) - - it('should never run this test', function(){ - throw new Error('never thrown'); - }) - - it('should never run this test', function(){ - throw new Error('never thrown'); - }) -}) - -describe('skip in beforeEach', function(){ - beforeEach(function(){ - this.skip(); - }) - - it('should never run this test', function(){ - throw new Error('never thrown'); - }) - - it('should never run this test', function(){ - throw new Error('never thrown'); - }) -}) diff --git a/test/acceptance/uncaught.js b/test/acceptance/uncaught.js deleted file mode 100644 index f228266e45..0000000000 --- a/test/acceptance/uncaught.js +++ /dev/null @@ -1,16 +0,0 @@ -describe('uncaught', function(){ - beforeEach(function(done){ - process.nextTick(function(){ - // throw new Error('oh noes'); - done(); - }); - }) - - it('should report properly', function(done){ - process.nextTick(function(){ - // if you uncomment this :) - // throw new Error("I'm uncaught!"); - done(); - }) - }) -}) diff --git a/test/delay/delay.js b/test/delay/delay.js deleted file mode 100644 index ce74db51f8..0000000000 --- a/test/delay/delay.js +++ /dev/null @@ -1,19 +0,0 @@ -var MS = 500, - start = new Date().getTime(); - -setTimeout(function () { - describe('delayed execution', function () { - it('should have waited ' + MS + 'ms to run this suite', function () { - (new Date().getTime() - MS >= start).should.be.true; - }); - - it('should have no effect if attempted twice in the same suite', - function () { - true.should.be.true; - run(); - true.should.be.true; - }); - }); - run(); - -}, MS); diff --git a/test/integration/diffs.js b/test/integration/diffs.js new file mode 100644 index 0000000000..d8aebba964 --- /dev/null +++ b/test/integration/diffs.js @@ -0,0 +1,45 @@ +var assert = require('assert'); +var helpers = require('./helpers'); +var run = helpers.runMocha; +var fs = require('fs'); +var getDiffs = helpers.getDiffs; + +function getExpectedOutput() { + var output = fs.readFileSync('test/integration/fixtures/diffs/output', 'UTF8'); + + // Diffs are delimited in file by "// DIFF" + return output.split(/\s*\/\/ DIFF/).slice(1).map(function(diff) { + return diff.split('\n').filter(Boolean).join('\n'); + }); +} + +describe('diffs', function() { + var diffs, expected; + this.timeout(1000); + + before(function(done) { + run('diffs/diffs.js', ['-C'], function(err, res) { + expected = getExpectedOutput(); + diffs = getDiffs(res.output); + done(err); + }); + }); + + [ + 'should display a diff for small strings', + 'should display a diff of canonicalized objects', + 'should display a diff for medium strings', + 'should display a diff for entire object dumps', + 'should display a diff for multi-line strings', + 'should display a diff for entire object dumps', + 'should display a full-comparison with escaped special characters', + 'should display a word diff for large strings', + 'should work with objects', + 'should show value diffs and not be affected by commas', + 'should display diff by data and not like an objects' + ].forEach(function(title, i) { + it(title, function() { + assert.equal(diffs[i], expected[i]); + }); + }); +}); diff --git a/test/integration/fixtures/cascade.js b/test/integration/fixtures/cascade.js new file mode 100644 index 0000000000..10b1c37ffd --- /dev/null +++ b/test/integration/fixtures/cascade.js @@ -0,0 +1,57 @@ +describe('one', function() { + before(function() { + console.log('before one'); + }); + + after(function() { + console.log('after one'); + }); + + beforeEach(function() { + console.log(' before each one'); + }); + + afterEach(function() { + console.log(' after each one'); + }); + + describe('two', function() { + before(function() { + console.log(' before two'); + }); + + after(function() { + console.log(' after two'); + }); + + beforeEach(function() { + console.log(' before each two'); + }); + + afterEach(function() { + console.log(' after each two'); + }); + + describe('three', function() { + before(function() { + console.log(' before three'); + }); + + after(function() { + console.log(' after three'); + }); + + beforeEach(function() { + console.log(' before each three'); + }); + + afterEach(function() { + console.log(' after each three'); + }); + + it('should three', function() { + console.log(' TEST three'); + }); + }); + }); +}); diff --git a/test/acceptance/fixtures/css.in b/test/integration/fixtures/diffs/diffs.css.in similarity index 100% rename from test/acceptance/fixtures/css.in rename to test/integration/fixtures/diffs/diffs.css.in diff --git a/test/acceptance/fixtures/css.out b/test/integration/fixtures/diffs/diffs.css.out similarity index 100% rename from test/acceptance/fixtures/css.out rename to test/integration/fixtures/diffs/diffs.css.out diff --git a/test/integration/fixtures/diffs/diffs.js b/test/integration/fixtures/diffs/diffs.js new file mode 100644 index 0000000000..cf538fd777 --- /dev/null +++ b/test/integration/fixtures/diffs/diffs.js @@ -0,0 +1,84 @@ +var fs = require('fs'); +var assert = require('assert'); +var cssin = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.in', 'ascii'); +var cssout = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.out', 'ascii'); + +describe('diffs', function() { + var actual, expected; + + it('should display a diff for small strings', function() { + actual = 'foo rar baz'; + expected = 'foo bar baz'; + actual.should.equal(expected); + }); + + it('should display a diff of canonicalized objects', function() { + actual = { name: 'travis j', age: 23 }; + expected = { age: 23, name: 'travis' }; + actual.should.equal(expected); + }); + + it('should display a diff for medium strings', function() { + actual = 'foo bar baz\nfoo rar baz\nfoo bar raz'; + expected = 'foo bar baz\nfoo bar baz\nfoo bar baz'; + actual.should.equal(expected); + }); + + it('should display a diff for entire object dumps', function() { + actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }}; + expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }}; + actual.should.equal(expected); + }); + + it('should display a diff for multi-line strings', function() { + actual = 'one two three\nfour zzzz six\nseven eight nine'; + expected = 'one two three\nfour five six\nseven eight nine'; + actual.should.equal(expected); + }); + + it('should display a diff for entire object dumps', function() { + actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }}; + expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }} + actual.should.equal(expected); + }); + + it('should display a full-comparison with escaped special characters', function() { + actual = 'one\ttab\ntwo\t\t\ttabs'; + expected = 'one\ttab\ntwo\t\ttabs'; + actual.should.equal(expected); + }); + + it('should display a word diff for large strings', function() { + cssin.should.equal(cssout); + }); + + it('should work with objects', function() { + actual = { + name: 'tobi', + species: 'ferret', + color: 'white', + age: 2 + }; + + expected = { + name: 'loki', + species: 'ferret', + color: 'brown', + age: 2 + }; + + actual.should.eql(expected); + }); + + it('should show value diffs and not be affected by commas', function() { + actual = { a: 123 }; + expected = { a: 123, b: 456 }; + actual.should.equal(expected); + }); + + it('should display diff by data and not like an objects', function() { + actual = new Buffer([0x01]); + expected = new Buffer([0x02]); + actual.should.equal(expected); + }); +}); diff --git a/test/integration/fixtures/diffs/output b/test/integration/fixtures/diffs/output new file mode 100644 index 0000000000..480daca213 --- /dev/null +++ b/test/integration/fixtures/diffs/output @@ -0,0 +1,91 @@ +// DIFF + +foo bar baz + -foo rar baz + +// DIFF + { + "age": 23 + + "name": "travis" + - "name": "travis j" + } + +// DIFF + foo bar baz + +foo bar baz + +foo bar baz + -foo rar baz + -foo bar raz + +// DIFF + { + "address": { + "city": "new york" + + "country": "us" + - "country": "usa" + } + "age": 30 + + "name": "joe" + - "name": "joel" + } + +// DIFF + one two three + +four five six + -four zzzz six + seven eight nine + +// DIFF + { + "address": { + "city": "new york" + + "country": "us" + - "country": "usa" + } + "age": 30 + + "name": "joe" + - "name": "joel" + } + +// DIFF + one tab + +two tabs + -two tabs + +// DIFF + body { + font: "Helvetica Neue", Helvetica, arial, sans-serif; + background: black; + + color: #fff; + - color: white; + } + + a { + + color: blue; + - color: blue + } + + + +foo { + + bar: 'baz'; + +} + +// DIFF + { + "age": 2 + + "color": "brown" + + "name": "loki" + - "color": "white" + - "name": "tobi" + "species": "ferret" + } + +// DIFF + { + "a": 123 + + "b": 456 + } + +// DIFF + [ + + 2 + - 1 + ] diff --git a/test/integration/fixtures/multiple.done.js b/test/integration/fixtures/multiple.done.js new file mode 100644 index 0000000000..63a704061c --- /dev/null +++ b/test/integration/fixtures/multiple.done.js @@ -0,0 +1,18 @@ +// The suite below should result in an additional error, but does +// not. Uncomment once this bug is resolved. + +// describe('suite', function() { +// beforeEach(function(done) { +// done(); +// done(); +// }); + +// it('test', function() {}); +// }); + +it('should fail in a test-case', function(done) { + process.nextTick(function(){ + done(); + done(); + }); +}); diff --git a/test/integration/fixtures/options/async-only.async.js b/test/integration/fixtures/options/async-only.async.js new file mode 100644 index 0000000000..5387d169b7 --- /dev/null +++ b/test/integration/fixtures/options/async-only.async.js @@ -0,0 +1,3 @@ +it('should pass', function(done){ + done(); +}); diff --git a/test/integration/fixtures/options/async-only.sync.js b/test/integration/fixtures/options/async-only.sync.js new file mode 100644 index 0000000000..d0dd9fa828 --- /dev/null +++ b/test/integration/fixtures/options/async-only.sync.js @@ -0,0 +1 @@ +it('throws an error', function() {}); diff --git a/test/integration/fixtures/options/bail.js b/test/integration/fixtures/options/bail.js new file mode 100644 index 0000000000..bb8ad13da4 --- /dev/null +++ b/test/integration/fixtures/options/bail.js @@ -0,0 +1,25 @@ +describe('suite1', function() { + it('should display this spec', function() {}); + + it('should only display this error', function(done) { + throw new Error('this should be displayed'); + }); + + it('should not display this error', function(done) { + throw new Error('this should not be displayed'); + }); +}); + +describe('suite2', function() { + // TODO: When uncommented, the hook below is ran and throws an exception + // despite the previous failure with the bail flag. This is a bug. Uncomment + // once resolved + + // before(function(done) { + // throw new Error('this hook should not be displayed'); + // }); + + it('should not display this error', function(done) { + throw new Error('this should not be displayed'); + }); +}); diff --git a/test/integration/fixtures/options/delay.js b/test/integration/fixtures/options/delay.js new file mode 100644 index 0000000000..32b8f99383 --- /dev/null +++ b/test/integration/fixtures/options/delay.js @@ -0,0 +1,19 @@ +var assert = require('assert'); +var delay = 500; +var start = new Date().getTime(); + +setTimeout(function() { + describe('delayed execution', function() { + it('should have waited ' + delay + 'ms to run this suite', function() { + assert(new Date().getTime() - delay >= start); + }); + + it('should have no effect if attempted twice in the same suite', function() { + assert(true); + run(); + assert(true); + }); + }); + + run(); +}, delay); diff --git a/test/integration/fixtures/options/grep.js b/test/integration/fixtures/options/grep.js new file mode 100644 index 0000000000..5e163f5ee7 --- /dev/null +++ b/test/integration/fixtures/options/grep.js @@ -0,0 +1,12 @@ +describe('grep', function() { + describe('match', function() { + it('should run', function(){}); + it('should also run', function() {}); + }); + + describe('fail', function(){ + it('should not be ran', function() { + throw new Error('Spec should not run'); + }); + }); +}); diff --git a/test/acceptance/sort/alpha.js b/test/integration/fixtures/options/sort.alpha.js similarity index 100% rename from test/acceptance/sort/alpha.js rename to test/integration/fixtures/options/sort.alpha.js diff --git a/test/acceptance/sort/beta.js b/test/integration/fixtures/options/sort.beta.js similarity index 100% rename from test/acceptance/sort/beta.js rename to test/integration/fixtures/options/sort.beta.js diff --git a/test/integration/fixtures/pending/skip.sync.before.js b/test/integration/fixtures/pending/skip.sync.before.js new file mode 100644 index 0000000000..35152e27f4 --- /dev/null +++ b/test/integration/fixtures/pending/skip.sync.before.js @@ -0,0 +1,13 @@ +describe('skip in before', function() { + before(function() { + this.skip(); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); +}); diff --git a/test/integration/fixtures/pending/skip.sync.beforeEach.js b/test/integration/fixtures/pending/skip.sync.beforeEach.js new file mode 100644 index 0000000000..8d1c442ce2 --- /dev/null +++ b/test/integration/fixtures/pending/skip.sync.beforeEach.js @@ -0,0 +1,13 @@ +describe('skip in beforeEach', function() { + beforeEach(function() { + this.skip(); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); +}); diff --git a/test/integration/fixtures/pending/skip.sync.spec.js b/test/integration/fixtures/pending/skip.sync.spec.js new file mode 100644 index 0000000000..e2bbb739b3 --- /dev/null +++ b/test/integration/fixtures/pending/skip.sync.spec.js @@ -0,0 +1,10 @@ +describe('skip in test', function() { + it('should skip immediately', function() { + this.skip(); + throw new Error('never thrown'); + }); + + it('should run other tests in the suite', function() { + // Do nothing + }); +}); diff --git a/test/integration/fixtures/pending/spec.js b/test/integration/fixtures/pending/spec.js new file mode 100644 index 0000000000..084dd33588 --- /dev/null +++ b/test/integration/fixtures/pending/spec.js @@ -0,0 +1,3 @@ +describe('suite', function() { + it('pending spec'); +}); diff --git a/test/integration/fixtures/regression/issue-1327.js b/test/integration/fixtures/regression/issue-1327.js new file mode 100644 index 0000000000..5739edb465 --- /dev/null +++ b/test/integration/fixtures/regression/issue-1327.js @@ -0,0 +1,11 @@ +it('test 1', function() { + process.nextTick(function() { + throw 'Too bad'; + }); +}); + +it('test 2', function() {}); + +it('test 3', function() { + throw new Error('OUCH'); +}); diff --git a/test/integration/fixtures/timeout.js b/test/integration/fixtures/timeout.js new file mode 100644 index 0000000000..d8c99b2bc3 --- /dev/null +++ b/test/integration/fixtures/timeout.js @@ -0,0 +1,17 @@ +describe('timeout', function(){ + this.timeout(1); + + it('should be honored with sync suites', function() { + sleep(2); + }); + + it('should be honored with async suites', function(done) { + sleep(2); + done(); + }); + + function sleep(ms) { + var start = Date.now(); + while (start + ms > Date.now()); + } +}); diff --git a/test/integration/fixtures/uncaught.hook.js b/test/integration/fixtures/uncaught.hook.js new file mode 100644 index 0000000000..9adcb3f726 --- /dev/null +++ b/test/integration/fixtures/uncaught.hook.js @@ -0,0 +1,15 @@ +describe('uncaught', function() { + beforeEach(function(done) { + process.nextTick(function() { + throw new Error('oh noes'); + done(); + }); + }); + + it('test', function(done) { + process.nextTick(function() { + throw new Error("I'm uncaught!"); + done(); + }); + }); +}); diff --git a/test/acceptance/failing/uncaught-and-async.js b/test/integration/fixtures/uncaught.js similarity index 100% rename from test/acceptance/failing/uncaught-and-async.js rename to test/integration/fixtures/uncaught.js diff --git a/test/integration/helpers.js b/test/integration/helpers.js new file mode 100644 index 0000000000..eea8b185fb --- /dev/null +++ b/test/integration/helpers.js @@ -0,0 +1,142 @@ +var spawn = require('child_process').spawn; +var path = require('path'); + +module.exports = { + /** + * Invokes the mocha binary for the given fixture with color output disabled. + * Accepts an array of additional command line args to pass. The callback is + * invoked with a summary of the run, in addition to its output. The summary + * includes the number of passing, pending, and failing tests, as well as the + * exit code. Useful for testing different reporters. + * + * Example response: + * { + * pending: 0, + * passing: 0, + * failing: 1, + * code: 1, + * output: '...' + * } + * + * @param {string} fixturePath + * @param {array} args + * @param {function} fn + */ + runMocha: function(fixturePath, args, fn) { + var path; + + path = resolveFixturePath(fixturePath); + args = args || []; + + invokeMocha(args.concat(['-C', path]), function(err, res) { + if (err) return fn(err); + + fn(null, getSummary(res)); + }); + }, + + /** + * Invokes the mocha binary for the given fixture using the JSON reporter, + * returning the parsed output, as well as exit code. + * + * @param {string} fixturePath + * @param {array} args + * @param {function} fn + */ + runMochaJSON: function(fixturePath, args, fn) { + var path; + + path = resolveFixturePath(fixturePath); + args = args || []; + + invokeMocha(args.concat(['--reporter', 'json', path]), function(err, res) { + if (err) return fn(err); + + try { + var result = JSON.parse(res.output); + result.code = res.code; + } catch (err) { + return fn(err); + } + + fn(null, result); + }); + }, + + /** + * Returns an array of diffs corresponding to exceptions thrown from specs, + * given the plaintext output (-C) of a mocha run. + * + * @param {string} output + * returns {string[]} + */ + getDiffs: function(output) { + var diffs, i, inDiff, inStackTrace; + + diffs = []; + output.split('\n').forEach(function(line) { + if (line.match(/^ \d+\)/)) { + // New spec, e.g. "1) spec title" + diffs.push([]); + i = diffs.length - 1; + inStackTrace = false; + inDiff = false; + } else if (!diffs.length || inStackTrace) { + // Haven't encountered a spec yet + // or we're in the middle of a stack trace + return; + } else if (line.indexOf('+ expected - actual') !== -1) { + inDiff = true; + } else if (line.match(/at Context/)) { + // At the start of a stack trace + inStackTrace = true; + inDiff = false; + } else if (inDiff) { + diffs[i].push(line); + } + }); + + // Ignore empty lines before/after diff + return diffs.map(function(diff) { + return diff.slice(1, -1).join('\n'); + }); + } +}; + +function invokeMocha(args, fn) { + var output, mocha, listener; + + output = ''; + mocha = spawn('./bin/mocha', args); + + listener = function(data) { + output += data; + }; + + mocha.stdout.on('data', listener); + mocha.stderr.on('data', listener); + mocha.on('error', fn); + + mocha.on('close', function(code) { + fn(null, { + output: output.split('\n').join('\n'), + code: code + }); + }); +} + +function resolveFixturePath(fixture) { + return path.join('./test/integration/fixtures', fixture); +} + +function getSummary(res) { + return ['passing', 'pending', 'failing'].reduce(function(summary, type) { + var pattern, match; + + pattern = new RegExp(' (\\d+) ' + type + '\\s'); + match = pattern.exec(res.output); + summary[type] = (match) ? parseInt(match, 10) : 0; + + return summary; + }, res); +} diff --git a/test/integration/hooks.js b/test/integration/hooks.js new file mode 100644 index 0000000000..4236c7f82d --- /dev/null +++ b/test/integration/hooks.js @@ -0,0 +1,44 @@ +var assert = require('assert'); +var run = require('./helpers').runMocha; +var args = []; + +describe('hooks', function() { + this.timeout(1000); + + it('are ran in correct order', function(done) { + run('cascade.js', args, function(err, res) { + var lines, expected; + + assert(!err); + + lines = res.output.split(/[\n․]+/).map(function(line) { + return line.trim(); + }).filter(function(line) { + return line.length; + }).slice(0, -1); + + expected = [ + 'before one', + 'before two', + 'before three', + 'before each one', + 'before each two', + 'before each three', + 'TEST three', + 'after each three', + 'after each two', + 'after each one', + 'after three', + 'after two', + 'after one' + ]; + + expected.forEach(function(line, i) { + assert.equal(lines[i], line); + }); + + assert.equal(res.code, 0); + done(); + }); + }); +}); diff --git a/test/integration/multiple.done.js b/test/integration/multiple.done.js new file mode 100644 index 0000000000..8f9a3cdbce --- /dev/null +++ b/test/integration/multiple.done.js @@ -0,0 +1,28 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; +var args = []; + +describe('multiple calls to done()', function() { + var res; + + this.timeout(1000); + + before(function(done) { + run('multiple.done.js', args, function(err, result) { + res = result; + done(err); + }); + }); + + it('results in failures', function() { + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + }); + + it('throws a descriptive error', function() { + assert.equal(res.failures[0].err.message, + 'done() called multiple times'); + }); +}); diff --git a/test/integration/options.js b/test/integration/options.js new file mode 100644 index 0000000000..db3710913b --- /dev/null +++ b/test/integration/options.js @@ -0,0 +1,140 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; +var args = []; + +describe('options', function() { + this.timeout(2000); + + describe('--async-only', function() { + + before(function() { + args = ['--async-only']; + }); + + it('should fail synchronous specs', function(done) { + run('options/async-only.sync.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 1); + + assert.equal(res.failures[0].title, 'throws an error'); + assert.equal(res.code, 1); + done(); + }); + }); + + it('should allow asynchronous specs', function(done) { + run('options/async-only.async.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 0); + + assert.equal(res.passes[0].title, 'should pass'); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('--bail', function() { + before(function() { + args = ['--bail']; + }); + + it('should stop after the first error', function(done) { + run('options/bail.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 1); + + assert.equal(res.passes[0].title, 'should display this spec'); + assert.equal(res.failures[0].title, 'should only display this error'); + assert.equal(res.code, 1); + done(); + }); + }); + }); + + describe('--sort', function() { + before(function() { + args = ['--sort']; + }); + + it('should sort tests in alphabetical order', function(done) { + run('options/sort*', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 0); + + assert.equal(res.passes[0].fullTitle, + 'alpha should be executed first'); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('--delay', function() { + before(function() { + args = ['--delay']; + }); + + it('should run the generated test suite', function(done) { + run('options/delay.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 0); + + assert.equal(res.passes[0].title, + 'should have waited 500ms to run this suite'); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('--grep', function() { + it('runs specs matching a string', function(done) { + args = ['--grep', 'match']; + run('options/grep.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + + it('runs specs matching a RegExp', function(done) { + args = ['--grep', '.*']; + run('options/grep.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + done(); + }); + }); + + describe('with --invert', function() { + it('runs specs that do not match the pattern', function(done) { + args = ['--grep', 'fail', '--invert']; + run('options/grep.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + }); +}); diff --git a/test/integration/pending.js b/test/integration/pending.js new file mode 100644 index 0000000000..01ebbdf6eb --- /dev/null +++ b/test/integration/pending.js @@ -0,0 +1,63 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; +var args = []; + +describe('pending', function() { + describe('pending specs', function() { + this.timeout(1000); + + it('should be created by omitting a function', function(done) { + run('pending/spec.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 1); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('synchronous skip()', function() { + this.timeout(1000); + + describe('in spec', function() { + it('should immediately skip the spec and run all others', function(done) { + run('pending/skip.sync.spec.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 1); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('in before', function() { + it('should skip all suite specs', function(done) { + run('pending/skip.sync.before.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 2); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('in beforeEach', function() { + it('should skip all suite specs', function(done) { + run('pending/skip.sync.beforeEach.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 2); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + }); +}); diff --git a/test/integration/regression.js b/test/integration/regression.js new file mode 100644 index 0000000000..494176da6a --- /dev/null +++ b/test/integration/regression.js @@ -0,0 +1,22 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; + +describe('regressions', function() { + this.timeout(1000); + + it('issue-1327: should run all 3 specs exactly once', function(done) { + var args = []; + run('regression/issue-1327.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 1); + + assert.equal(res.passes[0].title, 'test 1'); + assert.equal(res.passes[1].title, 'test 2'); + assert.equal(res.failures[0].title, 'test 3'); + assert.equal(res.code, 1); + done(); + }); + }); +}); diff --git a/test/integration/timeout.js b/test/integration/timeout.js new file mode 100644 index 0000000000..9f0985c09d --- /dev/null +++ b/test/integration/timeout.js @@ -0,0 +1,18 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; +var args = []; + +describe('this.timeout()', function() { + this.timeout(1000); + + it('is respected by sync and async suites', function(done) { + run('timeout.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 2); + assert.equal(res.code, 2); + done(); + }); + }); +}); diff --git a/test/integration/uncaught.js b/test/integration/uncaught.js new file mode 100644 index 0000000000..cddc52b1ea --- /dev/null +++ b/test/integration/uncaught.js @@ -0,0 +1,37 @@ +var assert = require('assert'); +var run = require('./helpers').runMochaJSON; +var args = []; + +describe('uncaught exceptions', function() { + this.timeout(1000); + + it('handles uncaught exceptions from hooks', function(done) { + run('uncaught.hook.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 1); + + assert.equal(res.failures[0].fullTitle, + 'uncaught "before each" hook'); + assert.equal(res.code, 1); + done(); + }); + }); + + it('handles uncaught exceptions from async specs', function(done) { + run('uncaught.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 2); + + assert.equal(res.failures[0].title, + 'fails exactly once when a global error is thrown first'); + assert.equal(res.failures[1].title, + 'fails exactly once when a global error is thrown second'); + assert.equal(res.code, 2); + done(); + }); + }); +}); diff --git a/test/jsapi/index.js b/test/jsapi/index.js index 2dcdd6dc68..2dbbcb0469 100644 --- a/test/jsapi/index.js +++ b/test/jsapi/index.js @@ -20,7 +20,6 @@ mocha.addFile('test/hook.async.js'); mocha.addFile('test/acceptance/duration.js'); mocha.addFile('test/acceptance/fs.js'); mocha.addFile('test/acceptance/globals.js'); -mocha.addFile('test/acceptance/pending.js'); mocha.addFile('test/acceptance/timeout.js'); mocha.run(function(){ diff --git a/test/regression/issue1327/case.js b/test/regression/issue1327/case.js deleted file mode 100644 index 295ec12413..0000000000 --- a/test/regression/issue1327/case.js +++ /dev/null @@ -1,14 +0,0 @@ -var debug = require('debug')('mocha:issue1327'); -it("test 1", function() { - debug("This runs only once."); - process.nextTick(function() { - throw "Too bad"; - }); -}); -it("test 2", function() { - debug("This should run once - Previously wasn't called at all."); -}); -it("test 3", function() { - debug("This used to run twice."); - throw new Error("OUCH"); -}); diff --git a/test/regression/issue1327/control.js b/test/regression/issue1327/control.js deleted file mode 100644 index b77555da02..0000000000 --- a/test/regression/issue1327/control.js +++ /dev/null @@ -1,10 +0,0 @@ -var assert = require("assert"), - fs = require("fs"); - -describe("GitHub issue #1327: expected behavior of case.js", function() { - it("should have run 3 tests", function() { - var results = JSON.parse(fs.readFileSync( - "test-outputs/issue1327/case-out.json")); - results.stats.tests.should.equal(3); - }); -}); From 30bef55b021524fdab6e13ded5e9e49f3c0c2ca0 Mon Sep 17 00:00:00 2001 From: Kyle Mitchell Date: Tue, 5 May 2015 00:12:20 +0000 Subject: [PATCH 0256/1771] use a valid SPDX license identifier --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 83118a3306..20c93f594f 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "Ariel Mashraki ", "Pawel Kozlowski " ], + "license": "MIT", "repository": { "type": "git", "url": "git://github.com/mochajs/mocha.git" From 6ee3fb50755a6b55e8204e7eef01d989f1cc5868 Mon Sep 17 00:00:00 2001 From: James Nylen Date: Wed, 8 Apr 2015 14:17:21 -0500 Subject: [PATCH 0257/1771] Fix diff colors --- lib/reporters/base.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index bec43e58f5..4048ec2559 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -66,8 +66,8 @@ exports.colors = { , 'green': 32 , 'light': 90 , 'diff gutter': 90 - , 'diff added': 42 - , 'diff removed': 41 + , 'diff added': 32 + , 'diff removed': 31 }; /** From c9d0235fca85f9b77e22647f5f11da45e4ef72fb Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Tue, 5 May 2015 22:14:08 -0700 Subject: [PATCH 0258/1771] Sanity check: update fixtures/regression/issue-1327.js to be closer to orig test --- .../fixtures/regression/issue-1327.js | 6 +++++- test/integration/regression.js | 16 +++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/test/integration/fixtures/regression/issue-1327.js b/test/integration/fixtures/regression/issue-1327.js index 5739edb465..43d5553762 100644 --- a/test/integration/fixtures/regression/issue-1327.js +++ b/test/integration/fixtures/regression/issue-1327.js @@ -1,11 +1,15 @@ it('test 1', function() { + console.log('testbody1'); process.nextTick(function() { throw 'Too bad'; }); }); -it('test 2', function() {}); +it('test 2', function() { + console.log('testbody2'); +}); it('test 3', function() { + console.log('testbody3'); throw new Error('OUCH'); }); diff --git a/test/integration/regression.js b/test/integration/regression.js index 494176da6a..564e922110 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var run = require('./helpers').runMochaJSON; +var run = require('./helpers').runMocha; describe('regressions', function() { this.timeout(1000); @@ -7,14 +7,16 @@ describe('regressions', function() { it('issue-1327: should run all 3 specs exactly once', function(done) { var args = []; run('regression/issue-1327.js', args, function(err, res) { + var occurences = function(str) { + var pattern = new RegExp(str, 'g'); + return (res.output.match(pattern) || []).length; + }; + assert(!err); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 1); + assert.equal(occurences('testbody1'), 1); + assert.equal(occurences('testbody2'), 1); + assert.equal(occurences('testbody3'), 1); - assert.equal(res.passes[0].title, 'test 1'); - assert.equal(res.passes[1].title, 'test 2'); - assert.equal(res.failures[0].title, 'test 3'); assert.equal(res.code, 1); done(); }); From f4d754b991332a2745f5e59a56db5f5f6e46a518 Mon Sep 17 00:00:00 2001 From: Jonathan Delgado Date: Wed, 6 May 2015 14:00:24 -0700 Subject: [PATCH 0259/1771] Update json-stream.js --- lib/reporters/json-stream.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js index f7c05a89c2..8fd91ce72c 100644 --- a/lib/reporters/json-stream.js +++ b/lib/reporters/json-stream.js @@ -36,6 +36,7 @@ function List(runner) { runner.on('fail', function(test, err){ test = clean(test); test.err = err.message; + test.stack = err.stack || null; console.log(JSON.stringify(['fail', test])); }); From b8ed82c70c995e5581cd9126fcea0d7bbeb085a9 Mon Sep 17 00:00:00 2001 From: Jake Marsh Date: Mon, 11 May 2015 17:20:40 -0400 Subject: [PATCH 0260/1771] fix 'location is not defined' error --- lib/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index c1393a9c62..95623c21bf 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -647,7 +647,7 @@ exports.stackTraceFilter = function() { : { browser: true } , cwd = is.node ? process.cwd() + slash - : location.href.replace(/\/[^\/]*$/, '/'); + : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); function isNodeModule (line) { return (~line.indexOf('node_modules')); From 9a0794a6eb41248a2ba81995c7871919e82f50c4 Mon Sep 17 00:00:00 2001 From: James Nylen Date: Wed, 13 May 2015 11:44:15 -0500 Subject: [PATCH 0261/1771] Upgrade jsdiff to v1.4.0 The new version of jsdiff reverses the + and - diff line order to the standard order used by git, diff, etc. Tests updated accordingly. --- package.json | 2 +- test/integration/fixtures/diffs/output | 30 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 20c93f594f..552e3f1aa2 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "dependencies": { "commander": "2.3.0", "debug": "2.0.0", - "diff": "1.0.8", + "diff": "1.4.0", "escape-string-regexp": "1.0.2", "glob": "3.2.3", "growl": "1.8.1", diff --git a/test/integration/fixtures/diffs/output b/test/integration/fixtures/diffs/output index 480daca213..bf56a96397 100644 --- a/test/integration/fixtures/diffs/output +++ b/test/integration/fixtures/diffs/output @@ -1,67 +1,67 @@ // DIFF - +foo bar baz -foo rar baz + +foo bar baz // DIFF { "age": 23 - + "name": "travis" - "name": "travis j" + + "name": "travis" } // DIFF foo bar baz - +foo bar baz - +foo bar baz -foo rar baz -foo bar raz + +foo bar baz + +foo bar baz // DIFF { "address": { "city": "new york" - + "country": "us" - "country": "usa" + + "country": "us" } "age": 30 - + "name": "joe" - "name": "joel" + + "name": "joe" } // DIFF one two three - +four five six -four zzzz six + +four five six seven eight nine // DIFF { "address": { "city": "new york" - + "country": "us" - "country": "usa" + + "country": "us" } "age": 30 - + "name": "joe" - "name": "joel" + + "name": "joe" } // DIFF one tab - +two tabs -two tabs + +two tabs // DIFF body { font: "Helvetica Neue", Helvetica, arial, sans-serif; background: black; - + color: #fff; - color: white; + + color: #fff; } a { - + color: blue; - color: blue + + color: blue; } + +foo { @@ -71,10 +71,10 @@ // DIFF { "age": 2 - + "color": "brown" - + "name": "loki" - "color": "white" - "name": "tobi" + + "color": "brown" + + "name": "loki" "species": "ferret" } @@ -86,6 +86,6 @@ // DIFF [ - + 2 - 1 + + 2 ] From ebe9ceab96fc1a05d4c89b13c23824b94b01ec43 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Thu, 14 May 2015 16:18:43 -0500 Subject: [PATCH 0262/1771] Release 2.2.5 --- HISTORY.md | 18 ++++++++++++++++++ bower.json | 2 +- component.json | 2 +- package.json | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 305bfd1edf..9f7db2314e 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,22 @@ +2.2.5 / 2015-05-14 +================== + + * Merge pull request #1699 from nylen/upgrade/jsdiff + * Upgrade jsdiff to v1.4.0 + * Merge pull request #1648 from nylen/fix/diff-colors + * Merge pull request #1686 from danielstjules/1327-regression + * Sanity check: update fixtures/regression/issue-1327.js to be closer to orig test + * Fix diff colors + * Merge pull request #1675 from danielstjules/integration-tests + * Merge pull request #1682 from kemitchell/spdx-license + * use a valid SPDX license identifier + * Add integration tests + * Merge pull request #1655 from a8m/fix-issue-1241 + * Merge pull request #1661 from a8m/fix-issue-1660 + * fix(utils/stringify): fix issue #1660 + * fix(reporter/base): issue #1241 + 2.2.4 / 2015-04-08 ================== diff --git a/bower.json b/bower.json index dec090f19d..f03b076d09 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.4", + "version": "2.2.5", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ diff --git a/component.json b/component.json index a280cb60cc..5da3daa25e 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.4", + "version": "2.2.5", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index 552e3f1aa2..28e16ffd42 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.4", + "version": "2.2.5", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From b823e890b7f9ec2a4d82c3a49651574dec72cfe4 Mon Sep 17 00:00:00 2001 From: slyg Date: Sun, 31 May 2015 09:28:15 +0200 Subject: [PATCH 0263/1771] Add support of --harmony_arrow_functions V8 option --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 5b3c0c5b29..aa999a28c3 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -88,6 +88,7 @@ program .option('--harmony-proxies', 'enable harmony proxies') .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)') .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)') + .option('--harmony_rest_parameters', 'enable "harmony rest parameters" (iojs)') .option('--harmony_proxies', 'enable "harmony proxies" (iojs)') .option('--harmony_classes', 'enable "harmony classes" (iojs)') .option('--inline-diffs', 'display actual/expected differences inline within each string') diff --git a/bin/mocha b/bin/mocha index daa8fd910b..604a979f89 100755 --- a/bin/mocha +++ b/bin/mocha @@ -41,6 +41,7 @@ process.argv.slice(2).forEach(function(arg){ case '--harmony-generators': case '--harmony_shipping': case '--harmony_arrow_functions': + case '--harmony_rest_parameters': case '--harmony_proxies': case '--harmony_classes': case '--no-deprecation': From 81e02d7385a6d6d3b6b071947e83fd7a35e975dd Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Fri, 5 Jun 2015 11:40:30 +0200 Subject: [PATCH 0264/1771] Removes accidentally commited test.js Closes #1723 --- test.js | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test.js diff --git a/test.js b/test.js deleted file mode 100644 index 47de23e5e6..0000000000 --- a/test.js +++ /dev/null @@ -1,9 +0,0 @@ -function usedToBeAsync (cb) { - cb() -} - -it('test', function() { - this.timeout(4294967296); - usedToBeAsync(done) -}); - From 449e3d66202d051cd0ec65c382aa2a6df1281aaa Mon Sep 17 00:00:00 2001 From: Tomer Eskenazi Date: Tue, 2 Jun 2015 17:17:49 +0300 Subject: [PATCH 0265/1771] Site index - update mocha command flags Signed-off-by: Joshua Appelman Closes #1720 --- index.html | 14 ++++++++++++-- index.md | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 56c1cd6e01..f4837b8685 100644 --- a/index.html +++ b/index.html @@ -421,11 +421,22 @@

      mocha(1)

      --check-leaks check for global variable leaks --compilers <ext>:<module>,... use the given module(s) to compile files --debug-brk enable node's debugger breaking on the first line + --delay wait for async suite definition + --es_staging enable all staged features + --full-trace display the full stack trace --globals <names> allow the given comma-delimited global [names] + --harmony enable all harmony features (except typeof) + --harmony-collections enable harmony collections (sets, maps, and weak maps) + --harmony-generators enable harmony generators + --harmony-proxies enable harmony proxies + --harmony_arrow_functions enable "harmony arrow functions" (iojs) + --harmony_classes enable "harmony classes" (iojs) + --harmony_proxies enable "harmony proxies" (iojs) + --harmony_shipping enable all shipped harmony fetaures (iojs) --inline-diffs display actual/expected differences inline within each string --interfaces display available interfaces --no-deprecation silence deprecation warnings - --no-exit require a clean shutdown of the event loop: mocha will exit + --no-exit require a clean shutdown of the event loop: mocha will not call process.exit --no-timeouts disables timeouts, given implicitly with --debug --opts <path> specify opts path --prof log statistical profiling information @@ -435,7 +446,6 @@

      mocha(1)

      --trace trace function calls --trace-deprecation show stack traces on deprecations --watch-extensions <ext>,... additional extensions to monitor with --watch - --delay wait for async suite definition

      -w, --watch

      diff --git a/index.md b/index.md index 136bde0856..4f3fce5850 100644 --- a/index.md +++ b/index.md @@ -381,11 +381,22 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal --check-leaks check for global variable leaks --compilers :,... use the given module(s) to compile files --debug-brk enable node's debugger breaking on the first line + --delay wait for async suite definition + --es_staging enable all staged features + --full-trace display the full stack trace --globals allow the given comma-delimited global [names] + --harmony enable all harmony features (except typeof) + --harmony-collections enable harmony collections (sets, maps, and weak maps) + --harmony-generators enable harmony generators + --harmony-proxies enable harmony proxies + --harmony_arrow_functions enable "harmony arrow functions" (iojs) + --harmony_classes enable "harmony classes" (iojs) + --harmony_proxies enable "harmony proxies" (iojs) + --harmony_shipping enable all shipped harmony fetaures (iojs) --inline-diffs display actual/expected differences inline within each string --interfaces display available interfaces --no-deprecation silence deprecation warnings - --no-exit require a clean shutdown of the event loop: mocha will exit + --no-exit require a clean shutdown of the event loop: mocha will not call process.exit --no-timeouts disables timeouts, given implicitly with --debug --opts specify opts path --prof log statistical profiling information @@ -395,7 +406,6 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal --trace trace function calls --trace-deprecation show stack traces on deprecations --watch-extensions ,... additional extensions to monitor with --watch - --delay wait for async suite definition

      -w, --watch

      From 413753ff28475c4da36616891d357edaab993d8c Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Fri, 5 Jun 2015 12:05:05 +0200 Subject: [PATCH 0266/1771] Removes return statement irt #1700. This fixes #1700 and closes #1701. Thanks to: Edwin Shin [eddies]. --- lib/runnable.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/runnable.js b/lib/runnable.js index 6e4803fd7f..399c18db10 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -212,9 +212,6 @@ Runnable.prototype.run = function(fn){ if (self.timedOut) return; if (finished) return multiple(err || self._trace); - // Discard the resolution if this test has already failed asynchronously - if (self.state) return; - self.clearTimeout(); self.duration = new Date - start; finished = true; From f3c2a0a3e4faa0af6f02efce151b464c406e9467 Mon Sep 17 00:00:00 2001 From: Jeff Schilling Date: Sun, 1 Mar 2015 14:50:54 -0500 Subject: [PATCH 0267/1771] Prevent default browser behavior for failure/pass links Signed-off-by: Joshua Appelman Closes #1572 --- lib/reporters/html.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index aec2af0d39..4b6ac3ddea 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -29,8 +29,8 @@ exports = module.exports = HTML; var statsTemplate = ''; From 6a5a266eee61389bbbf2bab362222470abb7d62f Mon Sep 17 00:00:00 2001 From: Ryan Hubbard Date: Fri, 5 Jun 2015 14:21:17 -0400 Subject: [PATCH 0268/1771] removing duplicate flags adding additional iojs flags --- bin/mocha | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/bin/mocha b/bin/mocha index 6f5185579e..6f67e22426 100755 --- a/bin/mocha +++ b/bin/mocha @@ -36,17 +36,22 @@ process.argv.slice(2).forEach(function(arg){ case '--gc-global': case '--harmony': case '--es_staging': - case '--harmony-proxies': - case '--harmony_proxies': + case '--harmony_arrays': + case '--harmony_array_includes': + case '--harmony_arrow_functions': + case '--harmony_classes': case '--harmony-collections': case '--harmony_collections': case '--harmony-generators': case '--harmony_generators': + case '--harmony_modules': + case '--harmony-proxies': + case '--harmony_proxies': + case '--harmony_regexps': case '--harmony_shipping': - case '--harmony_arrow_functions': + case '--harmony_sloppy': case '--harmony_rest_parameters': - case '--harmony_proxies': - case '--harmony_classes': + case '--harmony_unicode': case '--no-deprecation': case '--prof': case '--throw-deprecation': From 832e03a8c1bc72ac1756f02b44249837fe14a6e5 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Wed, 10 Jun 2015 15:24:46 +0800 Subject: [PATCH 0269/1771] HISTORY: improve 2.2.5 changelog --- HISTORY.md | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 9f7db2314e..b46f833927 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,20 +2,28 @@ 2.2.5 / 2015-05-14 ================== - * Merge pull request #1699 from nylen/upgrade/jsdiff - * Upgrade jsdiff to v1.4.0 - * Merge pull request #1648 from nylen/fix/diff-colors - * Merge pull request #1686 from danielstjules/1327-regression - * Sanity check: update fixtures/regression/issue-1327.js to be closer to orig test - * Fix diff colors - * Merge pull request #1675 from danielstjules/integration-tests - * Merge pull request #1682 from kemitchell/spdx-license - * use a valid SPDX license identifier - * Add integration tests - * Merge pull request #1655 from a8m/fix-issue-1241 - * Merge pull request #1661 from a8m/fix-issue-1660 - * fix(utils/stringify): fix issue #1660 - * fix(reporter/base): issue #1241 + * [#1699] - Upgrade jsdiff to v1.4.0 ([@nylen]) + * [#1648] - fix diff background colors in the console ([@nylen]) + * [#1327] - fix tests running twice, a regression issue. ([#1686], [@danielstjules]) + * [#1675] - add integration tests ([@danielstjules]) + * [#1682] - use a valid SPDX license identifier in package.jsn ([@kemitchell]) + * [#1660] - fix assertion of invalid dates ([#1661], [@a8m]) + * [#1241] - fix issue with multiline diffs appearing as single line ([#1655], [@a8m]) + +[#1699]: https://github.com/mochajs/mocha/issues/1699 +[#1648]: https://github.com/mochajs/mocha/issues/1648 +[#1327]: https://github.com/mochajs/mocha/issues/1327 +[#1686]: https://github.com/mochajs/mocha/issues/1686 +[#1675]: https://github.com/mochajs/mocha/issues/1675 +[#1682]: https://github.com/mochajs/mocha/issues/1682 +[#1660]: https://github.com/mochajs/mocha/issues/1660 +[#1661]: https://github.com/mochajs/mocha/issues/1661 +[#1241]: https://github.com/mochajs/mocha/issues/1241 +[#1655]: https://github.com/mochajs/mocha/issues/1655 +[@nylen]: https://github.com/nylen +[@danielstjules]: https://github.com/danielstjules +[@kemitchell]: https://github.com/kemitchell +[@a8m]: https://github.com/a8m 2.2.4 / 2015-04-08 ================== From 82615a5b8459d799a7cd7d1495c8c5ff4b0b955a Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Wed, 10 Jun 2015 15:26:02 +0800 Subject: [PATCH 0270/1771] HISTORY: fix typo in 2.2.5 --- HISTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index b46f833927..8f949b2093 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -6,7 +6,7 @@ * [#1648] - fix diff background colors in the console ([@nylen]) * [#1327] - fix tests running twice, a regression issue. ([#1686], [@danielstjules]) * [#1675] - add integration tests ([@danielstjules]) - * [#1682] - use a valid SPDX license identifier in package.jsn ([@kemitchell]) + * [#1682] - use a valid SPDX license identifier in package.json ([@kemitchell]) * [#1660] - fix assertion of invalid dates ([#1661], [@a8m]) * [#1241] - fix issue with multiline diffs appearing as single line ([#1655], [@a8m]) From 38b54dd5b14fed06112affc888f6e3bbe0c76eed Mon Sep 17 00:00:00 2001 From: amsul Date: Wed, 10 Jun 2015 16:27:05 -0400 Subject: [PATCH 0271/1771] add note on allowUncaught method in the browser --- index.html | 6 ++++++ index.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/index.html b/index.html index f4837b8685..ddb594ad4d 100644 --- a/index.html +++ b/index.html @@ -859,6 +859,12 @@

      Browser-specific option(s)

      noHighlighting : If set to true, do not attempt to use syntax highlighting on output test code.

      +

      Browser-specific method(s)

      + +

      The following method(s) only function in a browser context:

      + +

      mocha.allowUncaught() : If called, uncaught errors will not be absorbed by the error handler.

      +

      mocha.opts

      Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

      diff --git a/index.md b/index.md index 4f3fce5850..870a1df2dc 100644 --- a/index.md +++ b/index.md @@ -807,6 +807,12 @@ Testing asynchronous code with Mocha could not be simpler! Simply invoke the cal `noHighlighting` : If set to `true`, do not attempt to use syntax highlighting on output test code. +

      Browser-specific method(s)

      + + The following method(s) only function in a browser context: + + `mocha.allowUncaught()` : If called, uncaught errors will not be absorbed by the error handler. +

      mocha.opts

      Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: From fcc85ff24a63adb71f6b402746353177aad3be42 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Wed, 10 Jun 2015 18:45:52 -0400 Subject: [PATCH 0272/1771] Remove moot `version` property from bower.json Per bower/bower.json-spec@a325da3 --- bower.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bower.json b/bower.json index f03b076d09..b21940fcbc 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,5 @@ { "name": "mocha", - "version": "2.2.5", "homepage": "http://mocha.github.io/mocha", "description": "simple, flexible, fun test framework", "authors": [ @@ -44,4 +43,4 @@ "tap" ], "license": "MIT" -} \ No newline at end of file +} From 8b382354c55cc0e0695e4fbcb6b32d05fbe073fc Mon Sep 17 00:00:00 2001 From: Gabriel Silk Date: Wed, 17 Jun 2015 10:55:28 -0700 Subject: [PATCH 0273/1771] Stop runner sending SIGINT to itself from within SIGINT handler --- bin/mocha | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/mocha b/bin/mocha index 6f67e22426..7d81333bc7 100755 --- a/bin/mocha +++ b/bin/mocha @@ -81,5 +81,4 @@ proc.on('exit', function (code, signal) { process.on('SIGINT', function () { proc.kill('SIGINT'); // calls runner.abort() proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. - process.kill(process.pid, 'SIGINT'); }); From 637941430d4af41682e3c44c8a9b3d4f6ae7cc67 Mon Sep 17 00:00:00 2001 From: Andreas Lind Date: Thu, 18 Jun 2015 10:45:50 +0200 Subject: [PATCH 0274/1771] _mocha: Allow boolean --reporter-options Previously "mocha --reporter-options foo" would blow up because an equal sign is required. This is quite unhandy for reporters that need to accept boolean (flag-ish) options. This commit changes that so that a value-less reporter option will be interpreted as having a value of true. This means that --reporter-options foo=bar,quux will turn into { foo: 'bar', quux: true } --- bin/_mocha | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index aa999a28c3..63ab9a42e5 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -195,10 +195,13 @@ var reporterOptions = {}; if (program.reporterOptions !== undefined) { program.reporterOptions.split(",").forEach(function(opt) { var L = opt.split("="); - if (L.length != 2) { + if (L.length > 2 || L.length === 0) { throw new Error("invalid reporter option '" + opt + "'"); + } else if (L.length === 2) { + reporterOptions[L[0]] = L[1]; + } else { + reporterOptions[L[0]] = true; } - reporterOptions[L[0]] = L[1]; }); } From 3fcca2e358fbbad1e6b6a9e7b919fab4ac24fb51 Mon Sep 17 00:00:00 2001 From: Johnathon Sanders Date: Fri, 19 Jun 2015 11:54:58 -0500 Subject: [PATCH 0275/1771] Add cross-frame compatible Error checking for fail --- lib/runner.js | 2 +- test/runner.js | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 3199dc921a..23ddaf23b4 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -202,7 +202,7 @@ Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; - if (!(err instanceof Error)) { + if (!(err instanceof Error || err && typeof err.message == 'string')) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } diff --git a/test/runner.js b/test/runner.js index a2ce512514..08a5ce3e78 100644 --- a/test/runner.js +++ b/test/runner.js @@ -229,7 +229,7 @@ describe('Runner', function(){ runner.fail(test, err); }) - it('should emit a the error when failed with an Error', function(done){ + it('should emit a the error when failed with an Error instance', function(done){ var test = {}, err = new Error('an error message'); runner.on('fail', function(test, err){ err.message.should.equal('an error message'); @@ -238,6 +238,15 @@ describe('Runner', function(){ runner.fail(test, err); }) + it('should emit the error when failed with an Error-like object', function(done){ + var test = {}, err = {message: 'an error message'}; + runner.on('fail', function(test, err){ + err.message.should.equal('an error message'); + done(); + }); + runner.fail(test, err); + }) + it('should emit a helpful message when failed with an Object', function(done){ var test = {}, err = { x: 1 }; runner.on('fail', function(test, err){ From d082a927c92359403a5fdefc667c8686aa232c9d Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Tue, 23 Jun 2015 11:08:27 -0700 Subject: [PATCH 0276/1771] Test undefined type identification. --- test/acceptance/utils.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index e67250b6d1..fa260bbfce 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -341,6 +341,7 @@ describe('lib/utils', function () { type(1).should.equal('number'); type(Infinity).should.equal('number'); type(null).should.equal('null'); + type(undefined).should.equal('undefined'); type(new Date()).should.equal('date'); type(/foo/).should.equal('regexp'); type('type').should.equal('string'); From 0d16e02585ad3061bbafeadb04ea3d10dfe1e47b Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Mon, 22 Jun 2015 15:38:55 -0700 Subject: [PATCH 0277/1771] Explicitly check `null` and `undefined` values in exports.type Some older JS engines, such as PhantomJS, return the `window` object instead of "[object Null]", as would be expected here. --- lib/utils.js | 6 +++++- test/acceptance/utils.js | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 5c292479b7..5eb2b92d10 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -372,7 +372,11 @@ var emptyRepresentation = function emptyRepresentation(value, type) { * @returns {string} */ exports.type = function type(value) { - if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { return 'buffer'; } return Object.prototype.toString.call(value) diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index fa260bbfce..8b861745c7 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -348,6 +348,26 @@ describe('lib/utils', function () { type(global).should.equal('global'); type(true).should.equal('boolean'); }); + + describe('when toString on null or undefined stringifies window', function () { + var toString = Object.prototype.toString; + + beforeEach(function () { + // some JS engines such as PhantomJS 1.x exhibit this behavior + Object.prototype.toString = function () { + return '[object DOMWindow]'; + }; + }); + + it('should recognize null and undefined', function () { + type(null).should.equal('null'); + type(undefined).should.equal('undefined'); + }); + + afterEach(function () { + Object.prototype.toString = toString; + }); + }); }); describe('lookupFiles', function () { From 28e0a4f9abfdae15841ce01c89e5c59224f6fc2d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 5 Apr 2015 16:47:03 -0700 Subject: [PATCH 0278/1771] update contributors --- .mailmap | 12 ++- package.json | 245 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 250 insertions(+), 7 deletions(-) diff --git a/.mailmap b/.mailmap index 704013125b..93ad1bff98 100644 --- a/.mailmap +++ b/.mailmap @@ -1 +1,11 @@ -TJ Holowaychuk \ No newline at end of file +TJ Holowaychuk +Travis Jeffery +Travis Jeffery Dr. Travis Jeffery +Christopher Hiller Christopher Hiller +David da Silva Contín David da Silva +David da Silva Contín David da Silva +Ariel Mashraki Ariel Mashraki +Ariel Mashraki Ariel Mashraki +Forbes Lindesay Forbes Lindesay +Ben Bradley Ben Bradley <[ben.bradley@cigna.com|mailto:ben.bradley@cigna.com]> +Glen Mailer Glen Mailer diff --git a/package.json b/package.json index 28e16ffd42..d5571824ce 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,247 @@ ], "author": "TJ Holowaychuk ", "contributors": [ - "Joshua Appelman ", - "Christoffer Hallas ", - "Christopher Hiller ", "Travis Jeffery ", - "Daniel St. Jules ", + "Christopher Hiller ", + "Joshua Appelman ", + "Guillermo Rauch ", "David da Silva Contín ", + "Daniel St. Jules ", "Ariel Mashraki ", - "Pawel Kozlowski " + "Attila Domokos ", + "John Firebaugh ", + "Nathan Rajlich ", + "Jo Liss ", + "Mike Pennisi ", + "Brendan Nee ", + "James Carr ", + "Ryunosuke SATO ", + "Aaron Heckmann ", + "Jonathan Ong ", + "Forbes Lindesay ", + "Raynos ", + "Xavier Antoviaque ", + "hokaccha ", + "Joshua Krall ", + "Domenic Denicola ", + "Glen Mailer ", + "Mathieu Desvé ", + "Cory Thomas ", + "Fredrik Enestad ", + "Ben Bradley ", + "Sindre Sorhus ", + "Jesse Dailey ", + "Ben Lindsey ", + "Maximilian Antoni ", + "Merrick Christensen ", + "Michael Demmer ", + "Tyson Tate ", + "Valentin Agachi ", + "Wil Moore III ", + "Benjie Gillam ", + "Nathan Bowser ", + "eiji.ienaga ", + "fool2fish ", + "Paul Miller ", + "Andreas Lind Petersen ", + "Timo Tijhof ", + "Nathan Alderson ", + "Ian Storm Taylor ", + "Arian Stolwijk ", + "Rico Sta. Cruz ", + "domenic ", + "Jacob Wejendorp ", + "fcrisci ", + "Simon Gaeremynck ", + "James Nylen ", + "Shawn Krisman ", + "Sean Lang ", + "David Henderson ", + "jsdevel ", + "Alexander Early ", + "Parker Moore ", + "Paul Armstrong ", + "monowerker ", + "Konstantin Käfer ", + "Justin DuJardin ", + "Juzer Ali ", + "Dominique Quatravaux ", + "Quang Van ", + "Quanlong He ", + "Vlad Magdalin ", + "Brian Beck ", + "Jonas Westerlund ", + "Michael Riley ", + "Buck Doyle ", + "FARKAS Máté ", + "Sune Simonsen ", + "Keith Cirkel ", + "Kent C. Dodds ", + "Kevin Conway ", + "Kevin Kirsche ", + "Kirill Korolyov ", + "Koen Punt ", + "Kyle Mitchell ", + "Laszlo Bacsi ", + "Liam Newman ", + "Linus Unnebäck ", + "László Bácsi ", + "Maciej Małecki ", + "Mal Graty ", + "Marc Kuo ", + "Marcello Bastea-Forte ", + "Martin Marko ", + "Matija Marohnić ", + "Matt Robenolt ", + "Matt Smith ", + "Matthew Shanley ", + "Mattias Tidlund ", + "Michael Jackson ", + "Michael Olson ", + "Michael Schoonmaker ", + "Michael Schoonmaker ", + "Michal Charemza ", + "Moshe Kolodny ", + "Nathan Black ", + "Nick Fitzgerald ", + "Nicolo Taddei ", + "Noshir Patel ", + "Panu Horsmalahti ", + "Pete Hawkins ", + "Pete Hawkins ", + "Phil Sung ", + "R56 ", + "Raynos <=>", + "Refael Ackermann ", + "Richard Dingwall ", + "Richard Knop ", + "Rob Wu ", + "Romain Prieto ", + "Roman Neuhauser ", + "Roman Shtylman ", + "Russ Bradberry ", + "Russell Munson ", + "Rustem Mustafin ", + "Ryan Hubbard ", + "Salehen Shovon Rahman ", + "Sam Mussell ", + "Sasha Koss ", + "Seiya Konno ", + "Shaine Hatch ", + "Simon Goumaz ", + "Standa Opichal ", + "Stephen Mathieson ", + "Steve Mason ", + "Stewart Taylor ", + "Tapiwa Kelvin ", + "Teddy Zeenny ", + "Tim Ehat ", + "Todd Agulnick ", + "Tom Coquereau ", + "Vadim Nikitin ", + "Victor Costan ", + "Will Langstroth ", + "Yanis Wang ", + "Yuest Wang ", + "Zsolt Takács ", + "abrkn ", + "airportyh ", + "badunk ", + "claudyus ", + "dasilvacontin ", + "fengmk2 ", + "gaye ", + "grasGendarme ", + "klaemo ", + "lakmeer ", + "lodr ", + "mrShturman ", + "nishigori ", + "omardelarosa ", + "qiuzuhui ", + "samuel goldszmidt ", + "sebv ", + "slyg ", + "startswithaj ", + "tgautier@yahoo.com ", + "traleig1 ", + "vlad ", + "yuitest ", + "zhiyelee ", + "Adam Crabtree ", + "Adam Gruber ", + "Andreas Brekken ", + "Andrew Nesbitt ", + "Andrey Popp <8mayday@gmail.com>", + "Andrii Shumada ", + "Anis Safine ", + "Arnaud Brousseau ", + "Atsuya Takagi ", + "Austin Birch ", + "Ben Noordhuis ", + "Benoît Zugmeyer ", + "Bjørge Næss ", + "Brian Lalor ", + "Brian M. Carlson ", + "Brian Moore ", + "Bryan Donovan ", + "C. Scott Ananian ", + "Casey Foster ", + "Chris Buckley ", + "ChrisWren ", + "Connor Dunn ", + "Corey Butler ", + "Daniel Stockman ", + "Dave McKenna ", + "Denis Bardadym ", + "Devin Weaver ", + "Di Wu ", + "Diogo Monteiro ", + "Dmitry Shirokov ", + "Dominic Barnes ", + "Douglas Christopher Wilson ", + "Fede Ramirez ", + "Fedor Indutny ", + "Florian Margaine ", + "Frederico Silva ", + "Fredrik Lindin ", + "Gareth Aye ", + "Gareth Murphy ", + "Gavin Mogan ", + "Giovanni Bassi ", + "Glen Huang ", + "Greg Perkins ", + "Harish ", + "Harry Brundage ", + "Herman Junge ", + "Ian Young ", + "Ian Zamojc ", + "Ivan ", + "JP Bochi ", + "Jaakko Salonen ", + "Jake Craige ", + "Jake Marsh ", + "Jakub Nešetřil ", + "James Bowes ", + "James Lal ", + "Jan Kopriva ", + "Jason Barry ", + "Javier Aranda ", + "Jean Ponchon ", + "Jeff Kunkle ", + "Jeff Schilling ", + "Jeremy Martin ", + "Jimmy Cuadra ", + "John Doty ", + "Johnathon Sanders ", + "Jonas Dohse ", + "Jonathan Creamer ", + "Jonathan Delgado ", + "Jonathan Park ", + "Jordan Sexton ", + "Jussi Virtanen ", + "Katie Gengler ", + "Kazuhito Hokamura " ], "license": "MIT", "repository": { @@ -72,4 +305,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} \ No newline at end of file +} From 42385648e953c9b008cf258102dedf26669c61cc Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Mon, 15 Jun 2015 21:18:01 -0700 Subject: [PATCH 0279/1771] Linting: Add linter Follows @boneskull's `make test` suggestion in https://github.com/mochajs/mocha/pull/1534#issuecomment-73151037 --- .eslintrc | 131 +++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 6 ++- bin/.eslintrc | 3 ++ package.json | 1 + test/.eslintrc | 3 ++ 5 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 .eslintrc create mode 100644 bin/.eslintrc create mode 100644 test/.eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..2e572a69ad --- /dev/null +++ b/.eslintrc @@ -0,0 +1,131 @@ +--- +env: + node: true + +rules: + brace-style: [2, 1tbs] + camelcase: 2 + comma-dangle: [2, never] + comma-spacing: [2, {before: false, after: true}] + comma-style: [2, last] + computed-property-spacing: [2, never] + consistent-return: 0 + consistent-this: [1, self] + curly: [2, all] + default-case: 2 + dot-location: [2, property] + dot-notation: [2, { allowKeywords: true }] + eol-last: 2 + eqeqeq: 2 + func-style: [2, declaration] + guard-for-in: 2 # TODO: Change to error + handle-callback-err: [2, ^(err|error)$] + indent: [2, 2] + key-spacing: [2, { beforeColon: false, afterColon: true }] + max-len: [0, 80, 2] # TODO: Change to error + max-params: [1, 4] + new-cap: 0 # TODO: Change to error + new-parens: 2 + no-alert: 2 + no-array-constructor: 0 + no-bitwise: 0 + no-caller: 2 + no-catch-shadow: 2 + no-cond-assign: [1, except-parens] # TODO: Change to error + no-console: 0 + no-constant-condition: 0 + no-control-regex: 2 + no-debugger: 1 + no-delete-var: 2 + no-dupe-args: 2 + no-dupe-keys: 2 + no-duplicate-case: 2 + no-else-return: 2 + no-empty: 2 + no-empty-character-class: 2 + no-eq-null: 0 + no-eval: 2 + no-ex-assign: 2 + no-extend-native: 2 + no-extra-bind: 2 + no-extra-boolean-cast: 2 + no-extra-semi: 2 + no-fallthrough: 2 + no-floating-decimal: 0 + no-func-assign: 2 + no-implied-eval: 2 + no-inner-declarations: [2, functions] + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-iterator: 2 + no-labels: 2 + no-lone-blocks: 2 + no-lonely-if: 2 + no-loop-func: 2 + no-mixed-requires: [0, false] + no-mixed-spaces-and-tabs: [2, false] + no-multi-spaces: 2 + no-multi-str: 2 + no-multiple-empty-lines: [2, { max: 1 }] + no-native-reassign: 2 + no-negated-in-lhs: 2 + no-nested-ternary: 2 + no-new: 2 + no-new-func: 2 + no-new-object: 2 + no-new-require: 2 + no-new-wrappers: 2 + no-obj-calls: 2 + no-octal: 2 + no-octal-escape: 2 + no-path-concat: 2 + no-process-exit: 2 + no-proto: 1 # TODO: Change to error + no-redeclare: 2 + no-regex-spaces: 2 + no-reserved-keys: 2 + no-return-assign: 2 + no-script-url: 2 + no-self-compare: 2 + no-sequences: 2 + no-shadow: 0 + no-shadow-restricted-names: 2 + no-spaced-func: 2 + no-sparse-arrays: 2 + no-trailing-spaces: 2 + no-undef: 2 + no-undef-init: 2 + no-underscore-dangle: 0 # TODO: Change to error + no-unneeded-ternary: 2 + no-unreachable: 2 + no-unused-expressions: 0 + no-unused-vars: [2, { vars: all, args: after-used }] + no-use-before-define: 0 + no-void: 2 + no-with: 2 + object-curly-spacing: [2, always] + one-var: [2, never] + operator-assignment: [2, always] + operator-linebreak: [2, before] + padded-blocks: [2, never] + quote-props: [2, as-needed] + quotes: [2, single, avoid-escape] + radix: 2 + semi: [2, always] + semi-spacing: [2, { before: false, after: true }] + space-after-keywords: [2, always] + space-before-blocks: [2, always] + space-before-function-paren: [2, never] + space-in-parens: [2, never] + space-infix-ops: 2 + space-return-throw-case: 2 + space-unary-ops: [2, { words: true, nonwords: false }] + spaced-line-comment: 2 + strict: [0, global] # TODO: Change to error + use-isnan: 2 + valid-jsdoc: [0, { requireReturn: false }] # TODO: Change to warning + valid-typeof: 2 + vars-on-top: 0 + wrap-iife: 2 + wrap-regex: 2 + yoda: [2, never] diff --git a/Makefile b/Makefile index cde16486a1..d359b3e79f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ +ESLINT := node_modules/.bin/eslint REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle SRC = $(shell find lib -name "*.js" -type f | sort) @@ -34,7 +35,10 @@ lib-cov: @rm -fr ./$@ @jscoverage lib $@ -test: test-unit +lint: + @$(ESLINT) --reset $(SRC) + +test: lint test-unit test-all: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only diff --git a/bin/.eslintrc b/bin/.eslintrc new file mode 100644 index 0000000000..db7424631c --- /dev/null +++ b/bin/.eslintrc @@ -0,0 +1,3 @@ +--- +rules: + no-process-exit: 0 diff --git a/package.json b/package.json index d5571824ce..b3ab7097cc 100644 --- a/package.json +++ b/package.json @@ -288,6 +288,7 @@ }, "devDependencies": { "coffee-script": "~1.8.0", + "eslint": "~0.23.0", "should": "~4.0.0" }, "files": [ diff --git a/test/.eslintrc b/test/.eslintrc new file mode 100644 index 0000000000..6db2a46c53 --- /dev/null +++ b/test/.eslintrc @@ -0,0 +1,3 @@ +--- +env: + mocha: true From 3f78f10ca40dba63be10454c8e17dc9586416e10 Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Tue, 16 Jun 2015 11:55:48 -0700 Subject: [PATCH 0280/1771] Linting: Compliance --- .eslintrc | 2 +- lib/browser/debug.js | 6 +- lib/browser/escape-string-regexp.js | 16 +- lib/browser/events.js | 68 +++-- lib/browser/progress.js | 82 +++--- lib/browser/tty.js | 9 +- lib/context.js | 58 ++-- lib/hook.js | 9 +- lib/interfaces/bdd.js | 47 ++-- lib/interfaces/common.js | 48 +++- lib/interfaces/exports.js | 14 +- lib/interfaces/qunit.js | 33 ++- lib/interfaces/tdd.js | 52 ++-- lib/mocha.js | 255 +++++++++-------- lib/ms.js | 67 +++-- lib/pending.js | 5 +- lib/reporters/base.js | 284 ++++++++++--------- lib/reporters/doc.js | 26 +- lib/reporters/dot.js | 38 +-- lib/reporters/html-cov.js | 44 +-- lib/reporters/html.js | 194 +++++++------ lib/reporters/json-cov.js | 80 +++--- lib/reporters/json-stream.js | 30 +- lib/reporters/json.js | 35 ++- lib/reporters/landing.js | 40 ++- lib/reporters/list.js | 26 +- lib/reporters/markdown.js | 37 ++- lib/reporters/min.js | 5 +- lib/reporters/nyan.js | 85 +++--- lib/reporters/progress.js | 39 ++- lib/reporters/spec.js | 41 +-- lib/reporters/tap.js | 34 +-- lib/reporters/xunit.js | 133 +++++---- lib/runnable.js | 195 +++++++------ lib/runner.js | 387 ++++++++++++++------------ lib/suite.js | 196 ++++++------- lib/template.html | 2 +- lib/test.js | 3 +- lib/utils.js | 410 +++++++++++++++------------- 39 files changed, 1665 insertions(+), 1470 deletions(-) diff --git a/.eslintrc b/.eslintrc index 2e572a69ad..a89b22b26a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,7 +14,7 @@ rules: curly: [2, all] default-case: 2 dot-location: [2, property] - dot-notation: [2, { allowKeywords: true }] + dot-notation: [2, { allowKeywords: true, allowPattern: "^long$" }] eol-last: 2 eqeqeq: 2 func-style: [2, declaration] diff --git a/lib/browser/debug.js b/lib/browser/debug.js index 0d939e5c07..ba232896df 100644 --- a/lib/browser/debug.js +++ b/lib/browser/debug.js @@ -1,4 +1,4 @@ -module.exports = function(type){ - return function(){ - } +/* eslint-disable no-unused-vars */ +module.exports = function(type) { + return function() {}; }; diff --git a/lib/browser/escape-string-regexp.js b/lib/browser/escape-string-regexp.js index 21a95663ed..02ea365619 100644 --- a/lib/browser/escape-string-regexp.js +++ b/lib/browser/escape-string-regexp.js @@ -1,11 +1,21 @@ 'use strict'; +/** + * Expose `escape`. + */ + +module.exports = escape; + var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; -module.exports = function (str) { +/** + * @param {string} str + * @return {string} + */ +function escape(str) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } - return str.replace(matchOperatorsRe, '\\$&'); -}; + return str.replace(matchOperatorsRe, '\\$&'); +} diff --git a/lib/browser/events.js b/lib/browser/events.js index f708260896..314016910b 100644 --- a/lib/browser/events.js +++ b/lib/browser/events.js @@ -5,11 +5,19 @@ exports.EventEmitter = EventEmitter; /** - * Check if `obj` is an array. + * Object#hasOwnProperty reference. */ +var objToString = Object.prototype.toString; -function isArray(obj) { - return '[object Array]' == {}.toString.call(obj); +/** + * Check if a value is an array. + * + * @api private + * @param {*} val The value to test. + * @return {boolean} true if the value is a boolean, otherwise false. + */ +function isArray(val) { + return objToString.call(val) === '[object Array]'; } /** @@ -17,16 +25,17 @@ function isArray(obj) { * * @api public */ - -function EventEmitter(){}; +function EventEmitter() {} /** - * Adds a listener. + * Add a listener. * * @api public + * @param {string} name Event name. + * @param {Function} fn Event handler. + * @return {EventEmitter} Emitter instance. */ - -EventEmitter.prototype.on = function (name, fn) { +EventEmitter.prototype.on = function(name, fn) { if (!this.$events) { this.$events = {}; } @@ -48,15 +57,17 @@ EventEmitter.prototype.addListener = EventEmitter.prototype.on; * Adds a volatile listener. * * @api public + * @param {string} name Event name. + * @param {Function} fn Event handler. + * @return {EventEmitter} Emitter instance. */ - -EventEmitter.prototype.once = function (name, fn) { +EventEmitter.prototype.once = function(name, fn) { var self = this; - function on () { + function on() { self.removeListener(name, on); fn.apply(this, arguments); - }; + } on.listener = fn; this.on(name, on); @@ -65,12 +76,14 @@ EventEmitter.prototype.once = function (name, fn) { }; /** - * Removes a listener. + * Remove a listener. * * @api public + * @param {string} name Event name. + * @param {Function} fn Event handler. + * @return {EventEmitter} Emitter instance. */ - -EventEmitter.prototype.removeListener = function (name, fn) { +EventEmitter.prototype.removeListener = function(name, fn) { if (this.$events && this.$events[name]) { var list = this.$events[name]; @@ -102,12 +115,13 @@ EventEmitter.prototype.removeListener = function (name, fn) { }; /** - * Removes all listeners for an event. + * Remove all listeners for an event. * * @api public + * @param {string} name Event name. + * @return {EventEmitter} Emitter instance. */ - -EventEmitter.prototype.removeAllListeners = function (name) { +EventEmitter.prototype.removeAllListeners = function(name) { if (name === undefined) { this.$events = {}; return this; @@ -121,12 +135,13 @@ EventEmitter.prototype.removeAllListeners = function (name) { }; /** - * Gets all listeners for a certain event. + * Get all listeners for a given event. * * @api public + * @param {string} name Event name. + * @return {EventEmitter} Emitter instance. */ - -EventEmitter.prototype.listeners = function (name) { +EventEmitter.prototype.listeners = function(name) { if (!this.$events) { this.$events = {}; } @@ -143,12 +158,13 @@ EventEmitter.prototype.listeners = function (name) { }; /** - * Emits an event. + * Emit an event. * * @api public + * @param {string} name Event name. + * @return {boolean} true if at least one handler was invoked, else false. */ - -EventEmitter.prototype.emit = function (name) { +EventEmitter.prototype.emit = function(name) { if (!this.$events) { return false; } @@ -159,9 +175,9 @@ EventEmitter.prototype.emit = function (name) { return false; } - var args = [].slice.call(arguments, 1); + var args = Array.prototype.slice.call(arguments, 1); - if ('function' == typeof handler) { + if (typeof handler === 'function') { handler.apply(this, args); } else if (isArray(handler)) { var listeners = handler.slice(); diff --git a/lib/browser/progress.js b/lib/browser/progress.js index b30e5179ea..3186b6ec50 100644 --- a/lib/browser/progress.js +++ b/lib/browser/progress.js @@ -7,7 +7,6 @@ module.exports = Progress; /** * Initialize a new `Progress` indicator. */ - function Progress() { this.percent = 0; this.size(0); @@ -16,52 +15,48 @@ function Progress() { } /** - * Set progress size to `n`. + * Set progress size to `size`. * - * @param {Number} n - * @return {Progress} for chaining * @api public + * @param {number} size + * @return {Progress} Progress instance. */ - -Progress.prototype.size = function(n){ - this._size = n; +Progress.prototype.size = function(size) { + this._size = size; return this; }; /** - * Set text to `str`. + * Set text to `text`. * - * @param {String} str - * @return {Progress} for chaining * @api public + * @param {string} text + * @return {Progress} Progress instance. */ - -Progress.prototype.text = function(str){ - this._text = str; +Progress.prototype.text = function(text) { + this._text = text; return this; }; /** - * Set font size to `n`. + * Set font size to `size`. * - * @param {Number} n - * @return {Progress} for chaining * @api public + * @param {number} size + * @return {Progress} Progress instance. */ - -Progress.prototype.fontSize = function(n){ - this._fontSize = n; +Progress.prototype.fontSize = function(size) { + this._fontSize = size; return this; }; /** - * Set font `family`. + * Set font to `family`. * - * @param {String} family - * @return {Progress} for chaining + * @param {string} family + * @return {Progress} Progress instance. */ - -Progress.prototype.font = function(family){ +Progress.prototype.font = function(family) { this._font = family; return this; }; @@ -69,11 +64,10 @@ Progress.prototype.font = function(family){ /** * Update percentage to `n`. * - * @param {Number} n - * @return {Progress} for chaining + * @param {number} n + * @return {Progress} Progress instance. */ - -Progress.prototype.update = function(n){ +Progress.prototype.update = function(n) { this.percent = n; return this; }; @@ -82,18 +76,17 @@ Progress.prototype.update = function(n){ * Draw on `ctx`. * * @param {CanvasRenderingContext2d} ctx - * @return {Progress} for chaining + * @return {Progress} Progress instance. */ - -Progress.prototype.draw = function(ctx){ +Progress.prototype.draw = function(ctx) { try { - var percent = Math.min(this.percent, 100) - , size = this._size - , half = size / 2 - , x = half - , y = half - , rad = half - 1 - , fontSize = this._fontSize; + var percent = Math.min(this.percent, 100); + var size = this._size; + var half = size / 2; + var x = half; + var y = half; + var rad = half - 1; + var fontSize = this._fontSize; ctx.font = fontSize + 'px ' + this._font; @@ -113,13 +106,12 @@ Progress.prototype.draw = function(ctx){ ctx.stroke(); // text - var text = this._text || (percent | 0) + '%' - , w = ctx.measureText(text).width; + var text = this._text || (percent | 0) + '%'; + var w = ctx.measureText(text).width; - ctx.fillText( - text - , x - w / 2 + 1 - , y + fontSize / 2 - 1); - } catch (ex) {} //don't fail if we can't render progress + ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); + } catch (err) { + // don't fail if we can't render progress + } return this; }; diff --git a/lib/browser/tty.js b/lib/browser/tty.js index eab6388270..840d6699ee 100644 --- a/lib/browser/tty.js +++ b/lib/browser/tty.js @@ -1,12 +1,11 @@ -exports.isatty = function(){ +exports.isatty = function isatty() { return true; }; -exports.getWindowSize = function(){ +exports.getWindowSize = function getWindowSize() { if ('innerHeight' in global) { return [global.innerHeight, global.innerWidth]; - } else { - // In a Web Worker, the DOM Window is not available. - return [640, 480]; } + // In a Web Worker, the DOM Window is not available. + return [640, 480]; }; diff --git a/lib/context.js b/lib/context.js index 3885218db9..0b0242fee1 100644 --- a/lib/context.js +++ b/lib/context.js @@ -9,19 +9,19 @@ module.exports = Context; * * @api private */ - -function Context(){} +function Context() {} /** * Set or get the context `Runnable` to `runnable`. * + * @api private * @param {Runnable} runnable * @return {Context} - * @api private */ - -Context.prototype.runnable = function(runnable){ - if (0 == arguments.length) return this._runnable; +Context.prototype.runnable = function(runnable) { + if (!arguments.length) { + return this._runnable; + } this.test = this._runnable = runnable; return this; }; @@ -29,13 +29,14 @@ Context.prototype.runnable = function(runnable){ /** * Set test timeout `ms`. * - * @param {Number} ms - * @return {Context} self * @api private + * @param {number} ms + * @return {Context} self */ - -Context.prototype.timeout = function(ms){ - if (arguments.length === 0) return this.runnable().timeout(); +Context.prototype.timeout = function(ms) { + if (!arguments.length) { + return this.runnable().timeout(); + } this.runnable().timeout(ms); return this; }; @@ -43,26 +44,23 @@ Context.prototype.timeout = function(ms){ /** * Set test timeout `enabled`. * - * @param {Boolean} enabled - * @return {Context} self * @api private + * @param {boolean} enabled + * @return {Context} self */ - -Context.prototype.enableTimeouts = function (enabled) { +Context.prototype.enableTimeouts = function(enabled) { this.runnable().enableTimeouts(enabled); return this; }; - /** * Set test slowness threshold `ms`. * - * @param {Number} ms - * @return {Context} self * @api private + * @param {number} ms + * @return {Context} self */ - -Context.prototype.slow = function(ms){ +Context.prototype.slow = function(ms) { this.runnable().slow(ms); return this; }; @@ -70,26 +68,22 @@ Context.prototype.slow = function(ms){ /** * Mark a test as skipped. * - * @return {Context} self * @api private + * @return {Context} self */ - -Context.prototype.skip = function(){ - this.runnable().skip(); - return this; +Context.prototype.skip = function() { + this.runnable().skip(); + return this; }; /** * Inspect the context void of `._runnable`. * - * @return {String} * @api private + * @return {string} */ - -Context.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_runnable' == key) return; - if ('test' == key) return; - return val; +Context.prototype.inspect = function() { + return JSON.stringify(this, function(key, val) { + return key === 'runnable' || key === 'test' ? undefined : val; }, 2); }; diff --git a/lib/hook.js b/lib/hook.js index c2dc346b44..3dec54b795 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -17,7 +17,6 @@ module.exports = Hook; * @param {Function} fn * @api private */ - function Hook(title, fn) { Runnable.call(this, title, fn); this.type = 'hook'; @@ -26,7 +25,6 @@ function Hook(title, fn) { /** * Inherit from `Runnable.prototype`. */ - Hook.prototype.__proto__ = Runnable.prototype; /** @@ -36,10 +34,9 @@ Hook.prototype.__proto__ = Runnable.prototype; * @return {Error} * @api public */ - -Hook.prototype.error = function(err){ - if (0 == arguments.length) { - var err = this._error; +Hook.prototype.error = function(err) { + if (!arguments.length) { + err = this._error; this._error = null; return err; } diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index f9f08a3ed0..253f24e488 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -2,33 +2,31 @@ * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , utils = require('../utils') - , escapeRe = require('escape-string-regexp'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * BDD-style interface: * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * + * describe('Array', function() { + * describe('#indexOf()', function() { + * it('should return -1 when not present', function() { + * // ... * }); * - * it('should return the index when present', function(){ - * + * it('should return the index when present', function() { + * // ... * }); * }); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.before = common.before; @@ -42,7 +40,7 @@ module.exports = function(suite){ * and/or tests. */ - context.describe = context.context = function(title, fn){ + context.describe = context.context = function(title, fn) { var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -55,9 +53,7 @@ module.exports = function(suite){ * Pending describe. */ - context.xdescribe = - context.xcontext = - context.describe.skip = function(title, fn){ + context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) { var suite = Suite.create(suites[0], title); suite.pending = true; suites.unshift(suite); @@ -69,7 +65,7 @@ module.exports = function(suite){ * Exclusive suite. */ - context.describe.only = function(title, fn){ + context.describe.only = function(title, fn) { var suite = context.describe(title, fn); mocha.grep(suite.fullTitle()); return suite; @@ -81,9 +77,11 @@ module.exports = function(suite){ * acting as a thunk. */ - context.it = context.specify = function(title, fn){ + context.it = context.specify = function(title, fn) { var suite = suites[0]; - if (suite.pending) fn = null; + if (suite.pending) { + fn = null; + } var test = new Test(title, fn); test.file = file; suite.addTest(test); @@ -94,7 +92,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.it.only = function(title, fn){ + context.it.only = function(title, fn) { var test = context.it(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); @@ -105,11 +103,8 @@ module.exports = function(suite){ * Pending test case. */ - context.xit = - context.xspecify = - context.it.skip = function(title){ + context.xit = context.xspecify = context.it.skip = function(title) { context.it(title); }; - }); }; diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 1ccd3390f7..4a21c16c69 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -1,16 +1,20 @@ -/** - * Functions common to more than one interface - * @module lib/interfaces/common - */ - 'use strict'; -module.exports = function (suites, context) { - +/** + * Functions common to more than one interface. + * + * @param {Suite[]} suites + * @param {Context} context + * @return {Object} An object containing common functions. + */ +module.exports = function(suites, context) { return { /** - * This is only present if flag --delay is passed into Mocha. It triggers - * root suite execution. Returns a function which runs the root suite. + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. + * + * @param {Suite} suite The root wuite. + * @return {Function} A function which runs the root suite */ runWithSuite: function runWithSuite(suite) { return function run() { @@ -20,39 +24,53 @@ module.exports = function (suites, context) { /** * Execute before running tests. + * + * @param {string} name + * @param {Function} fn */ - before: function (name, fn) { + before: function(name, fn) { suites[0].beforeAll(name, fn); }, /** * Execute after running tests. + * + * @param {string} name + * @param {Function} fn */ - after: function (name, fn) { + after: function(name, fn) { suites[0].afterAll(name, fn); }, /** * Execute before each test case. + * + * @param {string} name + * @param {Function} fn */ - beforeEach: function (name, fn) { + beforeEach: function(name, fn) { suites[0].beforeEach(name, fn); }, /** * Execute after each test case. + * + * @param {string} name + * @param {Function} fn */ - afterEach: function (name, fn) { + afterEach: function(name, fn) { suites[0].afterEach(name, fn); }, test: { /** * Pending test case. + * + * @param {string} title */ - skip: function (title) { + skip: function(title) { context.test(title); } } - } + }; }; diff --git a/lib/interfaces/exports.js b/lib/interfaces/exports.js index 95e8a07012..a64692ae5c 100644 --- a/lib/interfaces/exports.js +++ b/lib/interfaces/exports.js @@ -2,27 +2,27 @@ * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test'); +var Suite = require('../suite'); +var Test = require('../test'); /** * TDD-style interface: * * exports.Array = { * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ + * 'should return -1 when the value is not present': function() { * * }, * - * 'should return the correct index when the value is present': function(){ + * 'should return the correct index when the value is present': function() { * * } * } * }; * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; suite.on('require', visit); @@ -30,7 +30,7 @@ module.exports = function(suite){ function visit(obj, file) { var suite; for (var key in obj) { - if ('function' == typeof obj[key]) { + if (typeof obj[key] === 'function') { var fn = obj[key]; switch (key) { case 'before': diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index 6668967ca3..be7f50fb40 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -2,22 +2,21 @@ * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , escapeRe = require('escape-string-regexp') - , utils = require('../utils'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * QUnit-style interface: * * suite('Array'); * - * test('#length', function(){ + * test('#length', function() { * var arr = [1,2,3]; * ok(arr.length == 3); * }); * - * test('#indexOf()', function(){ + * test('#indexOf()', function() { * var arr = [1,2,3]; * ok(arr.indexOf(1) == 0); * ok(arr.indexOf(2) == 1); @@ -26,17 +25,16 @@ var Suite = require('../suite') * * suite('String'); * - * test('#length', function(){ + * test('#length', function() { * ok('foo'.length == 3); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.before = common.before; @@ -48,8 +46,10 @@ module.exports = function(suite){ * Describe a "suite" with the given `title`. */ - context.suite = function(title){ - if (suites.length > 1) suites.shift(); + context.suite = function(title) { + if (suites.length > 1) { + suites.shift(); + } var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -60,7 +60,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.suite.only = function(title, fn){ + context.suite.only = function(title, fn) { var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; @@ -71,7 +71,7 @@ module.exports = function(suite){ * acting as a thunk. */ - context.test = function(title, fn){ + context.test = function(title, fn) { var test = new Test(title, fn); test.file = file; suites[0].addTest(test); @@ -82,13 +82,12 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.test.only = function(title, fn){ + context.test.only = function(title, fn) { var test = context.test(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); }; context.test.skip = common.test.skip; - }); }; diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index 13bc2a33be..fb22a79190 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -2,41 +2,39 @@ * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , escapeRe = require('escape-string-regexp') - , utils = require('../utils'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * TDD-style interface: * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * suiteSetup(function(){ + * suite('Array', function() { + * suite('#indexOf()', function() { + * suiteSetup(function() { * * }); * - * test('should return -1 when not present', function(){ + * test('should return -1 when not present', function() { * * }); * - * test('should return the index when present', function(){ + * test('should return the index when present', function() { * * }); * - * suiteTeardown(function(){ + * suiteTeardown(function() { * * }); * }); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.setup = common.beforeEach; @@ -44,13 +42,12 @@ module.exports = function(suite){ context.suiteSetup = common.before; context.suiteTeardown = common.after; context.run = mocha.options.delay && common.runWithSuite(suite); + /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. + * Describe a "suite" with the given `title` and callback `fn` containing + * nested suites and/or tests. */ - - context.suite = function(title, fn){ + context.suite = function(title, fn) { var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -73,21 +70,20 @@ module.exports = function(suite){ /** * Exclusive test-case. */ - - context.suite.only = function(title, fn){ + context.suite.only = function(title, fn) { var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. + * Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. */ - - context.test = function(title, fn){ + context.test = function(title, fn) { var suite = suites[0]; - if (suite.pending) fn = null; + if (suite.pending) { + fn = null; + } var test = new Test(title, fn); test.file = file; suite.addTest(test); @@ -98,7 +94,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.test.only = function(title, fn){ + context.test.only = function(title, fn) { var test = context.test(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); diff --git a/lib/mocha.js b/lib/mocha.js index 8a11124cb1..0d86f21132 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -8,9 +8,9 @@ * Module dependencies. */ -var path = require('path') - , escapeRe = require('escape-string-regexp') - , utils = require('./utils'); +var escapeRe = require('escape-string-regexp'); +var path = require('path'); +var utils = require('./utils'); /** * Expose `Mocha`. @@ -23,9 +23,8 @@ exports = module.exports = Mocha; */ if (typeof process !== 'undefined' && typeof process.cwd === 'function') { - var join = path.join - , cwd = process.cwd(); - module.paths.push(cwd, join(cwd, 'node_modules')); + var cwd = process.cwd(); + module.paths.push(cwd, path.join(cwd, 'node_modules')); } /** @@ -45,17 +44,16 @@ exports.Test = require('./test'); /** * Return image `name` path. * - * @param {String} name - * @return {String} * @api private + * @param {string} name + * @return {string} */ - function image(name) { - return __dirname + '/../images/' + name + '.png'; + return path.join(__dirname, '../images', name + '.png'); } /** - * Setup mocha with `options`. + * Set up mocha with `options`. * * Options: * @@ -69,26 +67,35 @@ function image(name) { * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * - * @param {Object} options * @api public + * @param {Object} options */ - function Mocha(options) { options = options || {}; this.files = []; this.options = options; - if (options.grep) this.grep(new RegExp(options.grep)); - if (options.fgrep) this.grep(options.fgrep); - this.suite = new exports.Suite('', new exports.Context); + if (options.grep) { + this.grep(new RegExp(options.grep)); + } + if (options.fgrep) { + this.grep(options.fgrep); + } + this.suite = new exports.Suite('', new exports.Context()); this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); - if (null != options.timeout) this.timeout(options.timeout); + if (options.timeout != null) { + this.timeout(options.timeout); + } this.useColors(options.useColors); - if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts); - if (options.slow) this.slow(options.slow); + if (options.enableTimeouts !== null) { + this.enableTimeouts(options.enableTimeouts); + } + if (options.slow) { + this.slow(options.slow); + } - this.suite.on('pre-require', function (context) { + this.suite.on('pre-require', function(context) { exports.afterEach = context.afterEach || context.teardown; exports.after = context.after || context.suiteTeardown; exports.beforeEach = context.beforeEach || context.setup; @@ -108,12 +115,13 @@ function Mocha(options) { /** * Enable or disable bailing on the first failure. * - * @param {Boolean} [bail] * @api public + * @param {boolean} [bail] */ - -Mocha.prototype.bail = function(bail){ - if (0 == arguments.length) bail = true; +Mocha.prototype.bail = function(bail) { + if (!arguments.length) { + bail = true; + } this.suite.bail(bail); return this; }; @@ -121,11 +129,10 @@ Mocha.prototype.bail = function(bail){ /** * Add test `file`. * - * @param {String} file * @api public + * @param {string} file */ - -Mocha.prototype.addFile = function(file){ +Mocha.prototype.addFile = function(file) { this.files.push(file); return this; }; @@ -133,27 +140,38 @@ Mocha.prototype.addFile = function(file){ /** * Set reporter to `reporter`, defaults to "spec". * - * @param {String|Function} reporter name or constructor - * @param {Object} reporterOptions optional options * @api public + * @param {string|Function} reporter name or constructor + * @param {Object} reporterOptions optional options */ -Mocha.prototype.reporter = function(reporter, reporterOptions){ - if ('function' == typeof reporter) { +Mocha.prototype.reporter = function(reporter, reporterOptions) { + if (typeof reporter === 'function') { this._reporter = reporter; } else { reporter = reporter || 'spec'; var _reporter; - try { _reporter = require('./reporters/' + reporter); } catch (err) {} - if (!_reporter) try { _reporter = require(reporter); } catch (err) { - err.message.indexOf('Cannot find module') !== -1 - ? console.warn('"' + reporter + '" reporter not found') - : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + try { + _reporter = require('./reporters/' + reporter); + } catch (err) { + // Ignore + } + if (!_reporter) { + try { + _reporter = require(reporter); + } catch (err) { + err.message.indexOf('Cannot find module') !== -1 + ? console.warn('"' + reporter + '" reporter not found') + : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + } + } + if (!_reporter && reporter === 'teamcity') { + console.warn('The Teamcity reporter was moved to a package named ' + + 'mocha-teamcity-reporter ' + + '(https://npmjs.org/package/mocha-teamcity-reporter).'); + } + if (!_reporter) { + throw new Error('invalid reporter "' + reporter + '"'); } - if (!_reporter && reporter === 'teamcity') - console.warn('The Teamcity reporter was moved to a package named ' + - 'mocha-teamcity-reporter ' + - '(https://npmjs.org/package/mocha-teamcity-reporter).'); - if (!_reporter) throw new Error('invalid reporter "' + reporter + '"'); this._reporter = _reporter; } this.options.reporterOptions = reporterOptions; @@ -163,15 +181,19 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ /** * Set test UI `name`, defaults to "bdd". * - * @param {String} bdd * @api public + * @param {string} bdd */ - -Mocha.prototype.ui = function(name){ +Mocha.prototype.ui = function(name) { name = name || 'bdd'; this._ui = exports.interfaces[name]; - if (!this._ui) try { this._ui = require(name); } catch (err) {} - if (!this._ui) throw new Error('invalid interface "' + name + '"'); + if (!this._ui) { + try { + this._ui = require(name); + } catch (err) { + throw new Error('invalid interface "' + name + '"'); + } + } this._ui = this._ui(this.suite); return this; }; @@ -181,12 +203,11 @@ Mocha.prototype.ui = function(name){ * * @api private */ - -Mocha.prototype.loadFiles = function(fn){ +Mocha.prototype.loadFiles = function(fn) { var self = this; var suite = this.suite; var pending = this.files.length; - this.files.forEach(function(file){ + this.files.forEach(function(file) { file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); @@ -200,20 +221,19 @@ Mocha.prototype.loadFiles = function(fn){ * * @api private */ - Mocha.prototype._growl = function(runner, reporter) { var notify = require('growl'); - runner.on('end', function(){ + runner.on('end', function() { var stats = reporter.stats; if (stats.failures) { var msg = stats.failures + ' of ' + runner.total + ' tests failed'; notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); } else { notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { - name: 'mocha' - , title: 'Passed' - , image: image('ok') + name: 'mocha', + title: 'Passed', + image: image('ok') }); } }); @@ -222,26 +242,22 @@ Mocha.prototype._growl = function(runner, reporter) { /** * Add regexp to grep, if `re` is a string it is escaped. * - * @param {RegExp|String} re - * @return {Mocha} * @api public + * @param {RegExp|string} re + * @return {Mocha} */ - -Mocha.prototype.grep = function(re){ - this.options.grep = 'string' == typeof re - ? new RegExp(escapeRe(re)) - : re; +Mocha.prototype.grep = function(re) { + this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re; return this; }; /** * Invert `.grep()` matches. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.invert = function(){ +Mocha.prototype.invert = function() { this.options.invert = true; return this; }; @@ -249,24 +265,22 @@ Mocha.prototype.invert = function(){ /** * Ignore global leaks. * - * @param {Boolean} ignore - * @return {Mocha} * @api public + * @param {boolean} ignore + * @return {Mocha} */ - -Mocha.prototype.ignoreLeaks = function(ignore){ - this.options.ignoreLeaks = !!ignore; +Mocha.prototype.ignoreLeaks = function(ignore) { + this.options.ignoreLeaks = Boolean(ignore); return this; }; /** * Enable global leak checking. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.checkLeaks = function(){ +Mocha.prototype.checkLeaks = function() { this.options.ignoreLeaks = false; return this; }; @@ -274,10 +288,9 @@ Mocha.prototype.checkLeaks = function(){ /** * Display long stack-trace on failing * - * @return {Mocha} * @api public + * @return {Mocha} */ - Mocha.prototype.fullTrace = function() { this.options.fullStackTrace = true; return this; @@ -286,11 +299,10 @@ Mocha.prototype.fullTrace = function() { /** * Enable growl support. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.growl = function(){ +Mocha.prototype.growl = function() { this.options.growl = true; return this; }; @@ -298,12 +310,11 @@ Mocha.prototype.growl = function(){ /** * Ignore `globals` array or string. * - * @param {Array|String} globals - * @return {Mocha} * @api public + * @param {Array|string} globals + * @return {Mocha} */ - -Mocha.prototype.globals = function(globals){ +Mocha.prototype.globals = function(globals) { this.options.globals = (this.options.globals || []).concat(globals); return this; }; @@ -311,12 +322,11 @@ Mocha.prototype.globals = function(globals){ /** * Emit color output. * - * @param {Boolean} colors - * @return {Mocha} * @api public + * @param {boolean} colors + * @return {Mocha} */ - -Mocha.prototype.useColors = function(colors){ +Mocha.prototype.useColors = function(colors) { if (colors !== undefined) { this.options.useColors = colors; } @@ -326,27 +336,23 @@ Mocha.prototype.useColors = function(colors){ /** * Use inline diffs rather than +/-. * - * @param {Boolean} inlineDiffs - * @return {Mocha} * @api public + * @param {boolean} inlineDiffs + * @return {Mocha} */ - Mocha.prototype.useInlineDiffs = function(inlineDiffs) { - this.options.useInlineDiffs = arguments.length && inlineDiffs != undefined - ? inlineDiffs - : false; + this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; /** * Set the timeout in milliseconds. * - * @param {Number} timeout - * @return {Mocha} * @api public + * @param {number} timeout + * @return {Mocha} */ - -Mocha.prototype.timeout = function(timeout){ +Mocha.prototype.timeout = function(timeout) { this.suite.timeout(timeout); return this; }; @@ -354,12 +360,11 @@ Mocha.prototype.timeout = function(timeout){ /** * Set slowness threshold in milliseconds. * - * @param {Number} slow - * @return {Mocha} * @api public + * @param {number} slow + * @return {Mocha} */ - -Mocha.prototype.slow = function(slow){ +Mocha.prototype.slow = function(slow) { this.suite.slow(slow); return this; }; @@ -367,34 +372,31 @@ Mocha.prototype.slow = function(slow){ /** * Enable timeouts. * - * @param {Boolean} enabled - * @return {Mocha} * @api public + * @param {boolean} enabled + * @return {Mocha} */ - Mocha.prototype.enableTimeouts = function(enabled) { - this.suite.enableTimeouts(arguments.length && enabled !== undefined - ? enabled - : true); - return this + this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true); + return this; }; /** * Makes all tests async (accepting a callback) * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.asyncOnly = function(){ +Mocha.prototype.asyncOnly = function() { this.options.asyncOnly = true; return this; }; /** * Disable syntax highlighting (in browser). - * @returns {Mocha} + * * @api public + * @returns {Mocha} */ Mocha.prototype.noHighlighting = function() { this.options.noHighlighting = true; @@ -403,8 +405,9 @@ Mocha.prototype.noHighlighting = function() { /** * Delay root suite execution. - * @returns {Mocha} + * * @api public + * @returns {Mocha} */ Mocha.prototype.delay = function delay() { this.options.delay = true; @@ -414,32 +417,42 @@ Mocha.prototype.delay = function delay() { /** * Run tests and invoke `fn()` when complete. * + * @api public * @param {Function} fn * @return {Runner} - * @api public */ -Mocha.prototype.run = function(fn){ - if (this.files.length) this.loadFiles(); +Mocha.prototype.run = function(fn) { + if (this.files.length) { + this.loadFiles(); + } var suite = this.suite; var options = this.options; options.files = this.files; var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); - runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; - if (options.grep) runner.grep(options.grep, options.invert); - if (options.globals) runner.globals(options.globals); - if (options.growl) this._growl(runner, reporter); + if (options.grep) { + runner.grep(options.grep, options.invert); + } + if (options.globals) { + runner.globals(options.globals); + } + if (options.growl) { + this._growl(runner, reporter); + } if (options.useColors !== undefined) { exports.reporters.Base.useColors = options.useColors; } exports.reporters.Base.inlineDiffs = options.useInlineDiffs; function done(failures) { - if (reporter.done) { - reporter.done(failures, fn); - } else fn && fn(failures); + if (reporter.done) { + reporter.done(failures, fn); + } else { + fn && fn(failures); + } } return runner.run(done); diff --git a/lib/ms.js b/lib/ms.js index ba451fab6c..12fddc18ae 100644 --- a/lib/ms.js +++ b/lib/ms.js @@ -15,29 +15,32 @@ var y = d * 365.25; * * - `long` verbose formatting [false] * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} * @api public + * @param {string|number} val + * @param {Object} options + * @return {string|number} */ - -module.exports = function(val, options){ +module.exports = function(val, options) { options = options || {}; - if ('string' == typeof val) return parse(val); + if (typeof val === 'string') { + return parse(val); + } + // https://github.com/mochajs/mocha/pull/1035 return options['long'] ? longFormat(val) : shortFormat(val); }; /** * Parse the given `str` and return milliseconds. * - * @param {String} str - * @return {Number} * @api private + * @param {string} str + * @return {number} */ - function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; + var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str); + if (!match) { + return; + } var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { @@ -63,33 +66,41 @@ function parse(str) { return n * s; case 'ms': return n; + default: + // No default case } } /** * Short format for `ms`. * - * @param {Number} ms - * @return {String} * @api private + * @param {number} ms + * @return {string} */ - function shortFormat(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } return ms + 'ms'; } /** * Long format for `ms`. * - * @param {Number} ms - * @return {String} * @api private + * @param {number} ms + * @return {string} */ - function longFormat(ms) { return plural(ms, d, 'day') || plural(ms, h, 'hour') @@ -100,10 +111,18 @@ function longFormat(ms) { /** * Pluralization helper. + * + * @api private + * @param {number} ms + * @param {number} n + * @param {string} name */ - function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } return Math.ceil(ms / n) + ' ' + name + 's'; } diff --git a/lib/pending.js b/lib/pending.js index 265ec73c18..c847e04e3f 100644 --- a/lib/pending.js +++ b/lib/pending.js @@ -8,9 +8,8 @@ module.exports = Pending; /** * Initialize a new `Pending` error with the given message. * - * @param {String} message + * @param {string} message */ - function Pending(message) { - this.message = message; + this.message = message; } diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 9b719a80e7..3c57d01a0b 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -2,33 +2,36 @@ * Module dependencies. */ -var tty = require('tty') - , diff = require('diff') - , ms = require('../ms') - , utils = require('../utils') - , supportsColor = process.env ? require('supports-color') : null; +var tty = require('tty'); +var diff = require('diff'); +var ms = require('../ms'); +var utils = require('../utils'); +var supportsColor = process.env ? require('supports-color') : null; /** - * Save timer references to avoid Sinon interfering (see GH-237). + * Expose `Base`. */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +exports = module.exports = Base; /** - * Check if both stdio streams are associated with a tty. + * Save timer references to avoid Sinon interfering. + * See: https://github.com/mochajs/mocha/issues/237 */ -var isatty = tty.isatty(1) && tty.isatty(2); +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** - * Expose `Base`. + * Check if both stdio streams are associated with a tty. */ -exports = module.exports = Base; +var isatty = tty.isatty(1) && tty.isatty(2); /** * Enable coloring by default, except in the browser interface. @@ -49,25 +52,25 @@ exports.inlineDiffs = false; */ exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'bright pass': 92 - , 'bright fail': 91 - , 'bright yellow': 93 - , 'pending': 36 - , 'suite': 0 - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 - , 'green': 32 - , 'light': 90 - , 'diff gutter': 90 - , 'diff added': 32 - , 'diff removed': 31 + pass: 90, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31 }; /** @@ -81,7 +84,7 @@ exports.symbols = { }; // With node.js on Windows: use symbols available in terminal default fonts -if ('win32' == process.platform) { +if (process.platform === 'win32') { exports.symbols.ok = '\u221A'; exports.symbols.err = '\u00D7'; exports.symbols.dot = '.'; @@ -93,53 +96,54 @@ if ('win32' == process.platform) { * as well as user-defined color * schemes. * - * @param {String} type - * @param {String} str - * @return {String} + * @param {string} type + * @param {string} str + * @return {string} * @api private */ - var color = exports.color = function(type, str) { - if (!exports.useColors) return String(str); + if (!exports.useColors) { + return String(str); + } return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; }; /** - * Expose term window size, with some - * defaults for when stderr is not a tty. + * Expose term window size, with some defaults for when stderr is not a tty. */ exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 + width: 75 }; +if (isatty) { + exports.window.width = process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1]; +} + /** - * Expose some basic cursor interactions - * that are common among reporters. + * Expose some basic cursor interactions that are common among reporters. */ exports.cursor = { - hide: function(){ + hide: function() { isatty && process.stdout.write('\u001b[?25l'); }, - show: function(){ + show: function() { isatty && process.stdout.write('\u001b[?25h'); }, - deleteLine: function(){ + deleteLine: function() { isatty && process.stdout.write('\u001b[2K'); }, - beginningOfLine: function(){ + beginningOfLine: function() { isatty && process.stdout.write('\u001b[0G'); }, - CR: function(){ + CR: function() { if (isatty) { exports.cursor.deleteLine(); exports.cursor.beginningOfLine(); @@ -156,22 +160,24 @@ exports.cursor = { * @api public */ -exports.list = function(failures){ +exports.list = function(failures) { console.log(); - failures.forEach(function(test, i){ + failures.forEach(function(test, i) { // format var fmt = color('error title', ' %s) %s:\n') + color('error message', ' %s') + color('error stack', '\n%s\n'); // msg - var err = test.err - , message = err.message || '' - , stack = err.stack || message - , index = stack.indexOf(message) - , actual = err.actual - , expected = err.expected - , escape = true; + var msg; + var err = test.err; + var message = err.message || ''; + var stack = err.stack || message; + var index = stack.indexOf(message); + var actual = err.actual; + var expected = err.expected; + var escape = true; + if (index === -1) { msg = message; } else { @@ -186,9 +192,7 @@ exports.list = function(failures){ msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff !== false && sameType(actual, expected) - && expected !== undefined) { - + if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { escape = false; if (!(utils.isString(actual) && utils.isString(expected))) { err.actual = actual = utils.stringify(actual); @@ -226,55 +230,57 @@ exports.list = function(failures){ */ function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } - , failures = this.failures = []; + var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; + var failures = this.failures = []; - if (!runner) return; + if (!runner) { + return; + } this.runner = runner; runner.stats = stats; - runner.on('start', function(){ - stats.start = new Date; + runner.on('start', function() { + stats.start = new Date(); }); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { stats.suites = stats.suites || 0; suite.root || stats.suites++; }); - runner.on('test end', function(test){ + runner.on('test end', function() { stats.tests = stats.tests || 0; stats.tests++; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { stats.passes = stats.passes || 0; - var medium = test.slow() / 2; - test.speed = test.duration > test.slow() - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; + if (test.duration > test.slow()) { + test.speed = 'slow'; + } else if (test.duration > test.slow() / 2) { + test.speed = 'medium'; + } else { + test.speed = 'fast'; + } stats.passes++; }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { stats.failures = stats.failures || 0; stats.failures++; test.err = err; failures.push(test); }); - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; + runner.on('end', function() { + stats.end = new Date(); + stats.duration = new Date() - stats.start; }); - runner.on('pending', function(){ + runner.on('pending', function() { stats.pending++; }); } @@ -285,10 +291,8 @@ function Base(runner) { * * @api public */ - -Base.prototype.epilogue = function(){ +Base.prototype.epilogue = function() { var stats = this.stats; - var tests; var fmt; console.log(); @@ -326,26 +330,24 @@ Base.prototype.epilogue = function(){ /** * Pad the given `str` to `len`. * - * @param {String} str - * @param {String} len - * @return {String} * @api private + * @param {string} str + * @param {string} len + * @return {string} */ - function pad(str, len) { str = String(str); return Array(len - str.length + 1).join(' ') + str; } - /** * Returns an inline diff between 2 strings with coloured ANSI output * - * @param {Error} Error with actual/expected - * @return {String} Diff * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} Diff */ - function inlineDiff(err, escape) { var msg = errorDiff(err, 'WordsWithSpace', escape); @@ -353,7 +355,7 @@ function inlineDiff(err, escape) { var lines = msg.split('\n'); if (lines.length > 4) { var width = String(lines.length).length; - msg = lines.map(function(str, i){ + msg = lines.map(function(str, i) { return pad(++i, width) + ' |' + ' ' + str; }).join('\n'); } @@ -373,24 +375,32 @@ function inlineDiff(err, escape) { } /** - * Returns a unified diff between 2 strings + * Returns a unified diff between two strings. * - * @param {Error} Error with actual/expected - * @return {String} Diff * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} The diff. */ - function unifiedDiff(err, escape) { var indent = ' '; function cleanUp(line) { if (escape) { line = escapeInvisibles(line); } - if (line[0] === '+') return indent + colorLines('diff added', line); - if (line[0] === '-') return indent + colorLines('diff removed', line); - if (line.match(/\@\@/)) return null; - if (line.match(/\\ No newline/)) return null; - else return indent + line; + if (line[0] === '+') { + return indent + colorLines('diff added', line); + } + if (line[0] === '-') { + return indent + colorLines('diff removed', line); + } + if (line.match(/\@\@/)) { + return null; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; } function notBlank(line) { return line != null; @@ -398,26 +408,31 @@ function unifiedDiff(err, escape) { var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); return '\n ' - + colorLines('diff added', '+ expected') + ' ' - + colorLines('diff removed', '- actual') - + '\n\n' - + lines.map(cleanUp).filter(notBlank).join('\n'); + + colorLines('diff added', '+ expected') + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n'); } /** * Return a character diff for `err`. * - * @param {Error} err - * @return {String} * @api private + * @param {Error} err + * @param {string} type + * @param {boolean} escape + * @return {string} */ - function errorDiff(err, type, escape) { - var actual = escape ? escapeInvisibles(err.actual) : err.actual; + var actual = escape ? escapeInvisibles(err.actual) : err.actual; var expected = escape ? escapeInvisibles(err.expected) : err.expected; - return diff['diff' + type](actual, expected).map(function(str){ - if (str.added) return colorLines('diff added', str.value); - if (str.removed) return colorLines('diff removed', str.value); + return diff['diff' + type](actual, expected).map(function(str) { + if (str.added) { + return colorLines('diff added', str.value); + } + if (str.removed) { + return colorLines('diff removed', str.value); + } return str.value; }).join(''); } @@ -425,42 +440,43 @@ function errorDiff(err, type, escape) { /** * Returns a string with all invisible characters in plain text * - * @param {String} line - * @return {String} * @api private + * @param {string} line + * @return {string} */ function escapeInvisibles(line) { - return line.replace(/\t/g, '') - .replace(/\r/g, '') - .replace(/\n/g, '\n'); + return line.replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); } /** * Color lines for `str`, using the color `name`. * - * @param {String} name - * @param {String} str - * @return {String} * @api private + * @param {string} name + * @param {string} str + * @return {string} */ - function colorLines(name, str) { - return str.split('\n').map(function(str){ + return str.split('\n').map(function(str) { return color(name, str); }).join('\n'); } +/** + * Object#toString reference. + */ +var objToString = Object.prototype.toString; + /** * Check that a / b have the same type. * + * @api private * @param {Object} a * @param {Object} b - * @return {Boolean} - * @api private + * @return {boolean} */ - function sameType(a, b) { - a = Object.prototype.toString.call(a); - b = Object.prototype.toString.call(b); - return a == b; + return objToString.call(a) === objToString.call(b); } diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js index d194eb0e69..8c1fd3adf7 100644 --- a/lib/reporters/doc.js +++ b/lib/reporters/doc.js @@ -2,8 +2,8 @@ * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils'); +var Base = require('./base'); +var utils = require('../utils'); /** * Expose `Doc`. @@ -17,21 +17,19 @@ exports = module.exports = Doc; * @param {Runner} runner * @api public */ - function Doc(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; + var indents = 2; function indent() { return Array(indents).join(' '); } - runner.on('suite', function(suite){ - if (suite.root) return; + runner.on('suite', function(suite) { + if (suite.root) { + return; + } ++indents; console.log('%s
      ', indent()); ++indents; @@ -39,21 +37,23 @@ function Doc(runner) { console.log('%s
      ', indent()); }); - runner.on('suite end', function(suite){ - if (suite.root) return; + runner.on('suite end', function(suite) { + if (suite.root) { + return; + } console.log('%s
      ', indent()); --indents; console.log('%s
      ', indent()); --indents; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { console.log('%s
      %s
      ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.fn.toString())); console.log('%s
      %s
      ', indent(), code); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { console.log('%s
      %s
      ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.fn.toString())); console.log('%s
      %s
      ', indent(), code); diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index 42a45ee2b5..b9cb785b25 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -2,8 +2,8 @@ * Module dependencies. */ -var Base = require('./base') - , color = Base.color; +var Base = require('./base'); +var color = Base.color; /** * Expose `Dot`. @@ -14,42 +14,46 @@ exports = module.exports = Dot; /** * Initialize a new `Dot` matrix test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Dot(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , n = -1; + var self = this; + var width = Base.window.width * .75 | 0; + var n = -1; - runner.on('start', function(){ + runner.on('start', function() { process.stdout.write('\n'); }); - runner.on('pending', function(test){ - if (++n % width == 0) process.stdout.write('\n '); + runner.on('pending', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } process.stdout.write(color('pending', Base.symbols.dot)); }); - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { + runner.on('pass', function(test) { + if (++n % width === 0) { + process.stdout.write('\n '); + } + if (test.speed === 'slow') { process.stdout.write(color('bright yellow', Base.symbols.dot)); } else { process.stdout.write(color(test.speed, Base.symbols.dot)); } }); - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); + runner.on('fail', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } process.stdout.write(color('fail', Base.symbols.dot)); }); - runner.on('end', function(){ + runner.on('end', function() { console.log(); self.epilogue(); }); diff --git a/lib/reporters/html-cov.js b/lib/reporters/html-cov.js index 74b46adcd9..f45feb5d70 100644 --- a/lib/reporters/html-cov.js +++ b/lib/reporters/html-cov.js @@ -2,8 +2,9 @@ * Module dependencies. */ -var JSONCov = require('./json-cov') - , fs = require('fs'); +var JSONCov = require('./json-cov'); +var readFileSync = require('fs').readFileSync; +var join = require('path').join; /** * Expose `HTMLCov`. @@ -14,37 +15,42 @@ exports = module.exports = HTMLCov; /** * Initialize a new `JsCoverage` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function HTMLCov(runner) { - var jade = require('jade') - , file = __dirname + '/templates/coverage.jade' - , str = fs.readFileSync(file, 'utf8') - , fn = jade.compile(str, { filename: file }) - , self = this; + var jade = require('jade'); + var file = join(__dirname, '/templates/coverage.jade'); + var fn = jade.compile(str, { filename: file }); + var self = this; + var str = readFileSync(file, 'utf8'); JSONCov.call(this, runner, false); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write(fn({ - cov: self.cov - , coverageClass: coverageClass + cov: self.cov, + coverageClass: coverageClass })); }); } /** - * Return coverage class for `n`. + * Return coverage class for a given coverage percentage. * - * @return {String} * @api private + * @param {number} coveragePctg + * @return {string} */ - -function coverageClass(n) { - if (n >= 75) return 'high'; - if (n >= 50) return 'medium'; - if (n >= 25) return 'low'; +function coverageClass(coveragePctg) { + if (coveragePctg >= 75) { + return 'high'; + } + if (coveragePctg >= 50) { + return 'medium'; + } + if (coveragePctg >= 25) { + return 'low'; + } return 'terrible'; } diff --git a/lib/reporters/html.js b/lib/reporters/html.js index f0e4e6f011..00e9d58fe5 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -1,21 +1,25 @@ +/* eslint-env browser */ + /** * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils') - , Progress = require('../browser/progress') - , escape = utils.escape; +var Base = require('./base'); +var utils = require('../utils'); +var Progress = require('../browser/progress'); +var escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `HTML`. @@ -37,29 +41,27 @@ var statsTemplate = '
        ' /** * Initialize a new `HTML` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function HTML(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total - , stat = fragment(statsTemplate) - , items = stat.getElementsByTagName('li') - , passes = items[1].getElementsByTagName('em')[0] - , passesLink = items[1].getElementsByTagName('a')[0] - , failures = items[2].getElementsByTagName('em')[0] - , failuresLink = items[2].getElementsByTagName('a')[0] - , duration = items[3].getElementsByTagName('em')[0] - , canvas = stat.getElementsByTagName('canvas')[0] - , report = fragment('
          ') - , stack = [report] - , progress - , ctx - , root = document.getElementById('mocha'); + var self = this; + var stats = this.stats; + var stat = fragment(statsTemplate); + var items = stat.getElementsByTagName('li'); + var passes = items[1].getElementsByTagName('em')[0]; + var passesLink = items[1].getElementsByTagName('a')[0]; + var failures = items[2].getElementsByTagName('em')[0]; + var failuresLink = items[2].getElementsByTagName('a')[0]; + var duration = items[3].getElementsByTagName('em')[0]; + var canvas = stat.getElementsByTagName('canvas')[0]; + var report = fragment('
            '); + var stack = [report]; + var progress; + var ctx; + var root = document.getElementById('mocha'); if (canvas.getContext) { var ratio = window.devicePixelRatio || 1; @@ -69,34 +71,44 @@ function HTML(runner) { canvas.height *= ratio; ctx = canvas.getContext('2d'); ctx.scale(ratio, ratio); - progress = new Progress; + progress = new Progress(); } - if (!root) return error('#mocha div missing, add it to your document'); + if (!root) { + return error('#mocha div missing, add it to your document'); + } // pass toggle - on(passesLink, 'click', function(){ + on(passesLink, 'click', function() { unhide(); - var name = /pass/.test(report.className) ? '' : ' pass'; + var name = (/pass/).test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test pass'); + if (report.className.trim()) { + hideSuitesWithout('test pass'); + } }); // failure toggle - on(failuresLink, 'click', function(){ + on(failuresLink, 'click', function() { unhide(); - var name = /fail/.test(report.className) ? '' : ' fail'; + var name = (/fail/).test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test fail'); + if (report.className.trim()) { + hideSuitesWithout('test fail'); + } }); root.appendChild(stat); root.appendChild(report); - if (progress) progress.size(40); + if (progress) { + progress.size(40); + } - runner.on('suite', function(suite){ - if (suite.root) return; + runner.on('suite', function(suite) { + if (suite.root) { + return; + } // suite var url = self.suiteURL(suite); @@ -108,40 +120,49 @@ function HTML(runner) { el.appendChild(stack[0]); }); - runner.on('suite end', function(suite){ - if (suite.root) return; + runner.on('suite end', function(suite) { + if (suite.root) { + return; + } stack.shift(); }); - runner.on('fail', function(test, err){ - if ('hook' == test.type) runner.emit('test end', test); + runner.on('fail', function(test) { + if (test.type === 'hook') { + runner.emit('test end', test); + } }); - runner.on('test end', function(test){ + runner.on('test end', function(test) { // TODO: add to stats var percent = stats.tests / this.total * 100 | 0; - if (progress) progress.update(percent).draw(ctx); + if (progress) { + progress.update(percent).draw(ctx); + } // update stats - var ms = new Date - stats.start; + var ms = new Date() - stats.start; text(passes, stats.passes); text(failures, stats.failures); text(duration, (ms / 1000).toFixed(2)); // test - if ('passed' == test.state) { + var el; + if (test.state === 'passed') { var url = self.testURL(test); - var el = fragment('
          • %e%ems

          • ', test.speed, test.title, test.duration, url); + el = fragment('
          • %e%ems

          • ', test.speed, test.title, test.duration, url); } else if (test.pending) { - var el = fragment('
          • %e

          • ', test.title); + el = fragment('
          • %e

          • ', test.title); } else { - var el = fragment('
          • %e

          • ', test.title, self.testURL(test)); - var stackString, // Note: Includes leading newline - message = test.err.toString(); + el = fragment('
          • %e

          • ', test.title, self.testURL(test)); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we // check for the result of the stringifying. - if ('[object Error]' === message) message = test.err.message; + if (message === '[object Error]') { + message = test.err.message; + } if (test.err.stack) { var indexOfMessage = test.err.stack.indexOf(test.err.message); @@ -152,7 +173,7 @@ function HTML(runner) { } } else if (test.err.sourceURL && test.err.line !== undefined) { // Safari doesn't give you a stack. Let's at least provide a source line. - stackString = "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; } stackString = stackString || ''; @@ -171,10 +192,8 @@ function HTML(runner) { if (!test.pending) { var h2 = el.getElementsByTagName('h2')[0]; - on(h2, 'click', function(){ - pre.style.display = 'none' == pre.style.display - ? 'block' - : 'none'; + on(h2, 'click', function() { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; }); var pre = fragment('
            %e
            ', utils.clean(test.fn.toString())); @@ -183,16 +202,19 @@ function HTML(runner) { } // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. - if (stack[0]) stack[0].appendChild(el); + if (stack[0]) { + stack[0].appendChild(el); + } }); } /** * Makes a URL, preserving querystring ("search") parameters. + * * @param {string} s - * @returns {string} your new URL + * @return {string} A new URL. */ -var makeUrl = function makeUrl(s) { +function makeUrl(s) { var search = window.location.search; // Remove previous grep query parameter if present @@ -200,49 +222,51 @@ var makeUrl = function makeUrl(s) { search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); } - return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s); -}; + return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(s); +} /** - * Provide suite URL + * Provide suite URL. * * @param {Object} [suite] */ -HTML.prototype.suiteURL = function(suite){ +HTML.prototype.suiteURL = function(suite) { return makeUrl(suite.fullTitle()); }; /** - * Provide test URL + * Provide test URL. * * @param {Object} [test] */ - -HTML.prototype.testURL = function(test){ +HTML.prototype.testURL = function(test) { return makeUrl(test.fullTitle()); }; /** * Display error `msg`. + * + * @param {string} msg */ - function error(msg) { document.body.appendChild(fragment('
            %s
            ', msg)); } /** * Return a DOM fragment from `html`. + * + * @param {string} html */ - function fragment(html) { - var args = arguments - , div = document.createElement('div') - , i = 1; + var args = arguments; + var div = document.createElement('div'); + var i = 1; - div.innerHTML = html.replace(/%([se])/g, function(_, type){ + div.innerHTML = html.replace(/%([se])/g, function(_, type) { switch (type) { case 's': return String(args[i++]); case 'e': return escape(args[i++]); + // no default } }); @@ -250,22 +274,23 @@ function fragment(html) { } /** - * Check for suites that do not have elements - * with `classname`, and hide them. + * Check for suites that do not have elements with `classname`, and hide them. + * + * @param {text} classname */ - function hideSuitesWithout(classname) { var suites = document.getElementsByClassName('suite'); for (var i = 0; i < suites.length; i++) { var els = suites[i].getElementsByClassName(classname); - if (0 == els.length) suites[i].className += ' hidden'; + if (!els.length) { + suites[i].className += ' hidden'; + } } } /** * Unhide .hidden suites. */ - function unhide() { var els = document.getElementsByClassName('suite hidden'); for (var i = 0; i < els.length; ++i) { @@ -274,21 +299,22 @@ function unhide() { } /** - * Set `el` text to `str`. + * Set an element's text contents. + * + * @param {HTMLElement} el + * @param {string} contents */ - -function text(el, str) { +function text(el, contents) { if (el.textContent) { - el.textContent = str; + el.textContent = contents; } else { - el.innerText = str; + el.innerText = contents; } } /** * Listen on `event` with callback `fn`. */ - function on(el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); diff --git a/lib/reporters/json-cov.js b/lib/reporters/json-cov.js index 309c0ef54a..ed444e4117 100644 --- a/lib/reporters/json-cov.js +++ b/lib/reporters/json-cov.js @@ -13,42 +13,42 @@ exports = module.exports = JSONCov; /** * Initialize a new `JsCoverage` reporter. * - * @param {Runner} runner - * @param {Boolean} output * @api public + * @param {Runner} runner + * @param {boolean} output */ - function JSONCov(runner, output) { - var self = this - , output = 1 == arguments.length ? true : output; - Base.call(this, runner); - var tests = [] - , failures = [] - , passes = []; + output = arguments.length === 1 || output; + var self = this; + var tests = []; + var failures = []; + var passes = []; - runner.on('test end', function(test){ + runner.on('test end', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { failures.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { var cov = global._$jscoverage || {}; var result = self.cov = map(cov); result.stats = self.stats; result.tests = tests.map(clean); result.failures = failures.map(clean); result.passes = passes.map(clean); - if (!output) return; - process.stdout.write(JSON.stringify(result, null, 2 )); + if (!output) { + return; + } + process.stdout.write(JSON.stringify(result, null, 2)); }); } @@ -56,27 +56,29 @@ function JSONCov(runner, output) { * Map jscoverage data to a JSON structure * suitable for reporting. * + * @api private * @param {Object} cov * @return {Object} - * @api private */ function map(cov) { var ret = { - instrumentation: 'node-jscoverage' - , sloc: 0 - , hits: 0 - , misses: 0 - , coverage: 0 - , files: [] + instrumentation: 'node-jscoverage', + sloc: 0, + hits: 0, + misses: 0, + coverage: 0, + files: [] }; for (var filename in cov) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; + if (Object.prototype.hasOwnProperty.call(cov, filename)) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } } ret.files.sort(function(a, b) { @@ -94,12 +96,11 @@ function map(cov) { * Map jscoverage data for a single source file * to a JSON structure suitable for reporting. * - * @param {String} filename name of the source file + * @api private + * @param {string} filename name of the source file * @param {Object} data jscoverage coverage data * @return {Object} - * @api private */ - function coverage(filename, data) { var ret = { filename: filename, @@ -110,7 +111,7 @@ function coverage(filename, data) { source: {} }; - data.source.forEach(function(line, num){ + data.source.forEach(function(line, num) { num++; if (data[num] === 0) { @@ -122,10 +123,8 @@ function coverage(filename, data) { } ret.source[num] = { - source: line - , coverage: data[num] === undefined - ? '' - : data[num] + source: line, + coverage: data[num] === undefined ? '' : data[num] }; }); @@ -138,15 +137,14 @@ function coverage(filename, data) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } + duration: test.duration, + fullTitle: test.fullTitle(), + title: test.title + }; } diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js index 8fd91ce72c..c8f0e11302 100644 --- a/lib/reporters/json-stream.js +++ b/lib/reporters/json-stream.js @@ -2,8 +2,7 @@ * Module dependencies. */ -var Base = require('./base') - , color = Base.color; +var Base = require('./base'); /** * Expose `List`. @@ -14,33 +13,31 @@ exports = module.exports = List; /** * Initialize a new `List` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function List(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total; + var self = this; + var total = runner.total; - runner.on('start', function(){ + runner.on('start', function() { console.log(JSON.stringify(['start', { total: total }])); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { console.log(JSON.stringify(['pass', clean(test)])); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { test = clean(test); test.err = err.message; test.stack = err.stack || null; console.log(JSON.stringify(['fail', test])); }); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write(JSON.stringify(['end', self.stats])); }); } @@ -49,15 +46,14 @@ function List(runner) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } + title: test.title, + fullTitle: test.fullTitle(), + duration: test.duration + }; } diff --git a/lib/reporters/json.js b/lib/reporters/json.js index f565506c6e..35b760e25a 100644 --- a/lib/reporters/json.js +++ b/lib/reporters/json.js @@ -2,9 +2,7 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); /** * Expose `JSON`. @@ -15,36 +13,35 @@ exports = module.exports = JSONReporter; /** * Initialize a new `JSON` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function JSONReporter(runner) { - var self = this; Base.call(this, runner); - var tests = [] - , pending = [] - , failures = [] - , passes = []; + var self = this; + var tests = []; + var pending = []; + var failures = []; + var passes = []; - runner.on('test end', function(test){ + runner.on('test end', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { failures.push(test); }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { pending.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { var obj = { stats: self.stats, tests: tests.map(clean), @@ -63,26 +60,26 @@ function JSONReporter(runner) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { title: test.title, fullTitle: test.fullTitle(), duration: test.duration, err: errorJSON(test.err || {}) - } + }; } /** * Transform `error` into a JSON object. + * + * @api private * @param {Error} err * @return {Object} */ - function errorJSON(err) { var res = {}; Object.getOwnPropertyNames(err).forEach(function(key) { diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index ee004a20aa..1dd952cb7d 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -2,9 +2,9 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var cursor = Base.cursor; +var color = Base.color; /** * Expose `Landing`. @@ -33,56 +33,52 @@ Base.colors.runway = 90; /** * Initialize a new `Landing` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Landing(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; + var self = this; + var width = Base.window.width * .75 | 0; + var total = runner.total; + var stream = process.stdout; + var plane = color('plane', '✈'); + var crashed = -1; + var n = 0; function runway() { var buf = Array(width).join('-'); return ' ' + color('runway', buf); } - runner.on('start', function(){ + runner.on('start', function() { stream.write('\n\n\n '); cursor.hide(); }); - runner.on('test end', function(test){ + runner.on('test end', function(test) { // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; + var col = crashed === -1 ? width * ++n / total | 0 : crashed; // show the crash - if ('failed' == test.state) { + if (test.state === 'failed') { plane = color('plane crash', '✈'); crashed = col; } // render landing strip - stream.write('\u001b['+(width+1)+'D\u001b[2A'); + stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); stream.write(runway()); stream.write('\n '); stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) + stream.write(plane); stream.write(color('runway', Array(width - col).join('⋅') + '\n')); stream.write(runway()); stream.write('\u001b[0m'); }); - runner.on('end', function(){ + runner.on('end', function() { cursor.show(); console.log(); self.epilogue(); diff --git a/lib/reporters/list.js b/lib/reporters/list.js index f64367a410..5f6d37e8b1 100644 --- a/lib/reporters/list.js +++ b/lib/reporters/list.js @@ -2,9 +2,9 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `List`. @@ -15,40 +15,38 @@ exports = module.exports = List; /** * Initialize a new `List` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function List(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , n = 0; + var self = this; + var n = 0; - runner.on('start', function(){ + runner.on('start', function() { console.log(); }); - runner.on('test', function(test){ + runner.on('test', function(test) { process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { var fmt = color('checkmark', ' -') + color('pending', ' %s'); console.log(fmt, test.fullTitle()); }); - runner.on('pass', function(test){ - var fmt = color('checkmark', ' '+Base.symbols.dot) + runner.on('pass', function(test) { + var fmt = color('checkmark', ' ' + Base.symbols.dot) + color('pass', ' %s: ') + color(test.speed, '%dms'); cursor.CR(); console.log(fmt, test.fullTitle(), test.duration); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test) { cursor.CR(); console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); }); diff --git a/lib/reporters/markdown.js b/lib/reporters/markdown.js index e14174c30e..ac054506b7 100644 --- a/lib/reporters/markdown.js +++ b/lib/reporters/markdown.js @@ -2,8 +2,8 @@ * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils'); +var Base = require('./base'); +var utils = require('../utils'); /** * Constants @@ -20,33 +20,28 @@ exports = module.exports = Markdown; /** * Initialize a new `Markdown` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Markdown(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , level = 0 - , buf = ''; + var level = 0; + var buf = ''; function title(str) { return Array(level).join('#') + ' ' + str; } - function indent() { - return Array(level).join(' '); - } - function mapTOC(suite, obj) { - var ret = obj, - key = SUITE_PREFIX + suite.title; + var ret = obj; + var key = SUITE_PREFIX + suite.title; + obj = obj[key] = obj[key] || { suite: suite }; - suite.suites.forEach(function(suite){ + suite.suites.forEach(function() { mapTOC(suite, obj); }); + return ret; } @@ -55,7 +50,9 @@ function Markdown(runner) { var buf = ''; var link; for (var key in obj) { - if ('suite' == key) continue; + if (key === 'suite') { + continue; + } if (key !== SUITE_PREFIX) { link = ' - [' + key.substring(1) + ']'; link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; @@ -73,18 +70,18 @@ function Markdown(runner) { generateTOC(runner.suite); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { ++level; var slug = utils.slug(suite.fullTitle()); buf += '' + '\n'; buf += title(suite.title) + '\n'; }); - runner.on('suite end', function(suite){ + runner.on('suite end', function() { --level; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { var code = utils.clean(test.fn.toString()); buf += test.title + '.\n'; buf += '\n```js\n'; @@ -92,7 +89,7 @@ function Markdown(runner) { buf += '```\n\n'; }); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write('# TOC\n'); process.stdout.write(generateTOC(runner.suite)); process.stdout.write(buf); diff --git a/lib/reporters/min.js b/lib/reporters/min.js index ce1a3fef12..f0b85578d0 100644 --- a/lib/reporters/min.js +++ b/lib/reporters/min.js @@ -13,14 +13,13 @@ exports = module.exports = Min; /** * Initialize a new `Min` minimal test reporter (best used with --watch). * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Min(runner) { Base.call(this, runner); - runner.on('start', function(){ + runner.on('start', function() { // clear screen process.stdout.write('\u001b[2J'); // set cursor position diff --git a/lib/reporters/nyan.js b/lib/reporters/nyan.js index 63056b1777..21b7749868 100644 --- a/lib/reporters/nyan.js +++ b/lib/reporters/nyan.js @@ -19,39 +19,41 @@ exports = module.exports = NyanCat; function NyanCat(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , rainbowColors = this.rainbowColors = self.generateColors() - , colorIndex = this.colorIndex = 0 - , numerOfLines = this.numberOfLines = 4 - , trajectories = this.trajectories = [[], [], [], []] - , nyanCatWidth = this.nyanCatWidth = 11 - , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) - , scoreboardWidth = this.scoreboardWidth = 5 - , tick = this.tick = 0 - , n = 0; - - runner.on('start', function(){ + + var self = this; + var width = Base.window.width * .75 | 0; + var nyanCatWidth = this.nyanCatWidth = 11; + + this.colorIndex = 0; + this.numberOfLines = 4; + this.rainbowColors = self.generateColors(); + this.scoreboardWidth = 5; + this.tick = 0; + this.trajectories = [[], [], [], []]; + this.trajectoryWidthMax = (width - nyanCatWidth); + + runner.on('start', function() { Base.cursor.hide(); self.draw(); }); - runner.on('pending', function(test){ + runner.on('pending', function() { self.draw(); }); - runner.on('pass', function(test){ + runner.on('pass', function() { self.draw(); }); - runner.on('fail', function(test, err){ + runner.on('fail', function() { self.draw(); }); - runner.on('end', function(){ + runner.on('end', function() { Base.cursor.show(); - for (var i = 0; i < self.numberOfLines; i++) write('\n'); + for (var i = 0; i < self.numberOfLines; i++) { + write('\n'); + } self.epilogue(); }); } @@ -62,7 +64,7 @@ function NyanCat(runner) { * @api private */ -NyanCat.prototype.draw = function(){ +NyanCat.prototype.draw = function() { this.appendRainbow(); this.drawScoreboard(); this.drawRainbow(); @@ -77,7 +79,7 @@ NyanCat.prototype.draw = function(){ * @api private */ -NyanCat.prototype.drawScoreboard = function(){ +NyanCat.prototype.drawScoreboard = function() { var stats = this.stats; function draw(type, n) { @@ -100,13 +102,15 @@ NyanCat.prototype.drawScoreboard = function(){ * @api private */ -NyanCat.prototype.appendRainbow = function(){ +NyanCat.prototype.appendRainbow = function() { var segment = this.tick ? '_' : '-'; var rainbowified = this.rainbowify(segment); for (var index = 0; index < this.numberOfLines; index++) { var trajectory = this.trajectories[index]; - if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + if (trajectory.length >= this.trajectoryWidthMax) { + trajectory.shift(); + } trajectory.push(rainbowified); } }; @@ -117,10 +121,10 @@ NyanCat.prototype.appendRainbow = function(){ * @api private */ -NyanCat.prototype.drawRainbow = function(){ +NyanCat.prototype.drawRainbow = function() { var self = this; - this.trajectories.forEach(function(line, index) { + this.trajectories.forEach(function(line) { write('\u001b[' + self.scoreboardWidth + 'C'); write(line.join('')); write('\n'); @@ -134,7 +138,6 @@ NyanCat.prototype.drawRainbow = function(){ * * @api private */ - NyanCat.prototype.drawNyanCat = function() { var self = this; var startWidth = this.scoreboardWidth + this.trajectories[0].length; @@ -153,7 +156,6 @@ NyanCat.prototype.drawNyanCat = function() { write(dist); padding = self.tick ? '_' : '__'; var tail = self.tick ? '~' : '^'; - var face; write(tail + '|' + padding + this.face() + ' '); write('\n'); @@ -168,8 +170,8 @@ NyanCat.prototype.drawNyanCat = function() { /** * Draw nyan cat face. * - * @return {String} * @api private + * @return {string} */ NyanCat.prototype.face = function() { @@ -178,18 +180,17 @@ NyanCat.prototype.face = function() { return '( x .x)'; } else if (stats.pending) { return '( o .o)'; - } else if(stats.passes) { + } else if (stats.passes) { return '( ^ .^)'; - } else { - return '( - .-)'; } + return '( - .-)'; }; /** * Move cursor up `n`. * - * @param {Number} n * @api private + * @param {number} n */ NyanCat.prototype.cursorUp = function(n) { @@ -199,8 +200,8 @@ NyanCat.prototype.cursorUp = function(n) { /** * Move cursor down `n`. * - * @param {Number} n * @api private + * @param {number} n */ NyanCat.prototype.cursorDown = function(n) { @@ -210,11 +211,10 @@ NyanCat.prototype.cursorDown = function(n) { /** * Generate rainbow colors. * - * @return {Array} * @api private + * @return {Array} */ - -NyanCat.prototype.generateColors = function(){ +NyanCat.prototype.generateColors = function() { var colors = []; for (var i = 0; i < (6 * 7); i++) { @@ -232,14 +232,14 @@ NyanCat.prototype.generateColors = function(){ /** * Apply rainbow to the given `str`. * - * @param {String} str - * @return {String} * @api private + * @param {string} str + * @return {string} */ - -NyanCat.prototype.rainbowify = function(str){ - if (!Base.useColors) +NyanCat.prototype.rainbowify = function(str) { + if (!Base.useColors) { return str; + } var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; this.colorIndex += 1; return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; @@ -247,8 +247,9 @@ NyanCat.prototype.rainbowify = function(str){ /** * Stdout helper. + * + * @param {string} string A message to write to stdout. */ - function write(string) { process.stdout.write(string); } diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 2debb94541..29c6785451 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -2,9 +2,9 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `Progress`. @@ -21,24 +21,21 @@ Base.colors.progress = 90; /** * Initialize a new `Progress` bar test reporter. * + * @api public * @param {Runner} runner * @param {Object} options - * @api public */ - function Progress(runner, options) { Base.call(this, runner); - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max - , lastN = -1; + var self = this; + var width = Base.window.width * .50 | 0; + var total = runner.total; + var complete = 0; + var lastN = -1; // default chars + options = options || {}; options.open = options.open || '['; options.complete = options.complete || '▬'; options.incomplete = options.incomplete || Base.symbols.dot; @@ -46,20 +43,20 @@ function Progress(runner, options) { options.verbose = false; // tests started - runner.on('start', function(){ + runner.on('start', function() { console.log(); cursor.hide(); }); // tests complete - runner.on('test end', function(){ + runner.on('test end', function() { complete++; - var incomplete = total - complete - , percent = complete / total - , n = width * percent | 0 - , i = width - n; - if (lastN === n && !options.verbose) { + var percent = complete / total; + var n = width * percent | 0; + var i = width - n; + + if (n === lastN && !options.verbose) { // Don't re-render the line if it hasn't changed return; } @@ -78,7 +75,7 @@ function Progress(runner, options) { // tests are complete, output some stats // and the failures if any - runner.on('end', function(){ + runner.on('end', function() { cursor.show(); console.log(); self.epilogue(); diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index 3debffe26f..1b447c1738 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -2,9 +2,9 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `Spec`. @@ -15,50 +15,51 @@ exports = module.exports = Spec; /** * Initialize a new `Spec` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Spec(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , indents = 0 - , n = 0; + var self = this; + var indents = 0; + var n = 0; function indent() { - return Array(indents).join(' ') + return Array(indents).join(' '); } - runner.on('start', function(){ + runner.on('start', function() { console.log(); }); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { ++indents; console.log(color('suite', '%s%s'), indent(), suite.title); }); - runner.on('suite end', function(suite){ + runner.on('suite end', function() { --indents; - if (1 == indents) console.log(); + if (indents === 1) { + console.log(); + } }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { var fmt = indent() + color('pending', ' - %s'); console.log(fmt, test.title); }); - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() + runner.on('pass', function(test) { + var fmt; + if (test.speed === 'fast') { + fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); cursor.CR(); console.log(fmt, test.title); } else { - var fmt = indent() + fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); @@ -67,7 +68,7 @@ function Spec(runner) { } }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test) { cursor.CR(); console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); diff --git a/lib/reporters/tap.js b/lib/reporters/tap.js index 01a92eb076..d9b1b953aa 100644 --- a/lib/reporters/tap.js +++ b/lib/reporters/tap.js @@ -2,9 +2,7 @@ * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); /** * Expose `TAP`. @@ -15,44 +13,43 @@ exports = module.exports = TAP; /** * Initialize a new `TAP` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function TAP(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , n = 1 - , passes = 0 - , failures = 0; + var n = 1; + var passes = 0; + var failures = 0; - runner.on('start', function(){ + runner.on('start', function() { var total = runner.grepTotal(runner.suite); console.log('%d..%d', 1, total); }); - runner.on('test end', function(){ + runner.on('test end', function() { ++n; }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { console.log('ok %d %s # SKIP -', n, title(test)); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes++; console.log('ok %d %s', n, title(test)); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { failures++; console.log('not ok %d %s', n, title(test)); - if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + if (err.stack) { + console.log(err.stack.replace(/^/gm, ' ')); + } }); - runner.on('end', function(){ + runner.on('end', function() { console.log('# tests ' + (passes + failures)); console.log('# pass ' + passes); console.log('# fail ' + failures); @@ -62,11 +59,10 @@ function TAP(runner) { /** * Return a TAP-safe title of `test` * + * @api private * @param {Object} test * @return {String} - * @api private */ - function title(test) { return test.fullTitle().replace(/#/g, ''); } diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 77cd347094..8286cd3f52 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -2,20 +2,21 @@ * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils') - , fs = require('fs') - , escape = utils.escape; +var Base = require('./base'); +var fs = require('fs'); +var escape = require('../utils').escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `XUnit`. @@ -26,62 +27,68 @@ exports = module.exports = XUnit; /** * Initialize a new `XUnit` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function XUnit(runner, options) { Base.call(this, runner); - var stats = this.stats - , tests = [] - , self = this; + + var stats = this.stats; + var tests = []; + var self = this; if (options.reporterOptions && options.reporterOptions.output) { - if (! fs.createWriteStream) { - throw new Error('file output not supported in browser'); - } - self.fileStream = fs.createWriteStream(options.reporterOptions.output); + if (!fs.createWriteStream) { + throw new Error('file output not supported in browser'); + } + self.fileStream = fs.createWriteStream(options.reporterOptions.output); } - runner.on('pending', function(test){ + runner.on('pending', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { tests.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { tests.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { self.write(tag('testsuite', { - name: 'Mocha Tests' - , tests: stats.tests - , failures: stats.failures - , errors: stats.failures - , skipped: stats.tests - stats.failures - stats.passes - , timestamp: (new Date).toUTCString() - , time: (stats.duration / 1000) || 0 + name: 'Mocha Tests', + tests: stats.tests, + failures: stats.failures, + errors: stats.failures, + skipped: stats.tests - stats.failures - stats.passes, + timestamp: (new Date()).toUTCString(), + time: (stats.duration / 1000) || 0 }, false)); - tests.forEach(function(t) { self.test(t); }); + tests.forEach(function(t) { + self.test(t); + }); + self.write(''); }); } /** * Override done to close the stream (if it's a file). + * + * @param failures + * @param {Function} fn */ XUnit.prototype.done = function(failures, fn) { - if (this.fileStream) { - this.fileStream.end(function() { - fn(failures); - }); - } else { - fn(failures); - } + if (this.fileStream) { + this.fileStream.end(function() { + fn(failures); + }); + } else { + fn(failures); + } }; /** @@ -91,52 +98,64 @@ XUnit.prototype.done = function(failures, fn) { XUnit.prototype.__proto__ = Base.prototype; /** - * Write out the given line + * Write out the given line. + * + * @param {string} line */ XUnit.prototype.write = function(line) { - if (this.fileStream) { - this.fileStream.write(line + '\n'); - } else { - console.log(line); - } + if (this.fileStream) { + this.fileStream.write(line + '\n'); + } else { + console.log(line); + } }; /** * Output tag for the given `test.` + * + * @param {Test} test */ - -XUnit.prototype.test = function(test, ostream) { +XUnit.prototype.test = function(test) { var attrs = { - classname: test.parent.fullTitle() - , name: test.title - , time: (test.duration / 1000) || 0 + classname: test.parent.fullTitle(), + name: test.title, + time: (test.duration / 1000) || 0 }; - if ('failed' == test.state) { + if (test.state === 'failed') { var err = test.err; - this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + "\n" + err.stack)))); + this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\n' + err.stack)))); } else if (test.pending) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { - this.write(tag('testcase', attrs, true) ); + this.write(tag('testcase', attrs, true)); } }; /** * HTML tag helper. + * + * @param name + * @param attrs + * @param close + * @param content + * @return {string} */ - function tag(name, attrs, close, content) { - var end = close ? '/>' : '>' - , pairs = [] - , tag; + var end = close ? '/>' : '>'; + var pairs = []; + var tag; for (var key in attrs) { - pairs.push(key + '="' + escape(attrs[key]) + '"'); + if (Object.prototype.hasOwnProperty.call(attrs, key)) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } } tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; - if (content) tag += content + ''; - if ('ctx' == key) return '#'; +Runnable.prototype.inspect = function() { + return JSON.stringify(this, function(key, val) { + if (key[0] === '_') { + return; + } + if (key === 'parent') { + return '#'; + } + if (key === 'ctx') { + return '#'; + } return val; }, 2); }; @@ -158,50 +172,56 @@ Runnable.prototype.inspect = function(){ * * @api private */ - -Runnable.prototype.resetTimeout = function(){ +Runnable.prototype.resetTimeout = function() { var self = this; var ms = this.timeout() || 1e9; - if (!this._enableTimeouts) return; + if (!this._enableTimeouts) { + return; + } this.clearTimeout(); - this.timer = setTimeout(function(){ - if (!self._enableTimeouts) return; + this.timer = setTimeout(function() { + if (!self._enableTimeouts) { + return; + } self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.')); self.timedOut = true; }, ms); }; /** - * Whitelist these globals for this test run + * Whitelist a list of globals for this test run. * * @api private + * @param {string[]} globals */ -Runnable.prototype.globals = function(arr){ - var self = this; - this._allowedGlobals = arr; +Runnable.prototype.globals = function(globals) { + this._allowedGlobals = globals; }; /** * Run the test and invoke `fn(err)`. * - * @param {Function} fn * @api private + * @param {Function} fn */ - -Runnable.prototype.run = function(fn){ - var self = this - , start = new Date - , ctx = this.ctx - , finished - , emitted; - - // Some times the ctx exists but it is not runnable - if (ctx && ctx.runnable) ctx.runnable(this); +Runnable.prototype.run = function(fn) { + var self = this; + var start = new Date(); + var ctx = this.ctx; + var finished; + var emitted; + + // Sometimes the ctx exists, but it is not runnable + if (ctx && ctx.runnable) { + ctx.runnable(this); + } // called multiple times function multiple(err) { - if (emitted) return; + if (emitted) { + return; + } emitted = true; self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate')); } @@ -209,13 +229,19 @@ Runnable.prototype.run = function(fn){ // finished function done(err) { var ms = self.timeout(); - if (self.timedOut) return; - if (finished) return multiple(err || self._trace); + if (self.timedOut) { + return; + } + if (finished) { + return multiple(err || self._trace); + } self.clearTimeout(); - self.duration = new Date - start; + self.duration = new Date() - start; finished = true; - if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); + if (!err && self.duration > ms && self._enableTimeouts) { + err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); + } fn(err); } @@ -227,14 +253,15 @@ Runnable.prototype.run = function(fn){ this.resetTimeout(); try { - this.fn.call(ctx, function(err){ - if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); - if (null != err) { + this.fn.call(ctx, function(err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err != null) { if (Object.prototype.toString.call(err) === '[object Object]') { return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); - } else { - return done(new Error('done() invoked with non-Error: ' + err)); } + return done(new Error('done() invoked with non-Error: ' + err)); } done(); }); @@ -265,10 +292,10 @@ Runnable.prototype.run = function(fn){ self.resetTimeout(); result .then(function() { - done() + done(); }, function(reason) { - done(reason || new Error('Promise rejected with no or falsy reason')) + done(reason || new Error('Promise rejected with no or falsy reason')); }); } else { done(); diff --git a/lib/runner.js b/lib/runner.js index 23ddaf23b4..353ff0cc46 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -2,16 +2,16 @@ * Module dependencies. */ -var EventEmitter = require('events').EventEmitter - , debug = require('debug')('mocha:runner') - , Pending = require('./pending') - , Test = require('./test') - , utils = require('./utils') - , filter = utils.filter - , keys = utils.keys - , type = utils.type - , stringify = utils.stringify - , stackFilter = utils.stackTraceFilter(); +var EventEmitter = require('events').EventEmitter; +var Pending = require('./pending'); +var debug = require('debug')('mocha:runner'); +var filter = require('./utils').filter; +var indexOf = require('./utils').indexOf; +var keys = require('./utils').keys; +var stackFilter = require('./utils').stackTraceFilter(); +var stringify = require('./utils').stringify; +var type = require('./utils').type; +var undefinedError = require('./utils').undefinedError; /** * Non-enumerable globals. @@ -51,12 +51,11 @@ module.exports = Runner; * - `fail` (test, err) test failed * - `pending` (test) test pending * + * @api public * @param {Suite} suite Root suite * @param {boolean} [delay] Whether or not to delay execution of root suite - * until ready. - * @api public + * until ready. */ - function Runner(suite, delay) { var self = this; this._globals = []; @@ -65,8 +64,12 @@ function Runner(suite, delay) { this.suite = suite; this.total = suite.total(); this.failures = 0; - this.on('test end', function(test){ self.checkGlobals(test); }); - this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.on('test end', function(test) { + self.checkGlobals(test); + }); + this.on('hook end', function(hook) { + self.checkGlobals(hook); + }); this.grep(/.*/); this.globals(this.globalProps().concat(extraGlobals())); } @@ -74,10 +77,9 @@ function Runner(suite, delay) { /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * - * @param {Function} fn * @api private + * @param {Function} fn */ - Runner.immediately = global.setImmediate || process.nextTick; /** @@ -90,13 +92,12 @@ Runner.prototype.__proto__ = EventEmitter.prototype; * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * - * @param {RegExp} re - * @param {Boolean} invert - * @return {Runner} for chaining * @api public + * @param {RegExp} re + * @param {boolean} invert + * @return {Runner} Runner instance. */ - -Runner.prototype.grep = function(re, invert){ +Runner.prototype.grep = function(re, invert) { debug('grep %s', re); this._grep = re; this._invert = invert; @@ -108,19 +109,22 @@ Runner.prototype.grep = function(re, invert){ * Returns the number of tests matching the grep search for the * given suite. * - * @param {Suite} suite - * @return {Number} * @api public + * @param {Suite} suite + * @return {number} */ - Runner.prototype.grepTotal = function(suite) { var self = this; var total = 0; - suite.eachTest(function(test){ + suite.eachTest(function(test) { var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (match) total++; + if (self._invert) { + match = !match; + } + if (match) { + total++; + } }); return total; @@ -129,16 +133,17 @@ Runner.prototype.grepTotal = function(suite) { /** * Return a list of global properties. * - * @return {Array} * @api private + * @return {Array} */ - Runner.prototype.globalProps = function() { - var props = utils.keys(global); + var props = keys(global); // non-enumerables for (var i = 0; i < globals.length; ++i) { - if (~utils.indexOf(props, globals[i])) continue; + if (~indexOf(props, globals[i])) { + continue; + } props.push(globals[i]); } @@ -148,13 +153,14 @@ Runner.prototype.globalProps = function() { /** * Allow the given `arr` of globals. * - * @param {Array} arr - * @return {Runner} for chaining * @api public + * @param {Array} arr + * @return {Runner} Runner instance. */ - -Runner.prototype.globals = function(arr){ - if (0 == arguments.length) return this._globals; +Runner.prototype.globals = function(arr) { + if (!arguments.length) { + return this._globals; + } debug('globals %j', arr); this._globals = this._globals.concat(arr); return this; @@ -165,9 +171,10 @@ Runner.prototype.globals = function(arr){ * * @api private */ - -Runner.prototype.checkGlobals = function(test){ - if (this.ignoreLeaks) return; +Runner.prototype.checkGlobals = function(test) { + if (this.ignoreLeaks) { + return; + } var ok = this._globals; var globals = this.globalProps(); @@ -177,7 +184,9 @@ Runner.prototype.checkGlobals = function(test){ ok = ok.concat(test._allowedGlobals || []); } - if(this.prevGlobalsLength == globals.length) return; + if (this.prevGlobalsLength === globals.length) { + return; + } this.prevGlobalsLength = globals.length; leaks = filterLeaks(ok, globals); @@ -193,11 +202,10 @@ Runner.prototype.checkGlobals = function(test){ /** * Fail the given `test`. * + * @api private * @param {Test} test * @param {Error} err - * @api private */ - Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; @@ -229,12 +237,11 @@ Runner.prototype.fail = function(test, err) { * suite and subsuites, but executes other `after each` * hooks * + * @api private * @param {Hook} hook * @param {Error} err - * @api private */ - -Runner.prototype.failHook = function(hook, err){ +Runner.prototype.failHook = function(hook, err) { this.fail(hook, err); if (this.suite.bail()) { this.emit('end'); @@ -244,34 +251,36 @@ Runner.prototype.failHook = function(hook, err){ /** * Run hook `name` callbacks and then invoke `fn()`. * - * @param {String} name - * @param {Function} function * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , hooks = suite['_' + name] - , self = this - , timer; +Runner.prototype.hook = function(name, fn) { + var suite = this.suite; + var hooks = suite['_' + name]; + var self = this; function next(i) { var hook = hooks[i]; - if (!hook) return fn(); + if (!hook) { + return fn(); + } self.currentRunnable = hook; hook.ctx.currentTest = self.test; self.emit('hook', hook); - hook.on('error', function(err){ + hook.on('error', function(err) { self.failHook(hook, err); }); - hook.run(function(err){ + hook.run(function(err) { hook.removeAllListeners('error'); var testError = hook.error(); - if (testError) self.fail(self.test, testError); + if (testError) { + self.fail(self.test, testError); + } if (err) { if (err instanceof Pending) { suite.pending = true; @@ -288,7 +297,7 @@ Runner.prototype.hook = function(name, fn){ }); } - Runner.immediately(function(){ + Runner.immediately(function() { next(0); }); }; @@ -297,15 +306,14 @@ Runner.prototype.hook = function(name, fn){ * Run hook `name` for the given array of `suites` * in order, and callback `fn(err, errSuite)`. * - * @param {String} name + * @api private + * @param {string} name * @param {Array} suites * @param {Function} fn - * @api private */ - -Runner.prototype.hooks = function(name, suites, fn){ - var self = this - , orig = this.suite; +Runner.prototype.hooks = function(name, suites, fn) { + var self = this; + var orig = this.suite; function next(suite) { self.suite = suite; @@ -315,7 +323,7 @@ Runner.prototype.hooks = function(name, suites, fn){ return fn(); } - self.hook(name, function(err){ + self.hook(name, function(err) { if (err) { var errSuite = self.suite; self.suite = orig; @@ -332,12 +340,11 @@ Runner.prototype.hooks = function(name, suites, fn){ /** * Run hooks from the top level down. * - * @param {String} name - * @param {Function} fn * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hookUp = function(name, fn){ +Runner.prototype.hookUp = function(name, fn) { var suites = [this.suite].concat(this.parents()).reverse(); this.hooks(name, suites, fn); }; @@ -345,12 +352,11 @@ Runner.prototype.hookUp = function(name, fn){ /** * Run hooks from the bottom up. * - * @param {String} name - * @param {Function} fn * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hookDown = function(name, fn){ +Runner.prototype.hookDown = function(name, fn) { var suites = [this.suite].concat(this.parents()); this.hooks(name, suites, fn); }; @@ -359,32 +365,34 @@ Runner.prototype.hookDown = function(name, fn){ * Return an array of parent Suites from * closest to furthest. * - * @return {Array} * @api private + * @return {Array} */ - -Runner.prototype.parents = function(){ - var suite = this.suite - , suites = []; - while (suite = suite.parent) suites.push(suite); +Runner.prototype.parents = function() { + var suite = this.suite; + var suites = []; + while (suite = suite.parent) { + suites.push(suite); + } return suites; }; /** * Run the current test and callback `fn(err)`. * - * @param {Function} fn * @api private + * @param {Function} fn */ +Runner.prototype.runTest = function(fn) { + var self = this; + var test = this.test; -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - if (this.asyncOnly) test.asyncOnly = true; + if (this.asyncOnly) { + test.asyncOnly = true; + } try { - test.on('error', function(err){ + test.on('error', function(err) { self.fail(test, err); }); test.run(fn); @@ -394,21 +402,18 @@ Runner.prototype.runTest = function(fn){ }; /** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. + * Run tests in the given `suite` and invoke the callback `fn()` when complete. * + * @api private * @param {Suite} suite * @param {Function} fn - * @api private */ +Runner.prototype.runTests = function(suite, fn) { + var self = this; + var tests = suite.tests.slice(); + var test; -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests.slice() - , test; - - - function hookErr(err, errSuite, after) { + function hookErr(_, errSuite, after) { // before/after Each hook for errSuite failed: var orig = self.suite; @@ -421,7 +426,9 @@ Runner.prototype.runTests = function(suite, fn){ self.hookUp('afterEach', function(err2, errSuite2) { self.suite = orig; // some hooks may fail even now - if (err2) return hookErr(err2, errSuite2, true); + if (err2) { + return hookErr(err2, errSuite2, true); + } // report error suite fn(errSuite); }); @@ -434,22 +441,34 @@ Runner.prototype.runTests = function(suite, fn){ function next(err, errSuite) { // if we bail after first err - if (self.failures && suite._bail) return fn(); + if (self.failures && suite._bail) { + return fn(); + } - if (self._abort) return fn(); + if (self._abort) { + return fn(); + } - if (err) return hookErr(err, errSuite, true); + if (err) { + return hookErr(err, errSuite, true); + } // next test test = tests.shift(); // all done - if (!test) return fn(); + if (!test) { + return fn(); + } // grep var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (!match) return next(); + if (self._invert) { + match = !match; + } + if (!match) { + return next(); + } // pending if (test.pending) { @@ -460,17 +479,17 @@ Runner.prototype.runTests = function(suite, fn){ // execute test and hook(s) self.emit('test', self.test = test); - self.hookDown('beforeEach', function(err, errSuite){ - + self.hookDown('beforeEach', function(err, errSuite) { if (suite.pending) { self.emit('pending', test); self.emit('test end', test); return next(); } - if (err) return hookErr(err, errSuite, false); - + if (err) { + return hookErr(err, errSuite, false); + } self.currentRunnable = self.test; - self.runTest(function(err){ + self.runTest(function(err) { test = self.test; if (err) { @@ -501,56 +520,61 @@ Runner.prototype.runTests = function(suite, fn){ }; /** - * Run the given `suite` and invoke the - * callback `fn()` when complete. + * Run the given `suite` and invoke the callback `fn()` when complete. * + * @api private * @param {Suite} suite * @param {Function} fn - * @api private */ - -Runner.prototype.runSuite = function(suite, fn){ - var total = this.grepTotal(suite) - , self = this - , i = 0; +Runner.prototype.runSuite = function(suite, fn) { + var i = 0; + var self = this; + var total = this.grepTotal(suite); debug('run suite %s', suite.fullTitle()); - if (!total) return fn(); + if (!total) { + return fn(); + } this.emit('suite', this.suite = suite); function next(errSuite) { if (errSuite) { // current suite failed on a hook from errSuite - if (errSuite == suite) { + if (errSuite === suite) { // if errSuite is current suite // continue to the next sibling suite return done(); - } else { - // errSuite is among the parents of current suite - // stop execution of errSuite and all sub-suites - return done(errSuite); } + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); } - if (self._abort) return done(); + if (self._abort) { + return done(); + } var curr = suite.suites[i++]; - if (!curr) return done(); + if (!curr) { + return done(); + } self.runSuite(curr, next); } function done(errSuite) { self.suite = suite; - self.hook('afterAll', function(){ + self.hook('afterAll', function() { self.emit('suite end', suite); fn(errSuite); }); } - this.hook('beforeAll', function(err){ - if (err) return done(); + this.hook('beforeAll', function(err) { + if (err) { + return done(); + } self.runTests(suite, next); }); }; @@ -558,32 +582,35 @@ Runner.prototype.runSuite = function(suite, fn){ /** * Handle uncaught exceptions. * - * @param {Error} err * @api private + * @param {Error} err */ - -Runner.prototype.uncaught = function(err){ +Runner.prototype.uncaught = function(err) { if (err) { - debug('uncaught exception %s', err !== function () { + debug('uncaught exception %s', err !== function() { return this; - }.call(err) ? err : ( err.message || err )); + }.call(err) ? err : (err.message || err)); } else { debug('uncaught undefined exception'); - err = utils.undefinedError(); + err = undefinedError(); } err.uncaught = true; var runnable = this.currentRunnable; - if (!runnable) return; + if (!runnable) { + return; + } runnable.clearTimeout(); // Ignore errors if complete - if (runnable.state) return; + if (runnable.state) { + return; + } this.fail(runnable, err); // recover from test - if ('test' == runnable.type) { + if (runnable.type === 'test') { this.emit('test end', runnable); this.hookUp('afterEach', this.next); return; @@ -597,24 +624,23 @@ Runner.prototype.uncaught = function(err){ * Run the root suite and invoke `fn(failures)` * on completion. * - * @param {Function} fn - * @return {Runner} for chaining * @api public + * @param {Function} fn + * @return {Runner} Runner instance. */ +Runner.prototype.run = function(fn) { + var self = this; + var rootSuite = this.suite; -Runner.prototype.run = function(fn){ - var self = this, - rootSuite = this.suite; - - fn = fn || function(){}; + fn = fn || function() {}; - function uncaught(err){ + function uncaught(err) { self.uncaught(err); } function start() { self.emit('start'); - self.runSuite(rootSuite, function(){ + self.runSuite(rootSuite, function() { debug('finished running'); self.emit('end'); }); @@ -623,7 +649,7 @@ Runner.prototype.run = function(fn){ debug('start'); // callback - this.on('end', function(){ + this.on('end', function() { debug('end'); process.removeListener('uncaughtException', uncaught); fn(self.failures); @@ -637,8 +663,7 @@ Runner.prototype.run = function(fn){ // might be nice to debounce some dots while we wait. this.emit('waiting', rootSuite); rootSuite.once('run', start); - } - else { + } else { start(); } @@ -646,71 +671,79 @@ Runner.prototype.run = function(fn){ }; /** - * Cleanly abort execution + * Cleanly abort execution. * - * @return {Runner} for chaining * @api public + * @return {Runner} Runner instance. */ -Runner.prototype.abort = function(){ +Runner.prototype.abort = function() { debug('aborting'); this._abort = true; + + return this; }; /** * Filter leaks with the given globals flagged as `ok`. * + * @api private * @param {Array} ok * @param {Array} globals * @return {Array} - * @api private */ - function filterLeaks(ok, globals) { - return filter(globals, function(key){ + return filter(globals, function(key) { // Firefox and Chrome exposes iframes as index inside the window object - if (/^d+/.test(key)) return false; + if (/^d+/.test(key)) { + return false; + } // in firefox // if runner runs in an iframe, this iframe's window.getInterface method not init at first // it is assigned in some seconds - if (global.navigator && /^getInterface/.test(key)) return false; + if (global.navigator && (/^getInterface/).test(key)) { + return false; + } // an iframe could be approached by window[iframeIndex] // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak - if (global.navigator && /^\d+/.test(key)) return false; + if (global.navigator && (/^\d+/).test(key)) { + return false; + } // Opera and IE expose global variables for HTML element IDs (issue #243) - if (/^mocha-/.test(key)) return false; + if (/^mocha-/.test(key)) { + return false; + } - var matched = filter(ok, function(ok){ - if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); - return key == ok; + var matched = filter(ok, function(ok) { + if (~ok.indexOf('*')) { + return key.indexOf(ok.split('*')[0]) === 0; + } + return key === ok; }); - return matched.length == 0 && (!global.navigator || 'onerror' !== key); + return !matched.length && (!global.navigator || key !== 'onerror'); }); } /** * Array of globals dependent on the environment. * - * @return {Array} * @api private + * @return {Array} */ - function extraGlobals() { - if (typeof(process) === 'object' && - typeof(process.version) === 'string') { - - var nodeVersion = process.version.split('.').reduce(function(a, v) { - return a << 8 | v; - }); + if (typeof process === 'object' && typeof process.version === 'string') { + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); - // 'errno' was renamed to process._errno in v0.9.11. + // 'errno' was renamed to process._errno in v0.9.11. - if (nodeVersion < 0x00090B) { - return ['errno']; - } - } + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } - return []; + return []; } diff --git a/lib/suite.js b/lib/suite.js index edc820e23a..b59b3c8ae9 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -2,11 +2,11 @@ * Module dependencies. */ -var EventEmitter = require('events').EventEmitter - , debug = require('debug')('mocha:suite') - , milliseconds = require('./ms') - , utils = require('./utils') - , Hook = require('./hook'); +var EventEmitter = require('events').EventEmitter; +var Hook = require('./hook'); +var debug = require('debug')('mocha:suite'); +var milliseconds = require('./ms'); +var utils = require('./utils'); /** * Expose `Suite`. @@ -15,41 +15,38 @@ var EventEmitter = require('events').EventEmitter exports = module.exports = Suite; /** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. + * Create a new `Suite` with the given `title` and parent `Suite`. When a suite + * with the same title is already present, that suite is returned to provide + * nicer reporter and more flexible meta-testing. * + * @api public * @param {Suite} parent - * @param {String} title + * @param {string} title * @return {Suite} - * @api public */ - -exports.create = function(parent, title){ +exports.create = function(parent, title) { var suite = new Suite(title, parent.ctx); suite.parent = parent; - if (parent.pending) suite.pending = true; + if (parent.pending) { + suite.pending = true; + } title = suite.fullTitle(); parent.addSuite(suite); return suite; }; /** - * Initialize a new `Suite` with the given - * `title` and `ctx`. + * Initialize a new `Suite` with the given `title` and `ctx`. * - * @param {String} title - * @param {Context} ctx * @api private + * @param {string} title + * @param {Context} parentContext */ - function Suite(title, parentContext) { this.title = title; - var context = function() {}; - context.prototype = parentContext; - this.ctx = new context(); + function Context() {} + Context.prototype = parentContext; + this.ctx = new Context(); this.suites = []; this.tests = []; this.pending = false; @@ -74,11 +71,10 @@ Suite.prototype.__proto__ = EventEmitter.prototype; /** * Return a clone of this `Suite`. * - * @return {Suite} * @api private + * @return {Suite} */ - -Suite.prototype.clone = function(){ +Suite.prototype.clone = function() { var suite = new Suite(this.title); debug('clone'); suite.ctx = this.ctx; @@ -92,30 +88,36 @@ Suite.prototype.clone = function(){ /** * Set timeout `ms` or short-hand such as "2s". * - * @param {Number|String} ms - * @return {Suite|Number} for chaining * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining */ - -Suite.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if (ms.toString() === '0') this._enableTimeouts = false; - if ('string' == typeof ms) ms = milliseconds(ms); +Suite.prototype.timeout = function(ms) { + if (!arguments.length) { + return this._timeout; + } + if (ms.toString() === '0') { + this._enableTimeouts = false; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('timeout %d', ms); this._timeout = parseInt(ms, 10); return this; }; /** - * Set timeout `enabled`. + * Set timeout to `enabled`. * - * @param {Boolean} enabled - * @return {Suite|Boolean} self or enabled * @api private + * @param {boolean} enabled + * @return {Suite|boolean} self or enabled */ - -Suite.prototype.enableTimeouts = function(enabled){ - if (arguments.length === 0) return this._enableTimeouts; +Suite.prototype.enableTimeouts = function(enabled) { + if (!arguments.length) { + return this._enableTimeouts; + } debug('enableTimeouts %s', enabled); this._enableTimeouts = enabled; return this; @@ -124,14 +126,17 @@ Suite.prototype.enableTimeouts = function(enabled){ /** * Set slow `ms` or short-hand such as "2s". * - * @param {Number|String} ms - * @return {Suite|Number} for chaining * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining */ - -Suite.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); +Suite.prototype.slow = function(ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('slow %d', ms); this._slow = ms; return this; @@ -140,13 +145,14 @@ Suite.prototype.slow = function(ms){ /** * Sets whether to bail after first error. * - * @param {Boolean} bail - * @return {Suite|Number} for chaining * @api private + * @param {boolean} bail + * @return {Suite|number} for chaining */ - -Suite.prototype.bail = function(bail){ - if (0 == arguments.length) return this._bail; +Suite.prototype.bail = function(bail) { + if (!arguments.length) { + return this._bail; + } debug('bail %s', bail); this._bail = bail; return this; @@ -155,14 +161,16 @@ Suite.prototype.bail = function(bail){ /** * Run `fn(test[, done])` before running tests. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.beforeAll = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.beforeAll = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -182,14 +190,16 @@ Suite.prototype.beforeAll = function(title, fn){ /** * Run `fn(test[, done])` after running tests. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.afterAll = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.afterAll = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -209,14 +219,16 @@ Suite.prototype.afterAll = function(title, fn){ /** * Run `fn(test[, done])` before each test case. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.beforeEach = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.beforeEach = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -236,14 +248,16 @@ Suite.prototype.beforeEach = function(title, fn){ /** * Run `fn(test[, done])` after each test case. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.afterEach = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.afterEach = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -263,12 +277,11 @@ Suite.prototype.afterEach = function(title, fn){ /** * Add a test `suite`. * + * @api private * @param {Suite} suite * @return {Suite} for chaining - * @api private */ - -Suite.prototype.addSuite = function(suite){ +Suite.prototype.addSuite = function(suite) { suite.parent = this; suite.timeout(this.timeout()); suite.enableTimeouts(this.enableTimeouts()); @@ -282,12 +295,11 @@ Suite.prototype.addSuite = function(suite){ /** * Add a `test` to this suite. * + * @api private * @param {Test} test * @return {Suite} for chaining - * @api private */ - -Suite.prototype.addTest = function(test){ +Suite.prototype.addTest = function(test) { test.parent = this; test.timeout(this.timeout()); test.enableTimeouts(this.enableTimeouts()); @@ -299,17 +311,18 @@ Suite.prototype.addTest = function(test){ }; /** - * Return the full title generated by recursively - * concatenating the parent's full title. + * Return the full title generated by recursively concatenating the parent's + * full title. * - * @return {String} * @api public + * @return {string} */ - -Suite.prototype.fullTitle = function(){ +Suite.prototype.fullTitle = function() { if (this.parent) { var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; + if (full) { + return full + ' ' + this.title; + } } return this.title; }; @@ -317,29 +330,26 @@ Suite.prototype.fullTitle = function(){ /** * Return the total number of tests. * - * @return {Number} * @api public + * @return {number} */ - -Suite.prototype.total = function(){ - return utils.reduce(this.suites, function(sum, suite){ +Suite.prototype.total = function() { + return utils.reduce(this.suites, function(sum, suite) { return sum + suite.total(); }, 0) + this.tests.length; }; /** - * Iterates through each suite recursively to find - * all tests. Applies a function in the format - * `fn(test)`. + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. * + * @api private * @param {Function} fn * @return {Suite} - * @api private */ - -Suite.prototype.eachTest = function(fn){ +Suite.prototype.eachTest = function(fn) { utils.forEach(this.tests, fn); - utils.forEach(this.suites, function(suite){ + utils.forEach(this.suites, function(suite) { suite.eachTest(fn); }); return this; diff --git a/lib/template.html b/lib/template.html index 0590d4aac2..36c5e0b694 100644 --- a/lib/template.html +++ b/lib/template.html @@ -9,7 +9,7 @@
            - + + + + + + +
            + + + diff --git a/test/browser/ui.js b/test/browser/ui.js new file mode 100644 index 0000000000..48236e9497 --- /dev/null +++ b/test/browser/ui.js @@ -0,0 +1,31 @@ +// test titles containing regex-conflicting characters + +// leading $ +describe('$.jQuery', function() { + // parens + describe('.on()', function () { + it('should set an event', function() { + assert(true); + }); + }); + + describe('.off()', function () { + it('should remove an event', function () { + + }); + }); +}); + +// another generic describe block to verify it is absent +// when greeping on $.jQuery +describe('@Array', function() { + it('.pop()', function() { + assert(true); + }); + it('.push()', function() { + assert(true); + }); + it('.length', function() { + assert(true); + }); +}); From 0f4e5a16d2292e50ae923712767c6a18052ce725 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 2 Jul 2015 22:31:50 -0700 Subject: [PATCH 0284/1771] lint runner.js --- lib/runner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index 353ff0cc46..51bd3c5427 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -210,7 +210,7 @@ Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; - if (!(err instanceof Error || err && typeof err.message == 'string')) { + if (!(err instanceof Error || err && typeof err.message === 'string')) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } From b3ff7290e26d728e106da811a3fa82b05600bdb9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 2 Jul 2015 22:32:54 -0700 Subject: [PATCH 0285/1771] lock down supports-color dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b3ab7097cc..66bb035698 100644 --- a/package.json +++ b/package.json @@ -284,7 +284,7 @@ "growl": "1.8.1", "jade": "0.26.3", "mkdirp": "0.5.0", - "supports-color": "~1.2.0" + "supports-color": "1.2.0" }, "devDependencies": { "coffee-script": "~1.8.0", From 2d91c94ed6ffc0bdb9bf149257ee3aea4c514832 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 2 Jul 2015 22:33:42 -0700 Subject: [PATCH 0286/1771] remove dupe in contributors list --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 66bb035698..d544796c21 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,6 @@ "Michael Jackson ", "Michael Olson ", "Michael Schoonmaker ", - "Michael Schoonmaker ", "Michal Charemza ", "Moshe Kolodny ", "Nathan Black ", From 630156d35a19bf5dfe722899084c3f7edaee764a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 2 Jul 2015 22:34:42 -0700 Subject: [PATCH 0287/1771] add lint check to test-all target. YES! --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d359b3e79f..9f0d8af29d 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ lint: test: lint test-unit -test-all: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only +test-all: lint test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-jsapi: @node test/jsapi From f12e1188d65ae7023cd86fc7846c3d5b9acce00b Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sat, 4 Jul 2015 14:25:45 +0200 Subject: [PATCH 0288/1771] Simplifies filter by truthy values. --- bin/options.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/options.js b/bin/options.js index 3b31798b8d..b46f8fb152 100644 --- a/bin/options.js +++ b/bin/options.js @@ -23,9 +23,7 @@ function getOptions() { var opts = fs.readFileSync(optsPath, 'utf8') .trim() .split(/\s+/) - .filter(function(value) { - return value ? true : false; - }); + .filter(Boolean); process.argv = process.argv .slice(0, 2) From 9045e2c1b88bf4f69fe22f7b0b7ecdb4e5b23225 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sat, 4 Jul 2015 14:26:59 +0200 Subject: [PATCH 0289/1771] Removes unneeded trim, the filter does the same. --- bin/options.js | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/options.js b/bin/options.js index b46f8fb152..b38ef5bf3f 100644 --- a/bin/options.js +++ b/bin/options.js @@ -21,7 +21,6 @@ function getOptions() { try { var opts = fs.readFileSync(optsPath, 'utf8') - .trim() .split(/\s+/) .filter(Boolean); From c2b418e9db3a3a888f3b33ad5daf5cc5ef6d889c Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sat, 4 Jul 2015 14:27:23 +0200 Subject: [PATCH 0290/1771] Simplifies split regex, the filter already catches empty args. --- bin/options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/options.js b/bin/options.js index b38ef5bf3f..5e90a70d1f 100644 --- a/bin/options.js +++ b/bin/options.js @@ -21,7 +21,7 @@ function getOptions() { try { var opts = fs.readFileSync(optsPath, 'utf8') - .split(/\s+/) + .split(/\s/) .filter(Boolean); process.argv = process.argv From 9a340570dfc5d56d7e8cda1a6046a8f169e85e31 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sat, 4 Jul 2015 14:27:34 +0200 Subject: [PATCH 0291/1771] Fixes indentation. --- bin/options.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/options.js b/bin/options.js index 5e90a70d1f..206e233c4a 100644 --- a/bin/options.js +++ b/bin/options.js @@ -21,8 +21,8 @@ function getOptions() { try { var opts = fs.readFileSync(optsPath, 'utf8') - .split(/\s/) - .filter(Boolean); + .split(/\s/) + .filter(Boolean); process.argv = process.argv .slice(0, 2) From 9e7056dc599fc4619f8e042947953bec1cbd63cf Mon Sep 17 00:00:00 2001 From: Adam Gruber Date: Sat, 4 Jul 2015 08:48:05 -0400 Subject: [PATCH 0292/1771] support escaped spaces in cli options --- bin/options.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/options.js b/bin/options.js index 206e233c4a..6e12d51672 100644 --- a/bin/options.js +++ b/bin/options.js @@ -21,8 +21,12 @@ function getOptions() { try { var opts = fs.readFileSync(optsPath, 'utf8') + .replace(/\\\s/g, '%20') .split(/\s/) - .filter(Boolean); + .filter(Boolean) + .map(function(value) { + return value.replace(/%20/g, ' '); + }); process.argv = process.argv .slice(0, 2) From d5ddcdcb0e49e60792b6c49368cfd8f3e8d7b028 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sat, 4 Jul 2015 22:54:35 +0200 Subject: [PATCH 0293/1771] Removes heading newline. --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 9f0d8af29d..6c959c0464 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ - ESLINT := node_modules/.bin/eslint REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle From 98c20ea906c6aa37d92d71de22de227444d57278 Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Sat, 4 Jul 2015 18:51:55 -0700 Subject: [PATCH 0294/1771] Replace __proto__ with lodash.create --- lib/hook.js | 6 +++++- lib/reporters/dot.js | 5 ++++- lib/reporters/landing.js | 5 ++++- lib/reporters/list.js | 5 ++++- lib/reporters/min.js | 5 ++++- lib/reporters/nyan.js | 15 +++++++++------ lib/reporters/progress.js | 5 ++++- lib/reporters/spec.js | 5 ++++- lib/reporters/xunit.js | 5 ++++- lib/runnable.js | 5 ++++- lib/runner.js | 5 ++++- lib/suite.js | 5 ++++- lib/test.js | 5 ++++- package.json | 1 + 14 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/hook.js b/lib/hook.js index 3dec54b795..429a60cb2b 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -3,6 +3,7 @@ */ var Runnable = require('./runnable'); +var create = require('lodash.create'); /** * Expose `Hook`. @@ -25,7 +26,10 @@ function Hook(title, fn) { /** * Inherit from `Runnable.prototype`. */ -Hook.prototype.__proto__ = Runnable.prototype; + +Hook.prototype = create(Runnable.prototype, { + constructor: Hook +}); /** * Get or set the test `err`. diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index b9cb785b25..2ecdb5e1be 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var color = Base.color; /** @@ -63,4 +64,6 @@ function Dot(runner) { * Inherit from `Base.prototype`. */ -Dot.prototype.__proto__ = Base.prototype; +Dot.prototype = create(Base.prototype, { + constructor: Dot +}); diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index 1dd952cb7d..a29c24728c 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var cursor = Base.cursor; var color = Base.color; @@ -89,4 +90,6 @@ function Landing(runner) { * Inherit from `Base.prototype`. */ -Landing.prototype.__proto__ = Base.prototype; +Landing.prototype = create(Base.prototype, { + constructor: Landing +}); diff --git a/lib/reporters/list.js b/lib/reporters/list.js index 5f6d37e8b1..f9b3969676 100644 --- a/lib/reporters/list.js +++ b/lib/reporters/list.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var color = Base.color; var cursor = Base.cursor; @@ -58,4 +59,6 @@ function List(runner) { * Inherit from `Base.prototype`. */ -List.prototype.__proto__ = Base.prototype; +List.prototype = create(Base.prototype, { + constructor: List +}); diff --git a/lib/reporters/min.js b/lib/reporters/min.js index f0b85578d0..f9c3a148c4 100644 --- a/lib/reporters/min.js +++ b/lib/reporters/min.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); /** * Expose `Min`. @@ -33,4 +34,6 @@ function Min(runner) { * Inherit from `Base.prototype`. */ -Min.prototype.__proto__ = Base.prototype; +Min.prototype = create(Base.prototype, { + constructor: Min +}); diff --git a/lib/reporters/nyan.js b/lib/reporters/nyan.js index 21b7749868..2baa901031 100644 --- a/lib/reporters/nyan.js +++ b/lib/reporters/nyan.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); /** * Expose `Dot`. @@ -58,6 +59,14 @@ function NyanCat(runner) { }); } +/** + * Inherit from `Base.prototype`. + */ + +NyanCat.prototype = create(Base.prototype, { + constructor: NyanCat +}); + /** * Draw the nyan cat * @@ -253,9 +262,3 @@ NyanCat.prototype.rainbowify = function(str) { function write(string) { process.stdout.write(string); } - -/** - * Inherit from `Base.prototype`. - */ - -NyanCat.prototype.__proto__ = Base.prototype; diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 29c6785451..2ea25bda94 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var color = Base.color; var cursor = Base.cursor; @@ -86,4 +87,6 @@ function Progress(runner, options) { * Inherit from `Base.prototype`. */ -Progress.prototype.__proto__ = Base.prototype; +Progress.prototype = create(Base.prototype, { + constructor: Progress +}); diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index 1b447c1738..9fbd805a3e 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var color = Base.color; var cursor = Base.cursor; @@ -80,4 +81,6 @@ function Spec(runner) { * Inherit from `Base.prototype`. */ -Spec.prototype.__proto__ = Base.prototype; +Spec.prototype = create(Base.prototype, { + constructor: Spec +}); diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 8286cd3f52..70bfc755a0 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var create = require('lodash.create'); var fs = require('fs'); var escape = require('../utils').escape; @@ -95,7 +96,9 @@ XUnit.prototype.done = function(failures, fn) { * Inherit from `Base.prototype`. */ -XUnit.prototype.__proto__ = Base.prototype; +XUnit.prototype = create(Base.prototype, { + constructor: XUnit +}); /** * Write out the given line. diff --git a/lib/runnable.js b/lib/runnable.js index aa82417413..d0c0f60732 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -4,6 +4,7 @@ var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); +var create = require('lodash.create'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); var utils = require('./utils'); @@ -55,7 +56,9 @@ function Runnable(title, fn) { * Inherit from `EventEmitter.prototype`. */ -Runnable.prototype.__proto__ = EventEmitter.prototype; +Runnable.prototype = create(EventEmitter.prototype, { + constructor: Runnable +}); /** * Set & get timeout `ms`. diff --git a/lib/runner.js b/lib/runner.js index 51bd3c5427..18e941191a 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -4,6 +4,7 @@ var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); +var create = require('lodash.create'); var debug = require('debug')('mocha:runner'); var filter = require('./utils').filter; var indexOf = require('./utils').indexOf; @@ -86,7 +87,9 @@ Runner.immediately = global.setImmediate || process.nextTick; * Inherit from `EventEmitter.prototype`. */ -Runner.prototype.__proto__ = EventEmitter.prototype; +Runner.prototype = create(EventEmitter.prototype, { + constructor: Runner +}); /** * Run tests with full titles matching `re`. Updates runner.total diff --git a/lib/suite.js b/lib/suite.js index b59b3c8ae9..eb89fb346e 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -4,6 +4,7 @@ var EventEmitter = require('events').EventEmitter; var Hook = require('./hook'); +var create = require('lodash.create'); var debug = require('debug')('mocha:suite'); var milliseconds = require('./ms'); var utils = require('./utils'); @@ -66,7 +67,9 @@ function Suite(title, parentContext) { * Inherit from `EventEmitter.prototype`. */ -Suite.prototype.__proto__ = EventEmitter.prototype; +Suite.prototype = create(EventEmitter.prototype, { + constructor: Suite +}); /** * Return a clone of this `Suite`. diff --git a/lib/test.js b/lib/test.js index c6cbfd147b..057e772824 100644 --- a/lib/test.js +++ b/lib/test.js @@ -3,6 +3,7 @@ */ var Runnable = require('./runnable'); +var create = require('lodash.create'); /** * Expose `Test`. @@ -27,4 +28,6 @@ function Test(title, fn) { * Inherit from `Runnable.prototype`. */ -Test.prototype.__proto__ = Runnable.prototype; +Test.prototype = create(Runnable.prototype, { + constructor: Test +}); diff --git a/package.json b/package.json index d544796c21..fb7a8476b4 100644 --- a/package.json +++ b/package.json @@ -282,6 +282,7 @@ "glob": "3.2.3", "growl": "1.8.1", "jade": "0.26.3", + "lodash.create": "^3.1.1", "mkdirp": "0.5.0", "supports-color": "1.2.0" }, From 993d1ebe03a98c9df3afa55d6664d95baa65a02e Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Sat, 4 Jul 2015 18:52:12 -0700 Subject: [PATCH 0295/1771] Remove __proto__ parsing from browser build scripts --- support/compile.js | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/support/compile.js b/support/compile.js index bea017ab51..cd99fc47bc 100644 --- a/support/compile.js +++ b/support/compile.js @@ -33,7 +33,7 @@ args.forEach(function(file){ */ function parse(js) { - return parseRequires(parseInheritance(js)); + return parseRequires(js); } /** @@ -52,20 +52,6 @@ function parseRequires(js) { .replace(/require\('fs'\)/g , "require('browser/fs')"); } -/** - * Parse __proto__. - */ - -function parseInheritance(js) { - return js - .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){ - return 'function F(){};\n' - + 'F.prototype = ' + parent + '.prototype;\n' - + child + '.prototype = new F;\n' - + child + '.prototype.constructor = '+ child + ';\n'; - }); -} - /** * Compile the files. */ From a3fa9bc594c68764de8aabefe793d7e694990862 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 9 Apr 2015 09:46:29 -0700 Subject: [PATCH 0296/1771] build mochajs.org with Jekyll; closes #1640 Lots of stuff here, but the main things: - use Jekyll - convert `index.md` to *actual GFM Markdown* - a lot of edits of the documentation, including, but not limited to: - reorganization - grammar fixes - code style fixes - rewording confusing sentences - add a couple more examples - dynamically generate TOC - use CDNs for JS, though there's basically none I've taken every effort to make the site look as close to the current version as it does now, and keep it compatible with old browsers. However, I was not able to reuse the syntax highlighting scheme, as highlighting is now done by Pygments. ![screenshot 1](http://content.screencast.com/users/chiller/folders/Jing/media/32a9e9d6-b927-465a-a027-39d8bbfe0407/00000153.png) ![screenshot 2](http://content.screencast.com/users/chiller/folders/Jing/media/890e0481-65a4-4729-bc69-37098c48940f/00000154.png) --- .editorconfig | 4 + .gitignore | 4 +- Gemfile | 2 + Gemfile.lock | 131 + Makefile | 10 - README.md | 50 +- _config.yml | 12 + _includes/footer.html | 3 + _includes/head.html | 13 + _includes/header.html | 4 + _layouts/default.html | 18 + _mocha.js | 4057 -------------------- coverage.html | 333 -- normalize.min.css => css/normalize.min.css | 0 css/pygments.css | 59 + style.css => css/style.css | 49 +- foot.html | 6 - head.html | 24 - highlight.js | 18 - html5shiv.js | 8 - images/_unused/concrete_wall_3.png | Bin 61150 -> 0 bytes images/_unused/handmadepaper.png | Bin 6367 -> 0 bytes images/_unused/soft_wallpaper.png | Bin 229627 -> 0 bytes images/_unused/whitey.png | Bin 76816 -> 0 bytes index.html | 976 ----- index.js | 2 - index.md | 1467 +++---- jquery.js | 4 - package.json | 22 + 29 files changed, 1094 insertions(+), 6182 deletions(-) create mode 100644 .editorconfig create mode 100644 Gemfile create mode 100644 Gemfile.lock delete mode 100644 Makefile create mode 100644 _config.yml create mode 100644 _includes/footer.html create mode 100644 _includes/head.html create mode 100644 _includes/header.html create mode 100644 _layouts/default.html delete mode 100644 _mocha.js delete mode 100644 coverage.html rename normalize.min.css => css/normalize.min.css (100%) create mode 100644 css/pygments.css rename style.css => css/style.css (84%) delete mode 100644 foot.html delete mode 100644 head.html delete mode 100644 highlight.js delete mode 100644 html5shiv.js delete mode 100644 images/_unused/concrete_wall_3.png delete mode 100644 images/_unused/handmadepaper.png delete mode 100644 images/_unused/soft_wallpaper.png delete mode 100644 images/_unused/whitey.png delete mode 100644 index.html delete mode 100644 index.js delete mode 100644 jquery.js create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..4b5665da7d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index fbb64d6ad6..90dbb6975a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ -.DS_Store +_site node_modules -*.sock -testing diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..053c27dc35 --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'github-pages' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..68ac47b0bd --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,131 @@ +GEM + remote: https://rubygems.org/ + specs: + RedCloth (4.2.9) + activesupport (4.2.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + blankslate (2.1.2.4) + celluloid (0.16.0) + timers (~> 4.0.0) + classifier-reborn (2.0.3) + fast-stemmer (~> 1.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.9.1.1) + colorator (0.1) + execjs (2.5.2) + fast-stemmer (1.0.2) + ffi (1.9.8) + gemoji (2.1.0) + github-pages (37) + RedCloth (= 4.2.9) + github-pages-health-check (~> 0.2) + jekyll (= 2.4.0) + jekyll-coffeescript (= 1.0.1) + jekyll-feed (= 0.3.0) + jekyll-mentions (= 0.2.1) + jekyll-redirect-from (= 0.8.0) + jekyll-sass-converter (= 1.2.0) + jekyll-sitemap (= 0.8.1) + jemoji (= 0.4.0) + kramdown (= 1.5.0) + liquid (= 2.6.2) + maruku (= 0.7.0) + mercenary (~> 0.3) + pygments.rb (= 0.6.1) + rdiscount (= 2.1.7) + redcarpet (= 3.1.2) + terminal-table (~> 1.4) + github-pages-health-check (0.2.2) + net-dns (~> 0.6) + public_suffix (~> 1.4) + hitimes (1.2.2) + html-pipeline (1.9.0) + activesupport (>= 2) + nokogiri (~> 1.4) + i18n (0.7.0) + jekyll (2.4.0) + classifier-reborn (~> 2.0) + colorator (~> 0.1) + jekyll-coffeescript (~> 1.0) + jekyll-gist (~> 1.0) + jekyll-paginate (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.3) + liquid (~> 2.6.1) + mercenary (~> 0.3.3) + pygments.rb (~> 0.6.0) + redcarpet (~> 3.1) + safe_yaml (~> 1.0) + toml (~> 0.1.0) + jekyll-coffeescript (1.0.1) + coffee-script (~> 2.2) + jekyll-feed (0.3.0) + jekyll-gist (1.2.1) + jekyll-mentions (0.2.1) + html-pipeline (~> 1.9.0) + jekyll (~> 2.0) + jekyll-paginate (1.1.0) + jekyll-redirect-from (0.8.0) + jekyll (>= 2.0) + jekyll-sass-converter (1.2.0) + sass (~> 3.2) + jekyll-sitemap (0.8.1) + jekyll-watch (1.2.1) + listen (~> 2.7) + jemoji (0.4.0) + gemoji (~> 2.0) + html-pipeline (~> 1.9) + jekyll (~> 2.0) + json (1.8.2) + kramdown (1.5.0) + liquid (2.6.2) + listen (2.10.0) + celluloid (~> 0.16.0) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + maruku (0.7.0) + mercenary (0.3.5) + mini_portile (0.6.2) + minitest (5.6.0) + net-dns (0.8.0) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) + parslet (1.5.0) + blankslate (~> 2.0) + posix-spawn (0.3.11) + public_suffix (1.5.1) + pygments.rb (0.6.1) + posix-spawn (~> 0.3.6) + yajl-ruby (~> 1.2.0) + rb-fsevent (0.9.4) + rb-inotify (0.9.5) + ffi (>= 0.5.0) + rdiscount (2.1.7) + redcarpet (3.1.2) + safe_yaml (1.0.4) + sass (3.4.13) + terminal-table (1.4.5) + thread_safe (0.3.5) + timers (4.0.1) + hitimes + toml (0.1.2) + parslet (~> 1.5.0) + tzinfo (1.2.2) + thread_safe (~> 0.1) + yajl-ruby (1.2.1) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages + +BUNDLED WITH + 1.10.5 diff --git a/Makefile b/Makefile deleted file mode 100644 index 51fbe9831a..0000000000 --- a/Makefile +++ /dev/null @@ -1,10 +0,0 @@ - -index.html: head.html foot.html index.md - @markdown < index.md \ - | cat head.html - foot.html \ - > $@ - -clean: - rm -f index.html - -.PHONY: clean \ No newline at end of file diff --git a/README.md b/README.md index a89c99485d..0f8db3ae9e 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,25 @@ -# mocha: How to Build the Site +# [mochajs.org](http://mochajs.org): How to Build the Site -So you wanna build the site? +*So you wanna build the site?* -## Requirements +[mochajs.org](http://mochajs.org) is now built using [Jekyll](http://jekyllrb.com), the popular static site generator. -There's two: +## Prerequisites -1. [make](http://www.gnu.org/software/make/) -2. [markdown](http://daringfireball.net/projects/markdown/) +1. Some recent version of Ruby +2. Some version of [RubyGems](https://rubygems.org) +3. Some recent version of Node.JS -### Mac OS X +## Installation -Install `markdown` via Homebrew: +1. Execute `npm install`. This will install [Bundler](http://bundler.io), Jekyll, and [markdown-toc-index](https://www.npmjs.com/package/markdown-toc-index). +2. To build, execute `npm run-script build`. -```sh -brew install markdown -``` +For more information, refer to the [Jekyll Docs](http://jekyllrb.com/docs/home/) and [GitHub's Tutorial](https://help.github.com/articles/using-jekyll-with-pages/) on the subject. -Or download from [here](http://daringfireball.net/projects/markdown/). +## Notes -Celebrate with tequila! Or try to build first. Probably want to build first. - -### Linux - -#### Ubuntu 14.04 - -1. `sudo apt-get install build-essential` to install make. -2. `sudo apt-get install markdown` to install markdown. -3. That seems to do it. It's just a Perl script, so you can [get it from here](http://daringfireball.net/projects/markdown/) otherwise. - -### Windows - -*To be filled in by somebody using Windows* - -## Building - -Execute: - -``` -make clean && make -``` - -You should now have an updated `index.html`. Open it in your browser and proceed to tweak it until it's correct, because the compiler seem a little wonky. +- To update `index.md` with the TOC, execute: `node_modules/.bin/toc-idx -i index.md --max-depth 1 --bullet "\- " index.md` +- `bundle exec jekyll build` rebuilds the site without updating the TOC +- The `_site` directory is where the generated site lives. It is *not* under version control, because GitHub Pages generates it for us. diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000000..7d22174d9e --- /dev/null +++ b/_config.yml @@ -0,0 +1,12 @@ +url: http://mochajs.org +markdown: redcarpet +redcarpet: + extensions: ["with_toc_data"] +highlighter: pygments +exclude: + - node_modules + - README.md + - Gemfile* + - package.json + - CNAME + diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000000..300314d5c6 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,3 @@ +
            + © 2011-2015 TJ Holowaychuk. All rights reserved. Licensed MIT +
            diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000000..0332f13b8d --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,13 @@ + + + {{ page.title }} + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000000..71eb2f0287 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,4 @@ +
            +

            Mocha

            +

            simple, flexible, fun

            +
            diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000000..f71fd1faff --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,18 @@ + + + + {% include head.html %} + + + + {% include header.html %} + +
            + {{ content }} +
            + + {% include footer.html %} + + + + diff --git a/_mocha.js b/_mocha.js deleted file mode 100644 index 095a2f9afc..0000000000 --- a/_mocha.js +++ /dev/null @@ -1,4057 +0,0 @@ - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p.charAt(0)) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("browser/debug.js", function(module, exports, require){ - -module.exports = function(type){ - return function(){ - - } -}; -}); // module: browser/debug.js - -require.register("browser/diff.js", function(module, exports, require){ - -}); // module: browser/diff.js - -require.register("browser/events.js", function(module, exports, require){ - -/** - * Module exports. - */ - -exports.EventEmitter = EventEmitter; - -/** - * Check if `obj` is an array. - */ - -function isArray(obj) { - return '[object Array]' == {}.toString.call(obj); -} - -/** - * Event emitter constructor. - * - * @api public - */ - -function EventEmitter(){}; - -/** - * Adds a listener. - * - * @api public - */ - -EventEmitter.prototype.on = function (name, fn) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = fn; - } else if (isArray(this.$events[name])) { - this.$events[name].push(fn); - } else { - this.$events[name] = [this.$events[name], fn]; - } - - return this; -}; - -EventEmitter.prototype.addListener = EventEmitter.prototype.on; - -/** - * Adds a volatile listener. - * - * @api public - */ - -EventEmitter.prototype.once = function (name, fn) { - var self = this; - - function on () { - self.removeListener(name, on); - fn.apply(this, arguments); - }; - - on.listener = fn; - this.on(name, on); - - return this; -}; - -/** - * Removes a listener. - * - * @api public - */ - -EventEmitter.prototype.removeListener = function (name, fn) { - if (this.$events && this.$events[name]) { - var list = this.$events[name]; - - if (isArray(list)) { - var pos = -1; - - for (var i = 0, l = list.length; i < l; i++) { - if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { - pos = i; - break; - } - } - - if (pos < 0) { - return this; - } - - list.splice(pos, 1); - - if (!list.length) { - delete this.$events[name]; - } - } else if (list === fn || (list.listener && list.listener === fn)) { - delete this.$events[name]; - } - } - - return this; -}; - -/** - * Removes all listeners for an event. - * - * @api public - */ - -EventEmitter.prototype.removeAllListeners = function (name) { - if (name === undefined) { - this.$events = {}; - return this; - } - - if (this.$events && this.$events[name]) { - this.$events[name] = null; - } - - return this; -}; - -/** - * Gets all listeners for a certain event. - * - * @api public - */ - -EventEmitter.prototype.listeners = function (name) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = []; - } - - if (!isArray(this.$events[name])) { - this.$events[name] = [this.$events[name]]; - } - - return this.$events[name]; -}; - -/** - * Emits an event. - * - * @api public - */ - -EventEmitter.prototype.emit = function (name) { - if (!this.$events) { - return false; - } - - var handler = this.$events[name]; - - if (!handler) { - return false; - } - - var args = [].slice.call(arguments, 1); - - if ('function' == typeof handler) { - handler.apply(this, args); - } else if (isArray(handler)) { - var listeners = handler.slice(); - - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i].apply(this, args); - } - } else { - return false; - } - - return true; -}; -}); // module: browser/events.js - -require.register("browser/fs.js", function(module, exports, require){ - -}); // module: browser/fs.js - -require.register("browser/path.js", function(module, exports, require){ - -}); // module: browser/path.js - -require.register("browser/progress.js", function(module, exports, require){ - -/** - * Expose `Progress`. - */ - -module.exports = Progress; - -/** - * Initialize a new `Progress` indicator. - */ - -function Progress() { - this.percent = 0; - this.size(0); - this.fontSize(11); - this.font('helvetica, arial, sans-serif'); -} - -/** - * Set progress size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.size = function(n){ - this._size = n; - return this; -}; - -/** - * Set text to `str`. - * - * @param {String} str - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.text = function(str){ - this._text = str; - return this; -}; - -/** - * Set font size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.fontSize = function(n){ - this._fontSize = n; - return this; -}; - -/** - * Set font `family`. - * - * @param {String} family - * @return {Progress} for chaining - */ - -Progress.prototype.font = function(family){ - this._font = family; - return this; -}; - -/** - * Update percentage to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - */ - -Progress.prototype.update = function(n){ - this.percent = n; - return this; -}; - -/** - * Draw on `ctx`. - * - * @param {CanvasRenderingContext2d} ctx - * @return {Progress} for chaining - */ - -Progress.prototype.draw = function(ctx){ - var percent = Math.min(this.percent, 100) - , size = this._size - , half = size / 2 - , x = half - , y = half - , rad = half - 1 - , fontSize = this._fontSize; - - ctx.font = fontSize + 'px ' + this._font; - - var angle = Math.PI * 2 * (percent / 100); - ctx.clearRect(0, 0, size, size); - - // outer circle - ctx.strokeStyle = '#9f9f9f'; - ctx.beginPath(); - ctx.arc(x, y, rad, 0, angle, false); - ctx.stroke(); - - // inner circle - ctx.strokeStyle = '#eee'; - ctx.beginPath(); - ctx.arc(x, y, rad - 1, 0, angle, true); - ctx.stroke(); - - // text - var text = this._text || (percent | 0) + '%' - , w = ctx.measureText(text).width; - - ctx.fillText( - text - , x - w / 2 + 1 - , y + fontSize / 2 - 1); - - return this; -}; - -}); // module: browser/progress.js - -require.register("browser/tty.js", function(module, exports, require){ - -exports.isatty = function(){ - return true; -}; - -exports.getWindowSize = function(){ - return [window.innerHeight, window.innerWidth]; -}; -}); // module: browser/tty.js - -require.register("context.js", function(module, exports, require){ - -/** - * Expose `Context`. - */ - -module.exports = Context; - -/** - * Initialize a new `Context`. - * - * @api private - */ - -function Context(){} - -/** - * Set the context `Runnable` to `runnable`. - * - * @param {Runnable} runnable - * @return {Context} - * @api private - */ - -Context.prototype.runnable = function(runnable){ - this._runnable = runnable; - return this; -}; - -/** - * Set test timeout `ms`. - * - * @param {Number} ms - * @return {Context} self - * @api private - */ - -Context.prototype.timeout = function(ms){ - this._runnable.timeout(ms); - return this; -}; - -/** - * Inspect the context void of `._runnable`. - * - * @return {String} - * @api private - */ - -Context.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - return '_runnable' == key - ? undefined - : val; - }, 2); -}; - -}); // module: context.js - -require.register("hook.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Runnable = require('./runnable'); - -/** - * Expose `Hook`. - */ - -module.exports = Hook; - -/** - * Initialize a new `Hook` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Hook(title, fn) { - Runnable.call(this, title, fn); - this.type = 'hook'; -} - -/** - * Inherit from `Runnable.prototype`. - */ - -Hook.prototype = new Runnable; -Hook.prototype.constructor = Hook; - - -}); // module: hook.js - -require.register("interfaces/bdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * BDD-style interface: - * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * - * }); - * - * it('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - // noop variants - - context.xdescribe = function(){}; - context.xit = function(){}; - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.describe = context.context = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = context.specify = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/bdd.js - -require.register("interfaces/exports.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * exports.Array = { - * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ - * - * }, - * - * 'should return the correct index when the value is present': function(){ - * - * } - * } - * }; - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('require', visit); - - function visit(obj) { - var suite; - for (var key in obj) { - if ('function' == typeof obj[key]) { - var fn = obj[key]; - switch (key) { - case 'before': - suites[0].beforeAll(fn); - break; - case 'after': - suites[0].afterAll(fn); - break; - case 'beforeEach': - suites[0].beforeEach(fn); - break; - case 'afterEach': - suites[0].afterEach(fn); - break; - default: - suites[0].addTest(new Test(key, fn)); - } - } else { - var suite = Suite.create(suites[0], key); - suites.unshift(suite); - visit(obj[key]); - suites.shift(); - } - } - } -}; -}); // module: interfaces/exports.js - -require.register("interfaces/index.js", function(module, exports, require){ - -exports.bdd = require('./bdd'); -exports.tdd = require('./tdd'); -exports.qunit = require('./qunit'); -exports.exports = require('./exports'); - -}); // module: interfaces/index.js - -require.register("interfaces/qunit.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * QUnit-style interface: - * - * suite('Array'); - * - * test('#length', function(){ - * var arr = [1,2,3]; - * ok(arr.length == 3); - * }); - * - * test('#indexOf()', function(){ - * var arr = [1,2,3]; - * ok(arr.indexOf(1) == 0); - * ok(arr.indexOf(2) == 1); - * ok(arr.indexOf(3) == 2); - * }); - * - * suite('String'); - * - * test('#length', function(){ - * ok('foo'.length == 3); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title`. - */ - - context.suite = function(title){ - if (suites.length > 1) suites.shift(); - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/qunit.js - -require.register("interfaces/tdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * suiteSetup(function(){ - * - * }); - * - * test('should return -1 when not present', function(){ - * - * }); - * - * test('should return the index when present', function(){ - * - * }); - * - * suiteTeardown(function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before each test case. - */ - - context.setup = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.teardown = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Execute before the suite. - */ - - context.suiteSetup = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after the suite. - */ - - context.suiteTeardown = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.suite = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/tdd.js - -require.register("mocha.js", function(module, exports, require){ -/*! - * mocha - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var path = require('browser/path'); - -/** - * Expose `Mocha`. - */ - -exports = module.exports = Mocha; - -/** - * Library version. - */ - -exports.version = '1.1.0'; - -/** - * Expose internals. - */ - -exports.utils = require('./utils'); -exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); -exports.Runnable = require('./runnable'); -exports.Context = require('./context'); -exports.Runner = require('./runner'); -exports.Suite = require('./suite'); -exports.Hook = require('./hook'); -exports.Test = require('./test'); - -/** - * Return image `name` path. - * - * @param {String} name - * @return {String} - * @api private - */ - -function image(name) { - return __dirname + '/../images/' + name + '.png'; -} - -/** - * Setup mocha with `options`. - * - * Options: - * - * - `ui` name "bdd", "tdd", "exports" etc - * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` - * - `globals` array of accepted globals - * - `timeout` timeout in milliseconds - * - `ignoreLeaks` ignore global leaks - * - `grep` string or regexp to filter tests with - * - * @param {Object} options - * @api public - */ - -function Mocha(options) { - options = options || {}; - this.files = []; - this.options = options; - this.grep(options.grep); - this.suite = new exports.Suite('', new exports.Context); - this.ui(options.ui); - this.reporter(options.reporter); - if (options.timeout) this.suite.timeout(options.timeout); -} - -/** - * Add test `file`. - * - * @param {String} file - * @api public - */ - -Mocha.prototype.addFile = function(file){ - this.files.push(file); - return this; -}; - -/** - * Set reporter to `name`, defaults to "dot". - * - * @param {String} name - * @api public - */ - -Mocha.prototype.reporter = function(name){ - name = name || 'dot'; - this._reporter = require('./reporters/' + name); - if (!this._reporter) throw new Error('invalid reporter "' + name + '"'); - return this; -}; - -/** - * Set test UI `name`, defaults to "bdd". - * - * @param {String} bdd - * @api public - */ - -Mocha.prototype.ui = function(name){ - name = name || 'bdd'; - this._ui = exports.interfaces[name]; - if (!this._ui) throw new Error('invalid interface "' + name + '"'); - this._ui = this._ui(this.suite); - return this; -}; - -/** - * Load registered files. - * - * @api private - */ - -Mocha.prototype.loadFiles = function(){ - var suite = this.suite; - this.files.forEach(function(file){ - file = path.resolve(file); - suite.emit('pre-require', global, file); - suite.emit('require', require(file), file); - suite.emit('post-require', global, file); - }); -}; - -/** - * Enable growl support. - * - * @api private - */ - -Mocha.prototype.growl = function(runner, reporter) { - var notify = require('growl'); - - runner.on('end', function(){ - var stats = reporter.stats; - if (stats.failures) { - var msg = stats.failures + ' of ' + runner.total + ' tests failed'; - notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); - } else { - notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { - name: 'mocha' - , title: 'Passed' - , image: image('ok') - }); - } - }); -}; - -/** - * Add regexp to grep for to the options object - * - * @param {RegExp} or {String} re - * @return {Mocha} - * @api public - */ - -Mocha.prototype.grep = function(re){ - this.options.grep = 'string' == typeof re - ? new RegExp(re) - : re; - return this; -}; - -/** - * Run tests and invoke `fn()` when complete. - * - * @param {Function} fn - * @return {Runner} - * @api public - */ - -Mocha.prototype.run = function(fn){ - this.loadFiles(); - var suite = this.suite; - var options = this.options; - var runner = new exports.Runner(suite); - var reporter = new this._reporter(runner); - runner.ignoreLeaks = options.ignoreLeaks; - if (options.grep) runner.grep(options.grep); - if (options.globals) runner.globals(options.globals); - if (options.growl) this.growl(runner, reporter); - return runner.run(fn); -}; - -}); // module: mocha.js - -require.register("reporters/base.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var tty = require('browser/tty') - , diff = require('browser/diff'); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Check if both stdio streams are associated with a tty. - */ - -var isatty = tty.isatty(1) && tty.isatty(2); - -/** - * Expose `Base`. - */ - -exports = module.exports = Base; - -/** - * Enable coloring by default. - */ - -exports.useColors = isatty; - -/** - * Default color map. - */ - -exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'bright pass': 92 - , 'bright fail': 91 - , 'bright yellow': 93 - , 'pending': 36 - , 'suite': 0 - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 - , 'green': 32 - , 'light': 90 - , 'diff gutter': 90 - , 'diff added': 42 - , 'diff removed': 41 -}; - -/** - * Color `str` with the given `type`, - * allowing colors to be disabled, - * as well as user-defined color - * schemes. - * - * @param {String} type - * @param {String} str - * @return {String} - * @api private - */ - -var color = exports.color = function(type, str) { - if (!exports.useColors) return str; - return '\033[' + exports.colors[type] + 'm' + str + '\033[0m'; -}; - -/** - * Expose term window size, with some - * defaults for when stderr is not a tty. - */ - -exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 -}; - -/** - * Expose some basic cursor interactions - * that are common among reporters. - */ - -exports.cursor = { - hide: function(){ - process.stdout.write('\033[?25l'); - }, - - show: function(){ - process.stdout.write('\033[?25h'); - }, - - deleteLine: function(){ - process.stdout.write('\033[2K'); - }, - - beginningOfLine: function(){ - process.stdout.write('\033[0G'); - }, - - CR: function(){ - exports.cursor.deleteLine(); - exports.cursor.beginningOfLine(); - } -}; - -/** - * A test is considered slow if it - * exceeds the following value in milliseconds. - */ - -exports.slow = 75; - -/** - * Outut the given `failures` as a list. - * - * @param {Array} failures - * @api public - */ - -exports.list = function(failures){ - console.error(); - failures.forEach(function(test, i){ - // format - var fmt = color('error title', ' %s) %s:\n') - + color('error message', ' %s') - + color('error stack', '\n%s\n'); - - // msg - var err = test.err - , message = err.message || '' - , stack = err.stack || message - , index = stack.indexOf(message) + message.length - , msg = stack.slice(0, index) - , actual = err.actual - , expected = err.expected; - - // actual / expected diff - if ('string' == typeof actual && 'string' == typeof expected) { - var len = Math.max(actual.length, expected.length); - - if (len < 20) msg = errorDiff(err, 'Chars'); - else msg = errorDiff(err, 'Words'); - - // linenos - var lines = msg.split('\n'); - if (lines.length > 4) { - var width = String(lines.length).length; - msg = lines.map(function(str, i){ - return pad(++i, width) + ' |' + ' ' + str; - }).join('\n'); - } - - // legend - msg = '\n' - + color('diff removed', 'actual') - + ' ' - + color('diff added', 'expected') - + '\n\n' - + msg - + '\n'; - - // indent - msg = msg.replace(/^/gm, ' '); - - fmt = color('error title', ' %s) %s:\n%s') - + color('error stack', '\n%s\n'); - } - - // indent stack trace without msg - stack = stack.slice(index ? index + 1 : index) - .replace(/^/gm, ' '); - - console.error(fmt, (i + 1), test.fullTitle(), msg, stack); - }); -}; - -/** - * Initialize a new `Base` reporter. - * - * All other reporters generally - * inherit from this reporter, providing - * stats such as test duration, number - * of tests passed / failed etc. - * - * @param {Runner} runner - * @api public - */ - -function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } - , failures = this.failures = []; - - if (!runner) return; - this.runner = runner; - - runner.on('start', function(){ - stats.start = new Date; - }); - - runner.on('suite', function(suite){ - stats.suites = stats.suites || 0; - suite.root || stats.suites++; - }); - - runner.on('test end', function(test){ - stats.tests = stats.tests || 0; - stats.tests++; - }); - - runner.on('pass', function(test){ - stats.passes = stats.passes || 0; - - var medium = exports.slow / 2; - test.speed = test.duration > exports.slow - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; - - stats.passes++; - }); - - runner.on('fail', function(test, err){ - stats.failures = stats.failures || 0; - stats.failures++; - test.err = err; - failures.push(test); - }); - - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; - }); - - runner.on('pending', function(){ - stats.pending++; - }); -} - -/** - * Output common epilogue used by many of - * the bundled reporters. - * - * @api public - */ - -Base.prototype.epilogue = function(){ - var stats = this.stats - , fmt - , tests; - - console.log(); - - function pluralize(n) { - return 1 == n ? 'test' : 'tests'; - } - - // failure - if (stats.failures) { - fmt = color('bright fail', ' ✖') - + color('fail', ' %d of %d %s failed') - + color('light', ':') - - console.error(fmt, - stats.failures, - this.runner.total, - pluralize(this.runner.total)); - - Base.list(this.failures); - console.error(); - return; - } - - // pass - fmt = color('bright pass', ' ✔') - + color('green', ' %d %s complete') - + color('light', ' (%dms)'); - - console.log(fmt, - stats.tests || 0, - pluralize(stats.tests), - stats.duration); - - // pending - if (stats.pending) { - fmt = color('pending', ' •') - + color('pending', ' %d %s pending'); - - console.log(fmt, stats.pending, pluralize(stats.pending)); - } - - console.log(); -}; - -/** - * Pad the given `str` to `len`. - * - * @param {String} str - * @param {String} len - * @return {String} - * @api private - */ - -function pad(str, len) { - str = String(str); - return Array(len - str.length + 1).join(' ') + str; -} - -/** - * Return a character diff for `err`. - * - * @param {Error} err - * @return {String} - * @api private - */ - -function errorDiff(err, type) { - return diff['diff' + type](err.actual, err.expected).map(function(str){ - if (/^(\n+)$/.test(str.value)) str.value = Array(++RegExp.$1.length).join(''); - if (str.added) return colorLines('diff added', str.value); - if (str.removed) return colorLines('diff removed', str.value); - return str.value; - }).join(''); -} - -/** - * Color lines for `str`, using the color `name`. - * - * @param {String} name - * @param {String} str - * @return {String} - * @api private - */ - -function colorLines(name, str) { - return str.split('\n').map(function(str){ - return color(name, str); - }).join('\n'); -} - -}); // module: reporters/base.js - -require.register("reporters/doc.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = Doc; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Doc(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; - - function indent() { - return Array(indents).join(' '); - } - - runner.on('suite', function(suite){ - if (suite.root) return; - ++indents; - console.log('%s
            ', indent()); - ++indents; - console.log('%s

            %s

            ', indent(), suite.title); - console.log('%s
            ', indent()); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - console.log('%s
            ', indent()); - --indents; - console.log('%s
            ', indent()); - --indents; - }); - - runner.on('pass', function(test){ - console.log('%s
            %s
            ', indent(), test.title); - var code = utils.escape(utils.clean(test.fn.toString())); - console.log('%s
            %s
            ', indent(), code); - }); -} - -}); // module: reporters/doc.js - -require.register("reporters/dot.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = Dot; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Dot(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , n = 0; - - runner.on('start', function(){ - process.stdout.write('\n '); - }); - - runner.on('pending', function(test){ - process.stdout.write(color('pending', '.')); - }); - - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { - process.stdout.write(color('bright yellow', '.')); - } else { - process.stdout.write(color(test.speed, '.')); - } - }); - - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); - process.stdout.write(color('fail', '.')); - }); - - runner.on('end', function(){ - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Dot.prototype = new Base; -Dot.prototype.constructor = Dot; - -}); // module: reporters/dot.js - -require.register("reporters/html-cov.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var JSONCov = require('./json-cov') - , fs = require('browser/fs'); - -/** - * Expose `HTMLCov`. - */ - -exports = module.exports = HTMLCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTMLCov(runner) { - var jade = require('jade') - , file = __dirname + '/templates/coverage.jade' - , str = fs.readFileSync(file, 'utf8') - , fn = jade.compile(str, { filename: file }) - , self = this; - - JSONCov.call(this, runner, false); - - runner.on('end', function(){ - process.stdout.write(fn({ - cov: self.cov - , coverageClass: coverageClass - })); - }); -} - -/** - * Return coverage class for `n`. - * - * @return {String} - * @api private - */ - -function coverageClass(n) { - if (n >= 75) return 'high'; - if (n >= 50) return 'medium'; - if (n >= 25) return 'low'; - return 'terrible'; -} -}); // module: reporters/html-cov.js - -require.register("reporters/html.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils') - , Progress = require('../browser/progress') - , escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `Doc`. - */ - -exports = module.exports = HTML; - -/** - * Stats template. - */ - -var statsTemplate = '
              ' - + '
            • ' - + '
            • passes: 0
            • ' - + '
            • failures: 0
            • ' - + '
            • duration: 0s
            • ' - + '
            '; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTML(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , root = document.getElementById('mocha') - , stat = fragment(statsTemplate) - , items = stat.getElementsByTagName('li') - , passes = items[1].getElementsByTagName('em')[0] - , failures = items[2].getElementsByTagName('em')[0] - , duration = items[3].getElementsByTagName('em')[0] - , canvas = stat.getElementsByTagName('canvas')[0] - , report = fragment('
              ') - , stack = [report] - , progress - , ctx - - if (canvas.getContext) { - ctx = canvas.getContext('2d'); - progress = new Progress; - } - - if (!root) return error('#mocha div missing, add it to your document'); - - root.appendChild(stat); - root.appendChild(report); - - if (progress) progress.size(40); - - runner.on('suite', function(suite){ - if (suite.root) return; - - // suite - var url = location.protocol + '//' + location.host + location.pathname + '?grep=^' + utils.escapeRegexp(suite.fullTitle()); - var el = fragment('
            • %s

            • ', url, suite.title); - - // container - stack[0].appendChild(el); - stack.unshift(document.createElement('ul')); - el.appendChild(stack[0]); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - stack.shift(); - }); - - runner.on('fail', function(test, err){ - if ('hook' == test.type || err.uncaught) runner.emit('test end', test); - }); - - runner.on('test end', function(test){ - // TODO: add to stats - var percent = stats.tests / total * 100 | 0; - if (progress) progress.update(percent).draw(ctx); - - // update stats - var ms = new Date - stats.start; - text(passes, stats.passes); - text(failures, stats.failures); - text(duration, (ms / 1000).toFixed(2)); - - // test - if ('passed' == test.state) { - var el = fragment('
            • %e%ems

            • ', test.speed, test.title, test.duration); - } else if (test.pending) { - var el = fragment('
            • %e

            • ', test.title); - } else { - var el = fragment('
            • %e

            • ', test.title); - var str = test.err.stack || test.err.toString(); - - // FF / Opera do not add the message - if (!~str.indexOf(test.err.message)) { - str = test.err.message + '\n' + str; - } - - // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we - // check for the result of the stringifying. - if ('[object Error]' == str) str = test.err.message; - - // Safari doesn't give you a stack. Let's at least provide a source line. - if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { - str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; - } - - el.appendChild(fragment('
              %e
              ', str)); - } - - // toggle code - var h2 = el.getElementsByTagName('h2')[0]; - - on(h2, 'click', function(){ - pre.style.display = 'none' == pre.style.display - ? 'block' - : 'none'; - }); - - // code - // TODO: defer - if (!test.pending) { - var pre = fragment('
              %e
              ', utils.clean(test.fn.toString())); - el.appendChild(pre); - pre.style.display = 'none'; - } - - stack[0].appendChild(el); - }); -} - -/** - * Display error `msg`. - */ - -function error(msg) { - document.body.appendChild(fragment('
              %s
              ', msg)); -} - -/** - * Return a DOM fragment from `html`. - */ - -function fragment(html) { - var args = arguments - , div = document.createElement('div') - , i = 1; - - div.innerHTML = html.replace(/%([se])/g, function(_, type){ - switch (type) { - case 's': return String(args[i++]); - case 'e': return escape(args[i++]); - } - }); - - return div.firstChild; -} - -/** - * Set `el` text to `str`. - */ - -function text(el, str) { - if (el.textContent) { - el.textContent = str; - } else { - el.innerText = str; - } -} - -/** - * Listen on `event` with callback `fn`. - */ - -function on(el, event, fn) { - if (el.addEventListener) { - el.addEventListener(event, fn, false); - } else { - el.attachEvent('on' + event, fn); - } -} -}); // module: reporters/html.js - -require.register("reporters/index.js", function(module, exports, require){ - -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Min = require('./min'); -exports.Spec = require('./spec'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONCov = require('./json-cov'); -exports.HTMLCov = require('./html-cov'); -exports.JSONStream = require('./json-stream'); -exports.XUnit = require('./xunit') -exports.Teamcity = require('./teamcity') - -}); // module: reporters/index.js - -require.register("reporters/json-cov.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `JSONCov`. - */ - -exports = module.exports = JSONCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @param {Runner} runner - * @param {Boolean} output - * @api public - */ - -function JSONCov(runner, output) { - var self = this - , output = 1 == arguments.length ? true : output; - - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var cov = global._$jscoverage || {}; - var result = self.cov = map(cov); - result.stats = self.stats; - result.tests = tests.map(clean); - result.failures = failures.map(clean); - result.passes = passes.map(clean); - if (!output) return; - process.stdout.write(JSON.stringify(result, null, 2 )); - }); -} - -/** - * Map jscoverage data to a JSON structure - * suitable for reporting. - * - * @param {Object} cov - * @return {Object} - * @api private - */ - -function map(cov) { - var ret = { - instrumentation: 'node-jscoverage' - , sloc: 0 - , hits: 0 - , misses: 0 - , coverage: 0 - , files: [] - }; - - for (var filename in cov) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; - } - - if (ret.sloc > 0) { - ret.coverage = (ret.hits / ret.sloc) * 100; - } - - return ret; -}; - -/** - * Map jscoverage data for a single source file - * to a JSON structure suitable for reporting. - * - * @param {String} filename name of the source file - * @param {Object} data jscoverage coverage data - * @return {Object} - * @api private - */ - -function coverage(filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc: 0, - source: {} - }; - - data.source.forEach(function(line, num){ - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - ret.source[num] = { - source: line - , coverage: data[num] === undefined - ? '' - : data[num] - }; - }); - - ret.coverage = ret.hits / ret.sloc * 100; - - return ret; -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} - -}); // module: reporters/json-cov.js - -require.register("reporters/json-stream.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total; - - runner.on('start', function(){ - console.log(JSON.stringify(['start', { total: total }])); - }); - - runner.on('pass', function(test){ - console.log(JSON.stringify(['pass', clean(test)])); - }); - - runner.on('fail', function(test, err){ - console.log(JSON.stringify(['fail', clean(test)])); - }); - - runner.on('end', function(){ - process.stdout.write(JSON.stringify(['end', self.stats])); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json-stream.js - -require.register("reporters/json.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `JSON`. - */ - -exports = module.exports = JSONReporter; - -/** - * Initialize a new `JSON` reporter. - * - * @param {Runner} runner - * @api public - */ - -function JSONReporter(runner) { - var self = this; - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var obj = { - stats: self.stats - , tests: tests.map(clean) - , failures: failures.map(clean) - , passes: passes.map(clean) - }; - - process.stdout.write(JSON.stringify(obj, null, 2)); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json.js - -require.register("reporters/landing.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Landing`. - */ - -exports = module.exports = Landing; - -/** - * Airplane color. - */ - -Base.colors.plane = 0; - -/** - * Airplane crash color. - */ - -Base.colors['plane crash'] = 31; - -/** - * Runway color. - */ - -Base.colors.runway = 90; - -/** - * Initialize a new `Landing` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Landing(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; - - function runway() { - var buf = Array(width).join('-'); - return ' ' + color('runway', buf); - } - - runner.on('start', function(){ - stream.write('\n '); - cursor.hide(); - }); - - runner.on('test end', function(test){ - // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; - - // show the crash - if ('failed' == test.state) { - plane = color('plane crash', '✈'); - crashed = col; - } - - // render landing strip - stream.write('\033[4F\n\n'); - stream.write(runway()); - stream.write('\n '); - stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) - stream.write(color('runway', Array(width - col).join('⋅') + '\n')); - stream.write(runway()); - stream.write('\033[0m'); - }); - - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Landing.prototype = new Base; -Landing.prototype.constructor = Landing; - -}); // module: reporters/landing.js - -require.register("reporters/list.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , n = 0; - - runner.on('start', function(){ - console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = color('checkmark', ' -') - + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); - }); - - runner.on('pass', function(test){ - var fmt = color('checkmark', ' ✓') - + color('pass', ' %s: ') - + color(test.speed, '%dms'); - cursor.CR(); - console.log(fmt, test.fullTitle(), test.duration); - }); - - runner.on('fail', function(test, err){ - cursor.CR(); - console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -List.prototype = new Base; -List.prototype.constructor = List; - - -}); // module: reporters/list.js - -require.register("reporters/markdown.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils'); - -/** - * Expose `Markdown`. - */ - -exports = module.exports = Markdown; - -/** - * Initialize a new `Markdown` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Markdown(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , level = 0 - , buf = ''; - - function title(str) { - return Array(level).join('#') + ' ' + str; - } - - function indent() { - return Array(level).join(' '); - } - - function mapTOC(suite, obj) { - var ret = obj; - obj = obj[suite.title] = obj[suite.title] || { suite: suite }; - suite.suites.forEach(function(suite){ - mapTOC(suite, obj); - }); - return ret; - } - - function stringifyTOC(obj, level) { - ++level; - var buf = ''; - var link; - for (var key in obj) { - if ('suite' == key) continue; - if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; - if (key) buf += Array(level).join(' ') + link; - buf += stringifyTOC(obj[key], level); - } - --level; - return buf; - } - - function generateTOC(suite) { - var obj = mapTOC(suite, {}); - return stringifyTOC(obj, 0); - } - - generateTOC(runner.suite); - - runner.on('suite', function(suite){ - ++level; - var slug = utils.slug(suite.fullTitle()); - buf += '' + '\n'; - buf += title(suite.title) + '\n'; - }); - - runner.on('suite end', function(suite){ - --level; - }); - - runner.on('pass', function(test){ - var code = utils.clean(test.fn.toString()); - buf += test.title + '.\n'; - buf += '\n```js'; - buf += code + '\n'; - buf += '```\n\n'; - }); - - runner.on('end', function(){ - process.stdout.write('# TOC\n'); - process.stdout.write(generateTOC(runner.suite)); - process.stdout.write(buf); - }); -} -}); // module: reporters/markdown.js - -require.register("reporters/min.js", function(module, exports, require){ -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Min`. - */ - -exports = module.exports = Min; - -/** - * Initialize a new `Min` minimal test reporter (best used with --watch). - * - * @param {Runner} runner - * @api public - */ - -function Min(runner) { - Base.call(this, runner); - - runner.on('start', function(){ - // clear screen - process.stdout.write('\033[2J'); - // set cursor position - process.stdout.write('\033[1;3H'); - }); - - runner.on('end', this.epilogue.bind(this)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Min.prototype = new Base; -Min.prototype.constructor = Min; - -}); // module: reporters/min.js - -require.register("reporters/progress.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Progress`. - */ - -exports = module.exports = Progress; - -/** - * General progress bar color. - */ - -Base.colors.progress = 90; - -/** - * Initialize a new `Progress` bar test reporter. - * - * @param {Runner} runner - * @param {Object} options - * @api public - */ - -function Progress(runner, options) { - Base.call(this, runner); - - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max; - - // default chars - options.open = options.open || '['; - options.complete = options.complete || '▬'; - options.incomplete = options.incomplete || '⋅'; - options.close = options.close || ']'; - options.verbose = false; - - // tests started - runner.on('start', function(){ - console.log(); - cursor.hide(); - }); - - // tests complete - runner.on('test end', function(){ - complete++; - var incomplete = total - complete - , percent = complete / total - , n = width * percent | 0 - , i = width - n; - - cursor.CR(); - process.stdout.write('\033[J'); - process.stdout.write(color('progress', ' ' + options.open)); - process.stdout.write(Array(n).join(options.complete)); - process.stdout.write(Array(i).join(options.incomplete)); - process.stdout.write(color('progress', options.close)); - if (options.verbose) { - process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); - } - }); - - // tests are complete, output some stats - // and the failures if any - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Progress.prototype = new Base; -Progress.prototype.constructor = Progress; - - -}); // module: reporters/progress.js - -require.register("reporters/spec.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Spec`. - */ - -exports = module.exports = Spec; - -/** - * Initialize a new `Spec` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Spec(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , indents = 0 - , n = 0; - - function indent() { - return Array(indents).join(' ') - } - - runner.on('start', function(){ - console.log(); - }); - - runner.on('suite', function(suite){ - ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); - }); - - runner.on('suite end', function(suite){ - --indents; - if (1 == indents) console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(indent() + color('pass', ' ◦ ' + test.title + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); - }); - - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s '); - cursor.CR(); - console.log(fmt, test.title); - } else { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); - cursor.CR(); - console.log(fmt, test.title, test.duration); - } - }); - - runner.on('fail', function(test, err){ - cursor.CR(); - console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Spec.prototype = new Base; -Spec.prototype.constructor = Spec; - - -}); // module: reporters/spec.js - -require.register("reporters/tap.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `TAP`. - */ - -exports = module.exports = TAP; - -/** - * Initialize a new `TAP` reporter. - * - * @param {Runner} runner - * @api public - */ - -function TAP(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , n = 1; - - runner.on('start', function(){ - console.log('%d..%d', 1, total); - }); - - runner.on('test end', function(){ - ++n; - }); - - runner.on('pending', function(test){ - console.log('ok %d %s # SKIP -', n, title(test)); - }); - - runner.on('pass', function(test){ - console.log('ok %d %s', n, title(test)); - }); - - runner.on('fail', function(test, err){ - console.log('not ok %d %s', n, title(test)); - console.log(err.stack.replace(/^/gm, ' ')); - }); -} - -/** - * Return a TAP-safe title of `test` - * - * @param {Object} test - * @return {String} - * @api private - */ - -function title(test) { - return test.fullTitle().replace(/#/g, ''); -} - -}); // module: reporters/tap.js - -require.register("reporters/teamcity.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Teamcity`. - */ - -exports = module.exports = Teamcity; - -/** - * Initialize a new `Teamcity` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Teamcity(runner) { - Base.call(this, runner); - var stats = this.stats; - - runner.on('start', function() { - console.log("##teamcity[testSuiteStarted name='mocha.suite']"); - }); - - runner.on('test', function(test) { - console.log("##teamcity[testStarted name='" + escape(test.fullTitle()) + "']"); - }); - - runner.on('fail', function(test, err) { - console.log("##teamcity[testFailed name='" + escape(test.fullTitle()) + "' message='" + escape(err.message) + "']"); - }); - - runner.on('pending', function(test) { - console.log("##teamcity[testIgnored name='" + escape(test.fullTitle()) + "' message='pending']"); - }); - - runner.on('test end', function(test) { - console.log("##teamcity[testFinished name='" + escape(test.fullTitle()) + "' duration='" + test.duration + "']"); - }); - - runner.on('end', function() { - console.log("##teamcity[testSuiteFinished name='mocha.suite' duration='" + stats.duration + "']"); - }); -} - -/** - * Escape the given `str`. - */ - -function escape(str) { - return str - .replace(/\|/g, "||") - .replace(/\n/g, "|n") - .replace(/\r/g, "|r") - .replace(/\[/g, "|[") - .replace(/\]/g, "|]") - .replace(/\u0085/g, "|x") - .replace(/\u2028/g, "|l") - .replace(/\u2029/g, "|p") - .replace(/'/g, "|'"); -} - -}); // module: reporters/teamcity.js - -require.register("reporters/xunit.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils') - , escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `XUnit`. - */ - -exports = module.exports = XUnit; - -/** - * Initialize a new `XUnit` reporter. - * - * @param {Runner} runner - * @api public - */ - -function XUnit(runner) { - Base.call(this, runner); - var stats = this.stats - , tests = [] - , self = this; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('end', function(){ - console.log(tag('testsuite', { - name: 'Mocha Tests' - , tests: stats.tests - , failures: stats.failures - , errors: stats.failures - , skip: stats.tests - stats.failures - stats.passes - , timestamp: (new Date).toUTCString() - , time: stats.duration / 1000 - }, false)); - - tests.forEach(test); - console.log(''); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -XUnit.prototype = new Base; -XUnit.prototype.constructor = XUnit; - - -/** - * Output tag for the given `test.` - */ - -function test(test) { - var attrs = { - classname: test.parent.fullTitle() - , name: test.title - , time: test.duration / 1000 - }; - - if ('failed' == test.state) { - var err = test.err; - attrs.message = escape(err.message); - console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); - } else if (test.pending) { - console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); - } else { - console.log(tag('testcase', attrs, true) ); - } -} - -/** - * HTML tag helper. - */ - -function tag(name, attrs, close, content) { - var end = close ? '/>' : '>' - , pairs = [] - , tag; - - for (var key in attrs) { - pairs.push(key + '="' + escape(attrs[key]) + '"'); - } - - tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; - if (content) tag += content + ''; -} - -}); // module: reporters/xunit.js - -require.register("runnable.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('runnable'); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `Runnable`. - */ - -module.exports = Runnable; - -/** - * Initialize a new `Runnable` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Runnable(title, fn) { - this.title = title; - this.fn = fn; - this.async = fn && fn.length; - this.sync = ! this.async; - this._timeout = 2000; - this.timedOut = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runnable.prototype = new EventEmitter; -Runnable.prototype.constructor = Runnable; - - -/** - * Set & get timeout `ms`. - * - * @param {Number} ms - * @return {Runnable|Number} ms or self - * @api private - */ - -Runnable.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - debug('timeout %d', ms); - this._timeout = ms; - if (this.timer) this.resetTimeout(); - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Runnable.prototype.fullTitle = function(){ - return this.parent.fullTitle() + ' ' + this.title; -}; - -/** - * Clear the timeout. - * - * @api private - */ - -Runnable.prototype.clearTimeout = function(){ - clearTimeout(this.timer); -}; - -/** - * Reset the timeout. - * - * @api private - */ - -Runnable.prototype.resetTimeout = function(){ - var self = this - , ms = this.timeout(); - - this.clearTimeout(); - if (ms) { - this.timer = setTimeout(function(){ - self.callback(new Error('timeout of ' + ms + 'ms exceeded')); - self.timedOut = true; - }, ms); - } -}; - -/** - * Run the test and invoke `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runnable.prototype.run = function(fn){ - var self = this - , ms = this.timeout() - , start = new Date - , ctx = this.ctx - , finished - , emitted; - - if (ctx) ctx.runnable(this); - - // timeout - if (this.async) { - if (ms) { - this.timer = setTimeout(function(){ - done(new Error('timeout of ' + ms + 'ms exceeded')); - self.timedOut = true; - }, ms); - } - } - - // called multiple times - function multiple() { - if (emitted) return; - emitted = true; - self.emit('error', new Error('done() called multiple times')); - } - - // finished - function done(err) { - if (self.timedOut) return; - if (finished) return multiple(); - self.clearTimeout(); - self.duration = new Date - start; - finished = true; - fn(err); - } - - // for .resetTimeout() - this.callback = done; - - // async - if (this.async) { - try { - this.fn.call(ctx, function(err){ - if (err instanceof Error) return done(err); - if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); - done(); - }); - } catch (err) { - done(err); - } - return; - } - - // sync - try { - if (!this.pending) this.fn.call(ctx); - this.duration = new Date - start; - fn(); - } catch (err) { - fn(err); - } -}; - -}); // module: runnable.js - -require.register("runner.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('runner') - , Test = require('./test') - , utils = require('./utils') - , filter = utils.filter - , keys = utils.keys - , noop = function(){}; - -/** - * Expose `Runner`. - */ - -module.exports = Runner; - -/** - * Initialize a `Runner` for the given `suite`. - * - * Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - * @api public - */ - -function Runner(suite) { - var self = this; - this._globals = []; - this.suite = suite; - this.total = suite.total(); - this.failures = 0; - this.on('test end', function(test){ self.checkGlobals(test); }); - this.on('hook end', function(hook){ self.checkGlobals(hook); }); - this.grep(/.*/); - this.globals(utils.keys(global).concat(['errno'])); -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runner.prototype = new EventEmitter; -Runner.prototype.constructor = Runner; - - -/** - * Run tests with full titles matching `re`. Updates runner.total - * with number of tests matched. - * - * @param {RegExp} re - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.grep = function(re){ - debug('grep %s', re); - this._grep = re; - this.total = this.grepTotal(this.suite); - return this; -}; - -/** - * Returns the number of tests matching the grep search for the - * given suite. - * - * @param {Suite} suite - * @return {Number} - * @api public - */ - -Runner.prototype.grepTotal = function(suite) { - var self = this; - var total = 0; - - suite.eachTest(function(test){ - if (self._grep.test(test.fullTitle())) total++; - }); - - return total; -}; - -/** - * Allow the given `arr` of globals. - * - * @param {Array} arr - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.globals = function(arr){ - if (0 == arguments.length) return this._globals; - debug('globals %j', arr); - utils.forEach(arr, function(arr){ - this._globals.push(arr); - }, this); - return this; -}; - -/** - * Check for global variable leaks. - * - * @api private - */ - -Runner.prototype.checkGlobals = function(test){ - if (this.ignoreLeaks) return; - var leaks = filterLeaks(this._globals); - - this._globals = this._globals.concat(leaks); - - if (leaks.length > 1) { - this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); - } else if (leaks.length) { - this.fail(test, new Error('global leak detected: ' + leaks[0])); - } -}; - -/** - * Fail the given `test`. - * - * @param {Test} test - * @param {Error} err - * @api private - */ - -Runner.prototype.fail = function(test, err){ - ++this.failures; - test.state = 'failed'; - if ('string' == typeof err) { - err = new Error('the string "' + err + '" was thrown, throw an Error :)'); - } - this.emit('fail', test, err); -}; - -/** - * Fail the given `hook` with `err`. - * - * Hook failures (currently) hard-end due - * to that fact that a failing hook will - * surely cause subsequent tests to fail, - * causing jumbled reporting. - * - * @param {Hook} hook - * @param {Error} err - * @api private - */ - -Runner.prototype.failHook = function(hook, err){ - this.fail(hook, err); - this.emit('end'); -}; - -/** - * Run hook `name` callbacks and then invoke `fn()`. - * - * @param {String} name - * @param {Function} function - * @api private - */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , hooks = suite['_' + name] - , ms = suite._timeout - , self = this - , timer; - - function next(i) { - var hook = hooks[i]; - if (!hook) return fn(); - self.currentRunnable = hook; - - self.emit('hook', hook); - - hook.on('error', function(err){ - self.failHook(hook, err); - }); - - hook.run(function(err){ - hook.removeAllListeners('error'); - if (err) return self.failHook(hook, err); - self.emit('hook end', hook); - next(++i); - }); - } - - process.nextTick(function(){ - next(0); - }); -}; - -/** - * Run hook `name` for the given array of `suites` - * in order, and callback `fn(err)`. - * - * @param {String} name - * @param {Array} suites - * @param {Function} fn - * @api private - */ - -Runner.prototype.hooks = function(name, suites, fn){ - var self = this - , orig = this.suite; - - function next(suite) { - self.suite = suite; - - if (!suite) { - self.suite = orig; - return fn(); - } - - self.hook(name, function(err){ - if (err) { - self.suite = orig; - return fn(err); - } - - next(suites.pop()); - }); - } - - next(suites.pop()); -}; - -/** - * Run hooks from the top level down. - * - * @param {String} name - * @param {Function} fn - * @api private - */ - -Runner.prototype.hookUp = function(name, fn){ - var suites = [this.suite].concat(this.parents()).reverse(); - this.hooks(name, suites, fn); -}; - -/** - * Run hooks from the bottom up. - * - * @param {String} name - * @param {Function} fn - * @api private - */ - -Runner.prototype.hookDown = function(name, fn){ - var suites = [this.suite].concat(this.parents()); - this.hooks(name, suites, fn); -}; - -/** - * Return an array of parent Suites from - * closest to furthest. - * - * @return {Array} - * @api private - */ - -Runner.prototype.parents = function(){ - var suite = this.suite - , suites = []; - while (suite = suite.parent) suites.push(suite); - return suites; -}; - -/** - * Run the current test and callback `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - try { - test.on('error', function(err){ - self.fail(test, err); - }); - test.run(fn); - } catch (err) { - fn(err); - } -}; - -/** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests - , test; - - function next(err) { - // if we bail after first err - if (self.failures && suite._bail) return fn(); - - // next test - test = tests.shift(); - - // all done - if (!test) return fn(); - - // grep - if (!self._grep.test(test.fullTitle())) return next(); - - // pending - if (test.pending) { - self.emit('pending', test); - self.emit('test end', test); - return next(); - } - - // execute test and hook(s) - self.emit('test', self.test = test); - self.hookDown('beforeEach', function(){ - self.currentRunnable = self.test; - self.runTest(function(err){ - test = self.test; - - if (err) { - self.fail(test, err); - self.emit('test end', test); - return self.hookUp('afterEach', next); - } - - test.state = 'passed'; - self.emit('pass', test); - self.emit('test end', test); - self.hookUp('afterEach', next); - }); - }); - } - - this.next = next; - next(); -}; - -/** - * Run the given `suite` and invoke the - * callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runSuite = function(suite, fn){ - var total = this.grepTotal(suite) - , self = this - , i = 0; - - debug('run suite %s', suite.fullTitle()); - - if (!total) return fn(); - - this.emit('suite', this.suite = suite); - - function next() { - var curr = suite.suites[i++]; - if (!curr) return done(); - self.runSuite(curr, next); - } - - function done() { - self.suite = suite; - self.hook('afterAll', function(){ - self.emit('suite end', suite); - fn(); - }); - } - - this.hook('beforeAll', function(){ - self.runTests(suite, next); - }); -}; - -/** - * Handle uncaught exceptions. - * - * @param {Error} err - * @api private - */ - -Runner.prototype.uncaught = function(err){ - debug('uncaught exception'); - var runnable = this.currentRunnable; - if ('failed' == runnable.state) return; - runnable.clearTimeout(); - err.uncaught = true; - this.fail(runnable, err); - - // recover from test - if ('test' == runnable.type) { - this.emit('test end', runnable); - this.hookUp('afterEach', this.next); - return; - } - - // bail on hooks - this.emit('end'); -}; - -/** - * Run the root suite and invoke `fn(failures)` - * on completion. - * - * @param {Function} fn - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.run = function(fn){ - var self = this - , fn = fn || function(){}; - - debug('start'); - - // callback - this.on('end', function(){ - debug('end'); - process.removeListener('uncaughtException', this.uncaught); - fn(self.failures); - }); - - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - debug('finished running'); - self.emit('end'); - }); - - // uncaught exception - process.on('uncaughtException', function(err){ - self.uncaught(err); - }); - - return this; -}; - -/** - * Filter leaks with the given globals flagged as `ok`. - * - * @param {Array} ok - * @return {Array} - * @api private - */ - -function filterLeaks(ok) { - return filter(keys(global), function(key){ - var matched = filter(ok, function(ok){ - return 0 == key.indexOf(ok.split('*')[0]); - }); - return matched.length == 0 && (!global.navigator || 'onerror' !== key); - }); -} -}); // module: runner.js - -require.register("suite.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('suite') - , utils = require('./utils') - , Hook = require('./hook'); - -/** - * Expose `Suite`. - */ - -exports = module.exports = Suite; - -/** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. - * - * @param {Suite} parent - * @param {String} title - * @return {Suite} - * @api public - */ - -exports.create = function(parent, title){ - var suite = new Suite(title, parent.ctx); - suite.parent = parent; - title = suite.fullTitle(); - parent.addSuite(suite); - return suite; -}; - -/** - * Initialize a new `Suite` with the given - * `title` and `ctx`. - * - * @param {String} title - * @param {Context} ctx - * @api private - */ - -function Suite(title, ctx) { - this.title = title; - this.ctx = ctx; - this.suites = []; - this.tests = []; - this._beforeEach = []; - this._beforeAll = []; - this._afterEach = []; - this._afterAll = []; - this.root = !title; - this._timeout = 2000; - this._bail = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Suite.prototype = new EventEmitter; -Suite.prototype.constructor = Suite; - - -/** - * Return a clone of this `Suite`. - * - * @return {Suite} - * @api private - */ - -Suite.prototype.clone = function(){ - var suite = new Suite(this.title); - debug('clone'); - suite.ctx = this.ctx; - suite.timeout(this.timeout()); - suite.bail(this.bail()); - return suite; -}; - -/** - * Set timeout `ms` or short-hand such as "2s". - * - * @param {Number|String} ms - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if (String(ms).match(/s$/)) ms = parseFloat(ms) * 1000; - debug('timeout %d', ms); - this._timeout = parseInt(ms, 10); - return this; -}; - -/** - * Sets whether to bail after first error. - * - * @parma {Boolean} bail - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.bail = function(bail){ - if (0 == arguments.length) return this._bail; - debug('bail %s', bail); - this._bail = bail; - return this; -}; - -/** - * Run `fn(test[, done])` before running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeAll = function(fn){ - var hook = new Hook('"before all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.ctx = this.ctx; - this._beforeAll.push(hook); - this.emit('beforeAll', hook); - return this; -}; - -/** - * Run `fn(test[, done])` after running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterAll = function(fn){ - var hook = new Hook('"after all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.ctx = this.ctx; - this._afterAll.push(hook); - this.emit('afterAll', hook); - return this; -}; - -/** - * Run `fn(test[, done])` before each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeEach = function(fn){ - var hook = new Hook('"before each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.ctx = this.ctx; - this._beforeEach.push(hook); - this.emit('beforeEach', hook); - return this; -}; - -/** - * Run `fn(test[, done])` after each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterEach = function(fn){ - var hook = new Hook('"after each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.ctx = this.ctx; - this._afterEach.push(hook); - this.emit('afterEach', hook); - return this; -}; - -/** - * Add a test `suite`. - * - * @param {Suite} suite - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addSuite = function(suite){ - suite.parent = this; - suite.timeout(this.timeout()); - suite.bail(this.bail()); - this.suites.push(suite); - this.emit('suite', suite); - return this; -}; - -/** - * Add a `test` to this suite. - * - * @param {Test} test - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addTest = function(test){ - test.parent = this; - test.timeout(this.timeout()); - test.ctx = this.ctx; - this.tests.push(test); - this.emit('test', test); - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Suite.prototype.fullTitle = function(){ - if (this.parent) { - var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; - } - return this.title; -}; - -/** - * Return the total number of tests. - * - * @return {Number} - * @api public - */ - -Suite.prototype.total = function(){ - return utils.reduce(this.suites, function(sum, suite){ - return sum + suite.total(); - }, 0) + this.tests.length; -}; - -/** - * Iterates through each suite recursively to find - * all tests. Applies a function in the format - * `fn(test)`. - * - * @param {Function} fn - * @return {Suite} - * @api private - */ - -Suite.prototype.eachTest = function(fn){ - utils.forEach(this.tests, fn); - utils.forEach(this.suites, function(suite){ - suite.eachTest(fn); - }); - return this; -}; - -}); // module: suite.js - -require.register("test.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Runnable = require('./runnable'); - -/** - * Expose `Test`. - */ - -module.exports = Test; - -/** - * Initialize a new `Test` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Test(title, fn) { - Runnable.call(this, title, fn); - this.pending = !fn; - this.type = 'test'; -} - -/** - * Inherit from `Runnable.prototype`. - */ - -Test.prototype = new Runnable; -Test.prototype.constructor = Test; - - -/** - * Inspect the context void of private properties. - * - * @return {String} - * @api private - */ - -Test.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - return '_' == key[0] - ? undefined - : 'parent' == key - ? '#' - : val; - }, 2); -}; -}); // module: test.js - -require.register("utils.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var fs = require('browser/fs') - , path = require('browser/path') - , join = path.join - , debug = require('browser/debug')('watch'); - -/** - * Ignored directories. - */ - -var ignore = ['node_modules', '.git']; - -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>'); -}; - -/** - * Array#forEach (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} scope - * @api private - */ - -exports.forEach = function(arr, fn, scope) { - for (var i = 0, l = arr.length; i < l; i++) - fn.call(scope, arr[i], i); -}; - -/** - * Array#indexOf (<=IE8) - * - * @parma {Array} arr - * @param {Object} obj to find index of - * @param {Number} start - * @api private - */ - -exports.indexOf = function (arr, obj, start) { - for (var i = start || 0, l = arr.length; i < l; i++) { - if (arr[i] === obj) - return i; - } - return -1; -}; - -/** - * Array#reduce (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} initial value - * @param {Object} scope - * @api private - */ - -exports.reduce = function(arr, fn, val, scope) { - var rval = val; - - for (var i = 0, l = arr.length; i < l; i++) { - rval = fn.call(scope, rval, arr[i], i, arr); - } - - return rval; -}; - -/** - * Array#filter (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} scope - * @api private - */ - -exports.filter = function(arr, fn, scope) { - var ret = []; - - for (var i = 0, l = arr.length; i < l; i++) { - var val = arr[i]; - if (fn.call(scope, val, i, arr)) - ret.push(val); - } - - return ret; -}; - -/** - * Object.keys (<=IE8) - * - * @param {Object} obj - * @return {Array} keys - * @api private - */ - -exports.keys = Object.keys || function(obj) { - var keys = [] - , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 - - for (var key in obj) { - if (has.call(obj, key)) { - keys.push(key); - } - } - - return keys; -}; - -/** - * Watch the given `files` for changes - * and invoke `fn(file)` on modification. - * - * @param {Array} files - * @param {Function} fn - * @api private - */ - -exports.watch = function(files, fn){ - var options = { interval: 100 }; - files.forEach(function(file){ - debug('file %s', file); - fs.watchFile(file, options, function(curr, prev){ - if (prev.mtime < curr.mtime) fn(file); - }); - }); -}; - -/** - * Ignored files. - */ - -function ignored(path){ - return !~ignore.indexOf(path); -} - -/** - * Lookup files in the given `dir`. - * - * @return {Array} - * @api private - */ - -exports.files = function(dir, ret){ - ret = ret || []; - - fs.readdirSync(dir) - .filter(ignored) - .forEach(function(path){ - path = join(dir, path); - if (fs.statSync(path).isDirectory()) { - exports.files(path, ret); - } else if (path.match(/\.(js|coffee)$/)) { - ret.push(path); - } - }); - - return ret; -}; - -/** - * Compute a slug from the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.slug = function(str){ - return str - .toLowerCase() - .replace(/ +/g, '-') - .replace(/[^-\w]/g, ''); -}; - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -exports.clean = function(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str.replace(re, ''); - - return str.trim(); -}; - -/** - * Escape regular expression characters in `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.escapeRegexp = function(str){ - return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); -}; -}); // module: utils.js diff --git a/coverage.html b/coverage.html deleted file mode 100644 index 16ad6474c4..0000000000 --- a/coverage.html +++ /dev/null @@ -1,333 +0,0 @@ -Coverage

              Coverage

              89%
              772
              694
              78

              connect.js

              100%
              22
              22
              0
              LineHitsSource
              1
              2/*!
              3 * Connect
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var EventEmitter = require('events').EventEmitter
              14 , proto = require('./proto')
              15 , utils = require('./utils')
              16 , path = require('path')
              17 , basename = path.basename
              18 , fs = require('fs');
              19
              20// node patches
              21
              221require('./patch');
              23
              24// expose createServer() as the module
              25
              261exports = module.exports = createServer;
              27
              28/**
              29 * Framework version.
              30 */
              31
              321exports.version = '2.0.0alpha1';
              33
              34/**
              35 * Expose the prototype.
              36 */
              37
              381exports.proto = proto;
              39
              40/**
              41 * Auto-load middleware getters.
              42 */
              43
              441exports.middleware = {};
              45
              46/**
              47 * Expose utilities.
              48 */
              49
              501exports.utils = utils;
              51
              52/**
              53 * Create a new connect server.
              54 *
              55 * @return {Function}
              56 * @api public
              57 */
              58
              591function createServer() {
              60199 function app(req, res){ app.handle(req, res); }
              6171 utils.merge(app, proto);
              6271 utils.merge(app, EventEmitter.prototype);
              6371 app.route = '/';
              6471 app.stack = [];
              6571 return app;
              661};
              67
              68/**
              69 * Auto-load bundled middleware with getters.
              70 */
              71
              721fs.readdirSync(__dirname + '/middleware').forEach(function(filename){
              7323 if (!/\.js$/.test(filename)) return;
              7421 var name = basename(filename, '.js');
              7521 function load(){
              7699 return require('./middleware/' + name);
              77 }
              7821 exports.middleware.__defineGetter__(name, load);
              7921 exports.__defineGetter__(name, load);
              80});

              proto.js

              98%
              62
              61
              1
              LineHitsSource
              1
              2/*!
              3 * Connect - HTTPServer
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var http = require('http')
              14 , parse = require('url').parse
              15 , utils = require('./utils');
              16
              17// prototype
              18
              191var app = module.exports = {};
              20
              21// environment
              22
              231var env = process.env.NODE_ENV || 'development';
              24
              25/**
              26 * Utilize the given middleware `handle` to the given `route`,
              27 * defaulting to _/_. This "route" is the mount-point for the
              28 * middleware, when given a value other than _/_ the middleware
              29 * is only effective when that segment is present in the request's
              30 * pathname.
              31 *
              32 * For example if we were to mount a function at _/admin_, it would
              33 * be invoked on _/admin_, and _/admin/settings_, however it would
              34 * not be invoked for _/_, or _/posts_.
              35 *
              36 * Examples:
              37 *
              38 * var app = connect();
              39 * app.use(connect.favicon());
              40 * app.use(connect.logger());
              41 * app.use(connect.static(__dirname + '/public'));
              42 *
              43 * If we wanted to prefix static files with _/public_, we could
              44 * "mount" the `static()` middleware:
              45 *
              46 * app.use('/public', connect.static(__dirname + '/public'));
              47 *
              48 * This api is chainable, so the following is valid:
              49 *
              50 * connect
              51 * .use(connect.favicon())
              52 * .use(connect.logger())
              53 * .use(connect.static(__dirname + '/public'))
              54 * .listen(3000);
              55 *
              56 * @param {String|Function|Server} route, callback or server
              57 * @param {Function|Server} callback or server
              58 * @return {Server} for chaining
              59 * @api public
              60 */
              61
              621app.use = function(route, fn){
              63 // default route to '/'
              64155 if ('string' != typeof route) {
              65150 fn = route;
              66150 route = '/';
              67 }
              68
              69 // wrap sub-apps
              70155 if ('function' == typeof fn.handle) {
              714 var server = fn;
              724 fn.route = route;
              734 fn = function(req, res, next){
              742 server.handle(req, res, next);
              75 };
              76 }
              77
              78 // wrap vanilla http.Servers
              79155 if (fn instanceof http.Server) {
              801 fn = fn.listeners('request')[0];
              81 }
              82
              83 // strip trailing slash
              84155 if ('/' == route[route.length - 1]) {
              85151 route = route.slice(0, -1);
              86 }
              87
              88 // add the middleware
              89155 this.stack.push({ route: route, handle: fn });
              90
              91155 return this;
              92};
              93
              94/**
              95 * Handle server requests, punting them down
              96 * the middleware stack.
              97 *
              98 * @api private
              99 */
              100
              1011app.handle = function(req, res, out) {
              102130 var stack = this.stack
              103 , fqdn = ~req.url.indexOf('://')
              104 , removed = ''
              105 , index = 0;
              106
              107130 function next(err) {
              108268 var layer, path, status, c;
              109268 req.url = removed + req.url;
              110268 req.originalUrl = req.originalUrl || req.url;
              111268 removed = '';
              112
              113 // next callback
              114268 layer = stack[index++];
              115
              116 // all done
              117268 if (!layer || res.headerSent) {
              118 // delegate to parent
              11911 if (out) return out(err);
              120
              121 // unhandled error
              12211 if (err) {
              123 // default to 500
              12416 if (res.statusCode < 400) res.statusCode = 500;
              125
              126 // respect err.status
              12714 if (err.status) res.statusCode = err.status;
              128
              129 // production gets a basic error message
              1308 var msg = 'production' == env
              131 ? http.STATUS_CODES[res.statusCode]
              132 : err.stack || err.toString();
              133
              134 // log to stderr in a non-test env
              1358 if ('test' != env) console.error(err.stack || err.toString());
              1368 if (res.headerSent) return req.socket.destroy();
              1378 res.setHeader('Content-Type', 'text/plain');
              1388 res.setHeader('Content-Length', Buffer.byteLength(msg));
              1398 if ('HEAD' == req.method) return res.end();
              1408 res.end(msg);
              141 } else {
              1423 res.statusCode = 404;
              1433 res.setHeader('Content-Type', 'text/plain');
              1443 if ('HEAD' == req.method) return res.end();
              1453 res.end('Cannot ' + req.method + ' ' + utils.escape(req.url));
              146 }
              14711 return;
              148 }
              149
              150257 try {
              151257 path = parse(req.url).pathname;
              152257 if (undefined == path) path = '/';
              153
              154 // skip this layer if the route doesn't match.
              155257 if (0 != path.indexOf(layer.route)) return next(err);
              156
              157257 c = path[layer.route.length];
              158257 if (c && '/' != c && '.' != c) return next(err);
              159
              160 // Call the layer handler
              161 // Trim off the part of the url that matches the route
              162257 removed = layer.route;
              163257 req.url = req.url.substr(removed.length);
              164
              165 // Ensure leading slash
              166260 if (!fqdn && '/' != req.url[0]) req.url = '/' + req.url;
              167
              168257 var arity = layer.handle.length;
              169257 if (err) {
              1708 if (arity === 4) {
              1713 layer.handle(err, req, res, next);
              172 } else {
              1735 next(err);
              174 }
              175249 } else if (arity < 4) {
              176249 layer.handle(req, res, next);
              177 } else {
              1780 next();
              179 }
              180 } catch (e) {
              1811 next(e);
              182 }
              183 }
              184130 next();
              185};

              utils.js

              86%
              129
              111
              18
              LineHitsSource
              1
              2/*!
              3 * Connect - utils
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var http = require('http')
              14 , crypto = require('crypto')
              15 , Path = require('path')
              16 , fs = require('fs');
              17
              18/**
              19 * Extract the mime type from the given request's
              20 * _Content-Type_ header.
              21 *
              22 * @param {IncomingMessage} req
              23 * @return {String}
              24 * @api private
              25 */
              26
              271exports.mime = function(req) {
              2849 var str = req.headers['content-type'] || '';
              2949 return str.split(';')[0];
              30};
              31
              32/**
              33 * Generate an `Error` from the given status `code`.
              34 *
              35 * @param {Number} code
              36 * @return {Error}
              37 * @api private
              38 */
              39
              401exports.error = function(code){
              415 var err = new Error(http.STATUS_CODES[code]);
              425 err.status = code;
              435 return err;
              44};
              45
              46/**
              47 * Flatten the given `arr`.
              48 *
              49 * @param {Array} arr
              50 * @return {Array}
              51 * @api private
              52 */
              53
              541exports.flatten = function(arr, ret){
              550 var ret = ret || []
              56 , len = arr.length;
              570 for (var i = 0; i < len; ++i) {
              580 if (Array.isArray(arr[i])) {
              590 exports.flatten(arr[i], ret);
              60 } else {
              610 ret.push(arr[i]);
              62 }
              63 }
              640 return ret;
              65};
              66
              67/**
              68 * Return md5 hash of the given string and optional encoding,
              69 * defaulting to hex.
              70 *
              71 * utils.md5('wahoo');
              72 * // => "e493298061761236c96b02ea6aa8a2ad"
              73 *
              74 * @param {String} str
              75 * @param {String} encoding
              76 * @return {String}
              77 * @api public
              78 */
              79
              801exports.md5 = function(str, encoding){
              810 return crypto
              82 .createHash('md5')
              83 .update(str)
              84 .digest(encoding || 'hex');
              85};
              86
              87/**
              88 * Merge object b with object a.
              89 *
              90 * var a = { foo: 'bar' }
              91 * , b = { bar: 'baz' };
              92 *
              93 * utils.merge(a, b);
              94 * // => { foo: 'bar', bar: 'baz' }
              95 *
              96 * @param {Object} a
              97 * @param {Object} b
              98 * @return {Object}
              99 * @api private
              100 */
              101
              1021exports.merge = function(a, b){
              103178 if (a && b) {
              104178 for (var key in b) {
              105885 a[key] = b[key];
              106 }
              107 }
              108178 return a;
              109};
              110
              111/**
              112 * Escape the given string of `html`.
              113 *
              114 * @param {String} html
              115 * @return {String}
              116 * @api private
              117 */
              118
              1191exports.escape = function(html){
              1203 return String(html)
              121 .replace(/&(?!\w+;)/g, '&amp;')
              122 .replace(/</g, '&lt;')
              123 .replace(/>/g, '&gt;')
              124 .replace(/"/g, '&quot;');
              125};
              126
              127
              128/**
              129 * Return a unique identifier with the given `len`.
              130 *
              131 * utils.uid(10);
              132 * // => "FDaS435D2z"
              133 *
              134 * @param {Number} len
              135 * @return {String}
              136 * @api private
              137 */
              138
              1391exports.uid = function(len) {
              14043 return crypto.randomBytes(Math.ceil(len * 3 / 4))
              141 .toString('base64')
              142 .slice(0, len);
              143};
              144
              145/**
              146 * Sign the given `val` with `secret`.
              147 *
              148 * @param {String} val
              149 * @param {String} secret
              150 * @return {String}
              151 * @api private
              152 */
              153
              1541exports.sign = function(val, secret){
              15547 return val + '.' + crypto
              156 .createHmac('sha1', secret)
              157 .update(val)
              158 .digest('base64')
              159 .replace(/=+$/, '');
              160};
              161
              162/**
              163 * Unsign and decode the given `val` with `secret`,
              164 * returning `false` if the signature is invalid.
              165 *
              166 * @param {String} val
              167 * @param {String} secret
              168 * @return {String|Boolean}
              169 * @api private
              170 */
              171
              1721exports.unsign = function(val, secret){
              17317 var str = val.slice(0,val.lastIndexOf('.'));
              17417 return exports.sign(str, secret) == val
              175 ? str
              176 : false;
              177};
              178
              179/**
              180 * Parse signed cookies, returning an object
              181 * containing the decoded key/value pairs,
              182 * while removing the signed key from `obj`.
              183 *
              184 * @param {Object} obj
              185 * @return {Object}
              186 * @api private
              187 */
              188
              1891exports.parseSignedCookies = function(obj, secret){
              1908 var ret = {};
              1918 Object.keys(obj).forEach(function(key){
              19212 var val = obj[key]
              193 , signed = exports.unsign(val, secret);
              194
              19512 if (signed) {
              1967 ret[key] = signed;
              1977 delete obj[key];
              198 }
              199 });
              2008 return ret;
              201};
              202
              203/**
              204 * Parse JSON cookies.
              205 *
              206 * @param {Object} obj
              207 * @return {Object}
              208 * @api private
              209 */
              210
              2111exports.parseJSONCookies = function(obj){
              21216 Object.keys(obj).forEach(function(key){
              21312 var val = obj[key];
              21412 if (0 == val.indexOf('j:')) {
              2152 try {
              2162 obj[key] = JSON.parse(val.slice(2));
              217 } catch (err) {
              218 // nothing
              219 }
              220 }
              221 });
              22216 return obj;
              223};
              224
              225/**
              226 * Parse the given cookie string into an object.
              227 *
              228 * @param {String} str
              229 * @return {Object}
              230 * @api private
              231 */
              232
              2331exports.parseCookie = function(str){
              23414 var obj = {}
              235 , pairs = str.split(/[;,] */);
              23614 for (var i = 0, len = pairs.length; i < len; ++i) {
              23719 var pair = pairs[i]
              238 , eqlIndex = pair.indexOf('=')
              239 , key = pair.substr(0, eqlIndex).trim()
              240 , val = pair.substr(++eqlIndex, pair.length).trim();
              241
              242 // quoted values
              24320 if ('"' == val[0]) val = val.slice(1, -1);
              244
              245 // only assign once
              24619 if (undefined == obj[key]) {
              24719 val = val.replace(/\+/g, ' ');
              24819 try {
              24919 obj[key] = decodeURIComponent(val);
              250 } catch (err) {
              2510 if (err instanceof URIError) {
              2520 obj[key] = val;
              253 } else {
              2540 throw err;
              255 }
              256 }
              257 }
              258 }
              25914 return obj;
              260};
              261
              262/**
              263 * Serialize the given object into a cookie string.
              264 *
              265 * utils.serializeCookie('name', 'tj', { httpOnly: true })
              266 * // => "name=tj; httpOnly"
              267 *
              268 * @param {String} name
              269 * @param {String} val
              270 * @param {Object} obj
              271 * @return {String}
              272 * @api private
              273 */
              274
              2751exports.serializeCookie = function(name, val, obj){
              27633 var pairs = [name + '=' + encodeURIComponent(val)]
              277 , obj = obj || {};
              278
              27933 if (obj.domain) pairs.push('domain=' + obj.domain);
              28062 if (obj.path) pairs.push('path=' + obj.path);
              28150 if (obj.expires) pairs.push('expires=' + obj.expires.toUTCString());
              28257 if (obj.httpOnly) pairs.push('httpOnly');
              28337 if (obj.secure) pairs.push('secure');
              284
              28533 return pairs.join('; ');
              286};
              287
              288/**
              289 * Pause `data` and `end` events on the given `obj`.
              290 * Middleware performing async tasks _should_ utilize
              291 * this utility (or similar), to re-emit data once
              292 * the async operation has completed, otherwise these
              293 * events may be lost.
              294 *
              295 * var pause = utils.pause(req);
              296 * fs.readFile(path, function(){
              297 * next();
              298 * pause.resume();
              299 * });
              300 *
              301 * @param {Object} obj
              302 * @return {Object}
              303 * @api private
              304 */
              305
              3061exports.pause = function(obj){
              3077 var onData
              308 , onEnd
              309 , events = [];
              310
              311 // buffer data
              3127 obj.on('data', onData = function(data, encoding){
              3130 events.push(['data', data, encoding]);
              314 });
              315
              316 // buffer end
              3177 obj.on('end', onEnd = function(data, encoding){
              3186 events.push(['end', data, encoding]);
              319 });
              320
              3217 return {
              322 end: function(){
              3236 obj.removeListener('data', onData);
              3246 obj.removeListener('end', onEnd);
              325 },
              326 resume: function(){
              3276 this.end();
              3286 for (var i = 0, len = events.length; i < len; ++i) {
              3295 obj.emit.apply(obj, events[i]);
              330 }
              331 }
              332 };
              333};
              334
              335/**
              336 * Check `req` and `res` to see if it has been modified.
              337 *
              338 * @param {IncomingMessage} req
              339 * @param {ServerResponse} res
              340 * @return {Boolean}
              341 * @api private
              342 */
              343
              3441exports.modified = function(req, res, headers) {
              3451 var headers = headers || res._headers || {}
              346 , modifiedSince = req.headers['if-modified-since']
              347 , lastModified = headers['last-modified']
              348 , noneMatch = req.headers['if-none-match']
              349 , etag = headers['etag'];
              350
              3511 if (noneMatch) noneMatch = noneMatch.split(/ *, */);
              352
              353 // check If-None-Match
              3541 if (noneMatch && etag && ~noneMatch.indexOf(etag)) {
              3550 return false;
              356 }
              357
              358 // check If-Modified-Since
              3591 if (modifiedSince && lastModified) {
              3601 modifiedSince = new Date(modifiedSince);
              3611 lastModified = new Date(lastModified);
              362 // Ignore invalid dates
              3631 if (!isNaN(modifiedSince.getTime())) {
              3642 if (lastModified <= modifiedSince) return false;
              365 }
              366 }
              367
              3680 return true;
              369};
              370
              371/**
              372 * Strip `Content-*` headers from `res`.
              373 *
              374 * @param {ServerResponse} res
              375 * @api private
              376 */
              377
              3781exports.removeContentHeaders = function(res){
              3791 Object.keys(res._headers).forEach(function(field){
              3806 if (0 == field.indexOf('content')) {
              3811 res.removeHeader(field);
              382 }
              383 });
              384};
              385
              386/**
              387 * Check if `req` is a conditional GET request.
              388 *
              389 * @param {IncomingMessage} req
              390 * @return {Boolean}
              391 * @api private
              392 */
              393
              3941exports.conditionalGET = function(req) {
              39536 return req.headers['if-modified-since']
              396 || req.headers['if-none-match'];
              397};
              398
              399/**
              400 * Respond with 401 "Unauthorized".
              401 *
              402 * @param {ServerResponse} res
              403 * @param {String} realm
              404 * @api private
              405 */
              406
              4071exports.unauthorized = function(res, realm) {
              4086 res.statusCode = 401;
              4096 res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"');
              4106 res.end('Unauthorized');
              411};
              412
              413/**
              414 * Respond with 304 "Not Modified".
              415 *
              416 * @param {ServerResponse} res
              417 * @param {Object} headers
              418 * @api private
              419 */
              420
              4211exports.notModified = function(res) {
              4221 exports.removeContentHeaders(res);
              4231 res.statusCode = 304;
              4241 res.end();
              425};
              426
              427/**
              428 * Return an ETag in the form of `"<size>-<mtime>"`
              429 * from the given `stat`.
              430 *
              431 * @param {Object} stat
              432 * @return {String}
              433 * @api private
              434 */
              435
              4361exports.etag = function(stat) {
              4370 return '"' + stat.size + '-' + Number(stat.mtime) + '"';
              438};
              439
              440/**
              441 * Parse "Range" header `str` relative to the given file `size`.
              442 *
              443 * @param {Number} size
              444 * @param {String} str
              445 * @return {Array}
              446 * @api private
              447 */
              448
              4491exports.parseRange = function(size, str){
              45015 var valid = true;
              45115 var arr = str.substr(6).split(',').map(function(range){
              45215 var range = range.split('-')
              453 , start = parseInt(range[0], 10)
              454 , end = parseInt(range[1], 10);
              455
              456 // -500
              45715 if (isNaN(start)) {
              4584 start = size - end;
              4594 end = size - 1;
              460 // 500-
              46111 } else if (isNaN(end)) {
              4623 end = size - 1;
              463 }
              464
              465 // Invalid
              46616 if (isNaN(start) || isNaN(end) || start > end) valid = false;
              467
              46815 return { start: start, end: end };
              469 });
              47015 return valid ? arr : undefined;
              471};
              472
              473/**
              474 * Parse the given Cache-Control `str`.
              475 *
              476 * @param {String} str
              477 * @return {Object}
              478 * @api private
              479 */
              480
              4811exports.parseCacheControl = function(str){
              48226 var directives = str.split(',')
              483 , obj = {};
              484
              48526 for(var i = 0, len = directives.length; i < len; i++) {
              48637 var parts = directives[i].split('=')
              487 , key = parts.shift().trim()
              488 , val = parseInt(parts.shift(), 10);
              489
              49037 obj[key] = isNaN(val) ? true : val;
              491 }
              492
              49326 return obj;
              494};
              495
              496/**
              497 * Convert array-like object to an `Array`.
              498 *
              499 * node-bench measured "16.5 times faster than Array.prototype.slice.call()"
              500 *
              501 * @param {Object} obj
              502 * @return {Array}
              503 * @api private
              504 */
              505
              5061var toArray = exports.toArray = function(obj){
              5070 var len = obj.length
              508 , arr = new Array(len);
              5090 for (var i = 0; i < len; ++i) {
              5100 arr[i] = obj[i];
              511 }
              5120 return arr;
              513};

              patch.js

              90%
              21
              19
              2
              LineHitsSource
              1
              2/*!
              3 * Connect
              4 * Copyright(c) 2011 TJ Holowaychuk
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Module dependencies.
              10 */
              11
              121var http = require('http')
              13 , res = http.ServerResponse.prototype
              14 , setHeader = res.setHeader
              15 , _renderHeaders = res._renderHeaders
              16 , writeHead = res.writeHead;
              17
              18// apply only once
              19
              201if (!res._hasConnectPatch) {
              21
              22 /**
              23 * Provide a public "header sent" flag
              24 * until node does.
              25 *
              26 * @return {Boolean}
              27 * @api public
              28 */
              29
              301 res.__defineGetter__('headerSent', function(){
              31273 return this._header;
              32 });
              33
              34 /**
              35 * Set header `field` to `val`, special-casing
              36 * the `Set-Cookie` field for multiple support.
              37 *
              38 * @param {String} field
              39 * @param {String} val
              40 * @api public
              41 */
              42
              431 res.setHeader = function(field, val){
              44265 var key = field.toLowerCase()
              45 , prev;
              46
              47 // special-case Set-Cookie
              48265 if (this._headers && 'set-cookie' == key) {
              493 if (prev = this.getHeader(field)) {
              500 val = Array.isArray(prev)
              51 ? prev.concat(val)
              52 : [prev, val];
              53 }
              54 // charset
              55262 } else if ('content-type' == key && this.charset) {
              560 val += '; charset=' + this.charset;
              57 }
              58
              59265 return setHeader.call(this, field, val);
              60 };
              61
              62 /**
              63 * Proxy to emit "header" event.
              64 */
              65
              661 res._renderHeaders = function(){
              6778 if (!this._emittedHeader) this.emit('header');
              6878 this._emittedHeader = true;
              6978 return _renderHeaders.call(this);
              70 };
              71
              721 res.writeHead = function(){
              73256 if (!this._emittedHeader) this.emit('header');
              74128 this._emittedHeader = true;
              75128 return writeHead.apply(this, arguments);
              76 };
              77
              781 res._hasConnectPatch = true;
              79}

              middleware/basicAuth.js

              100%
              28
              28
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - basicAuth
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('../utils')
              14 , unauthorized = utils.unauthorized;
              15
              16/**
              17 * Basic Auth:
              18 *
              19 * Enfore basic authentication by providing a `callback(user, pass)`,
              20 * which must return `true` in order to gain access. Alternatively an async
              21 * method is provided as well, invoking `callback(user, pass, callback)`. Populates
              22 * `req.user`. The final alternative is simply passing username / password
              23 * strings.
              24 *
              25 * Simple username and password
              26 *
              27 * connect(connect.basicAuth('username', 'password'));
              28 *
              29 * Callback verification
              30 *
              31 * connect()
              32 * .use(connect.basicAuth(function(user, pass){
              33 * return 'tj' == user & 'wahoo' == pass;
              34 * }))
              35 *
              36 * Async callback verification, accepting `fn(err, user)`.
              37 *
              38 * connect()
              39 * .use(connect.basicAuth(function(user, pass, fn){
              40 * User.authenticate({ user: user, pass: pass }, fn);
              41 * }))
              42 *
              43 * @param {Function|String} callback or username
              44 * @param {String} realm
              45 * @api public
              46 */
              47
              481module.exports = function basicAuth(callback, realm) {
              493 var username, password;
              50
              51 // user / pass strings
              523 if ('string' == typeof callback) {
              531 username = callback;
              541 password = realm;
              551 if ('string' != typeof password) throw new Error('password argument required');
              561 realm = arguments[2];
              571 callback = function(user, pass){
              582 return user == username && pass == password;
              59 }
              60 }
              61
              623 realm = realm || 'Authorization Required';
              63
              643 return function(req, res, next) {
              659 var authorization = req.headers.authorization;
              66
              679 if (req.user) return next();
              6812 if (!authorization) return unauthorized(res, realm);
              69
              706 var parts = authorization.split(' ')
              71 , scheme = parts[0]
              72 , credentials = new Buffer(parts[1], 'base64').toString().split(':')
              73 , user = credentials[0]
              74 , pass = credentials[1];
              75
              766 if ('Basic' != scheme) return next(utils.error(400));
              77
              78 // async
              796 if (callback.length >= 3) {
              802 var pause = utils.pause(req);
              812 callback(user, pass, function(err, user){
              823 if (err || !user) return unauthorized(res, realm);
              831 req.user = user;
              841 next();
              851 pause.resume();
              86 });
              87 // sync
              88 } else {
              894 if (callback(user, pass)) {
              902 req.user = user;
              912 next();
              92 } else {
              932 unauthorized(res, realm);
              94 }
              95 }
              96 }
              97};
              98

              middleware/bodyParser.js

              100%
              9
              9
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - bodyParser
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var multipart = require('./multipart')
              14 , urlencoded = require('./urlencoded')
              15 , json = require('./json');
              16
              17/**
              18 * Body parser:
              19 *
              20 * Parse request bodies, supports _application/json_,
              21 * _application/x-www-form-urlencoded_, and _multipart/form-data_.
              22 *
              23 * This is equivalent to:
              24 *
              25 * app.use(connect.json());
              26 * app.use(connect.urlencoded());
              27 * app.use(connect.multipart());
              28 *
              29 * Examples:
              30 *
              31 * connect()
              32 * .use(connect.bodyParser())
              33 * .use(function(req, res) {
              34 * res.end('viewing user ' + req.body.user.name);
              35 * });
              36 *
              37 * $ curl -d 'user[name]=tj' http://local/
              38 * $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://local/
              39 *
              40 * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info.
              41 *
              42 * @param {Object} options
              43 * @return {Function}
              44 * @api public
              45 */
              46
              471exports = module.exports = function bodyParser(options){
              486 var _urlencoded = urlencoded(options)
              49 , _multipart = multipart(options)
              50 , _json = json(options);
              51
              526 return function bodyParser(req, res, next) {
              5311 _json(req, res, function(err){
              5411 if (err) return next(err);
              5511 _urlencoded(req, res, function(err){
              5611 if (err) return next(err);
              5711 _multipart(req, res, next);
              58 });
              59 });
              60 }
              61};

              middleware/multipart.js

              94%
              34
              32
              2
              LineHitsSource
              1
              2/*!
              3 * Connect - multipart
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var formidable = require('formidable')
              14 , utils = require('../utils')
              15 , qs = require('qs');
              16
              17/**
              18 * Multipart:
              19 *
              20 * Parse multipart/form-data request bodies,
              21 * providing the parsed object as `req.body`
              22 * and `req.files`.
              23 *
              24 * Configuration:
              25 *
              26 * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s
              27 * `IncomingForm` object, allowing you to configure the upload directory,
              28 * size limits, etc. For example if you wish to change the upload dir do the following.
              29 *
              30 * app.use(connect.multipart({ uploadDir: path }));
              31 *
              32 * @param {Object} options
              33 * @return {Function}
              34 * @api public
              35 */
              36
              371exports = module.exports = function(options){
              3813 options = options || {};
              3913 return function multipart(req, res, next) {
              4024 if (req._body) return next();
              4120 req.body = req.body || {};
              4220 req.files = req.files || {};
              43
              44 // ignore GET
              4521 if ('GET' == req.method || 'HEAD' == req.method) return next();
              46
              47 // check Content-Type
              4822 if ('multipart/form-data' != utils.mime(req)) return next();
              49
              50 // flag as parsed
              5116 req._body = true;
              52
              53 // parse
              5416 var form = new formidable.IncomingForm
              55 , data = {}
              56 , files = {}
              57 , done;
              58
              5916 Object.keys(options).forEach(function(key){
              602 form[key] = options[key];
              61 });
              62
              6316 function ondata(name, val, data){
              6432 if (Array.isArray(data[name])) {
              650 data[name].push(val);
              6632 } else if (data[name]) {
              672 data[name] = [data[name], val];
              68 } else {
              6930 data[name] = val;
              70 }
              71 }
              72
              7316 form.on('field', function(name, val){
              7418 ondata(name, val, data);
              75 });
              76
              7716 form.on('file', function(name, val){
              7814 ondata(name, val, files);
              79 });
              80
              8116 form.on('error', function(err){
              822 next(err);
              832 done = true;
              84 });
              85
              8616 form.on('end', function(){
              8718 if (done) return;
              8814 try {
              8914 req.body = qs.parse(data);
              9014 req.files = qs.parse(files);
              9114 next();
              92 } catch (err) {
              930 next(err);
              94 }
              95 });
              96
              9716 form.parse(req);
              98 }
              99};

              middleware/urlencoded.js

              94%
              17
              16
              1
              LineHitsSource
              1
              2/*!
              3 * Connect - urlencoded
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('../utils')
              14 , qs = require('qs');
              15
              16/**
              17 * Urlencoded:
              18 *
              19 * Parse x-ww-form-urlencoded request bodies,
              20 * providing the parsed object as `req.body`.
              21 *
              22 * @param {Object} options
              23 * @return {Function}
              24 * @api public
              25 */
              26
              271exports = module.exports = function(options){
              287 options = options || {};
              297 return function urlencoded(req, res, next) {
              3014 if (req._body) return next();
              3112 req.body = req.body || {};
              32
              33 // ignore GET
              3412 if ('GET' == req.method || 'HEAD' == req.method) return next();
              35
              36 // check Content-Type
              3722 if ('application/x-www-form-urlencoded' != utils.mime(req)) return next();
              38
              39 // flag as parsed
              402 req._body = true;
              41
              42 // parse
              432 var buf = '';
              442 req.setEncoding('utf8');
              454 req.on('data', function(chunk){ buf += chunk });
              462 req.on('end', function(){
              472 try {
              482 req.body = buf.length
              49 ? qs.parse(buf)
              50 : {};
              512 next();
              52 } catch (err){
              530 next(err);
              54 }
              55 });
              56 }
              57};

              middleware/json.js

              100%
              18
              18
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - json
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('../utils');
              14
              15/**
              16 * JSON:
              17 *
              18 * Parse JSON request bodies, providing the
              19 * parsed object as `req.body`.
              20 *
              21 * @param {Object} options
              22 * @return {Function}
              23 * @api public
              24 */
              25
              261exports = module.exports = function(options){
              278 options = options || {};
              288 return function json(req, res, next) {
              2916 if (req._body) return next();
              3016 req.body = req.body || {};
              31
              32 // ignore GET
              3317 if ('GET' == req.method || 'HEAD' == req.method) return next();
              34
              35 // check Content-Type
              3626 if ('application/json' != utils.mime(req)) return next();
              37
              38 // flag as parsed
              394 req._body = true;
              40
              41 // parse
              424 var buf = '';
              434 req.setEncoding('utf8');
              448 req.on('data', function(chunk){ buf += chunk });
              454 req.on('end', function(){
              464 try {
              474 req.body = buf.length
              48 ? JSON.parse(buf)
              49 : {};
              502 next();
              51 } catch (err){
              522 err.status = 400;
              532 next(err);
              54 }
              55 });
              56 }
              57};

              middleware/compress.js

              100%
              35
              35
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - compress
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var zlib = require('zlib');
              14
              15/**
              16 * Supported content-encoding methods.
              17 */
              18
              191exports.methods = {
              20 gzip: zlib.createGzip
              21 , deflate: zlib.createDeflate
              22};
              23
              24/**
              25 * Default filter function.
              26 */
              27
              281exports.filter = function(req, res){
              299 var type = res.getHeader('Content-Type') || '';
              309 return type.match(/json|text|javascript/);
              31};
              32
              33/**
              34 * Compress:
              35 *
              36 * Compress response data with gzip/deflate.
              37 *
              38 * Filter:
              39 *
              40 * A `filter` callback function may be passed to
              41 * replace the default logic of:
              42 *
              43 * exports.filter = function(req, res){
              44 * var type = res.getHeader('Content-Type') || '';
              45 * return type.match(/json|text|javascript/);
              46 * };
              47 *
              48 * Options:
              49 *
              50 * All remaining options are passed to the gzip/deflate
              51 * creation functions. Consult node's docs for additional details.
              52 *
              53 * - `chunkSize` (default: 16*1024)
              54 * - `windowBits`
              55 * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression
              56 * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more
              57 * - `strategy`: compression strategy
              58 *
              59 * @param {Object} options
              60 * @return {Function}
              61 * @api public
              62 */
              63
              641module.exports = function compress(options) {
              651 var options = options || {}
              66 , names = Object.keys(exports.methods)
              67 , filter = options.filter || exports.filter;
              68
              691 return function(req, res, next){
              709 var accept = req.headers['accept-encoding']
              71 , write = res.write
              72 , end = res.end
              73 , stream
              74 , method;
              75
              76 // vary
              779 res.setHeader('Vary', 'Accept-Encoding');
              78
              79 // proxy
              80
              819 res.write = function(chunk, encoding){
              8214 if (!this.headerSent) this._implicitHeader();
              837 return stream
              84 ? stream.write(chunk, encoding)
              85 : write.call(res, chunk, encoding);
              86 };
              87
              889 res.end = function(chunk, encoding){
              899 if (chunk) this.write(chunk, encoding);
              909 return stream
              91 ? stream.end()
              92 : end.call(res);
              93 };
              94
              959 res.on('header', function(){
              96 // default request filter
              9710 if (!filter(req, res)) return;
              98
              99 // SHOULD use identity
              1009 if (!accept) return;
              101
              102 // head
              1038 if ('HEAD' == req.method) return;
              104
              105 // default to gzip
              1066 if ('*' == accept.trim()) method = 'gzip';
              107
              108 // compression method
              1096 if (!method) {
              1106 for (var i = 0, len = names.length; i < len; ++i) {
              1116 if (~accept.indexOf(names[i])) {
              1126 method = names[i];
              1136 break;
              114 }
              115 }
              116 }
              117
              118 // compression method
              1196 if (!method) return;
              120
              121 // compression stream
              1226 stream = exports.methods[method](options);
              123
              124 // header fields
              1256 res.setHeader('Content-Encoding', method);
              1266 res.removeHeader('Content-Length');
              127
              128 // compression
              129
              1306 stream.on('data', function(chunk){
              13112 write.call(res, chunk);
              132 });
              133
              1346 stream.on('end', function(){
              1356 end.call(res);
              136 });
              137
              138 });
              139
              1409 next();
              141 };
              142}

              middleware/static.js

              90%
              77
              70
              7
              LineHitsSource
              1/*!
              2 * Connect - staticProvider
              3 * Copyright(c) 2010 Sencha Inc.
              4 * Copyright(c) 2011 TJ Holowaychuk
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Module dependencies.
              10 */
              11
              121var fs = require('fs')
              13 , path = require('path')
              14 , join = path.join
              15 , basename = path.basename
              16 , normalize = path.normalize
              17 , utils = require('../utils')
              18 , Buffer = require('buffer').Buffer
              19 , parse = require('url').parse
              20 , mime = require('mime');
              21
              22/**
              23 * Static:
              24 *
              25 * Static file server with the given `root` path.
              26 *
              27 * Examples:
              28 *
              29 * var oneDay = 86400000;
              30 *
              31 * connect()
              32 * .use(connect.static(__dirname + '/public'))
              33 *
              34 * connect()
              35 * .use(connect.static(__dirname + '/public', { maxAge: oneDay }))
              36 *
              37 * Options:
              38 *
              39 * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0
              40 * - `hidden` Allow transfer of hidden files. defaults to false
              41 * - `redirect` Redirect to trailing "/" when the pathname is a dir
              42 *
              43 * @param {String} root
              44 * @param {Object} options
              45 * @return {Function}
              46 * @api public
              47 */
              48
              491exports = module.exports = function static(root, options){
              506 options = options || {};
              51
              52 // root required
              536 if (!root) throw new Error('static() root path required');
              546 options.root = root;
              55
              566 return function static(req, res, next) {
              5736 options.path = req.url;
              5836 options.getOnly = true;
              5936 send(req, res, next, options);
              60 };
              61};
              62
              63/**
              64 * Expose mime module.
              65 *
              66 * If you wish to extend the mime table use this
              67 * reference to the "mime" module in the npm registry.
              68 */
              69
              701exports.mime = mime;
              71
              72/**
              73 * decodeURIComponent.
              74 *
              75 * Allows V8 to only deoptimize this fn instead of all
              76 * of send().
              77 *
              78 * @param {String} path
              79 * @api private
              80 */
              81
              821function decode(path){
              8336 try {
              8436 return decodeURIComponent(path);
              85 } catch (err) {
              861 return err;
              87 }
              88}
              89
              90/**
              91 * Attempt to tranfer the requested file to `res`.
              92 *
              93 * @param {ServerRequest}
              94 * @param {ServerResponse}
              95 * @param {Function} next
              96 * @param {Object} options
              97 * @api private
              98 */
              99
              1001var send = exports.send = function(req, res, next, options){
              10136 options = options || {};
              10236 if (!options.path) throw new Error('path required');
              103
              104 // setup
              10536 var maxAge = options.maxAge || 0
              106 , ranges = req.headers.range
              107 , head = 'HEAD' == req.method
              108 , get = 'GET' == req.method
              109 , root = options.root ? normalize(options.root) : null
              110 , redirect = false === options.redirect ? false : true
              111 , getOnly = options.getOnly
              112 , fn = options.callback
              113 , hidden = options.hidden
              114 , done;
              115
              116 // replace next() with callback when available
              11736 if (fn) next = fn;
              118
              119 // ignore non-GET requests
              12036 if (getOnly && !get && !head) return next();
              121
              122 // parse url
              12336 var url = parse(options.path)
              124 , path = decode(url.pathname)
              125 , type;
              126
              12737 if ('URIError: URI malformed' == path) return next(utils.error(400));
              128
              129 // null byte(s)
              13035 if (~path.indexOf('\0')) return next(utils.error(400));
              131
              132 // when root is not given, consider .. malicious
              13335 if (!root && ~path.indexOf('..')) return next(utils.error(403));
              134
              135 // index.html support
              13636 if (normalize('/') == path[path.length - 1]) path += 'index.html';
              137
              138 // join / normalize from optional root dir
              13935 path = normalize(join(root, path));
              140
              141 // malicious path
              14237 if (root && 0 != path.indexOf(root)) return next(utils.error(403));
              143
              144 // "hidden" file
              14534 if (!hidden && '.' == basename(path)[0]) return next();
              146
              14732 fs.stat(path, function(err, stat){
              148 // mime type
              14932 type = mime.lookup(path);
              150
              151 // ignore ENOENT
              15232 if (err) {
              1531 if (fn) return fn(err);
              1541 return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
              155 ? next()
              156 : next(err);
              157 // redirect directory in case index.html is present
              15831 } else if (stat.isDirectory()) {
              1591 if (!redirect) return next();
              1601 res.statusCode = 301;
              1611 res.setHeader('Location', url.pathname + '/');
              1621 res.end('Redirecting to ' + url.pathname + '/');
              1631 return;
              164 }
              165
              166 // header fields
              16760 if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString());
              16858 if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
              16960 if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
              17030 if (!res.getHeader('Content-Type')) {
              17130 var charset = mime.charsets.lookup(type);
              17230 res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
              173 }
              17430 res.setHeader('Accept-Ranges', 'bytes');
              175
              176 // conditional GET support
              17730 if (utils.conditionalGET(req)) {
              1781 if (!utils.modified(req, res)) {
              1791 req.emit('static');
              1801 return utils.notModified(res);
              181 }
              182 }
              183
              18429 var opts = {}
              185 , len = stat.size;
              186
              187 // we have a Range request
              18829 if (ranges) {
              1897 ranges = utils.parseRange(stat.size, ranges);
              190 // valid
              1917 if (ranges) {
              192 // TODO: stream options
              193 // TODO: multiple support
              1946 opts.start = ranges[0].start;
              1956 opts.end = ranges[0].end;
              1966 len = Math.min(len, opts.end - opts.start + 1);
              1976 res.statusCode = 206;
              1986 res.setHeader('Content-Range', 'bytes '
              199 + opts.start
              200 + '-'
              201 + opts.end
              202 + '/'
              203 + stat.size);
              204 // invalid range
              205 } else {
              2061 return next(utils.error(416));
              207 }
              208 }
              209
              21028 res.setHeader('Content-Length', len);
              211
              212 // transfer
              21332 if (head) return res.end();
              214
              215 // stream
              21624 var stream = fs.createReadStream(path, opts);
              21724 req.emit('static', stream);
              21824 req.on('close', stream.destroy.bind(stream));
              21924 stream.pipe(res);
              220
              221 // callback
              22224 if (fn) {
              2230 function callback(err) { done || fn(err); done = true }
              2240 req.on('close', callback);
              2250 req.socket.on('error', callback);
              2260 stream.on('error', callback);
              2270 stream.on('end', callback);
              228 } else {
              22924 stream.on('error', function(err){
              2301 if (res.headerSent) {
              2310 console.error(err.stack);
              2320 req.destroy();
              233 } else {
              2341 next(err);
              235 }
              236 });
              237 }
              238 });
              239};

              middleware/limit.js

              88%
              17
              15
              2
              LineHitsSource
              1
              2/*!
              3 * Connect - limit
              4 * Copyright(c) 2011 TJ Holowaychuk
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Module dependencies.
              10 */
              11
              121var utils = require('../utils');
              13
              14/**
              15 * Limit:
              16 *
              17 * Limit request bodies to the given size in `bytes`.
              18 *
              19 * A string representation of the bytesize may also be passed,
              20 * for example "5mb", "200kb", "1gb", etc.
              21 *
              22 * connect()
              23 * .use(connect.limit('5.5mb'))
              24 * .use(handleImageUpload)
              25 *
              26 * @param {Number|String} bytes
              27 * @return {Function}
              28 * @api public
              29 */
              30
              311module.exports = function limit(bytes){
              322 if ('string' == typeof bytes) bytes = parse(bytes);
              331 if ('number' != typeof bytes) throw new Error('limit() bytes required');
              341 return function limit(req, res, next){
              352 var received = 0
              36 , len = req.headers['content-length']
              37 ? parseInt(req.headers['content-length'], 10)
              38 : null;
              39
              40 // self-awareness
              412 if (req._limit) return next();
              422 req._limit = true;
              43
              44 // limit by content-length
              453 if (len && len > bytes) return next(utils.error(413));
              46
              47 // limit
              481 req.on('data', function(chunk){
              490 received += chunk.length;
              500 if (received > bytes) req.destroy();
              51 });
              52
              531 next();
              54 };
              55};
              56
              57/**
              58 * Parse byte `size` string.
              59 *
              60 * @param {String} size
              61 * @return {Number}
              62 * @api private
              63 */
              64
              651function parse(size) {
              661 var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/)
              67 , n = parseFloat(parts[1])
              68 , type = parts[2];
              69
              701 var map = {
              71 kb: 1024
              72 , mb: 1024 * 1024
              73 , gb: 1024 * 1024 * 1024
              74 };
              75
              761 return map[type] * n;
              77}

              middleware/query.js

              100%
              5
              5
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - query
              4 * Copyright(c) 2011 TJ Holowaychuk
              5 * Copyright(c) 2011 Sencha Inc.
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var qs = require('qs')
              14 , parse = require('url').parse;
              15
              16/**
              17 * Query:
              18 *
              19 * Automatically parse the query-string when available,
              20 * populating the `req.query` object.
              21 *
              22 * Examples:
              23 *
              24 * connect()
              25 * .use(connect.query())
              26 * .use(function(req, res){
              27 * res.end(JSON.stringify(req.query));
              28 * });
              29 *
              30 * @return {Function}
              31 * @api public
              32 */
              33
              341module.exports = function query(){
              351 return function query(req, res, next){
              362 req.query = ~req.url.indexOf('?')
              37 ? qs.parse(parse(req.url).query)
              38 : {};
              392 next();
              40 };
              41};

              middleware/responseTime.js

              100%
              9
              9
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - responseTime
              4 * Copyright(c) 2011 TJ Holowaychuk
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Reponse time:
              10 *
              11 * Adds the `X-Response-Time` header displaying the response
              12 * duration in milliseconds.
              13 *
              14 * @return {Function}
              15 * @api public
              16 */
              17
              181module.exports = function responseTime(){
              191 return function(req, res, next){
              201 var start = new Date;
              21
              221 if (res._responseTime) return next();
              231 res._responseTime = true;
              24
              251 res.on('header', function(header){
              261 var duration = new Date - start;
              271 res.setHeader('X-Response-time', duration + 'ms');
              28 });
              29
              301 next();
              31 };
              32};

              middleware/cookieParser.js

              94%
              17
              16
              1
              LineHitsSource
              1
              2/*!
              3 * Connect - cookieParser
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('./../utils');
              14
              15/**
              16 * Cookie parser:
              17 *
              18 * Parse _Cookie_ header and populate `req.cookies`
              19 * with an object keyed by the cookie names. Optionally
              20 * you may enabled signed cookie support by passing
              21 * a `secret` string, which assigns `req.secret` so
              22 * it may be used by other middleware such as `session()`.
              23 *
              24 * Examples:
              25 *
              26 * connect()
              27 * .use(connect.cookieParser('keyboard cat'))
              28 * .use(function(req, res, next){
              29 * res.end(JSON.stringify(req.cookies));
              30 * })
              31 *
              32 * @param {String} secret
              33 * @return {Function}
              34 * @api public
              35 */
              36
              371module.exports = function cookieParser(secret){
              3829 return function cookieParser(req, res, next) {
              3935 var cookie = req.headers.cookie;
              4035 if (req.cookies) return next();
              41
              4235 req.secret = secret;
              4335 req.cookies = {};
              4435 req.signedCookies = {};
              45
              4635 if (cookie) {
              478 try {
              488 req.cookies = utils.parseCookie(cookie);
              498 if (secret) {
              508 req.signedCookies = utils.parseSignedCookies(req.cookies, secret);
              518 req.signedCookies = utils.parseJSONCookies(req.signedCookies);
              52 }
              538 req.cookies = utils.parseJSONCookies(req.cookies);
              54 } catch (err) {
              550 return next(err);
              56 }
              57 }
              5835 next();
              59 };
              60};

              middleware/session.js

              86%
              67
              58
              9
              LineHitsSource
              1
              2/*!
              3 * Connect - session
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var Session = require('./session/session')
              14 , debug = require('debug')('connect:session')
              15 , MemoryStore = require('./session/memory')
              16 , Cookie = require('./session/cookie')
              17 , Store = require('./session/store')
              18 , utils = require('./../utils')
              19 , parse = require('url').parse
              20 , crypto = require('crypto');
              21
              22// environment
              23
              241var env = process.env.NODE_ENV;
              25
              26/**
              27 * Expose the middleware.
              28 */
              29
              301exports = module.exports = session;
              31
              32/**
              33 * Expose constructors.
              34 */
              35
              361exports.Store = Store;
              371exports.Cookie = Cookie;
              381exports.Session = Session;
              391exports.MemoryStore = MemoryStore;
              40
              41/**
              42 * Warning message for `MemoryStore` usage in production.
              43 */
              44
              451var warning = 'Warning: connection.session() MemoryStore is not\n'
              46 + 'designed for a production environment, as it will leak\n'
              47 + 'memory, and obviously only work within a single process.';
              48
              49/**
              50 * Session:
              51 *
              52 * Setup session store with the given `options`.
              53 *
              54 * Session data is _not_ saved in the cookie itself, however
              55 * cookies are used, so we must use the [cookieParser()](cookieParser.html)
              56 * middleware _before_ `session()`.
              57 *
              58 * Examples:
              59 *
              60 * connect()
              61 * .use(connect.cookieParser('keyboard cat'))
              62 * .use(connect.session({ key: 'sid', cookie: { secure: true }}))
              63 *
              64 * Options:
              65 *
              66 * - `key` cookie name defaulting to `connect.sid`
              67 * - `store` session store instance
              68 * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`
              69 * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto")
              70 *
              71 * Cookie option:
              72 *
              73 * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set
              74 * so the cookie becomes a browser-session cookie. When the user closes the
              75 * browser the cookie (and session) will be removed.
              76 *
              77 * ## req.session
              78 *
              79 * To store or access session data, simply use the request property `req.session`,
              80 * which is (generally) serialized as JSON by the store, so nested objects
              81 * are typically fine. For example below is a user-specific view counter:
              82 *
              83 * connect()
              84 * .use(connect.favicon())
              85 * .use(connect.cookieParser('keyboard cat'))
              86 * .use(connect.session({ cookie: { maxAge: 60000 }}))
              87 * .use(function(req, res, next){
              88 * var sess = req.session;
              89 * if (sess.views) {
              90 * res.setHeader('Content-Type', 'text/html');
              91 * res.write('<p>views: ' + sess.views + '</p>');
              92 * res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
              93 * res.end();
              94 * sess.views++;
              95 * } else {
              96 * sess.views = 1;
              97 * res.end('welcome to the session demo. refresh!');
              98 * }
              99 * }
              100 * )).listen(3000);
              101 *
              102 * ## Session#regenerate()
              103 *
              104 * To regenerate the session simply invoke the method, once complete
              105 * a new SID and `Session` instance will be initialized at `req.session`.
              106 *
              107 * req.session.regenerate(function(err){
              108 * // will have a new session here
              109 * });
              110 *
              111 * ## Session#destroy()
              112 *
              113 * Destroys the session, removing `req.session`, will be re-generated next request.
              114 *
              115 * req.session.destroy(function(err){
              116 * // cannot access session here
              117 * });
              118 *
              119 * ## Session#reload()
              120 *
              121 * Reloads the session data.
              122 *
              123 * req.session.reload(function(err){
              124 * // session updated
              125 * });
              126 *
              127 * ## Session#save()
              128 *
              129 * Save the session.
              130 *
              131 * req.session.save(function(err){
              132 * // session saved
              133 * });
              134 *
              135 * ## Session#touch()
              136 *
              137 * Updates the `.maxAge`, and `.lastAccess` properties. Typically this is
              138 * not necessary to call, as the session middleware does this for you.
              139 *
              140 * ## Session#cookie
              141 *
              142 * Each session has a unique cookie object accompany it. This allows
              143 * you to alter the session cookie per visitor. For example we can
              144 * set `req.session.cookie.expires` to `false` to enable the cookie
              145 * to remain for only the duration of the user-agent.
              146 *
              147 * ## Session#maxAge
              148 *
              149 * Alternatively `req.session.cookie.maxAge` will return the time
              150 * remaining in milliseconds, which we may also re-assign a new value
              151 * to adjust the `.expires` property appropriately. The following
              152 * are essentially equivalent
              153 *
              154 * var hour = 3600000;
              155 * req.session.cookie.expires = new Date(Date.now() + hour);
              156 * req.session.cookie.maxAge = hour;
              157 *
              158 * For example when `maxAge` is set to `60000` (one minute), and 30 seconds
              159 * has elapsed it will return `30000` until the current request has completed,
              160 * at which time `req.session.touch()` is called to update `req.session.lastAccess`,
              161 * and reset `req.session.maxAge` to its original value.
              162 *
              163 * req.session.cookie.maxAge;
              164 * // => 30000
              165 *
              166 * Session Store Implementation:
              167 *
              168 * Every session store _must_ implement the following methods
              169 *
              170 * - `.get(sid, callback)`
              171 * - `.set(sid, session, callback)`
              172 * - `.destroy(sid, callback)`
              173 *
              174 * Recommended methods include, but are not limited to:
              175 *
              176 * - `.length(callback)`
              177 * - `.clear(callback)`
              178 *
              179 * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo.
              180 *
              181 * @param {Object} options
              182 * @return {Function}
              183 * @api public
              184 */
              185
              1861function session(options){
              18715 var options = options || {}
              188 , key = options.key || 'connect.sid'
              189 , store = options.store || new MemoryStore
              190 , cookie = options.cookie
              191 , trustProxy = options.proxy;
              192
              193 // notify user that this store is not
              194 // meant for a production environment
              19515 if ('production' == env && store instanceof MemoryStore) {
              1960 console.warn(warning);
              197 }
              198
              199 // generates the new session
              20015 store.generate = function(req){
              20121 req.sessionID = utils.uid(24);
              20221 req.session = new Session(req);
              20321 req.session.cookie = new Cookie(req, cookie);
              204 };
              205
              20615 return function session(req, res, next) {
              207 // self-awareness
              20824 if (req.session) return next();
              209
              210 // ensure secret is available or bail
              21124 if (!req.secret) throw new Error('connect.cookieParser("secret") required for security when using sessions');
              212
              213 // parse url
              21424 var url = parse(req.url)
              215 , path = url.pathname
              216 , sessionIsNew;
              217
              218 // expose store
              21924 req.sessionStore = store;
              220
              221 // set-cookie
              22224 res.on('header', function(){
              22325 if (!req.session) return;
              22423 var cookie = req.session.cookie
              225 , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()
              226 , tls = req.connection.encrypted || (trustProxy && 'https' == proto)
              227 , secured = cookie.secure && tls;
              228
              229 // browser-session cookies only set-cookie once
              23024 if (null == cookie.expires && !sessionIsNew) return;
              231
              232 // only send secure cookies via https
              23324 if (cookie.secure && !secured) return debug('not secured');
              234
              23520 debug('set %s to %s', key, req.sessionID);
              23620 res.setHeader('Set-Cookie', cookie.serialize(key, req.sessionID));
              237 });
              238
              239 // proxy end() to commit the session
              24024 var end = res.end;
              24124 res.end = function(data, encoding){
              24224 res.end = end;
              24325 if (!req.session) return res.end(data, encoding);
              24423 debug('saving');
              24523 req.session.resetMaxAge();
              24623 req.session.save(function(){
              24723 debug('saved');
              24823 res.end(data, encoding);
              249 });
              250 };
              251
              252 // generate the session
              25324 function generate() {
              25419 sessionIsNew = true;
              25519 store.generate(req);
              256 }
              257
              258 // get the sessionID from the cookie
              25924 req.sessionID = req.signedCookies[key];
              260
              261 // generate a session if the browser doesn't send a sessionID
              26224 if (!req.sessionID) {
              26319 debug('no SID sent, generating session');
              26419 generate();
              26519 next();
              26619 return;
              267 }
              268
              269 // generate the session object
              2705 var pause = utils.pause(req);
              2715 debug('fetching %s', req.sessionID);
              2725 store.get(req.sessionID, function(err, sess){
              273 // proxy to resume() events
              2745 var _next = next;
              2755 next = function(err){
              2765 _next(err);
              2775 pause.resume();
              278 }
              279
              280 // error handling
              2815 if (err) {
              2820 debug('error');
              2830 if ('ENOENT' == err.code) {
              2840 generate();
              2850 next();
              286 } else {
              2870 next(err);
              288 }
              289 // no session
              2905 } else if (!sess) {
              2910 debug('no session found');
              2920 generate();
              2930 next();
              294 // populate req.session
              295 } else {
              2965 debug('session found');
              2975 store.createSession(req, sess);
              2985 next();
              299 }
              300 });
              301 };
              3021};

              middleware/session/session.js

              75%
              33
              25
              8
              LineHitsSource
              1
              2/*!
              3 * Connect - session - Session
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('../../utils')
              14 , Cookie = require('./cookie');
              15
              16/**
              17 * Create a new `Session` with the given request and `data`.
              18 *
              19 * @param {IncomingRequest} req
              20 * @param {Object} data
              21 * @api private
              22 */
              23
              241var Session = module.exports = function Session(req, data) {
              2526 Object.defineProperty(this, 'req', { value: req });
              2626 Object.defineProperty(this, 'id', { value: req.sessionID });
              2726 if ('object' == typeof data) {
              285 utils.merge(this, data);
              29 } else {
              3021 this.lastAccess = Date.now();
              31 }
              32};
              33
              34/**
              35 * Update `.lastAccess` timestamp,
              36 * and reset `.cookie.maxAge` to prevent
              37 * the cookie from expiring when the
              38 * session is still active.
              39 *
              40 * @return {Session} for chaining
              41 * @api public
              42 */
              43
              441Session.prototype.touch = function(){
              450 return this
              46 .resetLastAccess()
              47 .resetMaxAge();
              48};
              49
              50/**
              51 * Update `.lastAccess` timestamp.
              52 *
              53 * @return {Session} for chaining
              54 * @api public
              55 */
              56
              571Session.prototype.resetLastAccess = function(){
              585 this.lastAccess = Date.now();
              595 return this;
              60};
              61
              62/**
              63 * Reset `.maxAge` to `.originalMaxAge`.
              64 *
              65 * @return {Session} for chaining
              66 * @api public
              67 */
              68
              691Session.prototype.resetMaxAge = function(){
              7023 this.cookie.maxAge = this.cookie.originalMaxAge;
              7123 return this;
              72};
              73
              74/**
              75 * Save the session data with optional callback `fn(err)`.
              76 *
              77 * @param {Function} fn
              78 * @return {Session} for chaining
              79 * @api public
              80 */
              81
              821Session.prototype.save = function(fn){
              8323 this.req.sessionStore.set(this.id, this, fn || function(){});
              8423 return this;
              85};
              86
              87/**
              88 * Re-loads the session data _without_ altering
              89 * the maxAge or lastAccess properties. Invokes the
              90 * callback `fn(err)`, after which time if no exception
              91 * has occurred the `req.session` property will be
              92 * a new `Session` object, although representing the
              93 * same session.
              94 *
              95 * @param {Function} fn
              96 * @return {Session} for chaining
              97 * @api public
              98 */
              99
              1001Session.prototype.reload = function(fn){
              1010 var req = this.req
              102 , store = this.req.sessionStore;
              1030 store.get(this.id, function(err, sess){
              1040 if (err) return fn(err);
              1050 if (!sess) return fn(new Error('failed to load session'));
              1060 store.createSession(req, sess);
              1070 fn();
              108 });
              1090 return this;
              110};
              111
              112/**
              113 * Destroy `this` session.
              114 *
              115 * @param {Function} fn
              116 * @return {Session} for chaining
              117 * @api public
              118 */
              119
              1201Session.prototype.destroy = function(fn){
              1211 delete this.req.session;
              1221 this.req.sessionStore.destroy(this.id, fn);
              1231 return this;
              124};
              125
              126/**
              127 * Regenerate this request's session.
              128 *
              129 * @param {Function} fn
              130 * @return {Session} for chaining
              131 * @api public
              132 */
              133
              1341Session.prototype.regenerate = function(fn){
              1352 this.req.sessionStore.regenerate(this.req, fn);
              1362 return this;
              137};

              middleware/session/cookie.js

              100%
              18
              18
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - session - Cookie
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var utils = require('../../utils');
              14
              15/**
              16 * Initialize a new `Cookie` with the given `options`.
              17 *
              18 * @param {IncomingMessage} req
              19 * @param {Object} options
              20 * @api private
              21 */
              22
              231var Cookie = module.exports = function Cookie(req, options) {
              2437 this.path = '/';
              2537 this.maxAge = null;
              2637 this.httpOnly = true;
              2761 if (options) utils.merge(this, options);
              2837 Object.defineProperty(this, 'req', { value: req });
              2937 this.originalMaxAge = undefined == this.originalMaxAge
              30 ? this.maxAge
              31 : this.originalMaxAge;
              32};
              33
              34/*!
              35 * Prototype.
              36 */
              37
              381Cookie.prototype = {
              39
              40 /**
              41 * Set expires `date`.
              42 *
              43 * @param {Date} date
              44 * @api public
              45 */
              46
              47 set expires(date) {
              4886 this._expires = date;
              4986 this.originalMaxAge = this.maxAge;
              50 },
              51
              52 /**
              53 * Get expires `date`.
              54 *
              55 * @return {Date}
              56 * @api public
              57 */
              58
              59 get expires() {
              60241 return this._expires;
              61 },
              62
              63 /**
              64 * Set expires via max-age in `ms`.
              65 *
              66 * @param {Number} ms
              67 * @api public
              68 */
              69
              70 set maxAge(ms) {
              7175 this.expires = 'number' == typeof ms
              72 ? new Date(Date.now() + ms)
              73 : ms;
              74 },
              75
              76 /**
              77 * Get expires max-age in `ms`.
              78 *
              79 * @return {Number}
              80 * @api public
              81 */
              82
              83 get maxAge() {
              84105 return this.expires instanceof Date
              85 ? this.expires.valueOf() - Date.now()
              86 : this.expires;
              87 },
              88
              89 /**
              90 * Return cookie data object.
              91 *
              92 * @return {Object}
              93 * @api private
              94 */
              95
              96 get data() {
              9743 return {
              98 originalMaxAge: this.originalMaxAge
              99 , expires: this._expires
              100 , secure: this.secure
              101 , httpOnly: this.httpOnly
              102 , domain: this.domain
              103 , path: this.path
              104 }
              105 },
              106
              107 /**
              108 * Return a serialized cookie string.
              109 *
              110 * @return {String}
              111 * @api public
              112 */
              113
              114 serialize: function(name, val){
              11520 val = utils.sign(val, this.req.secret);
              11620 return utils.serializeCookie(name, val, this.data);
              117 },
              118
              119 /**
              120 * Return JSON representation of this cookie.
              121 *
              122 * @return {Object}
              123 * @api private
              124 */
              125
              126 toJSON: function(){
              12723 return this.data;
              128 }
              129};

              middleware/session/memory.js

              74%
              35
              26
              9
              LineHitsSource
              1
              2/*!
              3 * Connect - session - MemoryStore
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var Store = require('./store')
              14 , utils = require('../../utils')
              15 , Session = require('./session');
              16
              17/**
              18 * Initialize a new `MemoryStore`.
              19 *
              20 * @api public
              21 */
              22
              231var MemoryStore = module.exports = function MemoryStore() {
              2415 this.sessions = {};
              25};
              26
              27/**
              28 * Inherit from `Store.prototype`.
              29 */
              30
              311MemoryStore.prototype.__proto__ = Store.prototype;
              32
              33/**
              34 * Attempt to fetch session by the given `sid`.
              35 *
              36 * @param {String} sid
              37 * @param {Function} fn
              38 * @api public
              39 */
              40
              411MemoryStore.prototype.get = function(sid, fn){
              425 var self = this;
              435 process.nextTick(function(){
              445 var expires
              45 , sess = self.sessions[sid];
              465 if (sess) {
              475 sess = JSON.parse(sess);
              485 expires = 'string' == typeof sess.cookie.expires
              49 ? new Date(sess.cookie.expires)
              50 : sess.cookie.expires;
              515 if (!expires || new Date < expires) {
              525 fn(null, sess);
              53 } else {
              540 self.destroy(sid, fn);
              55 }
              56 } else {
              570 fn();
              58 }
              59 });
              60};
              61
              62/**
              63 * Commit the given `sess` object associated with the given `sid`.
              64 *
              65 * @param {String} sid
              66 * @param {Session} sess
              67 * @param {Function} fn
              68 * @api public
              69 */
              70
              711MemoryStore.prototype.set = function(sid, sess, fn){
              7223 var self = this;
              7323 process.nextTick(function(){
              7423 self.sessions[sid] = JSON.stringify(sess);
              7523 fn && fn();
              76 });
              77};
              78
              79/**
              80 * Destroy the session associated with the given `sid`.
              81 *
              82 * @param {String} sid
              83 * @api public
              84 */
              85
              861MemoryStore.prototype.destroy = function(sid, fn){
              873 var self = this;
              883 process.nextTick(function(){
              893 delete self.sessions[sid];
              903 fn && fn();
              91 });
              92};
              93
              94/**
              95 * Invoke the given callback `fn` with all active sessions.
              96 *
              97 * @param {Function} fn
              98 * @api public
              99 */
              100
              1011MemoryStore.prototype.all = function(fn){
              1020 var arr = []
              103 , keys = Object.keys(this.sessions);
              1040 for (var i = 0, len = keys.length; i < len; ++i) {
              1050 arr.push(this.sessions[keys[i]]);
              106 }
              1070 fn(null, arr);
              108};
              109
              110/**
              111 * Clear all sessions.
              112 *
              113 * @param {Function} fn
              114 * @api public
              115 */
              116
              1171MemoryStore.prototype.clear = function(fn){
              1180 this.sessions = {};
              1190 fn && fn();
              120};
              121
              122/**
              123 * Fetch number of sessions.
              124 *
              125 * @param {Function} fn
              126 * @api public
              127 */
              128
              1291MemoryStore.prototype.length = function(fn){
              1300 fn(null, Object.keys(this.sessions).length);
              131};

              middleware/session/store.js

              70%
              24
              17
              7
              LineHitsSource
              1
              2/*!
              3 * Connect - session - Store
              4 * Copyright(c) 2010 Sencha Inc.
              5 * Copyright(c) 2011 TJ Holowaychuk
              6 * MIT Licensed
              7 */
              8
              9/**
              10 * Module dependencies.
              11 */
              12
              131var EventEmitter = require('events').EventEmitter
              14 , Session = require('./session')
              15 , Cookie = require('./cookie')
              16 , utils = require('../../utils');
              17
              18/**
              19 * Initialize abstract `Store`.
              20 *
              21 * @api private
              22 */
              23
              241var Store = module.exports = function Store(options){};
              25
              26/**
              27 * Inherit from `EventEmitter.prototype`.
              28 */
              29
              301Store.prototype.__proto__ = EventEmitter.prototype;
              31
              32/**
              33 * Re-generate the given requests's session.
              34 *
              35 * @param {IncomingRequest} req
              36 * @return {Function} fn
              37 * @api public
              38 */
              39
              401Store.prototype.regenerate = function(req, fn){
              412 var self = this;
              422 this.destroy(req.sessionID, function(err){
              432 self.generate(req);
              442 fn(err);
              45 });
              46};
              47
              48/**
              49 * Load a `Session` instance via the given `sid`
              50 * and invoke the callback `fn(err, sess)`.
              51 *
              52 * @param {String} sid
              53 * @param {Function} fn
              54 * @api public
              55 */
              56
              571Store.prototype.load = function(sid, fn){
              580 var self = this;
              590 this.get(sid, function(err, sess){
              600 if (err) return fn(err);
              610 if (!sess) return fn();
              620 var req = { sessionID: sid, sessionStore: self };
              630 sess = self.createSession(req, sess, false);
              640 fn(null, sess);
              65 });
              66};
              67
              68/**
              69 * Create session from JSON `sess` data.
              70 *
              71 * @param {IncomingRequest} req
              72 * @param {Object} sess
              73 * @return {Session}
              74 * @api private
              75 */
              76
              771Store.prototype.createSession = function(req, sess, update){
              785 var expires = sess.cookie.expires
              79 , orig = sess.cookie.originalMaxAge
              80 , update = null == update ? true : false;
              815 sess.cookie = new Cookie(req, sess.cookie);
              829 if ('string' == typeof expires) sess.cookie.expires = new Date(expires);
              835 sess.cookie.originalMaxAge = orig;
              845 req.session = new Session(req, sess);
              8510 if (update) req.session.resetLastAccess();
              865 return req.session;
              87};

              middleware/staticCache.js

              85%
              54
              46
              8
              LineHitsSource
              1
              2/*!
              3 * Connect - staticCache
              4 * Copyright(c) 2011 Sencha Inc.
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Module dependencies.
              10 */
              11
              121var http = require('http')
              13 , utils = require('../utils')
              14 , Cache = require('../cache')
              15 , url = require('url')
              16 , fs = require('fs');
              17
              18/**
              19 * Static cache:
              20 *
              21 * Enables a memory cache layer on top of
              22 * the `static()` middleware, serving popular
              23 * static files.
              24 *
              25 * By default a maximum of 128 objects are
              26 * held in cache, with a max of 256k each,
              27 * totalling ~32mb.
              28 *
              29 * A Least-Recently-Used (LRU) cache algo
              30 * is implemented through the `Cache` object,
              31 * simply rotating cache objects as they are
              32 * hit. This means that increasingly popular
              33 * objects maintain their positions while
              34 * others get shoved out of the stack and
              35 * garbage collected.
              36 *
              37 * Benchmarks:
              38 *
              39 * static(): 2700 rps
              40 * node-static: 5300 rps
              41 * static() + staticCache(): 7500 rps
              42 *
              43 * Options:
              44 *
              45 * - `maxObjects` max cache objects [128]
              46 * - `maxLength` max cache object length 256kb
              47 *
              48 * @param {Type} name
              49 * @return {Type}
              50 * @api public
              51 */
              52
              531module.exports = function staticCache(options){
              543 var options = options || {}
              55 , cache = new Cache(options.maxObjects || 128)
              56 , maxlen = options.maxLength || 1024 * 256;
              57
              583 return function staticCache(req, res, next){
              5910 var path = url.parse(req.url).pathname
              60 , ranges = req.headers.range
              61 , hit = cache.get(path)
              62 , hitCC
              63 , uaCC
              64 , header
              65 , age;
              66
              6710 function miss() {
              684 res.setHeader('X-Cache', 'MISS');
              694 next();
              70 }
              71
              72 // cache static
              73 // TODO: change from staticCache() -> static()
              74 // and make this work for any request
              7510 req.on('static', function(stream){
              762 var headers = res._headers
              77 , cc = utils.parseCacheControl(headers['cache-control'] || '')
              78 , contentLength = headers['content-length']
              79 , hit;
              80
              81 // ignore larger files
              822 if (!contentLength || contentLength > maxlen) return;
              83
              84 // dont cache items we shouldn't be
              85 // TODO: real support for must-revalidate / no-cache
              862 if ( cc['no-cache']
              87 || cc['no-store']
              88 || cc['private']
              890 || cc['must-revalidate']) return;
              90
              91 // if already in cache then validate
              922 if (hit = cache.get(path)){
              931 if (headers.etag == hit[0].etag) {
              941 hit[0].date = new Date;
              951 return;
              96 } else {
              970 cache.remove(path);
              98 }
              99 }
              100
              101 // validation notifiactions don't contain a steam
              1021 if (null == stream) return;
              103
              104 // add the cache object
              1051 var arr = cache.add(path);
              1061 arr.push(headers);
              107
              108 // store the chunks
              1091 stream.on('data', function(chunk){
              1101 arr.push(chunk);
              111 });
              112
              113 // flag it as complete
              1141 stream.on('end', function(){
              1151 arr.complete = true;
              116 });
              117 });
              118
              119 // cache hit, doesnt support range requests
              12010 if (hit && hit.complete && !ranges) {
              1217 header = utils.merge({}, hit[0]);
              1227 header.Age = age = (new Date - new Date(header.date)) / 1000 | 0;
              1237 header.date = new Date().toUTCString();
              124
              125 // parse cache-controls
              1267 hitCC = utils.parseCacheControl(header['cache-control'] || '');
              1277 uaCC = utils.parseCacheControl(req.headers['cache-control'] || '');
              128
              129 // check if we must revalidate(bypass)
              1308 if (hitCC['no-cache'] || uaCC['no-cache']) return miss();
              131
              132 // check freshness of entity
              1336 if (isStale(hitCC, age) || isStale(uaCC, age)) return miss();
              134
              135 // conditional GET support
              1366 if (utils.conditionalGET(req)) {
              1370 if (!utils.modified(req, res, header)) {
              1380 header['content-length'] = 0;
              1390 res.writeHead(304, header);
              1400 return res.end();
              141 }
              142 }
              143
              144 // HEAD support
              1456 if ('HEAD' == req.method) {
              1462 res.writeHead(200, header);
              1472 return res.end();
              148 }
              149
              150 // respond with cache
              1514 header['x-cache'] = 'HIT';
              1524 res.writeHead(200, header);
              153
              154 // backpressure
              1554 function write(i) {
              1568 var buf = hit[i];
              15712 if (!buf) return res.end();
              1584 if (false === res.write(buf)) {
              1590 res.once('drain', function(){
              1600 write(++i);
              161 });
              162 } else {
              1634 write(++i);
              164 }
              165 }
              166
              1674 return write(1);
              168 }
              169
              1703 miss();
              171 }
              172};
              173
              174/**
              175 * Check if cache item is stale
              176 *
              177 * @param {Object} cc
              178 * @param {Number} age
              179 * @return {Boolean}
              180 * @api private
              181 */
              182
              1831function isStale(cc, age) {
              18412 return cc['max-age'] && cc['max-age'] <= age;
              185}

              cache.js

              83%
              18
              15
              3
              LineHitsSource
              1
              2/*!
              3 * Connect - Cache
              4 * Copyright(c) 2011 Sencha Inc.
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Expose `Cache`.
              10 */
              11
              121module.exports = Cache;
              13
              14/**
              15 * LRU cache store.
              16 *
              17 * @param {Number} limit
              18 * @api private
              19 */
              20
              211function Cache(limit) {
              223 this.store = {};
              233 this.keys = [];
              243 this.limit = limit;
              25}
              26
              27/**
              28 * Touch `key`, promoting the object.
              29 *
              30 * @param {String} key
              31 * @param {Number} i
              32 * @api private
              33 */
              34
              351Cache.prototype.touch = function(key, i){
              360 this.keys.splice(i,1);
              370 this.keys.push(key);
              38};
              39
              40/**
              41 * Remove `key`.
              42 *
              43 * @param {String} key
              44 * @api private
              45 */
              46
              471Cache.prototype.remove = function(key){
              480 delete this.store[key];
              49};
              50
              51/**
              52 * Get the object stored for `key`.
              53 *
              54 * @param {String} key
              55 * @return {Array}
              56 * @api private
              57 */
              58
              591Cache.prototype.get = function(key){
              6012 return this.store[key];
              61};
              62
              63/**
              64 * Add a cache `key`.
              65 *
              66 * @param {String} key
              67 * @return {Array}
              68 * @api private
              69 */
              70
              711Cache.prototype.add = function(key){
              72 // initialize store
              731 var len = this.keys.push(key);
              74
              75 // limit reached, invalidate LRU
              761 if (len > this.limit) this.remove(this.keys.shift());
              77
              781 var arr = this.store[key] = [];
              791 arr.createdAt = new Date;
              801 return arr;
              81};

              middleware/cookieSession.js

              100%
              23
              23
              0
              LineHitsSource
              1
              2/*!
              3 * Connect - cookieSession
              4 * Copyright(c) 2011 Sencha Inc.
              5 * MIT Licensed
              6 */
              7
              8/**
              9 * Module dependencies.
              10 */
              11
              121var utils = require('./../utils')
              13 , Cookie = require('./session/cookie')
              14 , debug = require('debug')('connect:cookieSession');
              15
              16// environment
              17
              181var env = process.env.NODE_ENV;
              19
              20/**
              21 * Cookie Session:
              22 *
              23 * Cookie session middleware.
              24 *
              25 * var app = connect();
              26 * app.use(connect.cookieParser('tobo!'));
              27 * app.use(connect.cookieSession({ cookie: { maxAge: 60 * 60 * 1000 }}));
              28 *
              29 * Options:
              30 *
              31 * - `key` cookie name defaulting to `connect.sess`
              32 * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`
              33 * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto")
              34 *
              35 * @param {Object} options
              36 * @return {Function}
              37 * @api public
              38 */
              39
              401module.exports = function cookieSession(options){
              41 // TODO: utilize Session/Cookie to unify API
              42 // TODO: only set-cookie on changes to the session data
              43
              4414 var options = options || {}
              45 , key = options.key || 'connect.sess'
              46 , cookie = options.cookie
              47 , trustProxy = options.proxy;
              48
              4914 return function cookieSession(req, res, next) {
              5011 req.session = req.signedCookies[key] || {};
              5111 req.session.cookie = new Cookie(req, cookie);
              52
              5311 res.on('header', function(){
              54 // removed
              5511 if (!req.session) {
              561 debug('clear session');
              571 res.setHeader('Set-Cookie', key + '=; expires=' + new Date(0).toUTCString());
              581 return;
              59 }
              60
              6110 var cookie = req.session.cookie;
              6210 delete req.session.cookie;
              63
              64 // check security
              6510 var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()
              66 , tls = req.connection.encrypted || (trustProxy && 'https' == proto)
              67 , secured = cookie.secure && tls;
              68
              69 // only send secure cookies via https
              7012 if (cookie.secure && !secured) return debug('not secured');
              71
              72 // set cookie
              738 debug('serializing %j', req.session);
              748 var val = 'j:' + JSON.stringify(req.session);
              758 val = utils.sign(val, req.secret);
              768 val = utils.serializeCookie(key, val, cookie);
              778 debug('cookie %j', cookie);
              788 res.setHeader('Set-Cookie', val);
              79 });
              80
              8111 next();
              82 };
              83};
              \ No newline at end of file diff --git a/normalize.min.css b/css/normalize.min.css similarity index 100% rename from normalize.min.css rename to css/normalize.min.css diff --git a/css/pygments.css b/css/pygments.css new file mode 100644 index 0000000000..851ba3c1ae --- /dev/null +++ b/css/pygments.css @@ -0,0 +1,59 @@ +.highlight .hll { background-color: #ffffcc } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #bb8844 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #999999 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #bb8844 } /* Literal.String.Backtick */ +.highlight .sc { color: #bb8844 } /* Literal.String.Char */ +.highlight .sd { color: #bb8844 } /* Literal.String.Doc */ +.highlight .s2 { color: #bb8844 } /* Literal.String.Double */ +.highlight .se { color: #bb8844 } /* Literal.String.Escape */ +.highlight .sh { color: #bb8844 } /* Literal.String.Heredoc */ +.highlight .si { color: #bb8844 } /* Literal.String.Interpol */ +.highlight .sx { color: #bb8844 } /* Literal.String.Other */ +.highlight .sr { color: #808000 } /* Literal.String.Regex */ +.highlight .s1 { color: #bb8844 } /* Literal.String.Single */ +.highlight .ss { color: #bb8844 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/style.css b/css/style.css similarity index 84% rename from style.css rename to css/style.css index 982fa08f57..99375ed2c4 100644 --- a/style.css +++ b/css/style.css @@ -8,7 +8,11 @@ body { } #content { - padding: 140px 110px 60px 110px; + padding: 0 110px 60px 110px; +} + +header { + padding: 140px 110px 0 110px; } h1 { @@ -53,7 +57,14 @@ h2 { margin-top: 80px; font-weight: 100; letter-spacing: 1px; + border-bottom: 1px solid #ddd; +} + +h3 { + font-weight: 200; + letter-spacing: 1px; border-bottom: 1px solid #eee; + margin-top: 40px; } #tag { @@ -80,7 +91,7 @@ h2 { margin-left: 170px; } -#tag + p { +#content > p:first-child { font-size: 22px; font-weight: 100; letter-spacing: 1px; @@ -130,17 +141,18 @@ code { } pre { - margin: 30px; - padding: 30px; - border: 1px solid #eee; - border-bottom-color: #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - -o-border-radius: 2px; - border-radius: 2px; - -webkit-box-shadow: inset 0 0 10px #eee; - -moz-box-shadow: inset 0 0 10px #eee; - box-shadow: inset 0 0 10px #eee; + margin: 20px; + padding: 20px; + border: 1px solid #ddd; + border-bottom-color: #ccc; + background-color: #f3f3f3; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -o-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 0 10px #ddd; + -moz-box-shadow: inset 0 0 10px #ddd; + box-shadow: inset 0 0 10px #ddd; overflow-x: auto; } @@ -190,12 +202,6 @@ footer span { font-size: 12px; } -code .comment { color: #999 } -code .init { color: #2f6fad } -code .string { color: #5890ad } -code .keyword { color: #8a6343 } -code .number { color: #2f6fad } - @media all and (max-width: 850px) { ul li { width: 100%; @@ -213,3 +219,8 @@ code .number { color: #2f6fad } margin-left: 0; } } + +blockquote { + padding: 10px; + border-left: 1px solid #eee; +} diff --git a/foot.html b/foot.html deleted file mode 100644 index e2879ae7aa..0000000000 --- a/foot.html +++ /dev/null @@ -1,6 +0,0 @@ -
          -
          - © 2011 TJ Holowaychuk. All rights reserved. -
          - - \ No newline at end of file diff --git a/head.html b/head.html deleted file mode 100644 index c93fcfaee2..0000000000 --- a/head.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Mocha - the fun, simple, flexible JavaScript test framework - - - - - - - - - - -
          -

          Mocha

          -

          simple, flexible, fun

          diff --git a/highlight.js b/highlight.js deleted file mode 100644 index f6cddf60ba..0000000000 --- a/highlight.js +++ /dev/null @@ -1,18 +0,0 @@ - -$(function(){ - $('code').each(function(){ - $(this).html(highlight($(this).text())); - }); -}); - -function highlight(js) { - return js - .replace(//g, '>') - .replace(/\/\/(.*)/gm, '//$1') - .replace(/('.*?')/gm, '$1') - .replace(/(\d+\.\d+)/gm, '$1') - .replace(/(\d+)/gm, '$1') - .replace(/\bnew *(\w+)/gm, 'new $1') - .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') -} \ No newline at end of file diff --git a/html5shiv.js b/html5shiv.js deleted file mode 100644 index 448cebd79e..0000000000 --- a/html5shiv.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.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 X0YIP1O7@3M00000NkvXXu0mjf17bd? diff --git a/images/_unused/handmadepaper.png b/images/_unused/handmadepaper.png deleted file mode 100644 index eb575ba0b804e63e9b821cdaa7c487d54ff43e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6367 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 diff --git a/images/_unused/soft_wallpaper.png b/images/_unused/soft_wallpaper.png deleted file mode 100644 index 072b3bd34dbf61247ec112a0d28bb3007300b65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229627 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Π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�xd#ci@=L5NsHyo_-0OA` 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

          rd5nfe4Z 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 SyvKe30000P)t-s($m$` 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�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 X((gVhq_E{g00000NkvXXu0mjf7}yuy diff --git a/index.html b/index.html deleted file mode 100644 index 56c1cd6e01..0000000000 --- a/index.html +++ /dev/null @@ -1,976 +0,0 @@ - - - - - Mocha - the fun, simple, flexible JavaScript test framework - - - - - - - - - - -

          -
          - © 2011 TJ Holowaychuk. All rights reserved. -
          - - \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 238f0f16cd..0000000000 --- a/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/mocha'); \ No newline at end of file diff --git a/index.md b/index.md index 136bde0856..d9d7ccbae5 100644 --- a/index.md +++ b/index.md @@ -1,908 +1,1001 @@ -Mocha is a feature-rich JavaScript test framework running on [node.js](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). - - - -

          Features

          - - - browser support - - simple async support, including promises - - test coverage reporting - - string diff support - - javascript API for running tests - - proper exit status for CI support etc - - auto-detects and disables coloring for non-ttys - - maps uncaught exceptions to the correct test case - - async test timeout support - - test-specific timeouts - - growl notification support - - reports test durations - - highlights slow tests - - file watcher support - - global variable leak detection - - optionally run tests that match a regexp - - auto-exit to prevent "hanging" with an active loop - - easily meta-generate suites & test-cases - - mocha.opts file support - - clickable suite titles to filter test execution - - node debugger support - - detects multiple calls to `done()` - - use any assertion library you want - - extensible reporting, bundled with 9+ reporters - - extensible test DSLs or "interfaces" - - before, after, before each, after each hooks - - arbitrary transpiler support (coffee-script etc) - - TextMate bundle - - and more! - -

          Table of contents

          - - - [Installation](#installation) - - [1\. 2\. 3\. Mocha!](#getting-started) - - [Assertions](#assertions) - - [Synchronous code](#synchronous-code) - - [Asynchronous code](#asynchronous-code) - - [Hooks](#hooks) - - [Pending tests](#pending-tests) - - [Exclusive tests](#exclusive-tests) - - [Inclusive tests](#inclusive-tests) - - [Meta-Generated tests](#meta-generated-test) - - [Test duration](#test-duration) - - [String diffs](#string-diffs) - - [mocha(1)](#usage) - - [Interfaces](#interfaces) - - [Reporters](#reporters) - - [Browser support](#browser-support) - - [mocha.opts](#mocha.opts) - - [Suite specific timeouts](#suite-specific-timeouts) - - [Test specific timeouts](#test-specific-timeouts) - - [Best practices](#best-practices) - - [Editors](#editors) - - [Example test suites](#example-test-suites) - - [Running mocha's tests](#running-mochas-tests) - - [More information](#more-information) - -

          Installation

          - - Install with [npm](http://npmjs.org): - - $ npm install -g mocha - -

          1. 2. 3. Mocha!

          - - - $ npm install -g mocha - $ mkdir test - $ $EDITOR test/test.js - - var assert = require("assert") - describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - assert.equal(-1, [1,2,3].indexOf(5)); - assert.equal(-1, [1,2,3].indexOf(0)); - }) - }) - }) - - $ mocha - - . - - ✔ 1 test complete (1ms) - - -

          Assertions

          - -Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](https://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: - - - [should.js](https://github.com/visionmedia/should.js) BDD style shown throughout these docs - - [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions - - [chai](http://chaijs.com/) expect(), assert() and should style assertions - - [better-assert](https://github.com/visionmedia/better-assert) c-style self-documenting assert() - -

          Synchronous code

          - - When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. +--- +layout: default +title: "Mocha - the fun, simple, flexible JavaScript test framework" + +--- + +Mocha is a feature-rich JavaScript test framework running on [Node.js](http://nodejs.org) and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). + +[![Gitter](//badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha) + +## Features + +- browser support +- simple async support, including promises +- test coverage reporting +- string diff support +- javascript API for running tests +- proper exit status for CI support etc +- auto-detects and disables coloring for non-ttys +- maps uncaught exceptions to the correct test case +- async test timeout support +- test-specific timeouts +- growl notification support +- reports test durations +- highlights slow tests +- file watcher support +- global variable leak detection +- optionally run tests that match a regexp +- auto-exit to prevent "hanging" with an active loop +- easily meta-generate suites & test-cases +- mocha.opts file support +- clickable suite titles to filter test execution +- node debugger support +- detects multiple calls to `done()` +- use any assertion library you want +- extensible reporting, bundled with 9+ reporters +- extensible test DSLs or "interfaces" +- before, after, before each, after each hooks +- arbitrary transpiler support (coffee-script etc) +- TextMate bundle +- and more! + +## Table of Contents + + +- [Features](#features) +- [Installation](#installation) +- [Getting Started](#getting-started) +- [Assertions](#assertions) +- [Synchronous Code](#synchronous-code) +- [Asynchronous Code](#asynchronous-code) +- [Hooks](#hooks) +- [Pending Tests](#pending-tests) +- [Exclusive Tests](#exclusive-tests) +- [Inclusive Tests](#inclusive-tests) +- [Dynamically Generating Tests](#dynamically-generating-tests) +- [Timeouts](#timeouts) +- [Diffs](#diffs) +- [Usage](#usage) +- [Interfaces](#interfaces) +- [Reporters](#reporters) +- [Running Mocha in the Browser](#running-mocha-in-the-browser) +- [`mocha.opts`](#mochaopts) +- [The `test/` Directory](#the-test-directory) +- [Editor Plugins](#editor-plugins) +- [Examples](#examples) +- [Testing Mocha](#testing-mocha) +- [More Information](#more-information) + + + +## Installation + +Install with [npm](http://npmjs.org): + +```sh +$ npm install -g mocha +``` + +## Getting Started + +```sh +$ npm install -g mocha +$ mkdir test +$ $EDITOR test/test.js + +``` + +In your editor: + +```js +var assert = require("assert") +describe('Array', function() { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { + assert.equal(-1, [1,2,3].indexOf(5)); + assert.equal(-1, [1,2,3].indexOf(0)); + }); + }); +}); +``` - describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }) - }) - }) +Back in the terminal: -

          Asynchronous code

          +```sh +$ mocha -Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()` Mocha will know that it should wait for completion. + . - describe('User', function(){ - describe('#save()', function(){ - it('should save without error', function(done){ - var user = new User('Luna'); - user.save(function(err){ - if (err) throw err; - done(); - }); - }) - }) - }) - - To make things even easier, the `done()` callback accepts an error, so we may use this directly: - - describe('User', function(){ - describe('#save()', function(){ - it('should save without error', function(done){ - var user = new User('Luna'); - user.save(done); - }) - }) - }) - - All "hooks", that is `before()`, `after()`, `beforeEach()`, `afterEach()` may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test: - - describe('Connection', function(){ - var db = new Connection - , tobi = new User('tobi') - , loki = new User('loki') - , jane = new User('jane'); - - beforeEach(function(done){ - db.clear(function(err){ - if (err) return done(err); - db.save([tobi, loki, jane], done); - }); - }) - - describe('#find()', function(){ - it('respond with matching records', function(done){ - db.find({ type: 'User' }, function(err, res){ - if (err) return done(err); - res.should.have.length(3); - done(); - }) - }) - }) - }) - - Alternately, instead of using the `done()` callback, you can return a promise. This is useful if the APIs you are testing return promises instead of taking callbacks: - - beforeEach(function(){ - return db.clear().then(function() { - return db.save([tobi, loki, jane]); - }); - }) + ✔ 1 test complete (1ms) +``` - describe('#find()', function(){ - it('respond with matching records', function(){ - return db.find({ type: 'User' }).should.eventually.have.length(3); - }) - }) +## Assertions - (The latter example uses [Chai as Promised](https://github.com/domenic/chai-as-promised/) for fluent promise assertions.) - - Note that you may also pick any file and add "root" level hooks, for example add `beforeEach()` outside of `describe()`s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root `Suite` with no name. - - beforeEach(function(){ - console.log('before every test') - }) +Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](https://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: -

          Hooks

          +- [should.js](https://github.com/visionmedia/should.js) BDD style shown throughout these docs +- [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions +- [chai](http://chaijs.com/) expect(), assert() and should style assertions +- [better-assert](https://github.com/visionmedia/better-assert) c-style self-documenting assert() - Mocha provides the hooks `before()`, `after()`, `beforeEach()`, `afterEach()`, - that can be used to set up preconditions and clean up your tests. +## Synchronous Code - describe('hooks', function() { - before(function() { - // runs before all tests in this block - }) - after(function(){ - // runs after all tests in this block - }) - beforeEach(function(){ - // runs before each test in this block - }) - afterEach(function(){ - // runs after each test in this block - }) - // test cases - }) +When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. +```js +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { + [1,2,3].indexOf(5).should.equal(-1); + [1,2,3].indexOf(0).should.equal(-1); + }); + }); +}); +``` +## Asynchronous Code - All hooks can be invoked with an optional description, making it easier to pinpoint errors in your tests. - If hooks are given named functions those names will be used if no description is supplied. +Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()` Mocha will know that it should wait for completion. - beforeEach(function(){ - // beforeEach hook - }) - beforeEach(function namedFun() { - // beforeEach:namedFun - }) - beforeEach('some description', function(){ - // beforeEach:some description - }) +```js +describe('User', function() { + describe('#save()', function() { + it('should save without error', function(done) { + var user = new User('Luna'); + user.save(function(err) { + if (err) throw err; + done(); + }); + }); + }); +}); +``` + +To make things even easier, the `done()` callback accepts an error, so we may use this directly: + +```js +describe('User', function() { + describe('#save()', function() { + it('should save without error', function(done) { + var user = new User('Luna'); + user.save(done); + }); + }); +}); +``` +### Working with Promises +Alternately, instead of using the `done()` callback, you may return a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). This is useful if the APIs you are testing return promises instead of taking callbacks: -

          Pending tests

          +```js +beforeEach(function() { + return db.clear() + .then(function() { + return db.save([tobi, loki, jane]); + }); +}); + +describe('#find()', function() { + it('respond with matching records', function() { + return db.find({ type: 'User' }).should.eventually.have.length(3); + }); +}); +``` + +(The latter example uses [Chai as Promised](https://www.npmjs.com/package/chai-as-promised) for fluent promise assertions.) + +## Hooks + +Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`, which can be used to set up preconditions and clean up after your tests. + +```js +describe('hooks', function() { + + before(function() { + // runs before all tests in this block + }); + + after(function() { + // runs after all tests in this block + }); + + beforeEach(function() { + // runs before each test in this block + }); + + afterEach(function() { + // runs after each test in this block + }); + + // test cases +}); +``` + +### Describing Hooks + +All hooks can be invoked with an optional description, making it easier to pinpoint errors in your tests. If hooks are given named functions, those names will be used if no description is supplied. + +```js +beforeEach(function() { + // beforeEach hook +}); + +beforeEach(function namedFun() { + // beforeEach:namedFun +}); + +beforeEach('some description', function() { + // beforeEach:some description +}); +``` + +### Asynchronous Hooks + +All "hooks" (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: + +```js +describe('Connection', function() { + var db = new Connection, + tobi = new User('tobi'), + loki = new User('loki'), + jane = new User('jane'); + + beforeEach(function(done) { + db.clear(function(err) { + if (err) return done(err); + db.save([tobi, loki, jane], done); + }); + }); + + describe('#find()', function() { + it('respond with matching records', function(done) { + db.find({type: 'User'}, function(err, res) { + if (err) return done(err); + res.should.have.length(3); + done(); + }); + }); + }); +}); +``` + + +### Root-Level Hooks + +You may also pick any file and add "root"-level hooks. For example, add `beforeEach()` outside of all `describe()` blocks. This will cause the callback to `beforeEach()` to run before any test case, regardless of the file it lives in (this is because Mocha has a hidden `describe()` block, called the "root suite"). + +```js +beforeEach(function() { + console.log('before every test in every file'); +}); +``` + +### Delayed Root Suite + +If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Simply run Mocha with the `--delay` flag. This will provide a special function, `run()`, in the global context. + +```js +setTimeout(function() { + // do some setup + + describe('my suite', function() { + // ... + }); + + run(); +}, 5000); +``` + +## Pending Tests + +"Pending"--as in "someone should write these test cases eventually"--test-cases are simply those without a callback: + +```js +describe('Array', function() { + describe('#indexOf()', function() { + // pending test below + it('should return -1 when the value is not present'); + }); +}); +``` + +Pending tests will be reported as such. + +## Exclusive Tests + +The exclusivity feature allows you to run *only* the specified suite or test-case + by appending `.only()` to the function. Here's an example of executing only a particular suite: + +```js +describe('Array', function() { + describe.only('#indexOf()', function() { + // ... + }); +}); +``` + +*Note*: All nested suites will still be executed. + +Here's an example of executing a particular test case: + +```js +describe('Array', function() { + describe('#indexOf()', function() { + it.only('should return -1 unless present', function() { + // ... + }); - Pending test-cases are simply those without a callback: + it('should return the index when present', function() { + // ... + }); + }); +}); +``` - describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present') - }) - }) +*Note*: Hooks, if present, will still be executed. -

          Exclusive tests

          +*Warning*: Having more than one call to `.only()` in your tests or suites may result in unexpected behavior. - The exclusivity feature allows you to run only the specified suite or test-case - by appending `.only()` to the call as shown here: +## Inclusive Tests - describe('Array', function(){ - describe.only('#indexOf()', function(){ - ... - }) - }) +This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to simply ignore these suite(s) and test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an entire suite: - Or a specific test-case: +```js +describe('Array', function() { + describe.skip('#indexOf()', function() { + // ... + }); +}); +``` - describe('Array', function(){ - describe('#indexOf()', function(){ - it.only('should return -1 unless present', function(){ +> *Best practice*: Use `.skip()` instead of commenting tests out. - }) +Or a specific test-case: - it('should return the index when present', function(){ +```js +describe('Array', function() { + describe('#indexOf()', function() { + it.skip('should return -1 unless present', function() { + // ... + }); - }) - }) - }) + it('should return the index when present', function() { + // ... + }); + }); +}); +``` - Note that currently only one `.only()` call is respected, this - effectively turns into a `--grep`. +## Dynamically Generating Tests -

          Inclusive tests

          +Given Mocha's use of `Function.prototype.call` and function expressions to define suites and test cases, it's straightforward to generate your tests dynamically. No special syntax is required — plain ol' JavaScript can be used to achieve functionality similar to "parameterized" tests, which you may have seen in other frameworks. - This feature is similar to `.only()`, however by appending `.skip()` - you may tell Mocha to simply ignore these suite(s) and test-case(s). This - puts them in a pending state, and is favoured over commenting out tests - which you may forget to uncomment. +Take the following example: - describe('Array', function(){ - describe.skip('#indexOf()', function(){ - ... - }) - }) +```js +var assert = require('assert'); - Or a specific test-case: +function add() { + return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { + return prev + curr; + }, 0); +} - describe('Array', function(){ - describe('#indexOf()', function(){ - it.skip('should return -1 unless present', function(){ +describe('add()', function() { + var tests = [ + {args: [1, 2], expected: 3}, + {args: [1, 2, 3], expected: 6}, + {args: [1, 2, 3, 4], expected: 10} + ]; - }) + tests.forEach(function(test) { + it('correctly adds ' + test.args.length + ' args', function() { + var res = add.apply(null, test.args); + assert.equal(res, test.expected); + }); + }); +}); +``` - it('should return the index when present', function(){ +The above code will produce a suite with three specs: - }) - }) - }) +```sh +$ mocha -

          Meta-Generated tests

          + add() + ✓ correctly adds 2 args + ✓ correctly adds 3 args + ✓ correctly adds 4 args +``` - Given mocha's use of call statements and function expressions to define - suites and specs, it's rather straightforward to generate your tests. No - special syntax is required - plain JavaScript can be used to achieve - similar functionality as parameterized tests in other test frameworks. - Take the following example: +

          Test duration

          - var assert = require('assert'); +Many reporters will display test duration, as well as flagging tests that are slow, as shown here with the "spec" reporter: + +![test duration](images/reporter-spec-duration.png) + +To tweak what's considered "slow", you can use the `slow()` method: + +```js +describe('something slow', function() { + this.slow(10000); + + it('should take long enough for me to go make a sandwich', function() { + // ... + }); +}); +``` + + +## Timeouts + +### Suite-level - function add() { - return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { - return prev + curr; - }, 0); - } +Suite-level timeouts may be applied to entire test "suites", or disabled via `this.timeout(0)`. This will be inherited by all nested suites and test-cases that do not override the value. - describe('add()', function() { - var tests = [ - {args: [1, 2], expected: 3}, - {args: [1, 2, 3], expected: 6}, - {args: [1, 2, 3, 4], expected: 10} - ]; - - tests.forEach(function(test) { - it('correctly adds ' + test.args.length + ' args', function() { - var res = add.apply(null, test.args); - assert.equal(res, test.expected); - }); - }); - }); +```js +describe('a suite of tests', function() { + this.timeout(500); - The code above will output a suite with three specs: + it('should take less than 500ms', function(done){ + setTimeout(done, 300); + }) - add() - ✓ correctly adds 2 args - ✓ correctly adds 3 args - ✓ correctly adds 4 args + it('should take less than 500ms as well', function(done){ + setTimeout(done, 200); + }) +}) +``` -

          Test duration

          +### Test-level - Most of the reporters support some form of displaying - test duration, as well as flagging tests that are slow, - as shown here with the "spec" reporter: +Test-specific timeouts may also be applied, or the use of `this.timeout(0)` to disable timeouts all together: - ![test duration](images/reporter-spec-duration.png) +```js +it('should take less than 500ms', function(done){ + this.timeout(500); + setTimeout(done, 300); +}); +``` -

          String diffs

          +## Diffs - Mocha supports the `err.expected`, and `err.actual` properties - when available to present expectations to the developer. Currently - Mocha provides string diffs, however in the future object diffs and - others may be provided. +Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff: - ![string diffs](images/reporter-string-diffs.png) +![string diffs](images/reporter-string-diffs.png) -

          mocha(1)

          +## Usage +``` +Usage: mocha [debug] [options] [files] - Usage: mocha [debug] [options] [files] +Commands: - Commands: + init + initialize a client-side mocha setup at - init - initialize a client-side mocha setup at +Options: - Options: + -h, --help output usage information + -V, --version output the version number + -A, --async-only force all tests to take a callback (async) + -c, --colors force enabling of colors + -C, --no-colors force disabling of colors + -G, --growl enable growl notification support + -O, --reporter-options reporter-specific options + -R, --reporter specify the reporter to use + -S, --sort sort test files + -b, --bail bail after first test failure + -d, --debug enable node's debugger, synonym for node --debug + -g, --grep only run tests matching + -f, --fgrep only run tests containing + -gc, --expose-gc expose gc extension + -i, --invert inverts --grep and --fgrep matches + -r, --require require the given module + -s, --slow "slow" test threshold in milliseconds [75] + -t, --timeout set test-case timeout in milliseconds [2000] + -u, --ui specify user-interface (bdd|tdd|exports) + -w, --watch watch files for changes + --check-leaks check for global variable leaks + --compilers :,... use the given module(s) to compile files + --debug-brk enable node's debugger breaking on the first line + --globals allow the given comma-delimited global [names] + --inline-diffs display actual/expected differences inline within each string + --interfaces display available interfaces + --no-deprecation silence deprecation warnings + --no-exit require a clean shutdown of the event loop: mocha will exit + --no-timeouts disables timeouts, given implicitly with --debug + --opts specify opts path + --prof log statistical profiling information + --recursive include sub directories + --reporters display available reporters + --throw-deprecation throw an exception anytime a deprecated function is used + --trace trace function calls + --trace-deprecation show stack traces on deprecations + --watch-extensions ,... additional extensions to monitor with --watch + --delay wait for async suite definition +``` - -h, --help output usage information - -V, --version output the version number - -A, --async-only force all tests to take a callback (async) - -c, --colors force enabling of colors - -C, --no-colors force disabling of colors - -G, --growl enable growl notification support - -O, --reporter-options reporter-specific options - -R, --reporter specify the reporter to use - -S, --sort sort test files - -b, --bail bail after first test failure - -d, --debug enable node's debugger, synonym for node --debug - -g, --grep only run tests matching - -f, --fgrep only run tests containing - -gc, --expose-gc expose gc extension - -i, --invert inverts --grep and --fgrep matches - -r, --require require the given module - -s, --slow "slow" test threshold in milliseconds [75] - -t, --timeout set test-case timeout in milliseconds [2000] - -u, --ui specify user-interface (bdd|tdd|exports) - -w, --watch watch files for changes - --check-leaks check for global variable leaks - --compilers :,... use the given module(s) to compile files - --debug-brk enable node's debugger breaking on the first line - --globals allow the given comma-delimited global [names] - --inline-diffs display actual/expected differences inline within each string - --interfaces display available interfaces - --no-deprecation silence deprecation warnings - --no-exit require a clean shutdown of the event loop: mocha will exit - --no-timeouts disables timeouts, given implicitly with --debug - --opts specify opts path - --prof log statistical profiling information - --recursive include sub directories - --reporters display available reporters - --throw-deprecation throw an exception anytime a deprecated function is used - --trace trace function calls - --trace-deprecation show stack traces on deprecations - --watch-extensions ,... additional extensions to monitor with --watch - --delay wait for async suite definition +### `-w, --watch` -

          -w, --watch

          +Executes tests on changes to JavaScript in the CWD, and once initially. - Executes tests on changes to JavaScript in the CWD, and once initially. +### `--compilers` -

          --compilers

          +CoffeeScript is no longer supported out of the box. CS and similar transpilers +may be used by mapping the file extensions (for use with --watch) and the module +name. For example `--compilers coffee:coffee-script` with CoffeeScript 1.6- or +`--compilers coffee:coffee-script/register` with CoffeeScript 1.7+. - coffee-script is no longer supported out of the box. CS and similar transpilers - may be used by mapping the file extensions (for use with --watch) and the module - name. For example `--compilers coffee:coffee-script` with CoffeeScript 1.6- or - `--compilers coffee:coffee-script/register` with CoffeeScript 1.7+. +### `-b, --bail` -

          -b, --bail

          +Only interested in the first exception? use `--bail`! - Only interested in the first exception? use `--bail` ! +### `-d, --debug` -

          -d, --debug

          +Enables node's debugger support, this executes your script(s) with `node debug ` allowing you to step through code and break with the `debugger` statement. Note the difference between `mocha debug` and `mocha --debug`: `mocha debug` will fire up node's built-in debug client, `mocha --debug` will allow you to use a different interface — such as the Blink Developer Tools. - Enables node's debugger support, this executes your script(s) with `node debug ` allowing you to step through code and break with the `debugger` statement. Note the difference between `mocha debug` and `mocha --debug`: `mocha debug` will fire up node's built-in debug client, `mocha --debug` will allow you to use a different interface — such as the Blink Developer Tools. +### `--globals ` -

          --globals <names>

          +Accepts a comma-delimited list of accepted global variable names. For example, suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--globals app,YUI`. It also accepts wildcards. You could do `--globals '*bar'` and it would match `foobar`, `barbar`, etc. You can also simply pass in `'*'` to ignore all globals. - Accepts a comma-delimited list of accepted global variable names. For example, suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--globals app,YUI`. It also accepts wildcards. You could do `--globals '*bar'` and it would match `foobar`, `barbar`, etc. You can also simply pass in `'*'` to ignore all globals. +### `--check-leaks` -

          --check-leaks

          +By default, Mocha will not check for global variables leaked while running tests, to enable this pass `--check-leaks`, to specify globals that are acceptable use `--globals`, for example `--globals jQuery,MyLib`. - By default Mocha will not check for global variables leaked while running tests, to enable this pass `--check-leaks`, to specify globals that are acceptable use `--globals`, for example `--globals jQuery,MyLib`. +### `-r, --require ` -

          -r, --require <name>

          +The `--require` option is useful for libraries such as [should.js](https://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. Furthermore, it can be used with relative paths, e.g. `--require ./test/helper.js` - The `--require` option is useful for libraries such as [should.js](https://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. Furthermore, it can be used with relative paths, e.g. `--require ./test/helper.js` +### `-u, --ui ` -

          -u, --ui <name>

          +The `--ui` option lets you specify the interface to use, defaulting to "bdd". - The `--ui` option lets you specify the interface to use, defaulting to "bdd". +### `-R, --reporter ` -

          -R, --reporter <name>

          +The `--reporter` option allows you to specify the reporter that will be used, defaulting to "dot". This flag may also be used to utilize third-party reporters. For example if you `npm install mocha-lcov-reporter` you may then do `--reporter mocha-lcov-reporter`. - The `--reporter` option allows you to specify the reporter that will be used, defaulting to "dot". This flag may also be used to utilize third-party reporters. For example if you `npm install mocha-lcov-reporter` you may then do `--reporter mocha-lcov-reporter`. +### `-t, --timeout ` -

          -t, --timeout <ms>

          +Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the `s` suffix, ex: `--timeout 2s` or `--timeout 2000` would be equivalent. - Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the `s` suffix, ex: `--timeout 2s` or `--timeout 2000` would be equivalent. +### `-s, --slow ` -

          -s, --slow <ms>

          +Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long. - Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long. +### `-g, --grep ` -

          -g, --grep <pattern>

          +The `--grep` option when specified will trigger mocha to only run tests matching the given `pattern` which is internally compiled to a `RegExp`. - The `--grep` option when specified will trigger mocha to only run tests matching the given `pattern` which is internally compiled to a `RegExp`. +Suppose, for example, you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. - Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. +```js +describe('api', function() { + describe('GET /api/users', function() { + it('respond with an array of users', function() { + // ... + }); + }); +}); - describe('api', function(){ - describe('GET /api/users', function(){ - it('respond with an array of users') - }) - }) +describe('app', function() { + describe('GET /users', function() { + it('respond with an array of users', function() { + // ... + }); + }) +}) +``` - describe('app', function(){ - describe('GET /users', function(){ - it('respond with an array of users') - }) - }) +## Interfaces -

          Interfaces

          +Mocha's "interface" system allows developers to choose their style of DSL. Mocha has **BDD**, **TDD**, **Exports**, **QUnit** and **Require**-style interfaces. - Mocha "interface" system allows developers to choose their style of DSL. Shipping with __BDD__, __TDD__, and __exports__ flavoured interfaces. +### BDD -

          BDD

          +The **BDD** interface provides `describe()`, `context()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`. - The "__BDD__" interface provides `describe()`, `context()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`: +`context()` is just an alias for `describe()`, and behaves the same way; it just provides a way to keep tests easier to read and organized. - `context()` is just an alias for `describe()`, and behaves the same way; it just provides a way to keep tests easier to read and organized. +> All of the previous examples were written using the **BDD** interface. - describe('Array', function(){ - before(function(){ - // ... - }); +```js + describe('Array', function() { + before(function() { + // ... + }); - describe('#indexOf()', function(){ - context('when not present', function(){ - it('should not throw an error', function(){ - (function(){ - [1,2,3].indexOf(4); - }).should.not.throw(); - }); - it('should return -1', function(){ - [1,2,3].indexOf(4).should.equal(-1); - }); + describe('#indexOf()', function() { + context('when not present', function() { + it('should not throw an error', function() { + (function() { + [1,2,3].indexOf(4); + }).should.not.throw(); + }); + it('should return -1', function() { + [1,2,3].indexOf(4).should.equal(-1); }); - context('when present', function(){ - it('should return the index where the element first appears in the array', function(){ - [1,2,3].indexOf(3).should.equal(2); - }); + }); + context('when present', function() { + it('should return the index where the element first appears in the array', function() { + [1,2,3].indexOf(3).should.equal(2); }); }); }); + }); +``` -

          TDD

          +### TDD - The "__TDD__" interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`. +The **TDD** interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`: - suite('Array', function(){ - setup(function(){ - // ... - }); +```js +suite('Array', function() { + setup(function() { + // ... + }); - suite('#indexOf()', function(){ - test('should return -1 when not present', function(){ - assert.equal(-1, [1,2,3].indexOf(4)); - }); - }); + suite('#indexOf()', function() { + test('should return -1 when not present', function() { + assert.equal(-1, [1,2,3].indexOf(4)); }); + }); +}); +``` -

          Exports

          +### Exports - The "__exports__" interface is much like Mocha's predecessor [expresso](https://github.com/visionmedia/expresso). The keys `before`, `after`, `beforeEach`, and `afterEach` are special-cased, object values - are suites, and function values are test-cases. +The **Exports** interface is much like Mocha's predecessor [expresso](https://github.com/visionmedia/expresso). The keys `before`, `after`, `beforeEach`, and `afterEach` are special-cased, object values are suites, and function values are test-cases: - module.exports = { - before: function(){ - // ... - }, +```js +module.exports = { + before: function() { + // ... + }, - 'Array': { - '#indexOf()': { - 'should return -1 when not present': function(){ - [1,2,3].indexOf(4).should.equal(-1); - } - } + 'Array': { + '#indexOf()': { + 'should return -1 when not present': function() { + [1,2,3].indexOf(4).should.equal(-1); } - }; + } + } +}; +``` -

          QUnit

          +### QUnit - The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. Like TDD, it uses `suite()` and `test()`, but resembling BDD it also contains `before()`, `after()`, `beforeEach()`, and `afterEach()`. +The [QUnit](http://qunitjs.com)-inspired interface matches the "flat" look of QUnit, where the test suite title is simply defined before the test-cases. Like TDD, it uses `suite()` and `test()`, but resembling BDD, it also contains `before()`, `after()`, `beforeEach()`, and `afterEach()`. - function ok(expr, msg) { - if (!expr) throw new Error(msg); - } +```js +function ok(expr, msg) { + if (!expr) throw new Error(msg); +} - suite('Array'); +suite('Array'); - test('#length', function(){ - var arr = [1,2,3]; - ok(arr.length == 3); - }); +test('#length', function() { + var arr = [1,2,3]; + ok(arr.length == 3); +}); - test('#indexOf()', function(){ - var arr = [1,2,3]; - ok(arr.indexOf(1) == 0); - ok(arr.indexOf(2) == 1); - ok(arr.indexOf(3) == 2); - }); +test('#indexOf()', function() { + var arr = [1,2,3]; + ok(arr.indexOf(1) == 0); + ok(arr.indexOf(2) == 1); + ok(arr.indexOf(3) == 2); +}); - suite('String'); +suite('String'); - test('#length', function(){ - ok('foo'.length == 3); - }); +test('#length', function() { + ok('foo'.length == 3); +}); +``` -

          Require

          +### Require - The `require` interface allows you to require the `describe` and friend words - directly using `require` and call them whatever you want. This interface - is also useful if you want to avoid global variables in your tests. +The `require` interface allows you to require the `describe` and friend words directly using `require` and call them whatever you want. This interface is also useful if you want to avoid global variables in your tests. - Note this works when you run your tests via the `mocha` executable only, and not when using the `node` executable directly. The reason is that - certain methods are exposed at runtime and when using the `mocha` executable only. +*Note*: The `require` interface cannot be run via the `node` executable, and must be run via `mocha`. - var testCase = require('mocha').describe - var pre = require('mocha').before - var assertions = require('mocha').it - var assert = require('assert') +```js +var testCase = require('mocha').describe +var pre = require('mocha').before +var assertions = require('mocha').it +var assert = require('assert') - testCase('Array', function(){ - pre(function(){ - // ... - }); +testCase('Array', function() { + pre(function() { + // ... + }); - testCase('#indexOf()', function(){ - assertions('should return -1 when not present', function(){ - assert.equal([1,2,3].indexOf(4), -1); - }); - }); + testCase('#indexOf()', function() { + assertions('should return -1 when not present', function() { + assert.equal([1,2,3].indexOf(4), -1); }); + }); +}); +``` -

          Reporters

          +## Reporters - Mocha reporters adjust to the terminal window, - and always disable ansi-escape colouring when - the stdio streams are not associated with a tty. +Mocha reporters adjust to the terminal window, and always disable ANSI-escape coloring when the stdio streams are not associated with a TTY. -

          Dot Matrix

          +### Spec - The "dot" matrix reporter is simply a series of dots - that represent test cases, failures highlight in red, - pending in blue, slow as yellow. +This is the default reporter. The "spec" reporter outputs a hierarchical view nested just as the test cases are. - ![dot matrix reporter](images/reporter-dot.png) +![spec reporter](images/reporter-spec.png) +![spec reporter with failure](images/reporter-spec-fail.png) -

          Spec

          +### Dot Matrix - The "spec" reporter outputs a hierarchical view - nested just as the test cases are. +The dot matrix (or "dot") reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow. Good if you would like minimal output. - ![spec reporter](images/reporter-spec.png) - ![spec reporter with failure](images/reporter-spec-fail.png) +![dot matrix reporter](images/reporter-dot.png) -

          Nyan

          +### Nyan - The "nyan" reporter is exactly what you might expect: +The "nyan" reporter is exactly what you might expect: - ![js nyan cat reporter](images/reporter-nyan.png) +![js nyan cat reporter](images/reporter-nyan.png) -

          TAP

          +### TAP - The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. +The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. - ![test anything protocol](images/reporter-tap.png) +![test anything protocol](images/reporter-tap.png) -

          Landing Strip

          +### Landing Strip - The Landing Strip reporter is a gimmicky test reporter simulating - a plane landing :) unicode ftw +The 'Landing Strip' reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw - ![landing strip plane reporter](images/reporter-landing.png) - ![landing strip with failure](images/reporter-landing-fail.png) +![landing strip plane reporter](images/reporter-landing.png) +![landing strip with failure](images/reporter-landing-fail.png) -

          List

          +### List - The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at - the bottom of the output. +The "list" reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at the bottom of the output. - ![list reporter](images/reporter-list.png) +![list reporter](images/reporter-list.png) -

          Progress

          +### Progress - The progress reporter implements a simple progress-bar: +The "progress" reporter implements a simple progress-bar: - ![progress bar](images/reporter-progress.png) +![progress bar](images/reporter-progress.png) -

          JSON

          +### JSON - The JSON reporter outputs a single large JSON object when - the tests have completed (failures or not). +The "JSON" reporter outputs a single large JSON object when the tests have completed (failures or not). - ![json reporter](images/reporter-json.png) +![json reporter](images/reporter-json.png) -

          JSON Stream

          +### JSON Stream - The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. +The "JSON stream" reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. - ![json stream reporter](images/reporter-json-stream.png) +![json stream reporter](images/reporter-json-stream.png) -

          JSONCov

          +### JSONCov - The JSONCov reporter is similar to the JSON reporter, however when run against a library instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage) it will produce coverage output. +The "JSONCov" reporter is similar to the JSON reporter, however when run against a library instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage) it will produce coverage output. -

          HTMLCov

          +### HTMLCov - The HTMLCov reporter extends the JSONCov reporter. The library being tested should first be instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage), this allows Mocha to capture the coverage information necessary to produce a single-page HTML report. +The "HTMLCov" reporter extends the JSONCov reporter. The library being tested should first be instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage), this allows Mocha to capture the coverage information necessary to produce a single-page HTML report. - Click to view the current [Express test coverage](coverage.html) report. For an integration example view the mocha test coverage support [commit](https://github.com/visionmedia/express/commit/b6ee5fafd0d6c79cf7df5560cb324ebee4fe3a7f) for Express. +For an integration example, view the mocha test coverage support [commit](https://github.com/visionmedia/express/commit/b6ee5fafd0d6c79cf7df5560cb324ebee4fe3a7f) for Express. - ![code coverage reporting](images/reporter-htmlcov.png) +![code coverage reporting](images/reporter-htmlcov.png) -

          Min

          +### Min - The "min" reporter displays the summary only, while still outputting errors - on failure. This reporter works great with `--watch` as it clears the terminal - in order to keep your test summary at the top. +The "min" reporter displays the summary only, while still outputting errors on failure. This reporter works great with `--watch` as it clears the terminal in order to keep your test summary at the top. - ![min reporter](images/reporter-min.png) +![min reporter](images/reporter-min.png) -

          Doc

          +### Doc - The "doc" reporter outputs a hierarchical HTML body representation - of your tests, wrap it with a header, footer, some styling and you - have some fantastic documentation! +The "doc" reporter outputs a hierarchical HTML body representation of your tests. Wrap it with a header, footer, and some styling, then you have some fantastic documentation! - ![doc reporter](images/reporter-doc.png) +![doc reporter](images/reporter-doc.png) - For example suppose you have the following JavaScript: +For example, suppose you have the following JavaScript: - describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }) - }) - }) +``` +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { + [1,2,3].indexOf(5).should.equal(-1); + [1,2,3].indexOf(0).should.equal(-1); + }); + }); +}); +``` - The command `mocha --reporter doc array` would yield: +The command `mocha --reporter doc array` would yield: +```html +
          +

          Array

          +
          -

          Array

          +

          #indexOf()

          -
          -

          #indexOf()

          -
          -
          should return -1 when the value is not present
          -
          [1,2,3].indexOf(5).should.equal(-1);
          -    [1,2,3].indexOf(0).should.equal(-1);
          -
          -
          +
          should return -1 when the value is not present
          +
          [1,2,3].indexOf(5).should.equal(-1);
          +[1,2,3].indexOf(0).should.equal(-1);
          +
          +
          +``` - The SuperAgent request library [test documentation](http://visionmedia.github.io/superagent/docs/test.html) was generated with Mocha's doc reporter using this simple make target: - - test-docs: - make test REPORTER=doc \ - | cat docs/head.html - docs/tail.html \ - > docs/test.html - - View the entire [Makefile](https://github.com/visionmedia/superagent/blob/master/Makefile) for reference. - -

          XUnit

          - - Documentation needed. - -

          TeamCity

          - - Documentation needed. - -

          Markdown

          +The SuperAgent request library [test documentation](http://visionmedia.github.io/superagent/docs/test.html) was generated with Mocha's doc reporter using this simple make target: - The "markdown" reporter generates a markdown TOC and body for your - test suite. This is great if you want to use the tests as documentation - within a Github wiki page, or a markdown file in the repository that - Github can render. For example here is the Connect [test output](https://github.com/senchalabs/connect/blob/90a725343c2945aaee637e799b1cd11e065b2bff/tests.md). +```makefile + test-docs: + make test REPORTER=doc \ + | cat docs/head.html - docs/tail.html \ + > docs/test.html +``` -

          HTML

          +View the entire [Makefile](https://github.com/visionmedia/superagent/blob/master/Makefile) for reference. - The __HTML__ reporter is currently the only browser reporter - supported by Mocha, and it looks like this: +### Markdown - ![HTML test reporter](images/reporter-html.png) +The "markdown" reporter generates a markdown TOC and body for your test suite. This is great if you want to use the tests as documentation within a Github wiki page, or a markdown file in the repository that Github can render. For example here is the Connect [test output](https://github.com/senchalabs/connect/blob/90a725343c2945aaee637e799b1cd11e065b2bff/tests.md). -

          Browser support

          +### HTML - Mocha runs in the browser. Every release of Mocha will have new builds of _./mocha.js_ and _./mocha.css_ for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the __BDD__ interface before loading the test scripts, running them `onload` with `mocha.run()`. +The "HTML" reporter is currently the only browser reporter supported by Mocha, and it looks like this: - - - - Mocha Tests - - - -
          - - - - - - - - - - +![HTML test reporter](images/reporter-html.png) -

          grep

          - - The client-side may use `--grep` as well, however, you must append a query-string to your URL: `?grep=api`. - -

          Mocha Setup in the Browser

          - - Mocha options can be set via `mocha.setup()`. Examples: - - // Use "tdd" interface. This is a shortcut to setting the interface; - // any other options must be passed via an object. - mocha.setup('tdd'); - - // This is equivalent to the above. - mocha.setup({ - ui: 'tdd' - }); - - // Use "tdd" interface, ignore leaks, and force all tests to be asynchronous - mocha.setup({ - ui: 'tdd', - ignoreLeaks: true, - asyncOnly: true - }); +### Undocumented Reporters -

          Browser-specific option(s)

          +The "XUnit" and "TeamCity" reporters are also available, but someone needs to write the documentation. - The following option(s) *only* function in a browser context: +## Running Mocha in the Browser - `noHighlighting` : If set to `true`, do not attempt to use syntax highlighting on output test code. +Mocha runs in the browser. Every release of Mocha will have new builds of `./mocha.js` and `./mocha.css` for use in the browser. -

          mocha.opts

          +To configure Mocha for use in the browser, you must include the relevant files, tell Mocha which interface you would like to use, and then tell it to begin the tests. - Mocha will attempt to load `./test/mocha.opts`, these are concatenated with `process.argv`, though command-line args will take precedence. For example suppose you have the following _mocha.opts_ file: +A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the **BDD** interface before loading the test scripts, running them `onload` with `mocha.run()`. - --require should - --reporter dot - --ui bdd +```html + + + + Mocha Tests + + + +
          + + + + + + + + + + +``` - This will default the reporter to `dot`, require the `should` library, - and use `bdd` as the interface. With this you may then invoke `mocha(1)` - with additional arguments, here enabling growl support and changing - the reporter to `list`: +### Grep - $ mocha --reporter list --growl +The browser may use the `--grep` as functionality. Append a query-string to your URL: `?grep=api`. -

          Suite specific timeouts

          +### Browser Configuration - Suite-level timeouts may be applied to entire test "suites", or disabled - via `this.timeout(0)`. This will be inherited by all nested suites and test-cases - that do not override the value. +Mocha options can be set via `mocha.setup()`. Examples: - describe('a suite of tests', function(){ - this.timeout(500); +```js +// Use "tdd" interface. This is a shortcut to setting the interface; +// any other options must be passed via an object. +mocha.setup('tdd'); - it('should take less than 500ms', function(done){ - setTimeout(done, 300); - }) +// This is equivalent to the above. +mocha.setup({ + ui: 'tdd' +}); - it('should take less than 500ms as well', function(done){ - setTimeout(done, 200); - }) - }) +// Use "tdd" interface, ignore leaks, and force all tests to be asynchronous +mocha.setup({ + ui: 'tdd', + ignoreLeaks: true, + asyncOnly: true +}); +``` +### Browser-specific Option(s) -

          Test specific timeouts

          +The following option(s) *only* function in a browser context: - Test-specific timeouts may also be applied, or the use of `this.timeout(0)` - to disable timeouts all together: +`noHighlighting`: If set to `true`, do not attempt to use syntax highlighting on output test code. - it('should take less than 500ms', function(done){ - this.timeout(500); - setTimeout(done, 300); - }) +## `mocha.opts` -

          Best practices

          +Back on the server, Mocha will attempt to load `./test/mocha.opts` as a configuration file of sorts. The lines in this file are combined with any command-line arguments. The command-line arguments take precedence. For example, suppose you have the following `mocha.opts` file: -

          test/*

          +``` + --require should + --reporter dot + --ui bdd +``` - By default `mocha(1)` will use the pattern `./test/*.js`, so - it's usually a good place to put your tests. +This will default the reporter to `dot`, require the `should` library, and use `bdd` as the interface. With this, you may then invoke `mocha` with additional arguments, here enabling [Growl](http://growl.info) support, and changing the reporter to `list`: -

          Makefiles

          +```sh +$ mocha --reporter list --growl +``` - Be kind and don't make developers hunt around in your docs to figure - out how to run the tests, add a `make test` target to your _Makefile_: +## The `test/` Directory - test: - ./node_modules/.bin/mocha --reporter list +By default, `mocha` looks for the glob `./test/*.js`, so you may want to put your tests in `test/` folder. - .PHONY: test +## Editor Plugins -

          Editors

          +The following editor-related packages are available: - The following editor-related packages are available: +### TextMate -

          TextMate bundle

          +The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable. To install the bundle, clone a copy of the [Mocha repo](https://github.com/mochajs/mocha), and run: - The Mocha TextMate bundle includes snippets to - make writing tests quicker and more enjoyable. - To install the bundle run: +```sh +$ make tm +``` - $ make tm +### JetBrains -

          JetBrains plugin

          +[JetBrains](http://jetbrains.com) provides a [NodeJS plugin](http://www.jetbrains.com/idea/features/nodejs.html) for its suite of IDEs (IntelliJ IDEA, WebStorm, etc.), which contains a Mocha test runner, among other things. - [JetBrains](http://jetbrains.com) provides a [NodeJS plugin](http://www.jetbrains.com/idea/features/nodejs.html) for its suite of IDEs (IntelliJ IDEA, WebStorm, etc.), which contains a Mocha test runner, among other things. +![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png) - ![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png) +The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Plugins**, assuming your license allows it. - The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Plugins**, or via [direct download](http://plugins.jetbrains.com/plugin/6098?pr=phpStorm). -

          Example test suites

          +## Examples - The following test suites are from real projects putting Mocha to use, - so they serve as good examples: +Real live example code: - - [Express](https://github.com/visionmedia/express/tree/master/test) - - [Connect](https://github.com/senchalabs/connect/tree/master/test) - - [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) - - [WebSocket.io](https://github.com/LearnBoost/websocket.io/tree/master/test) - - [Mocha](https://github.com/mochajs/mocha/tree/master/test) +- [Express](https://github.com/visionmedia/express/tree/master/test) +- [Connect](https://github.com/senchalabs/connect/tree/master/test) +- [SuperAgent](https://github.com/visionmedia/superagent/tree/master/test/node) +- [WebSocket.io](https://github.com/LearnBoost/websocket.io/tree/master/test) +- [Mocha](https://github.com/mochajs/mocha/tree/master/test) -

          Running mocha's tests

          +## Testing Mocha - Run the tests: +To run Mocha's tests: - $ make test +```sh +$ make test +``` - Run all tests, including interfaces: +Run all tests, including interfaces: - $ make test-all +```sh +$ make test-all +``` - Alter the reporter: +Alter the reporter: - $ make test REPORTER=list +``` +$ make test REPORTER=list +``` -

          More information

          +## More Information - For additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/mochajs/mocha/wiki) on GitHub. For discussions join the [Google Group](http://groups.google.com/group/mochajs). For a running example of mocha view [example/tests.html](example/tests.html). For the JavaScript API view the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js#L51). +In addition to chatting with us on [Gitter](https://gitter.im/mochajs/mocha), for additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/mochajs/mocha/wiki) on GitHub. For discussions join the [Google Group](http://groups.google.com/group/mochajs). For a running example of Mocha, view [example/tests.html](example/tests.html). For the JavaScript API, view the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js#L51). diff --git a/jquery.js b/jquery.js deleted file mode 100644 index d2424e6528..0000000000 --- a/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7 jquery.com | jquery.org/license */ -(function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
          a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
          ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
          t
          ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p="
          "+""+"
          ";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&& -(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

          ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
          ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,"
          ","
          "],thead:[1,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],col:[2,"","
          "],area:[1,"",""],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div
          ","
          "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after" -,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/)<[^<]*)*<\/script>/gi,bQ=/^(?:select|textarea)/i,bR=/\s+/,bS=/([?&])_=[^&]*/,bT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bU=f.fn.load,bV={},bW={},bX,bY,bZ=["*/"]+["*"];try{bX=e.href}catch(b$){bX=c.createElement("a"),bX.href="",bX=bX.href}bY=bT.exec(bX.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bU)return bU.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
          ").append(c.replace(bP,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bQ.test(this.nodeName)||bK.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bH,"\r\n")}}):{name:b.name,value:c.replace(bH,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?cb(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),cb(a,b);return a},ajaxSettings:{url:bX,isLocal:bL.test(bY[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bZ},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:b_(bV),ajaxTransport:b_(bW),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cd(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=ce(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bJ.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bI,"").replace(bN,bY[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bR),d.crossDomain==null&&(r=bT.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bY[1]&&r[2]==bY[2]&&(r[3]||(r[1]==="http:"?80:443))==(bY[3]||(bY[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),ca(bV,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bM.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bO.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bS,"$1_="+x);d.url=y+(y===d.url?(bO.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bZ+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=ca(bW,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)cc(g,a[g],c,e);return d.join("&").replace(bF,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cf=f.now(),cg=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cf++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cg.test(b.url)||e&&cg.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cg,l),b.url===j&&(e&&(k=k.replace(cg,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ch=a.ActiveXObject?function(){for(var a in cj)cj[a](0,1)}:!1,ci=0,cj;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ck()||cl()}:ck,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ch&&delete cj[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++ci,ch&&(cj||(cj={},f(a).unload(ch)),cj[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cm={},cn,co,cp=/^(?:toggle|show|hide)$/,cq=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cr,cs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],ct;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cw("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cz.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cz.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cA(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cA(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000000..30fb54f16c --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "mochajs.org", + "version": "1.0.0", + "description": "Mocha's gh-pages branch", + "private": true, + "scripts": { + "prepublish": "gem install bundler && bundle install", + "build": "toc-idx -i index.md --max-depth 1 --bullet \"\\- \" index.md && bundle exec jekyll build" + }, + "repository": { + "type": "git", + "url": "https://github.com/mochajs/mocha.git#gh-pages" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/mochajs/mocha/issues" + }, + "homepage": "http://mochajs.org", + "devDependencies": { + "markdown-toc-index": "^0.2.0" + } +} From 2952eca30c62915a0d45d6c6b6598b3254c9a9ea Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 27 Jun 2015 18:07:49 -0700 Subject: [PATCH 0297/1771] Fix 1766: stackfilter should not ignore node_modules Closes #1766 Closes #1767 Signed-off-by: Joshua Appelman --- lib/utils.js | 8 +------- test/integration/helpers.js | 2 +- test/utils.js | 3 ++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index 7e102ee123..e7b9eee9f5 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -698,10 +698,6 @@ exports.stackTraceFilter = function() { ? process.cwd() + slash : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); - function isNodeModule(line) { - return (~line.indexOf('node_modules')); - } - function isMochaInternal(line) { return (~line.indexOf('node_modules' + slash + 'mocha')) || (~line.indexOf('components' + slash + 'mochajs')) @@ -726,9 +722,7 @@ exports.stackTraceFilter = function() { stack = stack.split('\n'); stack = exports.reduce(stack, function(list, line) { - if (is.node && (isNodeModule(line) - || isMochaInternal(line) - || isNodeInternal(line))) { + if (is.node && (isMochaInternal(line) || isNodeInternal(line))) { return list; } diff --git a/test/integration/helpers.js b/test/integration/helpers.js index eea8b185fb..7187d9d7e7 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -98,7 +98,7 @@ module.exports = { // Ignore empty lines before/after diff return diffs.map(function(diff) { - return diff.slice(1, -1).join('\n'); + return diff.slice(1, -2).join('\n'); }); } }; diff --git a/test/utils.js b/test/utils.js index 524a0e0519..31b49893ca 100644 --- a/test/utils.js +++ b/test/utils.js @@ -97,7 +97,8 @@ describe('utils', function() { , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; - filter(stack.join('\n')).should.equal(stack.slice(0,2).concat(stack.slice(5,7)).join('\n')); + + filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); }); it('should ignore bower and components files', function() { From b4fae164001589cbf96bec0f5e4659a812924c35 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Sun, 7 Jun 2015 19:06:00 +0800 Subject: [PATCH 0298/1771] Adds makefile Signed-off-by: Joshua Appelman --- Makefile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..9d3d37e77f --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +PORT ?= 3000 +bundle := bundle + +start: bundle + ${bundle} exec jekyll serve --safe --drafts --watch --port ${PORT} + +build: bundle + ${bundle} exec jekyll build --safe + +bundle: + ${bundle} From 0d934d68b33d1d38498b317fc045fb39c1538b8d Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 13:16:11 +0200 Subject: [PATCH 0299/1771] Adds TOC to makefile. --- Makefile | 8 ++++++-- package.json | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 9d3d37e77f..77e0c976a6 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,15 @@ PORT ?= 3000 bundle := bundle -start: bundle +start: toc bundle ${bundle} exec jekyll serve --safe --drafts --watch --port ${PORT} -build: bundle + +build: toc bundle ${bundle} exec jekyll build --safe +toc: + ./node_modules/.bin/toc-idx -i index.md --max-depth 1 --bullet "\- " index.md + bundle: ${bundle} diff --git a/package.json b/package.json index 30fb54f16c..7eaaef80c8 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "private": true, "scripts": { "prepublish": "gem install bundler && bundle install", - "build": "toc-idx -i index.md --max-depth 1 --bullet \"\\- \" index.md && bundle exec jekyll build" + "build": "make build" }, "repository": { "type": "git", From e86f82452c8fe2d6d12714686125f10135cccc61 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 13:19:03 +0200 Subject: [PATCH 0300/1771] Updates README with make and local dev instructions. --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f8db3ae9e..0be8a8dc26 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,13 @@ ## Installation 1. Execute `npm install`. This will install [Bundler](http://bundler.io), Jekyll, and [markdown-toc-index](https://www.npmjs.com/package/markdown-toc-index). -2. To build, execute `npm run-script build`. +2. To build, execute `npm run build` or `make build` -For more information, refer to the [Jekyll Docs](http://jekyllrb.com/docs/home/) and [GitHub's Tutorial](https://help.github.com/articles/using-jekyll-with-pages/) on the subject. +## Local development + +1. Run `make` to build the project and start a development server that auto-watches for changes on http://localhost:3000 + +For more information, refer to the [Jekyll Docs](http://jekyllrb.com/docs/home/) and [GitHub's Tutorial](https://help.github.com/articles/using-jekyll-with-pages/) on the subject. ## Notes From b8689990f4f75aaa65ea675093b98cfce6ce142d Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 13:26:29 +0200 Subject: [PATCH 0301/1771] Adds maintainers to package.json and footer. --- _includes/footer.html | 2 +- package.json | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index 300314d5c6..d4fbe54982 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,3 +1,3 @@
          - © 2011-2015 TJ Holowaychuk. All rights reserved. Licensed MIT + © 2011-2015 TJ Holowaychuk, Travis Jeffery, Christopher Hiller & Joshua Boy Nicolai Appelman. All rights reserved. Licensed MIT
          diff --git a/package.json b/package.json index 7eaaef80c8..051963d6bd 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "version": "1.0.0", "description": "Mocha's gh-pages branch", "private": true, + "maintainers": [ + "travisjeffery ", + "jbnicolai ", + "boneskull " + ], "scripts": { "prepublish": "gem install bundler && bundle install", "build": "make build" From 892498fa10ecb07345d680f5ff75d89de8d5b81e Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 13:33:08 +0200 Subject: [PATCH 0302/1771] Fixes broken href attribute. --- _includes/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/head.html b/_includes/head.html index 0332f13b8d..66c1b19385 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -1,7 +1,7 @@ {{ page.title }} - + From 97c936d3e327e9f8f881a9a06f4fe43e6558d276 Mon Sep 17 00:00:00 2001 From: Tomer Eskenazi Date: Tue, 2 Jun 2015 17:17:49 +0300 Subject: [PATCH 0303/1771] Site index - update mocha command flags Signed-off-by: Joshua Appelman --- index.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index d9d7ccbae5..7323b61bb9 100644 --- a/index.md +++ b/index.md @@ -501,11 +501,22 @@ Options: --check-leaks check for global variable leaks --compilers :,... use the given module(s) to compile files --debug-brk enable node's debugger breaking on the first line + --delay wait for async suite definition + --es_staging enable all staged features + --full-trace display the full stack trace --globals allow the given comma-delimited global [names] + --harmony enable all harmony features (except typeof) + --harmony-collections enable harmony collections (sets, maps, and weak maps) + --harmony-generators enable harmony generators + --harmony-proxies enable harmony proxies + --harmony_arrow_functions enable "harmony arrow functions" (iojs) + --harmony_classes enable "harmony classes" (iojs) + --harmony_proxies enable "harmony proxies" (iojs) + --harmony_shipping enable all shipped harmony fetaures (iojs) --inline-diffs display actual/expected differences inline within each string --interfaces display available interfaces --no-deprecation silence deprecation warnings - --no-exit require a clean shutdown of the event loop: mocha will exit + --no-exit require a clean shutdown of the event loop: mocha will not call process.exit --no-timeouts disables timeouts, given implicitly with --debug --opts specify opts path --prof log statistical profiling information @@ -515,7 +526,6 @@ Options: --trace trace function calls --trace-deprecation show stack traces on deprecations --watch-extensions ,... additional extensions to monitor with --watch - --delay wait for async suite definition ``` ### `-w, --watch` From 0a16234ae878c8301a5241145ec2d15db6f2b1ee Mon Sep 17 00:00:00 2001 From: amsul Date: Wed, 10 Jun 2015 16:27:05 -0400 Subject: [PATCH 0304/1771] add note on allowUncaught method in the browser Signed-off-by: Joshua Appelman --- index.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 7323b61bb9..8ee61f1d66 100644 --- a/index.md +++ b/index.md @@ -872,9 +872,13 @@ The "XUnit" and "TeamCity" reporters are also available, but someone needs to wr ## Running Mocha in the Browser -Mocha runs in the browser. Every release of Mocha will have new builds of `./mocha.js` and `./mocha.css` for use in the browser. +Mocha runs in the browser. Every release of Mocha will have new builds of `./mocha.js` and `./mocha.css` for use in the browser. -To configure Mocha for use in the browser, you must include the relevant files, tell Mocha which interface you would like to use, and then tell it to begin the tests. +### Browser-specific methods + + The following method(s) *only* function in a browser context: + + `mocha.allowUncaught()` : If called, uncaught errors will not be absorbed by the error handler. A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the **BDD** interface before loading the test scripts, running them `onload` with `mocha.run()`. From 63f04417b2f2b0a71cde74e16347d72346f766fc Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 14:27:21 +0200 Subject: [PATCH 0305/1771] Updates should.js repository url. Fixes #1743 --- index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index 8ee61f1d66..c09098639c 100644 --- a/index.md +++ b/index.md @@ -112,9 +112,9 @@ $ mocha ## Assertions -Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](https://github.com/visionmedia/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: +Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](https://github.com/shouldjs/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: -- [should.js](https://github.com/visionmedia/should.js) BDD style shown throughout these docs +- [should.js](https://github.com/shouldjs/should.js) BDD style shown throughout these docs - [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions - [chai](http://chaijs.com/) expect(), assert() and should style assertions - [better-assert](https://github.com/visionmedia/better-assert) c-style self-documenting assert() @@ -557,7 +557,7 @@ By default, Mocha will not check for global variables leaked while running tests ### `-r, --require ` -The `--require` option is useful for libraries such as [should.js](https://github.com/visionmedia/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. Furthermore, it can be used with relative paths, e.g. `--require ./test/helper.js` +The `--require` option is useful for libraries such as [should.js](https://github.com/shouldjs/should.js), so you may simply `--require should` instead of manually invoking `require('should')` within each test file. Note that this works well for `should` as it augments `Object.prototype`, however if you wish to access a module's exports you will have to require them, for example `var should = require('should')`. Furthermore, it can be used with relative paths, e.g. `--require ./test/helper.js` ### `-u, --ui ` From 4a22abd26d1977a746da5106fae9c78fbef2584e Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 14:36:23 +0200 Subject: [PATCH 0306/1771] Uses cdn urls in example html. Closes #1738. --- index.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/index.md b/index.md index c09098639c..e39cda4b2d 100644 --- a/index.md +++ b/index.md @@ -887,13 +887,15 @@ A typical setup might look something like the following, where we call `mocha.se Mocha Tests - +
          - - - + + + + + From 495c2b619b7739f832661f6182e625eb906a7b47 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 14:58:07 +0200 Subject: [PATCH 0307/1771] Fixes window.onload animation. --- _includes/header.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_includes/header.html b/_includes/header.html index 71eb2f0287..d9aaec736b 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,3 +1,6 @@ +

          Mocha

          simple, flexible, fun

          From b548d25eb1a8c6776711dfe7c528ec2cf7a5d36d Mon Sep 17 00:00:00 2001 From: Glen Mailer Date: Sun, 5 Jul 2015 17:31:46 +0100 Subject: [PATCH 0308/1771] Move hook error test to integration in prep for rewrite --- test/{ => integration}/hook.err.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{ => integration}/hook.err.js (100%) diff --git a/test/hook.err.js b/test/integration/hook.err.js similarity index 100% rename from test/hook.err.js rename to test/integration/hook.err.js From 092ea4684478aa99e32f3acaa0e5963ee5c0cb7d Mon Sep 17 00:00:00 2001 From: Glen Mailer Date: Sun, 5 Jul 2015 17:32:18 +0100 Subject: [PATCH 0309/1771] Rework hook error tests to actually assert --- test/integration/helpers.js | 42 +++ test/integration/hook.err.js | 570 +++++++++++++++++++---------------- 2 files changed, 359 insertions(+), 253 deletions(-) diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 7187d9d7e7..e6483674e2 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -1,5 +1,6 @@ var spawn = require('child_process').spawn; var path = require('path'); +var fs = require('fs'); module.exports = { /** @@ -35,6 +36,47 @@ module.exports = { }); }, + /** + * Invokes the mocha binary on the code of the body of the function. + * Accepts an array of additional command line args to pass. The callback is + * invoked with a summary of the run, in addition to its output. The summary + * includes the number of passing, pending, and failing tests, as well as the + * exit code. Useful for testing different reporters. + * + * Example response: + * { + * pending: 0, + * passing: 0, + * failing: 1, + * code: 1, + * output: '...' + * } + * + * @param {function} fixture + * @param {array} args + * @param {function} fn + */ + runMochaFunction: function(fixture, args, fn) { + var path = resolveFixturePath(fixture.name + '.js' || 'tempfile.js'); + args = args || []; + + var fixtureContent = 'var fn = ' + fixture.toString() + '; fn()'; + fs.writeFileSync(path, fixtureContent, 'utf8'); + + function cleanup() { + fs.unlink(path); + fn.apply(this, arguments); + } + + invokeMocha(args.concat(['-C', path]), function(err, res) { + if (err) { + return cleanup(err); + } + + cleanup(null, getSummary(res)); + }); + }, + /** * Invokes the mocha binary for the given fixture using the JSON reporter, * returning the parsed output, as well as exit code. diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index d7e6c2e460..0e3329523e 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -1,296 +1,360 @@ -describe('hook error handling', function(){ - // Lines in this test should be uncommented to see actual behavior - // You will also see errors in hooks - describe('before hook error', function() { - var calls = []; - describe('spec 1', function () { - describe('spec 1 nested', function () { - it('should not be called, because hook error was in a parent suite', function() { - calls.push('test nested'); - }) - }) - before(function(){ - calls.push('before'); - // throw new Error('before hook error'); - }) - after(function(){ - calls.push('after'); - }) - it('should not be called because of error in before hook', function() { - calls.push('test'); - }) - }) - describe('spec 2', function () { - before(function(){ - calls.push('before 2'); - }) - after(function(){ - calls.push('after 2'); - }) - it('should be called, because hook error was in a sibling suite', function() { - calls.push('test 2'); - }) - }) - after(function () { - // calls.should.eql(['before', 'after', 'before 2', 'test 2', 'after 2']); - }) - }) +var assert = require('assert'); +var runMochaFunction = require('./helpers').runMochaFunction; - describe('before each hook error', function() { - var calls = []; - describe('spec 1', function () { - describe('spec 1 nested', function () { - it('should not be called, because hook error was in a parent suite', function() { - calls.push('test nested'); - }) - }) - beforeEach(function(){ - calls.push('before'); - // throw new Error('before each hook error'); - }) - afterEach(function(){ - calls.push('after'); - }) - it('should not be called because of error in before each hook', function() { - calls.push('test'); - }) - }) - describe('spec 2', function () { - before(function(){ - calls.push('before 2'); - }) - after(function(){ - calls.push('after 2'); - }) - it('should be called, because hook error was in a sibling suite', function() { - calls.push('test 2'); - }) - }) - after(function () { - // This should be called ! - // calls.should.eql(['before', 'after', 'before 2', 'test 2', 'after 2']); - }) - }) +describe('hook error handling', function() { + this.timeout(1000); - describe('after hook error', function() { - var calls = []; - describe('spec 1', function () { - describe('spec 1 nested', function () { - it('should be called, because hook error will happen after parent suite', function() { - calls.push('test nested'); - }) - }) - before(function(){ - calls.push('before'); - }) - after(function(){ - calls.push('after'); - // throw new Error('after hook error'); - }) - it('should be called because error is in after hook', function() { - calls.push('test'); - }) - }) - describe('spec 2', function () { - before(function(){ - calls.push('before 2'); - }) - after(function(){ - calls.push('after 2'); - }) - it('should be called, because hook error was in a sibling suite', function() { - calls.push('test 2'); - }) - }) - after(function () { - // Even this should be called ! - // calls.should.eql(['before', 'test', 'test nested', 'after', 'before 2', 'test 2', 'after 2']); - }) - }) + var lines; - describe('after each hook error', function() { - var calls = []; - describe('spec 1', function () { - describe('spec 1 nested', function () { - it('should not be called, because hook error has already happened in parent suite', function() { - calls.push('test nested'); - }) - }) - beforeEach(function(){ - calls.push('before'); - }) - afterEach(function(){ - calls.push('after'); - // throw new Error('after each hook error'); - }) - it('should be called because error is in after each hook, and this is the first test', function() { - calls.push('test'); - }) - it('should not be called because error is in after each hook, and this is the second test', function() { - calls.push('another test'); - }) - }) - describe('spec 2', function () { - before(function(){ - calls.push('before 2'); - }) - after(function(){ - calls.push('after 2'); - }) - it('should be called, because hook error was in a sibling suite', function() { - calls.push('test 2'); - }) - }) - after(function () { - // This should be called ! - // calls.should.eql(['before', 'test', 'after', 'before 2', 'test 2', 'after 2']); - }) - }) + describe('before hook error', function() { + before(run(function beforeHookError() { + describe('spec 1', function() { + describe('spec 1 nested', function() { + it('should not be called, because hook error was in a parent suite', function() { + console.log('test nested'); + }); + }); + before(function() { + console.log('before'); + throw new Error('before hook error'); + }); + after(function() { + console.log('after'); + }); + it('should not be called because of error in before hook', function() { + console.log('test'); + }); + }); + describe('spec 2', function() { + before(function() { + console.log('before 2'); + }); + after(function() { + console.log('after 2'); + }); + it('should be called, because hook error was in a sibling suite', function() { + console.log('test 2'); + }); + }); + })); - describe('multiple hook errors', function() { - var calls = []; - before(function(){ - calls.push("root before"); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'after', 'before 2', 'test 2', 'after 2'] + ); }); - beforeEach(function(){ - calls.push("root before each"); - }); - describe('1', function(){ - beforeEach(function() { - calls.push('1 before each') - }) + }); - describe('1.1', function(){ - before(function() { - calls.push('1.1 before'); + describe('before each hook error', function() { + before(run(function beforeEachHookError() { + describe('spec 1', function() { + describe('spec 1 nested', function() { + it('should not be called, because hook error was in a parent suite', function() { + console.log('test nested'); + }); }); beforeEach(function() { - calls.push('1.1 before each') - // throw new Error('1.1 before each hook failed') + console.log('before'); + throw new Error('before each hook error'); }); - it('1.1 test 1', function () {calls.push('1.1 test 1')}); - it('1.1 test 2', function () {calls.push('1.1 test 2')}); afterEach(function() { - calls.push("1.1 after each"); + console.log('after'); + }); + it('should not be called because of error in before each hook', function() { + console.log('test'); + }); + }); + describe('spec 2', function() { + before(function() { + console.log('before 2'); + }); + after(function() { + console.log('after 2'); }); - after(function(){ - calls.push("1.1 after"); - // throw new Error('1.1 after hook failed') + it('should be called, because hook error was in a sibling suite', function() { + console.log('test 2'); }); }); + })); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'after', 'before 2', 'test 2', 'after 2'] + ); + }); + }); - describe('1.2', function(){ + describe('after hook error', function() { + before(run(function afterHookError() { + describe('spec 1', function() { + describe('spec 1 nested', function() { + it('should be called, because hook error will happen after parent suite', function() { + console.log('test nested'); + }); + }); before(function() { - calls.push('1.2 before'); + console.log('before'); }); - beforeEach(function() { - calls.push('1.2 before each') + after(function() { + console.log('after'); + throw new Error('after hook error'); }); - it('1.2 test 1', function () {calls.push('1.2 test 1')}); - it('1.2 test 2', function () {calls.push('1.2 test 2')}); - afterEach(function() { - calls.push("1.2 after each"); - // throw new Error('1.2 after each hook failed') + it('should be called because error is in after hook', function() { + console.log('test'); + }); + }); + describe('spec 2', function() { + before(function() { + console.log('before 2'); }); - after(function(){ - calls.push("1.2 after"); + after(function() { + console.log('after 2'); + }); + it('should be called, because hook error was in a sibling suite', function() { + console.log('test 2'); }); }); + })); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'test', 'test nested', 'after', 'before 2', 'test 2', 'after 2'] + ); + }); + }); - afterEach(function() { - calls.push('1 after each') - }) - - after(function(){ - calls.push("1 after"); + describe('after each hook error', function() { + before(run(function afterEachHookError() { + describe('spec 1', function() { + describe('spec 1 nested', function() { + it('should be called, because hook error will happen after parent suite', function() { + console.log('test nested'); + }); + }); + before(function() { + console.log('before'); + }); + after(function() { + console.log('after'); + throw new Error('after hook error'); + }); + it('should be called because error is in after hook', function() { + console.log('test'); + }); }); - }) + describe('spec 2', function() { + before(function() { + console.log('before 2'); + }); + after(function() { + console.log('after 2'); + }); + it('should be called, because hook error was in a sibling suite', function() { + console.log('test 2'); + }); + }); + })); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'test', 'test nested', 'after', 'before 2', 'test 2', 'after 2'] + ); + }); + }); - describe('2', function(){ + describe('multiple hook errors', function() { + before(run(function multipleHookErrors() { + before(function() { + console.log('root before'); + }); beforeEach(function() { - calls.push('2 before each') - // throw new Error('2 before each hook failed') - }) + console.log('root before each'); + }); + describe('1', function() { + beforeEach(function() { + console.log('1 before each'); + }); - describe('2.1', function(){ - before(function() { - calls.push('2.1 before'); + describe('1.1', function() { + before(function() { + console.log('1.1 before'); + }); + beforeEach(function() { + console.log('1.1 before each'); + throw new Error('1.1 before each hook failed'); + }); + it('1.1 test 1', function() { + console.log('1.1 test 1'); + }); + it('1.1 test 2', function() { + console.log('1.1 test 2'); + }); + afterEach(function() { + console.log('1.1 after each'); + }); + after(function() { + console.log('1.1 after'); + throw new Error('1.1 after hook failed'); + }); }); - beforeEach(function() { - calls.push('2.1 before each') + + describe('1.2', function() { + before(function() { + console.log('1.2 before'); + }); + beforeEach(function() { + console.log('1.2 before each'); + }); + it('1.2 test 1', function() { + console.log('1.2 test 1'); + }); + it('1.2 test 2', function() { + console.log('1.2 test 2'); + }); + afterEach(function() { + console.log('1.2 after each'); + throw new Error('1.2 after each hook failed'); + }); + after(function() { + console.log('1.2 after'); + }); }); - it('2.1 test 1', function () {calls.push('2.1 test 1')}); - it('2.1 test 2', function () {calls.push('2.1 test 2')}); + afterEach(function() { - calls.push("2.1 after each"); + console.log('1 after each'); }); - after(function(){ - calls.push("2.1 after"); + + after(function() { + console.log('1 after'); }); }); - describe('2.2', function(){ - before(function() { - calls.push('2.2 before'); - }); + describe('2', function() { beforeEach(function() { - calls.push('2.2 before each') + console.log('2 before each'); + throw new Error('2 before each hook failed'); }); - it('2.2 test 1', function () {calls.push('2.2 test 1')}); - it('2.2 test 2', function () {calls.push('2.2 test 2')}); + + describe('2.1', function() { + before(function() { + console.log('2.1 before'); + }); + beforeEach(function() { + console.log('2.1 before each'); + }); + it('2.1 test 1', function() { + console.log('2.1 test 1'); + }); + it('2.1 test 2', function() { + console.log('2.1 test 2'); + }); + afterEach(function() { + console.log('2.1 after each'); + }); + after(function() { + console.log('2.1 after'); + }); + }); + + describe('2.2', function() { + before(function() { + console.log('2.2 before'); + }); + beforeEach(function() { + console.log('2.2 before each'); + }); + it('2.2 test 1', function() { + console.log('2.2 test 1'); + }); + it('2.2 test 2', function() { + console.log('2.2 test 2'); + }); + afterEach(function() { + console.log('2.2 after each'); + }); + after(function() { + console.log('2.2 after'); + }); + }); + afterEach(function() { - calls.push("2.2 after each"); + console.log('2 after each'); + throw new Error('2 after each hook failed'); }); - after(function(){ - calls.push("2.2 after"); + + after(function() { + console.log('2 after'); }); }); + after(function() { + console.log('root after'); + }); afterEach(function() { - calls.push('2 after each') - // throw new Error('2 after each hook failed') - }) - - after(function(){ - calls.push("2 after"); + console.log('root after each'); }); - }) - - after(function(){ - calls.push("root after"); - /* calls.should.eql([ - "root before", - "1.1 before", - "root before each", - "1 before each", - "1.1 before each", - "1.1 after each", - "1 after each", - "root after each", - "1.1 after", - "1.2 before", - "root before each", - "1 before each", - "1.2 before each", - "1.2 test 1", - "1.2 after each", - "1 after each", - "root after each", - "1.2 after", - "1 after", - "2.1 before", - "root before each", - "2 before each", - "2 after each", - "root after each", - "2.1 after", - "2 after", - "root after" - ]); */ - }); - afterEach(function(){ - calls.push("root after each"); + })); + it('should verify results', function() { + assert.deepEqual( + lines, + [ + 'root before', + '1.1 before', + 'root before each', + '1 before each', + '1.1 before each', + '1.1 after each', + '1 after each', + 'root after each', + '1.1 after', + '1.2 before', + 'root before each', + '1 before each', + '1.2 before each', + '1.2 test 1', + '1.2 after each', + '1 after each', + 'root after each', + '1.2 after', + '1 after', + '2.1 before', + 'root before each', + '2 before each', + '2 after each', + 'root after each', + '2.1 after', + '2 after', + 'root after' + ] + ); }); - }) + }); + + function run(fn) { + return function(done) { + runMochaFunction(fn, [], function(err, res) { + assert.ifError(err); + + lines = res.output + .split(/[\n․]+/) + .map(function(line) { + return line.trim(); + }) + .filter(onlyConsoleOutput()); + + done(); + }); + }; + } +}); -}) +function onlyConsoleOutput() { + var foundSummary = false; + return function(line) { + if (!foundSummary) { + foundSummary = !!(/\(\d+ms\)/).exec(line); + } + return !foundSummary && line.length > 0; + }; +} From a81e5558f086808b682b6d196b80893d2c8926f8 Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Sat, 6 Jun 2015 14:46:25 -0700 Subject: [PATCH 0310/1771] Build using Browserify Signed-off-by: Joshua Appelman Closes #1193 --- Makefile | 25 +- lib/browser/escape-string-regexp.js | 21 - lib/browser/fs.js | 0 lib/browser/glob.js | 0 lib/browser/path.js | 0 lib/mocha.js | 13 +- lib/reporters/base.js | 6 +- lib/reporters/html.js | 2 +- lib/reporters/index.js | 36 +- lib/runner.js | 2 +- mocha.js | 12149 ++++++++++++++++++------ package.json | 11 +- support/{tail.js => browser-entry.js} | 45 +- support/compile.js | 143 - support/foot.js | 1 - support/head.js | 1 - 16 files changed, 9461 insertions(+), 2994 deletions(-) delete mode 100644 lib/browser/escape-string-regexp.js delete mode 100644 lib/browser/fs.js delete mode 100644 lib/browser/glob.js delete mode 100644 lib/browser/path.js rename support/{tail.js => browser-entry.js} (89%) delete mode 100644 support/compile.js delete mode 100644 support/foot.js delete mode 100644 support/head.js diff --git a/Makefile b/Makefile index 6c959c0464..656916c806 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ +BROWSERIFY := node_modules/.bin/browserify ESLINT := node_modules/.bin/eslint + REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle SRC = $(shell find lib -name "*.js" -type f | sort) @@ -6,20 +8,15 @@ SUPPORT = $(wildcard support/*.js) all: mocha.js -lib/browser/diff.js: node_modules/diff/diff.js - cp node_modules/diff/diff.js lib/browser/diff.js - -lib/browser/escape-string-regexp.js: node_modules/escape-string-regexp/index.js - cp node_modules/escape-string-regexp/index.js lib/browser/escape-string-regexp.js - -mocha.js: $(SRC) $(SUPPORT) lib/browser/diff.js lib/browser/escape-string-regexp.js - @node support/compile $(SRC) - @cat \ - support/head.js \ - _mocha.js \ - support/tail.js \ - support/foot.js \ - > mocha.js +# TODO: Remove filesize echos, just for comparison during browserify transition +mocha.js: $(SRC) $(SUPPORT) + @$(BROWSERIFY) ./support/browser-entry \ + --ignore 'fs' \ + --ignore 'glob' \ + --ignore 'jade' \ + --ignore 'path' \ + --ignore 'supports-color' \ + --exclude './lib-cov/mocha' > $@ clean: rm -f mocha.js diff --git a/lib/browser/escape-string-regexp.js b/lib/browser/escape-string-regexp.js deleted file mode 100644 index 02ea365619..0000000000 --- a/lib/browser/escape-string-regexp.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -/** - * Expose `escape`. - */ - -module.exports = escape; - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - -/** - * @param {string} str - * @return {string} - */ -function escape(str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - - return str.replace(matchOperatorsRe, '\\$&'); -} diff --git a/lib/browser/fs.js b/lib/browser/fs.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/browser/glob.js b/lib/browser/glob.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/browser/path.js b/lib/browser/path.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/mocha.js b/lib/mocha.js index 0d86f21132..1817ccf2c6 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -10,6 +10,7 @@ var escapeRe = require('escape-string-regexp'); var path = require('path'); +var reporters = require('./reporters'); var utils = require('./utils'); /** @@ -22,7 +23,7 @@ exports = module.exports = Mocha; * To require local UIs and reporters when running in node. */ -if (typeof process !== 'undefined' && typeof process.cwd === 'function') { +if (!process.browser) { var cwd = process.cwd(); module.paths.push(cwd, path.join(cwd, 'node_modules')); } @@ -33,7 +34,7 @@ if (typeof process !== 'undefined' && typeof process.cwd === 'function') { exports.utils = utils; exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); +exports.reporters = reporters; exports.Runnable = require('./runnable'); exports.Context = require('./context'); exports.Runner = require('./runner'); @@ -150,11 +151,11 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { } else { reporter = reporter || 'spec'; var _reporter; - try { - _reporter = require('./reporters/' + reporter); - } catch (err) { - // Ignore + // Try to load a built-in reporter. + if (reporters[reporter]) { + _reporter = reporters[reporter]; } + // Try to load reporters from process.cwd() and node_modules if (!_reporter) { try { _reporter = require(reporter); diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 3c57d01a0b..6bac3e04a4 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -6,7 +6,7 @@ var tty = require('tty'); var diff = require('diff'); var ms = require('../ms'); var utils = require('../utils'); -var supportsColor = process.env ? require('supports-color') : null; +var supportsColor = process.browser ? null : require('supports-color'); /** * Expose `Base`. @@ -37,9 +37,7 @@ var isatty = tty.isatty(1) && tty.isatty(2); * Enable coloring by default, except in the browser interface. */ -exports.useColors = process.env - ? (supportsColor || (process.env.MOCHA_COLORS !== undefined)) - : false; +exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined)); /** * Inline diffs instead of +/- diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 75fb97d52d..62643ecb3c 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -7,7 +7,7 @@ var Base = require('./base'); var utils = require('../utils'); var Progress = require('../browser/progress'); -var escapeRe = require('../browser/escape-string-regexp'); +var escapeRe = require('escape-string-regexp'); var escape = utils.escape; /** diff --git a/lib/reporters/index.js b/lib/reporters/index.js index 87b76d904f..51f5cffee1 100644 --- a/lib/reporters/index.js +++ b/lib/reporters/index.js @@ -1,17 +1,19 @@ -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Min = require('./min'); -exports.Spec = require('./spec'); -exports.Nyan = require('./nyan'); -exports.XUnit = require('./xunit'); -exports.Markdown = require('./markdown'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONCov = require('./json-cov'); -exports.HTMLCov = require('./html-cov'); -exports.JSONStream = require('./json-stream'); +// Alias exports to a their normalized format Mocha#reporter to prevent a need +// for dynamic (try/catch) requires, which Browserify doesn't handle. +exports.Base = exports.base = require('./base'); +exports.Dot = exports.dot = require('./dot'); +exports.Doc = exports.doc = require('./doc'); +exports.TAP = exports.tap = require('./tap'); +exports.JSON = exports.json = require('./json'); +exports.HTML = exports.html = require('./html'); +exports.List = exports.list = require('./list'); +exports.Min = exports.min = require('./min'); +exports.Spec = exports.spec = require('./spec'); +exports.Nyan = exports.nyan = require('./nyan'); +exports.XUnit = exports.xunit = require('./xunit'); +exports.Markdown = exports.markdown = require('./markdown'); +exports.Progress = exports.progress = require('./progress'); +exports.Landing = exports.landing = require('./landing'); +exports.JSONCov = exports['json-cov'] = require('./json-cov'); +exports.HTMLCov = exports['html-cov'] = require('./html-cov'); +exports.JSONStream = exports['json-stream'] = require('./json-stream'); diff --git a/lib/runner.js b/lib/runner.js index 18e941191a..f6a8fc2437 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -736,7 +736,7 @@ function filterLeaks(ok, globals) { * @return {Array} */ function extraGlobals() { - if (typeof process === 'object' && typeof process.version === 'string') { + if (!process.browser) { var nodeVersion = process.version.split('.').reduce(function(a, v) { return a << 8 | v; }); diff --git a/mocha.js b/mocha.js index 5ff1385758..0dba2dd347 100644 --- a/mocha.js +++ b/mocha.js @@ -1,891 +1,443 @@ -;(function(){ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o/g, '>'); - n = n.replace(/"/g, '"'); +EventEmitter.prototype.once = function(name, fn) { + var self = this; - return n; + function on() { + self.removeListener(name, on); + fn.apply(this, arguments); } - var Diff = function(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - }; - Diff.prototype = { - diff: function(oldString, newString) { - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString === oldString) { - return [{ value: newString }]; - } - if (!newString) { - return [{ value: oldString, removed: true }]; - } - if (!oldString) { - return [{ value: newString, added: true }]; - } + on.listener = fn; + this.on(name, on); + + return this; +}; - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); +/** + * Remove a listener. + * + * @api public + * @param {string} name Event name. + * @param {Function} fn Event handler. + * @return {EventEmitter} Emitter instance. + */ +EventEmitter.prototype.removeListener = function(name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; - var newLen = newString.length, oldLen = oldString.length; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; + if (isArray(list)) { + var pos = -1; - // Seed editLength = 0 - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { - return bestPath[0].components; + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; } + } - for (var editLength = 1; editLength <= maxEditLength; editLength++) { - for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { - var basePath; - var addPath = bestPath[diagonalPath-1], - removePath = bestPath[diagonalPath+1]; - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath-1] = undefined; - } + if (pos < 0) { + return this; + } - var canAdd = addPath && addPath.newPos+1 < newLen; - var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - bestPath[diagonalPath] = undefined; - continue; - } + list.splice(pos, 1); - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - this.pushComponent(basePath.components, oldString[oldPos], undefined, true); - } else { - basePath = clonePath(addPath); - basePath.newPos++; - this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); - } + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } - var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + return this; +}; - if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { - return basePath.components; - } else { - bestPath[diagonalPath] = basePath; - } - } - } - }, - - pushComponent: function(components, value, added, removed) { - var last = components[components.length-1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length-1] = - {value: this.join(last.value, value), added: added, removed: removed }; - } else { - components.push({value: value, added: added, removed: removed }); - } - }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath; - while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { - newPos++; - oldPos++; - - this.pushComponent(basePath.components, newString[newPos], undefined, undefined); - } - basePath.newPos = newPos; - return oldPos; - }, +/** + * Remove all listeners for an event. + * + * @api public + * @param {string} name Event name. + * @return {EventEmitter} Emitter instance. + */ +EventEmitter.prototype.removeAllListeners = function(name) { + if (name === undefined) { + this.$events = {}; + return this; + } - equals: function(left, right) { - var reWhitespace = /\S/; - if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { - return true; - } else { - return left === right; - } - }, - join: function(left, right) { - return left + right; - }, - tokenize: function(value) { - return value; - } - }; + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } - var CharDiff = new Diff(); + return this; +}; - var WordDiff = new Diff(true); - var WordWithSpaceDiff = new Diff(); - WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; +/** + * Get all listeners for a given event. + * + * @api public + * @param {string} name Event name. + * @return {EventEmitter} Emitter instance. + */ +EventEmitter.prototype.listeners = function(name) { + if (!this.$events) { + this.$events = {}; + } - var CssDiff = new Diff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; + if (!this.$events[name]) { + this.$events[name] = []; + } - var LineDiff = new Diff(); - LineDiff.tokenize = function(value) { - var retLines = [], - lines = value.split(/^/m); + if (!isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } - for(var i = 0; i < lines.length; i++) { - var line = lines[i], - lastLine = lines[i - 1]; + return this.$events[name]; +}; - // Merge lines that may contain windows new lines - if (line == '\n' && lastLine && lastLine[lastLine.length - 1] === '\r') { - retLines[retLines.length - 1] += '\n'; - } else if (line) { - retLines.push(line); - } - } +/** + * Emit an event. + * + * @api public + * @param {string} name Event name. + * @return {boolean} true if at least one handler was invoked, else false. + */ +EventEmitter.prototype.emit = function(name) { + if (!this.$events) { + return false; + } - return retLines; - }; + var handler = this.$events[name]; - return { - Diff: Diff, + if (!handler) { + return false; + } - diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, - diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, - diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); }, - diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + var args = Array.prototype.slice.call(arguments, 1); - diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + if (typeof handler === 'function') { + handler.apply(this, args); + } else if (isArray(handler)) { + var listeners = handler.slice(); - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } - ret.push('Index: ' + fileName); - ret.push('==================================================================='); - ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); - ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + return true; +}; - var diff = LineDiff.diff(oldStr, newStr); - if (!diff[diff.length-1].value) { - diff.pop(); // Remove trailing newline add - } - diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier +},{}],4:[function(require,module,exports){ +/** + * Expose `Progress`. + */ - function contextLines(lines) { - return lines.map(function(entry) { return ' ' + entry; }); - } - function eofNL(curRange, i, current) { - var last = diff[diff.length-2], - isLast = i === diff.length-2, - isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed); +module.exports = Progress; - // Figure out if this is the last line for the given file and missing NL - if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } +/** + * Initialize a new `Progress` indicator. + */ +function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); +} - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; +/** + * Set progress size to `size`. + * + * @api public + * @param {number} size + * @return {Progress} Progress instance. + */ +Progress.prototype.size = function(size) { + this._size = size; + return this; +}; - if (current.added || current.removed) { - if (!oldRangeStart) { - var prev = diff[i-1]; - oldRangeStart = oldLine; - newRangeStart = newLine; +/** + * Set text to `text`. + * + * @api public + * @param {string} text + * @return {Progress} Progress instance. + */ +Progress.prototype.text = function(text) { + this._text = text; + return this; +}; - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } - curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; })); - eofNL(curRange, i, current); - - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length-2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize) - + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize) - + ' @@'); - ret.push.apply(ret, curRange); - ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); - if (lines.length <= 4) { - eofNL(ret, i, current); - } - - oldRangeStart = 0; newRangeStart = 0; curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - } - - return ret.join('\n') + '\n'; - }, - - applyPatch: function(oldStr, uniDiff) { - var diffstr = uniDiff.split('\n'); - var diff = []; - var remEOFNL = false, - addEOFNL = false; - - for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) { - if(diffstr[i][0] === '@') { - var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); - diff.unshift({ - start:meh[3], - oldlength:meh[2], - oldlines:[], - newlength:meh[4], - newlines:[] - }); - } else if(diffstr[i][0] === '+') { - diff[0].newlines.push(diffstr[i].substr(1)); - } else if(diffstr[i][0] === '-') { - diff[0].oldlines.push(diffstr[i].substr(1)); - } else if(diffstr[i][0] === ' ') { - diff[0].newlines.push(diffstr[i].substr(1)); - diff[0].oldlines.push(diffstr[i].substr(1)); - } else if(diffstr[i][0] === '\\') { - if (diffstr[i-1][0] === '+') { - remEOFNL = true; - } else if(diffstr[i-1][0] === '-') { - addEOFNL = true; - } - } - } - - var str = oldStr.split('\n'); - for (var i = diff.length - 1; i >= 0; i--) { - var d = diff[i]; - for (var j = 0; j < d.oldlength; j++) { - if(str[d.start-1+j] !== d.oldlines[j]) { - return false; - } - } - Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines)); - } - - if (remEOFNL) { - while (!str[str.length-1]) { - str.pop(); - } - } else if (addEOFNL) { - str.push(''); - } - return str.join('\n'); - }, +/** + * Set font size to `size`. + * + * @api public + * @param {number} size + * @return {Progress} Progress instance. + */ +Progress.prototype.fontSize = function(size) { + this._fontSize = size; + return this; +}; - convertChangesToXML: function(changes){ - var ret = []; - for ( var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } +/** + * Set font to `family`. + * + * @param {string} family + * @return {Progress} Progress instance. + */ +Progress.prototype.font = function(family) { + this._font = family; + return this; +}; - ret.push(escapeHTML(change.value)); +/** + * Update percentage to `n`. + * + * @param {number} n + * @return {Progress} Progress instance. + */ +Progress.prototype.update = function(n) { + this.percent = n; + return this; +}; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } - } - return ret.join(''); - }, +/** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} Progress instance. + */ +Progress.prototype.draw = function(ctx) { + try { + var percent = Math.min(this.percent, 100); + var size = this._size; + var half = size / 2; + var x = half; + var y = half; + var rad = half - 1; + var fontSize = this._fontSize; - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - convertChangesToDMP: function(changes){ - var ret = [], change; - for ( var i = 0; i < changes.length; i++) { - change = changes[i]; - ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); - } - return ret; - } - }; -})(); + ctx.font = fontSize + 'px ' + this._font; -if (typeof module !== 'undefined') { - module.exports = JsDiff; -} + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); -}); // module: browser/diff.js + // outer circle + ctx.strokeStyle = '#9f9f9f'; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); -require.register("browser/escape-string-regexp.js", function(module, exports, require){ -'use strict'; + // inner circle + ctx.strokeStyle = '#eee'; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + // text + var text = this._text || (percent | 0) + '%'; + var w = ctx.measureText(text).width; -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); + ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); + } catch (err) { + // don't fail if we can't render progress } + return this; +}; - return str.replace(matchOperatorsRe, '\\$&'); +},{}],5:[function(require,module,exports){ +(function (global){ +exports.isatty = function isatty() { + return true; }; -}); // module: browser/escape-string-regexp.js +exports.getWindowSize = function getWindowSize() { + if ('innerHeight' in global) { + return [global.innerHeight, global.innerWidth]; + } + // In a Web Worker, the DOM Window is not available. + return [640, 480]; +}; -require.register("browser/events.js", function(module, exports, require){ +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],6:[function(require,module,exports){ /** - * Module exports. + * Expose `Context`. */ -exports.EventEmitter = EventEmitter; +module.exports = Context; /** - * Check if `obj` is an array. + * Initialize a new `Context`. + * + * @api private */ - -function isArray(obj) { - return '[object Array]' == {}.toString.call(obj); -} +function Context() {} /** - * Event emitter constructor. + * Set or get the context `Runnable` to `runnable`. * - * @api public + * @api private + * @param {Runnable} runnable + * @return {Context} */ - -function EventEmitter(){}; +Context.prototype.runnable = function(runnable) { + if (!arguments.length) { + return this._runnable; + } + this.test = this._runnable = runnable; + return this; +}; /** - * Adds a listener. + * Set test timeout `ms`. * - * @api public + * @api private + * @param {number} ms + * @return {Context} self */ - -EventEmitter.prototype.on = function (name, fn) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = fn; - } else if (isArray(this.$events[name])) { - this.$events[name].push(fn); - } else { - this.$events[name] = [this.$events[name], fn]; +Context.prototype.timeout = function(ms) { + if (!arguments.length) { + return this.runnable().timeout(); } - + this.runnable().timeout(ms); return this; }; -EventEmitter.prototype.addListener = EventEmitter.prototype.on; - /** - * Adds a volatile listener. + * Set test timeout `enabled`. * - * @api public + * @api private + * @param {boolean} enabled + * @return {Context} self */ - -EventEmitter.prototype.once = function (name, fn) { - var self = this; - - function on () { - self.removeListener(name, on); - fn.apply(this, arguments); - }; - - on.listener = fn; - this.on(name, on); - +Context.prototype.enableTimeouts = function(enabled) { + this.runnable().enableTimeouts(enabled); return this; }; /** - * Removes a listener. + * Set test slowness threshold `ms`. * - * @api public + * @api private + * @param {number} ms + * @return {Context} self */ - -EventEmitter.prototype.removeListener = function (name, fn) { - if (this.$events && this.$events[name]) { - var list = this.$events[name]; - - if (isArray(list)) { - var pos = -1; - - for (var i = 0, l = list.length; i < l; i++) { - if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { - pos = i; - break; - } - } - - if (pos < 0) { - return this; - } - - list.splice(pos, 1); - - if (!list.length) { - delete this.$events[name]; - } - } else if (list === fn || (list.listener && list.listener === fn)) { - delete this.$events[name]; - } - } - +Context.prototype.slow = function(ms) { + this.runnable().slow(ms); return this; }; /** - * Removes all listeners for an event. + * Mark a test as skipped. * - * @api public + * @api private + * @return {Context} self */ - -EventEmitter.prototype.removeAllListeners = function (name) { - if (name === undefined) { - this.$events = {}; - return this; - } - - if (this.$events && this.$events[name]) { - this.$events[name] = null; - } - +Context.prototype.skip = function() { + this.runnable().skip(); return this; }; /** - * Gets all listeners for a certain event. + * Inspect the context void of `._runnable`. * - * @api public + * @api private + * @return {string} */ - -EventEmitter.prototype.listeners = function (name) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = []; - } - - if (!isArray(this.$events[name])) { - this.$events[name] = [this.$events[name]]; - } - - return this.$events[name]; +Context.prototype.inspect = function() { + return JSON.stringify(this, function(key, val) { + return key === 'runnable' || key === 'test' ? undefined : val; + }, 2); }; +},{}],7:[function(require,module,exports){ /** - * Emits an event. - * - * @api public - */ - -EventEmitter.prototype.emit = function (name) { - if (!this.$events) { - return false; - } - - var handler = this.$events[name]; - - if (!handler) { - return false; - } - - var args = [].slice.call(arguments, 1); - - if ('function' == typeof handler) { - handler.apply(this, args); - } else if (isArray(handler)) { - var listeners = handler.slice(); - - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i].apply(this, args); - } - } else { - return false; - } - - return true; -}; - -}); // module: browser/events.js - -require.register("browser/fs.js", function(module, exports, require){ - -}); // module: browser/fs.js - -require.register("browser/glob.js", function(module, exports, require){ - -}); // module: browser/glob.js - -require.register("browser/path.js", function(module, exports, require){ - -}); // module: browser/path.js - -require.register("browser/progress.js", function(module, exports, require){ -/** - * Expose `Progress`. - */ - -module.exports = Progress; - -/** - * Initialize a new `Progress` indicator. - */ - -function Progress() { - this.percent = 0; - this.size(0); - this.fontSize(11); - this.font('helvetica, arial, sans-serif'); -} - -/** - * Set progress size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.size = function(n){ - this._size = n; - return this; -}; - -/** - * Set text to `str`. - * - * @param {String} str - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.text = function(str){ - this._text = str; - return this; -}; - -/** - * Set font size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.fontSize = function(n){ - this._fontSize = n; - return this; -}; - -/** - * Set font `family`. - * - * @param {String} family - * @return {Progress} for chaining - */ - -Progress.prototype.font = function(family){ - this._font = family; - return this; -}; - -/** - * Update percentage to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - */ - -Progress.prototype.update = function(n){ - this.percent = n; - return this; -}; - -/** - * Draw on `ctx`. - * - * @param {CanvasRenderingContext2d} ctx - * @return {Progress} for chaining - */ - -Progress.prototype.draw = function(ctx){ - try { - var percent = Math.min(this.percent, 100) - , size = this._size - , half = size / 2 - , x = half - , y = half - , rad = half - 1 - , fontSize = this._fontSize; - - ctx.font = fontSize + 'px ' + this._font; - - var angle = Math.PI * 2 * (percent / 100); - ctx.clearRect(0, 0, size, size); - - // outer circle - ctx.strokeStyle = '#9f9f9f'; - ctx.beginPath(); - ctx.arc(x, y, rad, 0, angle, false); - ctx.stroke(); - - // inner circle - ctx.strokeStyle = '#eee'; - ctx.beginPath(); - ctx.arc(x, y, rad - 1, 0, angle, true); - ctx.stroke(); - - // text - var text = this._text || (percent | 0) + '%' - , w = ctx.measureText(text).width; - - ctx.fillText( - text - , x - w / 2 + 1 - , y + fontSize / 2 - 1); - } catch (ex) {} //don't fail if we can't render progress - return this; -}; - -}); // module: browser/progress.js - -require.register("browser/tty.js", function(module, exports, require){ -exports.isatty = function(){ - return true; -}; - -exports.getWindowSize = function(){ - if ('innerHeight' in global) { - return [global.innerHeight, global.innerWidth]; - } else { - // In a Web Worker, the DOM Window is not available. - return [640, 480]; - } -}; - -}); // module: browser/tty.js - -require.register("context.js", function(module, exports, require){ -/** - * Expose `Context`. - */ - -module.exports = Context; - -/** - * Initialize a new `Context`. - * - * @api private - */ - -function Context(){} - -/** - * Set or get the context `Runnable` to `runnable`. - * - * @param {Runnable} runnable - * @return {Context} - * @api private - */ - -Context.prototype.runnable = function(runnable){ - if (0 == arguments.length) return this._runnable; - this.test = this._runnable = runnable; - return this; -}; - -/** - * Set test timeout `ms`. - * - * @param {Number} ms - * @return {Context} self - * @api private - */ - -Context.prototype.timeout = function(ms){ - if (arguments.length === 0) return this.runnable().timeout(); - this.runnable().timeout(ms); - return this; -}; - -/** - * Set test timeout `enabled`. - * - * @param {Boolean} enabled - * @return {Context} self - * @api private - */ - -Context.prototype.enableTimeouts = function (enabled) { - this.runnable().enableTimeouts(enabled); - return this; -}; - - -/** - * Set test slowness threshold `ms`. - * - * @param {Number} ms - * @return {Context} self - * @api private - */ - -Context.prototype.slow = function(ms){ - this.runnable().slow(ms); - return this; -}; - -/** - * Mark a test as skipped. - * - * @return {Context} self - * @api private - */ - -Context.prototype.skip = function(){ - this.runnable().skip(); - return this; -}; - -/** - * Inspect the context void of `._runnable`. - * - * @return {String} - * @api private - */ - -Context.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_runnable' == key) return; - if ('test' == key) return; - return val; - }, 2); -}; - -}); // module: context.js - -require.register("hook.js", function(module, exports, require){ -/** - * Module dependencies. + * Module dependencies. */ var Runnable = require('./runnable'); +var create = require('lodash.create'); /** * Expose `Hook`. @@ -900,7 +452,6 @@ module.exports = Hook; * @param {Function} fn * @api private */ - function Hook(title, fn) { Runnable.call(this, title, fn); this.type = 'hook'; @@ -910,11 +461,9 @@ function Hook(title, fn) { * Inherit from `Runnable.prototype`. */ -function F(){}; -F.prototype = Runnable.prototype; -Hook.prototype = new F; -Hook.prototype.constructor = Hook; - +Hook.prototype = create(Runnable.prototype, { + constructor: Hook +}); /** * Get or set the test `err`. @@ -923,10 +472,9 @@ Hook.prototype.constructor = Hook; * @return {Error} * @api public */ - -Hook.prototype.error = function(err){ - if (0 == arguments.length) { - var err = this._error; +Hook.prototype.error = function(err) { + if (!arguments.length) { + err = this._error; this._error = null; return err; } @@ -934,40 +482,36 @@ Hook.prototype.error = function(err){ this._error = err; }; -}); // module: hook.js - -require.register("interfaces/bdd.js", function(module, exports, require){ +},{"./runnable":35,"lodash.create":70}],8:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , utils = require('../utils') - , escapeRe = require('browser/escape-string-regexp'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * BDD-style interface: * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * + * describe('Array', function() { + * describe('#indexOf()', function() { + * it('should return -1 when not present', function() { + * // ... * }); * - * it('should return the index when present', function(){ - * + * it('should return the index when present', function() { + * // ... * }); * }); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.before = common.before; @@ -981,7 +525,7 @@ module.exports = function(suite){ * and/or tests. */ - context.describe = context.context = function(title, fn){ + context.describe = context.context = function(title, fn) { var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -994,9 +538,7 @@ module.exports = function(suite){ * Pending describe. */ - context.xdescribe = - context.xcontext = - context.describe.skip = function(title, fn){ + context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) { var suite = Suite.create(suites[0], title); suite.pending = true; suites.unshift(suite); @@ -1008,7 +550,7 @@ module.exports = function(suite){ * Exclusive suite. */ - context.describe.only = function(title, fn){ + context.describe.only = function(title, fn) { var suite = context.describe(title, fn); mocha.grep(suite.fullTitle()); return suite; @@ -1020,9 +562,11 @@ module.exports = function(suite){ * acting as a thunk. */ - context.it = context.specify = function(title, fn){ + context.it = context.specify = function(title, fn) { var suite = suites[0]; - if (suite.pending) fn = null; + if (suite.pending) { + fn = null; + } var test = new Test(title, fn); test.file = file; suite.addTest(test); @@ -1033,7 +577,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.it.only = function(title, fn){ + context.it.only = function(title, fn) { var test = context.it(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); @@ -1044,31 +588,30 @@ module.exports = function(suite){ * Pending test case. */ - context.xit = - context.xspecify = - context.it.skip = function(title){ + context.xit = context.xspecify = context.it.skip = function(title) { context.it(title); }; - }); }; -}); // module: interfaces/bdd.js +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],9:[function(require,module,exports){ +'use strict'; -require.register("interfaces/common.js", function(module, exports, require){ /** - * Functions common to more than one interface - * @module lib/interfaces/common + * Functions common to more than one interface. + * + * @param {Suite[]} suites + * @param {Context} context + * @return {Object} An object containing common functions. */ - -'use strict'; - -module.exports = function (suites, context) { - +module.exports = function(suites, context) { return { /** - * This is only present if flag --delay is passed into Mocha. It triggers - * root suite execution. Returns a function which runs the root suite. + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. + * + * @param {Suite} suite The root wuite. + * @return {Function} A function which runs the root suite */ runWithSuite: function runWithSuite(suite) { return function run() { @@ -1078,71 +621,83 @@ module.exports = function (suites, context) { /** * Execute before running tests. + * + * @param {string} name + * @param {Function} fn */ - before: function (name, fn) { + before: function(name, fn) { suites[0].beforeAll(name, fn); }, /** * Execute after running tests. + * + * @param {string} name + * @param {Function} fn */ - after: function (name, fn) { + after: function(name, fn) { suites[0].afterAll(name, fn); }, /** * Execute before each test case. + * + * @param {string} name + * @param {Function} fn */ - beforeEach: function (name, fn) { + beforeEach: function(name, fn) { suites[0].beforeEach(name, fn); }, /** * Execute after each test case. + * + * @param {string} name + * @param {Function} fn */ - afterEach: function (name, fn) { + afterEach: function(name, fn) { suites[0].afterEach(name, fn); }, test: { /** * Pending test case. + * + * @param {string} title */ - skip: function (title) { + skip: function(title) { context.test(title); } } - } + }; }; -}); // module: interfaces/common.js - -require.register("interfaces/exports.js", function(module, exports, require){ +},{}],10:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test'); +var Suite = require('../suite'); +var Test = require('../test'); /** * TDD-style interface: * * exports.Array = { * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ + * 'should return -1 when the value is not present': function() { * * }, * - * 'should return the correct index when the value is present': function(){ + * 'should return the correct index when the value is present': function() { * * } * } * }; * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; suite.on('require', visit); @@ -1150,7 +705,7 @@ module.exports = function(suite){ function visit(obj, file) { var suite; for (var key in obj) { - if ('function' == typeof obj[key]) { + if (typeof obj[key] === 'function') { var fn = obj[key]; switch (key) { case 'before': @@ -1180,37 +735,32 @@ module.exports = function(suite){ } }; -}); // module: interfaces/exports.js - -require.register("interfaces/index.js", function(module, exports, require){ +},{"../suite":37,"../test":38}],11:[function(require,module,exports){ exports.bdd = require('./bdd'); exports.tdd = require('./tdd'); exports.qunit = require('./qunit'); exports.exports = require('./exports'); -}); // module: interfaces/index.js - -require.register("interfaces/qunit.js", function(module, exports, require){ +},{"./bdd":8,"./exports":10,"./qunit":12,"./tdd":13}],12:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , escapeRe = require('browser/escape-string-regexp') - , utils = require('../utils'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * QUnit-style interface: * * suite('Array'); * - * test('#length', function(){ + * test('#length', function() { * var arr = [1,2,3]; * ok(arr.length == 3); * }); * - * test('#indexOf()', function(){ + * test('#indexOf()', function() { * var arr = [1,2,3]; * ok(arr.indexOf(1) == 0); * ok(arr.indexOf(2) == 1); @@ -1219,17 +769,16 @@ var Suite = require('../suite') * * suite('String'); * - * test('#length', function(){ + * test('#length', function() { * ok('foo'.length == 3); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.before = common.before; @@ -1241,8 +790,10 @@ module.exports = function(suite){ * Describe a "suite" with the given `title`. */ - context.suite = function(title){ - if (suites.length > 1) suites.shift(); + context.suite = function(title) { + if (suites.length > 1) { + suites.shift(); + } var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -1253,7 +804,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.suite.only = function(title, fn){ + context.suite.only = function(title, fn) { var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; @@ -1264,7 +815,7 @@ module.exports = function(suite){ * acting as a thunk. */ - context.test = function(title, fn){ + context.test = function(title, fn) { var test = new Test(title, fn); test.file = file; suites[0].addTest(test); @@ -1275,59 +826,54 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.test.only = function(title, fn){ + context.test.only = function(title, fn) { var test = context.test(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); }; context.test.skip = common.test.skip; - }); }; -}); // module: interfaces/qunit.js - -require.register("interfaces/tdd.js", function(module, exports, require){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],13:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite') - , Test = require('../test') - , escapeRe = require('browser/escape-string-regexp') - , utils = require('../utils'); +var Suite = require('../suite'); +var Test = require('../test'); +var escapeRe = require('escape-string-regexp'); /** * TDD-style interface: * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * suiteSetup(function(){ + * suite('Array', function() { + * suite('#indexOf()', function() { + * suiteSetup(function() { * * }); * - * test('should return -1 when not present', function(){ + * test('should return -1 when not present', function() { * * }); * - * test('should return the index when present', function(){ + * test('should return the index when present', function() { * * }); * - * suiteTeardown(function(){ + * suiteTeardown(function() { * * }); * }); * }); * + * @param {Suite} suite Root suite. */ - -module.exports = function(suite){ +module.exports = function(suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha){ - + suite.on('pre-require', function(context, file, mocha) { var common = require('./common')(suites, context); context.setup = common.beforeEach; @@ -1335,13 +881,12 @@ module.exports = function(suite){ context.suiteSetup = common.before; context.suiteTeardown = common.after; context.run = mocha.options.delay && common.runWithSuite(suite); + /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. + * Describe a "suite" with the given `title` and callback `fn` containing + * nested suites and/or tests. */ - - context.suite = function(title, fn){ + context.suite = function(title, fn) { var suite = Suite.create(suites[0], title); suite.file = file; suites.unshift(suite); @@ -1364,22 +909,21 @@ module.exports = function(suite){ /** * Exclusive test-case. */ - - context.suite.only = function(title, fn){ + context.suite.only = function(title, fn) { var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. + * Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. */ - - context.test = function(title, fn){ + context.test = function(title, fn) { var suite = suites[0]; - if (suite.pending) fn = null; - var test = new Test(title, fn); + if (suite.pending) { + fn = null; + } + var test = new Test(title, fn); test.file = file; suite.addTest(test); return test; @@ -1389,7 +933,7 @@ module.exports = function(suite){ * Exclusive test-case. */ - context.test.only = function(title, fn){ + context.test.only = function(title, fn) { var test = context.test(title, fn); var reString = '^' + escapeRe(test.fullTitle()) + '$'; mocha.grep(new RegExp(reString)); @@ -1399,9 +943,8 @@ module.exports = function(suite){ }); }; -}); // module: interfaces/tdd.js - -require.register("mocha.js", function(module, exports, require){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],14:[function(require,module,exports){ +(function (process,global,__dirname){ /*! * mocha * Copyright(c) 2011 TJ Holowaychuk @@ -1412,9 +955,10 @@ require.register("mocha.js", function(module, exports, require){ * Module dependencies. */ -var path = require('browser/path') - , escapeRe = require('browser/escape-string-regexp') - , utils = require('./utils'); +var escapeRe = require('escape-string-regexp'); +var path = require('path'); +var reporters = require('./reporters'); +var utils = require('./utils'); /** * Expose `Mocha`. @@ -1426,10 +970,9 @@ exports = module.exports = Mocha; * To require local UIs and reporters when running in node. */ -if (typeof process !== 'undefined' && typeof process.cwd === 'function') { - var join = path.join - , cwd = process.cwd(); - module.paths.push(cwd, join(cwd, 'node_modules')); +if (!process.browser) { + var cwd = process.cwd(); + module.paths.push(cwd, path.join(cwd, 'node_modules')); } /** @@ -1438,7 +981,7 @@ if (typeof process !== 'undefined' && typeof process.cwd === 'function') { exports.utils = utils; exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); +exports.reporters = reporters; exports.Runnable = require('./runnable'); exports.Context = require('./context'); exports.Runner = require('./runner'); @@ -1449,17 +992,16 @@ exports.Test = require('./test'); /** * Return image `name` path. * - * @param {String} name - * @return {String} * @api private + * @param {string} name + * @return {string} */ - function image(name) { - return __dirname + '/../images/' + name + '.png'; + return path.join(__dirname, '../images', name + '.png'); } /** - * Setup mocha with `options`. + * Set up mocha with `options`. * * Options: * @@ -1473,26 +1015,35 @@ function image(name) { * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * - * @param {Object} options * @api public + * @param {Object} options */ - function Mocha(options) { options = options || {}; this.files = []; this.options = options; - if (options.grep) this.grep(new RegExp(options.grep)); - if (options.fgrep) this.grep(options.fgrep); - this.suite = new exports.Suite('', new exports.Context); + if (options.grep) { + this.grep(new RegExp(options.grep)); + } + if (options.fgrep) { + this.grep(options.fgrep); + } + this.suite = new exports.Suite('', new exports.Context()); this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); - if (null != options.timeout) this.timeout(options.timeout); + if (options.timeout != null) { + this.timeout(options.timeout); + } this.useColors(options.useColors); - if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts); - if (options.slow) this.slow(options.slow); + if (options.enableTimeouts !== null) { + this.enableTimeouts(options.enableTimeouts); + } + if (options.slow) { + this.slow(options.slow); + } - this.suite.on('pre-require', function (context) { + this.suite.on('pre-require', function(context) { exports.afterEach = context.afterEach || context.teardown; exports.after = context.after || context.suiteTeardown; exports.beforeEach = context.beforeEach || context.setup; @@ -1512,12 +1063,13 @@ function Mocha(options) { /** * Enable or disable bailing on the first failure. * - * @param {Boolean} [bail] * @api public + * @param {boolean} [bail] */ - -Mocha.prototype.bail = function(bail){ - if (0 == arguments.length) bail = true; +Mocha.prototype.bail = function(bail) { + if (!arguments.length) { + bail = true; + } this.suite.bail(bail); return this; }; @@ -1525,11 +1077,10 @@ Mocha.prototype.bail = function(bail){ /** * Add test `file`. * - * @param {String} file * @api public + * @param {string} file */ - -Mocha.prototype.addFile = function(file){ +Mocha.prototype.addFile = function(file) { this.files.push(file); return this; }; @@ -1537,27 +1088,38 @@ Mocha.prototype.addFile = function(file){ /** * Set reporter to `reporter`, defaults to "spec". * - * @param {String|Function} reporter name or constructor - * @param {Object} reporterOptions optional options * @api public + * @param {string|Function} reporter name or constructor + * @param {Object} reporterOptions optional options */ -Mocha.prototype.reporter = function(reporter, reporterOptions){ - if ('function' == typeof reporter) { +Mocha.prototype.reporter = function(reporter, reporterOptions) { + if (typeof reporter === 'function') { this._reporter = reporter; } else { reporter = reporter || 'spec'; var _reporter; - try { _reporter = require('./reporters/' + reporter); } catch (err) {} - if (!_reporter) try { _reporter = require(reporter); } catch (err) { - err.message.indexOf('Cannot find module') !== -1 - ? console.warn('"' + reporter + '" reporter not found') - : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); - } - if (!_reporter && reporter === 'teamcity') - console.warn('The Teamcity reporter was moved to a package named ' + - 'mocha-teamcity-reporter ' + - '(https://npmjs.org/package/mocha-teamcity-reporter).'); - if (!_reporter) throw new Error('invalid reporter "' + reporter + '"'); + // Try to load a built-in reporter. + if (reporters[reporter]) { + _reporter = reporters[reporter]; + } + // Try to load reporters from process.cwd() and node_modules + if (!_reporter) { + try { + _reporter = require(reporter); + } catch (err) { + err.message.indexOf('Cannot find module') !== -1 + ? console.warn('"' + reporter + '" reporter not found') + : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); + } + } + if (!_reporter && reporter === 'teamcity') { + console.warn('The Teamcity reporter was moved to a package named ' + + 'mocha-teamcity-reporter ' + + '(https://npmjs.org/package/mocha-teamcity-reporter).'); + } + if (!_reporter) { + throw new Error('invalid reporter "' + reporter + '"'); + } this._reporter = _reporter; } this.options.reporterOptions = reporterOptions; @@ -1567,15 +1129,19 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){ /** * Set test UI `name`, defaults to "bdd". * - * @param {String} bdd * @api public + * @param {string} bdd */ - -Mocha.prototype.ui = function(name){ +Mocha.prototype.ui = function(name) { name = name || 'bdd'; this._ui = exports.interfaces[name]; - if (!this._ui) try { this._ui = require(name); } catch (err) {} - if (!this._ui) throw new Error('invalid interface "' + name + '"'); + if (!this._ui) { + try { + this._ui = require(name); + } catch (err) { + throw new Error('invalid interface "' + name + '"'); + } + } this._ui = this._ui(this.suite); return this; }; @@ -1585,12 +1151,11 @@ Mocha.prototype.ui = function(name){ * * @api private */ - -Mocha.prototype.loadFiles = function(fn){ +Mocha.prototype.loadFiles = function(fn) { var self = this; var suite = this.suite; var pending = this.files.length; - this.files.forEach(function(file){ + this.files.forEach(function(file) { file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); @@ -1604,20 +1169,19 @@ Mocha.prototype.loadFiles = function(fn){ * * @api private */ - Mocha.prototype._growl = function(runner, reporter) { var notify = require('growl'); - runner.on('end', function(){ + runner.on('end', function() { var stats = reporter.stats; if (stats.failures) { var msg = stats.failures + ' of ' + runner.total + ' tests failed'; notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); } else { notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { - name: 'mocha' - , title: 'Passed' - , image: image('ok') + name: 'mocha', + title: 'Passed', + image: image('ok') }); } }); @@ -1626,26 +1190,22 @@ Mocha.prototype._growl = function(runner, reporter) { /** * Add regexp to grep, if `re` is a string it is escaped. * - * @param {RegExp|String} re - * @return {Mocha} * @api public + * @param {RegExp|string} re + * @return {Mocha} */ - -Mocha.prototype.grep = function(re){ - this.options.grep = 'string' == typeof re - ? new RegExp(escapeRe(re)) - : re; +Mocha.prototype.grep = function(re) { + this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re; return this; }; /** * Invert `.grep()` matches. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.invert = function(){ +Mocha.prototype.invert = function() { this.options.invert = true; return this; }; @@ -1653,24 +1213,22 @@ Mocha.prototype.invert = function(){ /** * Ignore global leaks. * - * @param {Boolean} ignore - * @return {Mocha} * @api public + * @param {boolean} ignore + * @return {Mocha} */ - -Mocha.prototype.ignoreLeaks = function(ignore){ - this.options.ignoreLeaks = !!ignore; +Mocha.prototype.ignoreLeaks = function(ignore) { + this.options.ignoreLeaks = Boolean(ignore); return this; }; /** * Enable global leak checking. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.checkLeaks = function(){ +Mocha.prototype.checkLeaks = function() { this.options.ignoreLeaks = false; return this; }; @@ -1678,10 +1236,9 @@ Mocha.prototype.checkLeaks = function(){ /** * Display long stack-trace on failing * - * @return {Mocha} * @api public + * @return {Mocha} */ - Mocha.prototype.fullTrace = function() { this.options.fullStackTrace = true; return this; @@ -1690,11 +1247,10 @@ Mocha.prototype.fullTrace = function() { /** * Enable growl support. * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.growl = function(){ +Mocha.prototype.growl = function() { this.options.growl = true; return this; }; @@ -1702,12 +1258,11 @@ Mocha.prototype.growl = function(){ /** * Ignore `globals` array or string. * - * @param {Array|String} globals - * @return {Mocha} * @api public + * @param {Array|string} globals + * @return {Mocha} */ - -Mocha.prototype.globals = function(globals){ +Mocha.prototype.globals = function(globals) { this.options.globals = (this.options.globals || []).concat(globals); return this; }; @@ -1715,12 +1270,11 @@ Mocha.prototype.globals = function(globals){ /** * Emit color output. * - * @param {Boolean} colors - * @return {Mocha} * @api public + * @param {boolean} colors + * @return {Mocha} */ - -Mocha.prototype.useColors = function(colors){ +Mocha.prototype.useColors = function(colors) { if (colors !== undefined) { this.options.useColors = colors; } @@ -1730,27 +1284,23 @@ Mocha.prototype.useColors = function(colors){ /** * Use inline diffs rather than +/-. * - * @param {Boolean} inlineDiffs - * @return {Mocha} * @api public + * @param {boolean} inlineDiffs + * @return {Mocha} */ - Mocha.prototype.useInlineDiffs = function(inlineDiffs) { - this.options.useInlineDiffs = arguments.length && inlineDiffs != undefined - ? inlineDiffs - : false; + this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; /** * Set the timeout in milliseconds. * - * @param {Number} timeout - * @return {Mocha} * @api public + * @param {number} timeout + * @return {Mocha} */ - -Mocha.prototype.timeout = function(timeout){ +Mocha.prototype.timeout = function(timeout) { this.suite.timeout(timeout); return this; }; @@ -1758,12 +1308,11 @@ Mocha.prototype.timeout = function(timeout){ /** * Set slowness threshold in milliseconds. * - * @param {Number} slow - * @return {Mocha} * @api public + * @param {number} slow + * @return {Mocha} */ - -Mocha.prototype.slow = function(slow){ +Mocha.prototype.slow = function(slow) { this.suite.slow(slow); return this; }; @@ -1771,34 +1320,31 @@ Mocha.prototype.slow = function(slow){ /** * Enable timeouts. * - * @param {Boolean} enabled - * @return {Mocha} * @api public + * @param {boolean} enabled + * @return {Mocha} */ - Mocha.prototype.enableTimeouts = function(enabled) { - this.suite.enableTimeouts(arguments.length && enabled !== undefined - ? enabled - : true); - return this + this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true); + return this; }; /** * Makes all tests async (accepting a callback) * - * @return {Mocha} * @api public + * @return {Mocha} */ - -Mocha.prototype.asyncOnly = function(){ +Mocha.prototype.asyncOnly = function() { this.options.asyncOnly = true; return this; }; /** * Disable syntax highlighting (in browser). - * @returns {Mocha} + * * @api public + * @returns {Mocha} */ Mocha.prototype.noHighlighting = function() { this.options.noHighlighting = true; @@ -1807,8 +1353,9 @@ Mocha.prototype.noHighlighting = function() { /** * Delay root suite execution. - * @returns {Mocha} + * * @api public + * @returns {Mocha} */ Mocha.prototype.delay = function delay() { this.options.delay = true; @@ -1818,40 +1365,49 @@ Mocha.prototype.delay = function delay() { /** * Run tests and invoke `fn()` when complete. * + * @api public * @param {Function} fn * @return {Runner} - * @api public */ -Mocha.prototype.run = function(fn){ - if (this.files.length) this.loadFiles(); +Mocha.prototype.run = function(fn) { + if (this.files.length) { + this.loadFiles(); + } var suite = this.suite; var options = this.options; options.files = this.files; var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); - runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; - if (options.grep) runner.grep(options.grep, options.invert); - if (options.globals) runner.globals(options.globals); - if (options.growl) this._growl(runner, reporter); + if (options.grep) { + runner.grep(options.grep, options.invert); + } + if (options.globals) { + runner.globals(options.globals); + } + if (options.growl) { + this._growl(runner, reporter); + } if (options.useColors !== undefined) { exports.reporters.Base.useColors = options.useColors; } exports.reporters.Base.inlineDiffs = options.useInlineDiffs; function done(failures) { - if (reporter.done) { - reporter.done(failures, fn); - } else fn && fn(failures); + if (reporter.done) { + reporter.done(failures, fn); + } else { + fn && fn(failures); + } } return runner.run(done); }; -}); // module: mocha.js - -require.register("ms.js", function(module, exports, require){ +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":50,"escape-string-regexp":67,"growl":68,"path":41}],15:[function(require,module,exports){ /** * Helpers. */ @@ -1869,29 +1425,32 @@ var y = d * 365.25; * * - `long` verbose formatting [false] * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} * @api public + * @param {string|number} val + * @param {Object} options + * @return {string|number} */ - -module.exports = function(val, options){ +module.exports = function(val, options) { options = options || {}; - if ('string' == typeof val) return parse(val); + if (typeof val === 'string') { + return parse(val); + } + // https://github.com/mochajs/mocha/pull/1035 return options['long'] ? longFormat(val) : shortFormat(val); }; /** * Parse the given `str` and return milliseconds. * - * @param {String} str - * @return {Number} * @api private + * @param {string} str + * @return {number} */ - function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; + var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str); + if (!match) { + return; + } var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { @@ -1917,33 +1476,41 @@ function parse(str) { return n * s; case 'ms': return n; + default: + // No default case } } /** * Short format for `ms`. * - * @param {Number} ms - * @return {String} * @api private + * @param {number} ms + * @return {string} */ - function shortFormat(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } return ms + 'ms'; } /** * Long format for `ms`. * - * @param {Number} ms - * @return {String} * @api private + * @param {number} ms + * @return {string} */ - function longFormat(ms) { return plural(ms, d, 'day') || plural(ms, h, 'hour') @@ -1954,17 +1521,23 @@ function longFormat(ms) { /** * Pluralization helper. + * + * @api private + * @param {number} ms + * @param {number} n + * @param {string} name */ - function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } return Math.ceil(ms / n) + ' ' + name + 's'; } -}); // module: ms.js - -require.register("pending.js", function(module, exports, require){ +},{}],16:[function(require,module,exports){ /** * Expose `Pending`. @@ -1975,55 +1548,54 @@ module.exports = Pending; /** * Initialize a new `Pending` error with the given message. * - * @param {String} message + * @param {string} message */ - function Pending(message) { - this.message = message; + this.message = message; } -}); // module: pending.js - -require.register("reporters/base.js", function(module, exports, require){ +},{}],17:[function(require,module,exports){ +(function (process,global){ /** * Module dependencies. */ -var tty = require('browser/tty') - , diff = require('browser/diff') - , ms = require('../ms') - , utils = require('../utils') - , supportsColor = process.env ? require('supports-color') : null; +var tty = require('tty'); +var diff = require('diff'); +var ms = require('../ms'); +var utils = require('../utils'); +var supportsColor = process.browser ? null : require('supports-color'); /** - * Save timer references to avoid Sinon interfering (see GH-237). + * Expose `Base`. */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +exports = module.exports = Base; /** - * Check if both stdio streams are associated with a tty. + * Save timer references to avoid Sinon interfering. + * See: https://github.com/mochajs/mocha/issues/237 */ -var isatty = tty.isatty(1) && tty.isatty(2); +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** - * Expose `Base`. + * Check if both stdio streams are associated with a tty. */ -exports = module.exports = Base; +var isatty = tty.isatty(1) && tty.isatty(2); /** * Enable coloring by default, except in the browser interface. */ -exports.useColors = process.env - ? (supportsColor || (process.env.MOCHA_COLORS !== undefined)) - : false; +exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined)); /** * Inline diffs instead of +/- @@ -2036,25 +1608,25 @@ exports.inlineDiffs = false; */ exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'bright pass': 92 - , 'bright fail': 91 - , 'bright yellow': 93 - , 'pending': 36 - , 'suite': 0 - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 - , 'green': 32 - , 'light': 90 - , 'diff gutter': 90 - , 'diff added': 42 - , 'diff removed': 41 + pass: 90, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31 }; /** @@ -2068,7 +1640,7 @@ exports.symbols = { }; // With node.js on Windows: use symbols available in terminal default fonts -if ('win32' == process.platform) { +if (process.platform === 'win32') { exports.symbols.ok = '\u221A'; exports.symbols.err = '\u00D7'; exports.symbols.dot = '.'; @@ -2080,53 +1652,54 @@ if ('win32' == process.platform) { * as well as user-defined color * schemes. * - * @param {String} type - * @param {String} str - * @return {String} + * @param {string} type + * @param {string} str + * @return {string} * @api private */ - var color = exports.color = function(type, str) { - if (!exports.useColors) return String(str); + if (!exports.useColors) { + return String(str); + } return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; }; /** - * Expose term window size, with some - * defaults for when stderr is not a tty. + * Expose term window size, with some defaults for when stderr is not a tty. */ exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 + width: 75 }; +if (isatty) { + exports.window.width = process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1]; +} + /** - * Expose some basic cursor interactions - * that are common among reporters. + * Expose some basic cursor interactions that are common among reporters. */ exports.cursor = { - hide: function(){ + hide: function() { isatty && process.stdout.write('\u001b[?25l'); }, - show: function(){ + show: function() { isatty && process.stdout.write('\u001b[?25h'); }, - deleteLine: function(){ + deleteLine: function() { isatty && process.stdout.write('\u001b[2K'); }, - beginningOfLine: function(){ + beginningOfLine: function() { isatty && process.stdout.write('\u001b[0G'); }, - CR: function(){ + CR: function() { if (isatty) { exports.cursor.deleteLine(); exports.cursor.beginningOfLine(); @@ -2143,22 +1716,24 @@ exports.cursor = { * @api public */ -exports.list = function(failures){ +exports.list = function(failures) { console.log(); - failures.forEach(function(test, i){ + failures.forEach(function(test, i) { // format var fmt = color('error title', ' %s) %s:\n') + color('error message', ' %s') + color('error stack', '\n%s\n'); // msg - var err = test.err - , message = err.message || '' - , stack = err.stack || message - , index = stack.indexOf(message) - , actual = err.actual - , expected = err.expected - , escape = true; + var msg; + var err = test.err; + var message = err.message || ''; + var stack = err.stack || message; + var index = stack.indexOf(message); + var actual = err.actual; + var expected = err.expected; + var escape = true; + if (index === -1) { msg = message; } else { @@ -2173,11 +1748,9 @@ exports.list = function(failures){ msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff !== false && sameType(actual, expected) - && expected !== undefined) { - - if ('string' !== typeof actual) { - escape = false; + if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { + escape = false; + if (!(utils.isString(actual) && utils.isString(expected))) { err.actual = actual = utils.stringify(actual); err.expected = expected = utils.stringify(expected); } @@ -2213,55 +1786,57 @@ exports.list = function(failures){ */ function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } - , failures = this.failures = []; + var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; + var failures = this.failures = []; - if (!runner) return; + if (!runner) { + return; + } this.runner = runner; runner.stats = stats; - runner.on('start', function(){ - stats.start = new Date; + runner.on('start', function() { + stats.start = new Date(); }); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { stats.suites = stats.suites || 0; suite.root || stats.suites++; }); - runner.on('test end', function(test){ + runner.on('test end', function() { stats.tests = stats.tests || 0; stats.tests++; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { stats.passes = stats.passes || 0; - var medium = test.slow() / 2; - test.speed = test.duration > test.slow() - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; + if (test.duration > test.slow()) { + test.speed = 'slow'; + } else if (test.duration > test.slow() / 2) { + test.speed = 'medium'; + } else { + test.speed = 'fast'; + } stats.passes++; }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { stats.failures = stats.failures || 0; stats.failures++; test.err = err; failures.push(test); }); - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; + runner.on('end', function() { + stats.end = new Date(); + stats.duration = new Date() - stats.start; }); - runner.on('pending', function(){ + runner.on('pending', function() { stats.pending++; }); } @@ -2272,10 +1847,8 @@ function Base(runner) { * * @api public */ - -Base.prototype.epilogue = function(){ +Base.prototype.epilogue = function() { var stats = this.stats; - var tests; var fmt; console.log(); @@ -2313,26 +1886,24 @@ Base.prototype.epilogue = function(){ /** * Pad the given `str` to `len`. * - * @param {String} str - * @param {String} len - * @return {String} * @api private + * @param {string} str + * @param {string} len + * @return {string} */ - function pad(str, len) { str = String(str); return Array(len - str.length + 1).join(' ') + str; } - /** * Returns an inline diff between 2 strings with coloured ANSI output * - * @param {Error} Error with actual/expected - * @return {String} Diff * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} Diff */ - function inlineDiff(err, escape) { var msg = errorDiff(err, 'WordsWithSpace', escape); @@ -2340,7 +1911,7 @@ function inlineDiff(err, escape) { var lines = msg.split('\n'); if (lines.length > 4) { var width = String(lines.length).length; - msg = lines.map(function(str, i){ + msg = lines.map(function(str, i) { return pad(++i, width) + ' |' + ' ' + str; }).join('\n'); } @@ -2360,24 +1931,32 @@ function inlineDiff(err, escape) { } /** - * Returns a unified diff between 2 strings + * Returns a unified diff between two strings. * - * @param {Error} Error with actual/expected - * @return {String} Diff * @api private + * @param {Error} err with actual/expected + * @param {boolean} escape + * @return {string} The diff. */ - function unifiedDiff(err, escape) { var indent = ' '; function cleanUp(line) { if (escape) { line = escapeInvisibles(line); } - if (line[0] === '+') return indent + colorLines('diff added', line); - if (line[0] === '-') return indent + colorLines('diff removed', line); - if (line.match(/\@\@/)) return null; - if (line.match(/\\ No newline/)) return null; - else return indent + line; + if (line[0] === '+') { + return indent + colorLines('diff added', line); + } + if (line[0] === '-') { + return indent + colorLines('diff removed', line); + } + if (line.match(/\@\@/)) { + return null; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; } function notBlank(line) { return line != null; @@ -2385,26 +1964,31 @@ function unifiedDiff(err, escape) { var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); return '\n ' - + colorLines('diff added', '+ expected') + ' ' - + colorLines('diff removed', '- actual') - + '\n\n' - + lines.map(cleanUp).filter(notBlank).join('\n'); + + colorLines('diff added', '+ expected') + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n'); } /** * Return a character diff for `err`. * - * @param {Error} err - * @return {String} * @api private + * @param {Error} err + * @param {string} type + * @param {boolean} escape + * @return {string} */ - function errorDiff(err, type, escape) { - var actual = escape ? escapeInvisibles(err.actual) : err.actual; + var actual = escape ? escapeInvisibles(err.actual) : err.actual; var expected = escape ? escapeInvisibles(err.expected) : err.expected; - return diff['diff' + type](actual, expected).map(function(str){ - if (str.added) return colorLines('diff added', str.value); - if (str.removed) return colorLines('diff removed', str.value); + return diff['diff' + type](actual, expected).map(function(str) { + if (str.added) { + return colorLines('diff added', str.value); + } + if (str.removed) { + return colorLines('diff removed', str.value); + } return str.value; }).join(''); } @@ -2412,55 +1996,55 @@ function errorDiff(err, type, escape) { /** * Returns a string with all invisible characters in plain text * - * @param {String} line - * @return {String} * @api private + * @param {string} line + * @return {string} */ function escapeInvisibles(line) { - return line.replace(/\t/g, '') - .replace(/\r/g, '') - .replace(/\n/g, '\n'); + return line.replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); } /** * Color lines for `str`, using the color `name`. * - * @param {String} name - * @param {String} str - * @return {String} * @api private + * @param {string} name + * @param {string} str + * @return {string} */ - function colorLines(name, str) { - return str.split('\n').map(function(str){ + return str.split('\n').map(function(str) { return color(name, str); }).join('\n'); } +/** + * Object#toString reference. + */ +var objToString = Object.prototype.toString; + /** * Check that a / b have the same type. * + * @api private * @param {Object} a * @param {Object} b - * @return {Boolean} - * @api private + * @return {boolean} */ - function sameType(a, b) { - a = Object.prototype.toString.call(a); - b = Object.prototype.toString.call(b); - return a == b; + return objToString.call(a) === objToString.call(b); } -}); // module: reporters/base.js - -require.register("reporters/doc.js", function(module, exports, require){ +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../ms":15,"../utils":39,"_process":50,"diff":66,"supports-color":41,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils'); +var Base = require('./base'); +var utils = require('../utils'); /** * Expose `Doc`. @@ -2474,21 +2058,19 @@ exports = module.exports = Doc; * @param {Runner} runner * @api public */ - function Doc(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; + var indents = 2; function indent() { return Array(indents).join(' '); } - runner.on('suite', function(suite){ - if (suite.root) return; + runner.on('suite', function(suite) { + if (suite.root) { + return; + } ++indents; console.log('%s
          ', indent()); ++indents; @@ -2496,21 +2078,23 @@ function Doc(runner) { console.log('%s
          ', indent()); }); - runner.on('suite end', function(suite){ - if (suite.root) return; + runner.on('suite end', function(suite) { + if (suite.root) { + return; + } console.log('%s
          ', indent()); --indents; console.log('%s
          ', indent()); --indents; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { console.log('%s
          %s
          ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.fn.toString())); console.log('%s
          %s
          ', indent(), code); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { console.log('%s
          %s
          ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.fn.toString())); console.log('%s
          %s
          ', indent(), code); @@ -2518,15 +2102,15 @@ function Doc(runner) { }); } -}); // module: reporters/doc.js - -require.register("reporters/dot.js", function(module, exports, require){ +},{"../utils":39,"./base":17}],19:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , color = Base.color; +var Base = require('./base'); +var create = require('lodash.create'); +var color = Base.color; /** * Expose `Dot`. @@ -2537,42 +2121,46 @@ exports = module.exports = Dot; /** * Initialize a new `Dot` matrix test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Dot(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , n = -1; + var self = this; + var width = Base.window.width * .75 | 0; + var n = -1; - runner.on('start', function(){ + runner.on('start', function() { process.stdout.write('\n'); }); - runner.on('pending', function(test){ - if (++n % width == 0) process.stdout.write('\n '); + runner.on('pending', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } process.stdout.write(color('pending', Base.symbols.dot)); }); - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { + runner.on('pass', function(test) { + if (++n % width === 0) { + process.stdout.write('\n '); + } + if (test.speed === 'slow') { process.stdout.write(color('bright yellow', Base.symbols.dot)); } else { process.stdout.write(color(test.speed, Base.symbols.dot)); } }); - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); + runner.on('fail', function() { + if (++n % width === 0) { + process.stdout.write('\n '); + } process.stdout.write(color('fail', Base.symbols.dot)); }); - runner.on('end', function(){ + runner.on('end', function() { console.log(); self.epilogue(); }); @@ -2582,21 +2170,20 @@ function Dot(runner) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -Dot.prototype = new F; -Dot.prototype.constructor = Dot; - +Dot.prototype = create(Base.prototype, { + constructor: Dot +}); -}); // module: reporters/dot.js - -require.register("reporters/html-cov.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],20:[function(require,module,exports){ +(function (process,__dirname){ /** * Module dependencies. */ -var JSONCov = require('./json-cov') - , fs = require('browser/fs'); +var JSONCov = require('./json-cov'); +var readFileSync = require('fs').readFileSync; +var join = require('path').join; /** * Expose `HTMLCov`. @@ -2607,62 +2194,72 @@ exports = module.exports = HTMLCov; /** * Initialize a new `JsCoverage` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function HTMLCov(runner) { - var jade = require('jade') - , file = __dirname + '/templates/coverage.jade' - , str = fs.readFileSync(file, 'utf8') - , fn = jade.compile(str, { filename: file }) - , self = this; + var jade = require('jade'); + var file = join(__dirname, '/templates/coverage.jade'); + var fn = jade.compile(str, { filename: file }); + var self = this; + var str = readFileSync(file, 'utf8'); JSONCov.call(this, runner, false); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write(fn({ - cov: self.cov - , coverageClass: coverageClass + cov: self.cov, + coverageClass: coverageClass })); }); } /** - * Return coverage class for `n`. + * Return coverage class for a given coverage percentage. * - * @return {String} * @api private + * @param {number} coveragePctg + * @return {string} */ - -function coverageClass(n) { - if (n >= 75) return 'high'; - if (n >= 50) return 'medium'; - if (n >= 25) return 'low'; +function coverageClass(coveragePctg) { + if (coveragePctg >= 75) { + return 'high'; + } + if (coveragePctg >= 50) { + return 'medium'; + } + if (coveragePctg >= 25) { + return 'low'; + } return 'terrible'; } -}); // module: reporters/html-cov.js +}).call(this,require('_process'),"/lib/reporters") +},{"./json-cov":23,"_process":50,"fs":41,"jade":41,"path":41}],21:[function(require,module,exports){ +(function (global){ +/* eslint-env browser */ -require.register("reporters/html.js", function(module, exports, require){ /** * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils') - , Progress = require('../browser/progress') - , escape = utils.escape; +var Base = require('./base'); +var utils = require('../utils'); +var Progress = require('../browser/progress'); +var escapeRe = require('escape-string-regexp'); +var escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `HTML`. @@ -2676,37 +2273,35 @@ exports = module.exports = HTML; var statsTemplate = ''; /** * Initialize a new `HTML` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function HTML(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total - , stat = fragment(statsTemplate) - , items = stat.getElementsByTagName('li') - , passes = items[1].getElementsByTagName('em')[0] - , passesLink = items[1].getElementsByTagName('a')[0] - , failures = items[2].getElementsByTagName('em')[0] - , failuresLink = items[2].getElementsByTagName('a')[0] - , duration = items[3].getElementsByTagName('em')[0] - , canvas = stat.getElementsByTagName('canvas')[0] - , report = fragment('
            ') - , stack = [report] - , progress - , ctx - , root = document.getElementById('mocha'); + var self = this; + var stats = this.stats; + var stat = fragment(statsTemplate); + var items = stat.getElementsByTagName('li'); + var passes = items[1].getElementsByTagName('em')[0]; + var passesLink = items[1].getElementsByTagName('a')[0]; + var failures = items[2].getElementsByTagName('em')[0]; + var failuresLink = items[2].getElementsByTagName('a')[0]; + var duration = items[3].getElementsByTagName('em')[0]; + var canvas = stat.getElementsByTagName('canvas')[0]; + var report = fragment('
              '); + var stack = [report]; + var progress; + var ctx; + var root = document.getElementById('mocha'); if (canvas.getContext) { var ratio = window.devicePixelRatio || 1; @@ -2716,34 +2311,44 @@ function HTML(runner) { canvas.height *= ratio; ctx = canvas.getContext('2d'); ctx.scale(ratio, ratio); - progress = new Progress; + progress = new Progress(); } - if (!root) return error('#mocha div missing, add it to your document'); + if (!root) { + return error('#mocha div missing, add it to your document'); + } // pass toggle - on(passesLink, 'click', function(){ + on(passesLink, 'click', function() { unhide(); - var name = /pass/.test(report.className) ? '' : ' pass'; + var name = (/pass/).test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test pass'); + if (report.className.trim()) { + hideSuitesWithout('test pass'); + } }); // failure toggle - on(failuresLink, 'click', function(){ + on(failuresLink, 'click', function() { unhide(); - var name = /fail/.test(report.className) ? '' : ' fail'; + var name = (/fail/).test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test fail'); + if (report.className.trim()) { + hideSuitesWithout('test fail'); + } }); root.appendChild(stat); root.appendChild(report); - if (progress) progress.size(40); + if (progress) { + progress.size(40); + } - runner.on('suite', function(suite){ - if (suite.root) return; + runner.on('suite', function(suite) { + if (suite.root) { + return; + } // suite var url = self.suiteURL(suite); @@ -2755,51 +2360,71 @@ function HTML(runner) { el.appendChild(stack[0]); }); - runner.on('suite end', function(suite){ - if (suite.root) return; + runner.on('suite end', function(suite) { + if (suite.root) { + return; + } stack.shift(); }); - runner.on('fail', function(test, err){ - if ('hook' == test.type) runner.emit('test end', test); + runner.on('fail', function(test) { + if (test.type === 'hook') { + runner.emit('test end', test); + } }); - runner.on('test end', function(test){ + runner.on('test end', function(test) { // TODO: add to stats var percent = stats.tests / this.total * 100 | 0; - if (progress) progress.update(percent).draw(ctx); + if (progress) { + progress.update(percent).draw(ctx); + } // update stats - var ms = new Date - stats.start; + var ms = new Date() - stats.start; text(passes, stats.passes); text(failures, stats.failures); text(duration, (ms / 1000).toFixed(2)); // test - if ('passed' == test.state) { + var el; + if (test.state === 'passed') { var url = self.testURL(test); - var el = fragment('
            • %e%ems

            • ', test.speed, test.title, test.duration, url); + el = fragment('
            • %e%ems

            • ', test.speed, test.title, test.duration, url); } else if (test.pending) { - var el = fragment('
            • %e

            • ', test.title); + el = fragment('
            • %e

            • ', test.title); } else { - var el = fragment('
            • %e

            • ', test.title, self.testURL(test)); - var str = test.err.stack || test.err.toString(); - - // FF / Opera do not add the message - if (!~str.indexOf(test.err.message)) { - str = test.err.message + '\n' + str; - } + el = fragment('
            • %e

            • ', test.title, self.testURL(test)); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we // check for the result of the stringifying. - if ('[object Error]' == str) str = test.err.message; + if (message === '[object Error]') { + message = test.err.message; + } - // Safari doesn't give you a stack. Let's at least provide a source line. - if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { - str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; + } else { + stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); + } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; } - el.appendChild(fragment('
              %e
              ', str)); + stackString = stackString || ''; + + if (test.err.htmlMessage && stackString) { + el.appendChild(fragment('
              %s\n
              %e
              ', test.err.htmlMessage, stackString)); + } else if (test.err.htmlMessage) { + el.appendChild(fragment('
              %s
              ', test.err.htmlMessage)); + } else { + el.appendChild(fragment('
              %e%e
              ', message, stackString)); + } } // toggle code @@ -2807,10 +2432,8 @@ function HTML(runner) { if (!test.pending) { var h2 = el.getElementsByTagName('h2')[0]; - on(h2, 'click', function(){ - pre.style.display = 'none' == pre.style.display - ? 'block' - : 'none'; + on(h2, 'click', function() { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; }); var pre = fragment('
              %e
              ', utils.clean(test.fn.toString())); @@ -2819,16 +2442,19 @@ function HTML(runner) { } // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. - if (stack[0]) stack[0].appendChild(el); + if (stack[0]) { + stack[0].appendChild(el); + } }); } /** * Makes a URL, preserving querystring ("search") parameters. + * * @param {string} s - * @returns {string} your new URL + * @return {string} A new URL. */ -var makeUrl = function makeUrl(s) { +function makeUrl(s) { var search = window.location.search; // Remove previous grep query parameter if present @@ -2836,49 +2462,51 @@ var makeUrl = function makeUrl(s) { search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); } - return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s); -}; + return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s)); +} /** - * Provide suite URL + * Provide suite URL. * * @param {Object} [suite] */ -HTML.prototype.suiteURL = function(suite){ +HTML.prototype.suiteURL = function(suite) { return makeUrl(suite.fullTitle()); }; /** - * Provide test URL + * Provide test URL. * * @param {Object} [test] */ - -HTML.prototype.testURL = function(test){ +HTML.prototype.testURL = function(test) { return makeUrl(test.fullTitle()); }; /** * Display error `msg`. + * + * @param {string} msg */ - function error(msg) { document.body.appendChild(fragment('
              %s
              ', msg)); } /** * Return a DOM fragment from `html`. + * + * @param {string} html */ - function fragment(html) { - var args = arguments - , div = document.createElement('div') - , i = 1; + var args = arguments; + var div = document.createElement('div'); + var i = 1; - div.innerHTML = html.replace(/%([se])/g, function(_, type){ + div.innerHTML = html.replace(/%([se])/g, function(_, type) { switch (type) { case 's': return String(args[i++]); case 'e': return escape(args[i++]); + // no default } }); @@ -2888,20 +2516,22 @@ function fragment(html) { /** * Check for suites that do not have elements * with `classname`, and hide them. + * + * @param {text} classname */ - function hideSuitesWithout(classname) { var suites = document.getElementsByClassName('suite'); for (var i = 0; i < suites.length; i++) { var els = suites[i].getElementsByClassName(classname); - if (0 == els.length) suites[i].className += ' hidden'; + if (!els.length) { + suites[i].className += ' hidden'; + } } } /** * Unhide .hidden suites. */ - function unhide() { var els = document.getElementsByClassName('suite hidden'); for (var i = 0; i < els.length; ++i) { @@ -2910,21 +2540,22 @@ function unhide() { } /** - * Set `el` text to `str`. + * Set an element's text contents. + * + * @param {HTMLElement} el + * @param {string} contents */ - -function text(el, str) { +function text(el, contents) { if (el.textContent) { - el.textContent = str; + el.textContent = contents; } else { - el.innerText = str; + el.innerText = contents; } } /** * Listen on `event` with callback `fn`. */ - function on(el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); @@ -2933,30 +2564,30 @@ function on(el, event, fn) { } } -}); // module: reporters/html.js - -require.register("reporters/index.js", function(module, exports, require){ -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Min = require('./min'); -exports.Spec = require('./spec'); -exports.Nyan = require('./nyan'); -exports.XUnit = require('./xunit'); -exports.Markdown = require('./markdown'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONCov = require('./json-cov'); -exports.HTMLCov = require('./html-cov'); -exports.JSONStream = require('./json-stream'); - -}); // module: reporters/index.js - -require.register("reporters/json-cov.js", function(module, exports, require){ +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":67}],22:[function(require,module,exports){ +// Alias exports to a their normalized format Mocha#reporter to prevent a need +// for dynamic (try/catch) requires, which Browserify doesn't handle. +exports.Base = exports.base = require('./base'); +exports.Dot = exports.dot = require('./dot'); +exports.Doc = exports.doc = require('./doc'); +exports.TAP = exports.tap = require('./tap'); +exports.JSON = exports.json = require('./json'); +exports.HTML = exports.html = require('./html'); +exports.List = exports.list = require('./list'); +exports.Min = exports.min = require('./min'); +exports.Spec = exports.spec = require('./spec'); +exports.Nyan = exports.nyan = require('./nyan'); +exports.XUnit = exports.xunit = require('./xunit'); +exports.Markdown = exports.markdown = require('./markdown'); +exports.Progress = exports.progress = require('./progress'); +exports.Landing = exports.landing = require('./landing'); +exports.JSONCov = exports['json-cov'] = require('./json-cov'); +exports.HTMLCov = exports['html-cov'] = require('./html-cov'); +exports.JSONStream = exports['json-stream'] = require('./json-stream'); + +},{"./base":17,"./doc":18,"./dot":19,"./html":21,"./html-cov":20,"./json":25,"./json-cov":23,"./json-stream":24,"./landing":26,"./list":27,"./markdown":28,"./min":29,"./nyan":30,"./progress":31,"./spec":32,"./tap":33,"./xunit":34}],23:[function(require,module,exports){ +(function (process,global){ /** * Module dependencies. */ @@ -2972,42 +2603,42 @@ exports = module.exports = JSONCov; /** * Initialize a new `JsCoverage` reporter. * - * @param {Runner} runner - * @param {Boolean} output * @api public + * @param {Runner} runner + * @param {boolean} output */ - function JSONCov(runner, output) { - var self = this - , output = 1 == arguments.length ? true : output; - Base.call(this, runner); - var tests = [] - , failures = [] - , passes = []; + output = arguments.length === 1 || output; + var self = this; + var tests = []; + var failures = []; + var passes = []; - runner.on('test end', function(test){ + runner.on('test end', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { failures.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { var cov = global._$jscoverage || {}; var result = self.cov = map(cov); result.stats = self.stats; result.tests = tests.map(clean); result.failures = failures.map(clean); result.passes = passes.map(clean); - if (!output) return; - process.stdout.write(JSON.stringify(result, null, 2 )); + if (!output) { + return; + } + process.stdout.write(JSON.stringify(result, null, 2)); }); } @@ -3015,27 +2646,29 @@ function JSONCov(runner, output) { * Map jscoverage data to a JSON structure * suitable for reporting. * + * @api private * @param {Object} cov * @return {Object} - * @api private */ function map(cov) { var ret = { - instrumentation: 'node-jscoverage' - , sloc: 0 - , hits: 0 - , misses: 0 - , coverage: 0 - , files: [] + instrumentation: 'node-jscoverage', + sloc: 0, + hits: 0, + misses: 0, + coverage: 0, + files: [] }; for (var filename in cov) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; + if (Object.prototype.hasOwnProperty.call(cov, filename)) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } } ret.files.sort(function(a, b) { @@ -3053,12 +2686,11 @@ function map(cov) { * Map jscoverage data for a single source file * to a JSON structure suitable for reporting. * - * @param {String} filename name of the source file + * @api private + * @param {string} filename name of the source file * @param {Object} data jscoverage coverage data * @return {Object} - * @api private */ - function coverage(filename, data) { var ret = { filename: filename, @@ -3069,7 +2701,7 @@ function coverage(filename, data) { source: {} }; - data.source.forEach(function(line, num){ + data.source.forEach(function(line, num) { num++; if (data[num] === 0) { @@ -3081,10 +2713,8 @@ function coverage(filename, data) { } ret.source[num] = { - source: line - , coverage: data[num] === undefined - ? '' - : data[num] + source: line, + coverage: data[num] === undefined ? '' : data[num] }; }); @@ -3097,28 +2727,26 @@ function coverage(filename, data) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } + duration: test.duration, + fullTitle: test.fullTitle(), + title: test.title + }; } -}); // module: reporters/json-cov.js - -require.register("reporters/json-stream.js", function(module, exports, require){ +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./base":17,"_process":50}],24:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , color = Base.color; +var Base = require('./base'); /** * Expose `List`. @@ -3129,32 +2757,31 @@ exports = module.exports = List; /** * Initialize a new `List` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function List(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , total = runner.total; + var self = this; + var total = runner.total; - runner.on('start', function(){ + runner.on('start', function() { console.log(JSON.stringify(['start', { total: total }])); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { console.log(JSON.stringify(['pass', clean(test)])); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { test = clean(test); test.err = err.message; + test.stack = err.stack || null; console.log(JSON.stringify(['fail', test])); }); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write(JSON.stringify(['end', self.stats])); }); } @@ -3163,29 +2790,26 @@ function List(runner) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } + title: test.title, + fullTitle: test.fullTitle(), + duration: test.duration + }; } -}); // module: reporters/json-stream.js - -require.register("reporters/json.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50}],25:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); /** * Expose `JSON`. @@ -3196,36 +2820,35 @@ exports = module.exports = JSONReporter; /** * Initialize a new `JSON` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function JSONReporter(runner) { - var self = this; Base.call(this, runner); - var tests = [] - , pending = [] - , failures = [] - , passes = []; + var self = this; + var tests = []; + var pending = []; + var failures = []; + var passes = []; - runner.on('test end', function(test){ + runner.on('test end', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { failures.push(test); }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { pending.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { var obj = { stats: self.stats, tests: tests.map(clean), @@ -3244,26 +2867,26 @@ function JSONReporter(runner) { * Return a plain-object representation of `test` * free of cyclic properties etc. * + * @api private * @param {Object} test * @return {Object} - * @api private */ - function clean(test) { return { title: test.title, fullTitle: test.fullTitle(), duration: test.duration, err: errorJSON(test.err || {}) - } + }; } /** * Transform `error` into a JSON object. + * + * @api private * @param {Error} err * @return {Object} */ - function errorJSON(err) { var res = {}; Object.getOwnPropertyNames(err).forEach(function(key) { @@ -3272,16 +2895,17 @@ function errorJSON(err) { return res; } -}); // module: reporters/json.js - -require.register("reporters/landing.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50}],26:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var create = require('lodash.create'); +var cursor = Base.cursor; +var color = Base.color; /** * Expose `Landing`. @@ -3310,56 +2934,52 @@ Base.colors.runway = 90; /** * Initialize a new `Landing` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Landing(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; + var self = this; + var width = Base.window.width * .75 | 0; + var total = runner.total; + var stream = process.stdout; + var plane = color('plane', '✈'); + var crashed = -1; + var n = 0; function runway() { var buf = Array(width).join('-'); return ' ' + color('runway', buf); } - runner.on('start', function(){ + runner.on('start', function() { stream.write('\n\n\n '); cursor.hide(); }); - runner.on('test end', function(test){ + runner.on('test end', function(test) { // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; + var col = crashed === -1 ? width * ++n / total | 0 : crashed; // show the crash - if ('failed' == test.state) { + if (test.state === 'failed') { plane = color('plane crash', '✈'); crashed = col; } // render landing strip - stream.write('\u001b['+(width+1)+'D\u001b[2A'); + stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); stream.write(runway()); stream.write('\n '); stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) + stream.write(plane); stream.write(color('runway', Array(width - col).join('⋅') + '\n')); stream.write(runway()); stream.write('\u001b[0m'); }); - runner.on('end', function(){ + runner.on('end', function() { cursor.show(); console.log(); self.epilogue(); @@ -3370,22 +2990,21 @@ function Landing(runner) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -Landing.prototype = new F; -Landing.prototype.constructor = Landing; - +Landing.prototype = create(Base.prototype, { + constructor: Landing +}); -}); // module: reporters/landing.js - -require.register("reporters/list.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],27:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var create = require('lodash.create'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `List`. @@ -3396,40 +3015,38 @@ exports = module.exports = List; /** * Initialize a new `List` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function List(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , n = 0; + var self = this; + var n = 0; - runner.on('start', function(){ + runner.on('start', function() { console.log(); }); - runner.on('test', function(test){ + runner.on('test', function(test) { process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { var fmt = color('checkmark', ' -') + color('pending', ' %s'); console.log(fmt, test.fullTitle()); }); - runner.on('pass', function(test){ - var fmt = color('checkmark', ' '+Base.symbols.dot) + runner.on('pass', function(test) { + var fmt = color('checkmark', ' ' + Base.symbols.dot) + color('pass', ' %s: ') + color(test.speed, '%dms'); cursor.CR(); console.log(fmt, test.fullTitle(), test.duration); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test) { cursor.CR(); console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); }); @@ -3441,21 +3058,19 @@ function List(runner) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -List.prototype = new F; -List.prototype.constructor = List; +List.prototype = create(Base.prototype, { + constructor: List +}); - -}); // module: reporters/list.js - -require.register("reporters/markdown.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],28:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils'); +var Base = require('./base'); +var utils = require('../utils'); /** * Constants @@ -3472,33 +3087,28 @@ exports = module.exports = Markdown; /** * Initialize a new `Markdown` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Markdown(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , level = 0 - , buf = ''; + var level = 0; + var buf = ''; function title(str) { return Array(level).join('#') + ' ' + str; } - function indent() { - return Array(level).join(' '); - } - function mapTOC(suite, obj) { - var ret = obj, - key = SUITE_PREFIX + suite.title; + var ret = obj; + var key = SUITE_PREFIX + suite.title; + obj = obj[key] = obj[key] || { suite: suite }; - suite.suites.forEach(function(suite){ + suite.suites.forEach(function() { mapTOC(suite, obj); }); + return ret; } @@ -3507,7 +3117,9 @@ function Markdown(runner) { var buf = ''; var link; for (var key in obj) { - if ('suite' == key) continue; + if (key === 'suite') { + continue; + } if (key !== SUITE_PREFIX) { link = ' - [' + key.substring(1) + ']'; link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; @@ -3525,18 +3137,18 @@ function Markdown(runner) { generateTOC(runner.suite); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { ++level; var slug = utils.slug(suite.fullTitle()); buf += '' + '\n'; buf += title(suite.title) + '\n'; }); - runner.on('suite end', function(suite){ + runner.on('suite end', function() { --level; }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { var code = utils.clean(test.fn.toString()); buf += test.title + '.\n'; buf += '\n```js\n'; @@ -3544,21 +3156,22 @@ function Markdown(runner) { buf += '```\n\n'; }); - runner.on('end', function(){ + runner.on('end', function() { process.stdout.write('# TOC\n'); process.stdout.write(generateTOC(runner.suite)); process.stdout.write(buf); }); } -}); // module: reporters/markdown.js - -require.register("reporters/min.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"../utils":39,"./base":17,"_process":50}],29:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ var Base = require('./base'); +var create = require('lodash.create'); /** * Expose `Min`. @@ -3569,14 +3182,13 @@ exports = module.exports = Min; /** * Initialize a new `Min` minimal test reporter (best used with --watch). * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Min(runner) { Base.call(this, runner); - runner.on('start', function(){ + runner.on('start', function() { // clear screen process.stdout.write('\u001b[2J'); // set cursor position @@ -3590,20 +3202,19 @@ function Min(runner) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -Min.prototype = new F; -Min.prototype.constructor = Min; +Min.prototype = create(Base.prototype, { + constructor: Min +}); - -}); // module: reporters/min.js - -require.register("reporters/nyan.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],30:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ var Base = require('./base'); +var create = require('lodash.create'); /** * Expose `Dot`. @@ -3620,50 +3231,60 @@ exports = module.exports = NyanCat; function NyanCat(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , rainbowColors = this.rainbowColors = self.generateColors() - , colorIndex = this.colorIndex = 0 - , numerOfLines = this.numberOfLines = 4 - , trajectories = this.trajectories = [[], [], [], []] - , nyanCatWidth = this.nyanCatWidth = 11 - , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) - , scoreboardWidth = this.scoreboardWidth = 5 - , tick = this.tick = 0 - , n = 0; - - runner.on('start', function(){ + + var self = this; + var width = Base.window.width * .75 | 0; + var nyanCatWidth = this.nyanCatWidth = 11; + + this.colorIndex = 0; + this.numberOfLines = 4; + this.rainbowColors = self.generateColors(); + this.scoreboardWidth = 5; + this.tick = 0; + this.trajectories = [[], [], [], []]; + this.trajectoryWidthMax = (width - nyanCatWidth); + + runner.on('start', function() { Base.cursor.hide(); self.draw(); }); - runner.on('pending', function(test){ + runner.on('pending', function() { self.draw(); }); - runner.on('pass', function(test){ + runner.on('pass', function() { self.draw(); }); - runner.on('fail', function(test, err){ + runner.on('fail', function() { self.draw(); }); - runner.on('end', function(){ + runner.on('end', function() { Base.cursor.show(); - for (var i = 0; i < self.numberOfLines; i++) write('\n'); + for (var i = 0; i < self.numberOfLines; i++) { + write('\n'); + } self.epilogue(); }); } +/** + * Inherit from `Base.prototype`. + */ + +NyanCat.prototype = create(Base.prototype, { + constructor: NyanCat +}); + /** * Draw the nyan cat * * @api private */ -NyanCat.prototype.draw = function(){ +NyanCat.prototype.draw = function() { this.appendRainbow(); this.drawScoreboard(); this.drawRainbow(); @@ -3678,7 +3299,7 @@ NyanCat.prototype.draw = function(){ * @api private */ -NyanCat.prototype.drawScoreboard = function(){ +NyanCat.prototype.drawScoreboard = function() { var stats = this.stats; function draw(type, n) { @@ -3701,13 +3322,15 @@ NyanCat.prototype.drawScoreboard = function(){ * @api private */ -NyanCat.prototype.appendRainbow = function(){ +NyanCat.prototype.appendRainbow = function() { var segment = this.tick ? '_' : '-'; var rainbowified = this.rainbowify(segment); for (var index = 0; index < this.numberOfLines; index++) { var trajectory = this.trajectories[index]; - if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + if (trajectory.length >= this.trajectoryWidthMax) { + trajectory.shift(); + } trajectory.push(rainbowified); } }; @@ -3718,10 +3341,10 @@ NyanCat.prototype.appendRainbow = function(){ * @api private */ -NyanCat.prototype.drawRainbow = function(){ +NyanCat.prototype.drawRainbow = function() { var self = this; - this.trajectories.forEach(function(line, index) { + this.trajectories.forEach(function(line) { write('\u001b[' + self.scoreboardWidth + 'C'); write(line.join('')); write('\n'); @@ -3735,7 +3358,6 @@ NyanCat.prototype.drawRainbow = function(){ * * @api private */ - NyanCat.prototype.drawNyanCat = function() { var self = this; var startWidth = this.scoreboardWidth + this.trajectories[0].length; @@ -3754,7 +3376,6 @@ NyanCat.prototype.drawNyanCat = function() { write(dist); padding = self.tick ? '_' : '__'; var tail = self.tick ? '~' : '^'; - var face; write(tail + '|' + padding + this.face() + ' '); write('\n'); @@ -3769,8 +3390,8 @@ NyanCat.prototype.drawNyanCat = function() { /** * Draw nyan cat face. * - * @return {String} * @api private + * @return {string} */ NyanCat.prototype.face = function() { @@ -3779,18 +3400,17 @@ NyanCat.prototype.face = function() { return '( x .x)'; } else if (stats.pending) { return '( o .o)'; - } else if(stats.passes) { + } else if (stats.passes) { return '( ^ .^)'; - } else { - return '( - .-)'; } + return '( - .-)'; }; /** * Move cursor up `n`. * - * @param {Number} n * @api private + * @param {number} n */ NyanCat.prototype.cursorUp = function(n) { @@ -3800,8 +3420,8 @@ NyanCat.prototype.cursorUp = function(n) { /** * Move cursor down `n`. * - * @param {Number} n * @api private + * @param {number} n */ NyanCat.prototype.cursorDown = function(n) { @@ -3811,11 +3431,10 @@ NyanCat.prototype.cursorDown = function(n) { /** * Generate rainbow colors. * - * @return {Array} * @api private + * @return {Array} */ - -NyanCat.prototype.generateColors = function(){ +NyanCat.prototype.generateColors = function() { var colors = []; for (var i = 0; i < (6 * 7); i++) { @@ -3833,14 +3452,14 @@ NyanCat.prototype.generateColors = function(){ /** * Apply rainbow to the given `str`. * - * @param {String} str - * @return {String} * @api private + * @param {string} str + * @return {string} */ - -NyanCat.prototype.rainbowify = function(str){ - if (!Base.useColors) +NyanCat.prototype.rainbowify = function(str) { + if (!Base.useColors) { return str; + } var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; this.colorIndex += 1; return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; @@ -3848,32 +3467,24 @@ NyanCat.prototype.rainbowify = function(str){ /** * Stdout helper. + * + * @param {string} string A message to write to stdout. */ - function write(string) { process.stdout.write(string); } -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -NyanCat.prototype = new F; -NyanCat.prototype.constructor = NyanCat; - - -}); // module: reporters/nyan.js - -require.register("reporters/progress.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],31:[function(require,module,exports){ +(function (process){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var create = require('lodash.create'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `Progress`. @@ -3890,24 +3501,21 @@ Base.colors.progress = 90; /** * Initialize a new `Progress` bar test reporter. * + * @api public * @param {Runner} runner * @param {Object} options - * @api public */ - function Progress(runner, options) { Base.call(this, runner); - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max - , lastN = -1; + var self = this; + var width = Base.window.width * .50 | 0; + var total = runner.total; + var complete = 0; + var lastN = -1; // default chars + options = options || {}; options.open = options.open || '['; options.complete = options.complete || '▬'; options.incomplete = options.incomplete || Base.symbols.dot; @@ -3915,20 +3523,20 @@ function Progress(runner, options) { options.verbose = false; // tests started - runner.on('start', function(){ + runner.on('start', function() { console.log(); cursor.hide(); }); // tests complete - runner.on('test end', function(){ + runner.on('test end', function() { complete++; - var incomplete = total - complete - , percent = complete / total - , n = width * percent | 0 - , i = width - n; - if (lastN === n && !options.verbose) { + var percent = complete / total; + var n = width * percent | 0; + var i = width - n; + + if (n === lastN && !options.verbose) { // Don't re-render the line if it hasn't changed return; } @@ -3947,7 +3555,7 @@ function Progress(runner, options) { // tests are complete, output some stats // and the failures if any - runner.on('end', function(){ + runner.on('end', function() { cursor.show(); console.log(); self.epilogue(); @@ -3958,22 +3566,20 @@ function Progress(runner, options) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -Progress.prototype = new F; -Progress.prototype.constructor = Progress; - +Progress.prototype = create(Base.prototype, { + constructor: Progress +}); -}); // module: reporters/progress.js - -require.register("reporters/spec.js", function(module, exports, require){ +}).call(this,require('_process')) +},{"./base":17,"_process":50,"lodash.create":70}],32:[function(require,module,exports){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); +var create = require('lodash.create'); +var color = Base.color; +var cursor = Base.cursor; /** * Expose `Spec`. @@ -3984,50 +3590,51 @@ exports = module.exports = Spec; /** * Initialize a new `Spec` test reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function Spec(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , indents = 0 - , n = 0; + var self = this; + var indents = 0; + var n = 0; function indent() { - return Array(indents).join(' ') + return Array(indents).join(' '); } - runner.on('start', function(){ + runner.on('start', function() { console.log(); }); - runner.on('suite', function(suite){ + runner.on('suite', function(suite) { ++indents; console.log(color('suite', '%s%s'), indent(), suite.title); }); - runner.on('suite end', function(suite){ + runner.on('suite end', function() { --indents; - if (1 == indents) console.log(); + if (indents === 1) { + console.log(); + } }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { var fmt = indent() + color('pending', ' - %s'); console.log(fmt, test.title); }); - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() + runner.on('pass', function(test) { + var fmt; + if (test.speed === 'fast') { + fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); cursor.CR(); console.log(fmt, test.title); } else { - var fmt = indent() + fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); @@ -4036,7 +3643,7 @@ function Spec(runner) { } }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test) { cursor.CR(); console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); @@ -4048,22 +3655,16 @@ function Spec(runner) { * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -Spec.prototype = new F; -Spec.prototype.constructor = Spec; +Spec.prototype = create(Base.prototype, { + constructor: Spec +}); - -}); // module: reporters/spec.js - -require.register("reporters/tap.js", function(module, exports, require){ +},{"./base":17,"lodash.create":70}],33:[function(require,module,exports){ /** * Module dependencies. */ -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; +var Base = require('./base'); /** * Expose `TAP`. @@ -4074,44 +3675,43 @@ exports = module.exports = TAP; /** * Initialize a new `TAP` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function TAP(runner) { Base.call(this, runner); - var self = this - , stats = this.stats - , n = 1 - , passes = 0 - , failures = 0; + var n = 1; + var passes = 0; + var failures = 0; - runner.on('start', function(){ + runner.on('start', function() { var total = runner.grepTotal(runner.suite); console.log('%d..%d', 1, total); }); - runner.on('test end', function(){ + runner.on('test end', function() { ++n; }); - runner.on('pending', function(test){ + runner.on('pending', function(test) { console.log('ok %d %s # SKIP -', n, title(test)); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { passes++; console.log('ok %d %s', n, title(test)); }); - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { failures++; console.log('not ok %d %s', n, title(test)); - if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + if (err.stack) { + console.log(err.stack.replace(/^/gm, ' ')); + } }); - runner.on('end', function(){ + runner.on('end', function() { console.log('# tests ' + (passes + failures)); console.log('# pass ' + passes); console.log('# fail ' + failures); @@ -4121,36 +3721,36 @@ function TAP(runner) { /** * Return a TAP-safe title of `test` * + * @api private * @param {Object} test * @return {String} - * @api private */ - function title(test) { return test.fullTitle().replace(/#/g, ''); } -}); // module: reporters/tap.js - -require.register("reporters/xunit.js", function(module, exports, require){ +},{"./base":17}],34:[function(require,module,exports){ +(function (global){ /** * Module dependencies. */ -var Base = require('./base') - , utils = require('../utils') - , fs = require('browser/fs') - , escape = utils.escape; +var Base = require('./base'); +var create = require('lodash.create'); +var fs = require('fs'); +var escape = require('../utils').escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `XUnit`. @@ -4161,121 +3761,137 @@ exports = module.exports = XUnit; /** * Initialize a new `XUnit` reporter. * - * @param {Runner} runner * @api public + * @param {Runner} runner */ - function XUnit(runner, options) { Base.call(this, runner); - var stats = this.stats - , tests = [] - , self = this; + + var stats = this.stats; + var tests = []; + var self = this; if (options.reporterOptions && options.reporterOptions.output) { - if (! fs.createWriteStream) { - throw new Error('file output not supported in browser'); - } - self.fileStream = fs.createWriteStream(options.reporterOptions.output); + if (!fs.createWriteStream) { + throw new Error('file output not supported in browser'); + } + self.fileStream = fs.createWriteStream(options.reporterOptions.output); } - runner.on('pending', function(test){ + runner.on('pending', function(test) { tests.push(test); }); - runner.on('pass', function(test){ + runner.on('pass', function(test) { tests.push(test); }); - runner.on('fail', function(test){ + runner.on('fail', function(test) { tests.push(test); }); - runner.on('end', function(){ + runner.on('end', function() { self.write(tag('testsuite', { - name: 'Mocha Tests' - , tests: stats.tests - , failures: stats.failures - , errors: stats.failures - , skipped: stats.tests - stats.failures - stats.passes - , timestamp: (new Date).toUTCString() - , time: (stats.duration / 1000) || 0 + name: 'Mocha Tests', + tests: stats.tests, + failures: stats.failures, + errors: stats.failures, + skipped: stats.tests - stats.failures - stats.passes, + timestamp: (new Date()).toUTCString(), + time: (stats.duration / 1000) || 0 }, false)); - tests.forEach(function(t) { self.test(t); }); + tests.forEach(function(t) { + self.test(t); + }); + self.write(''); }); } /** * Override done to close the stream (if it's a file). + * + * @param failures + * @param {Function} fn */ XUnit.prototype.done = function(failures, fn) { - if (this.fileStream) { - this.fileStream.end(function() { - fn(failures); - }); - } else { - fn(failures); - } + if (this.fileStream) { + this.fileStream.end(function() { + fn(failures); + }); + } else { + fn(failures); + } }; /** * Inherit from `Base.prototype`. */ -function F(){}; -F.prototype = Base.prototype; -XUnit.prototype = new F; -XUnit.prototype.constructor = XUnit; - +XUnit.prototype = create(Base.prototype, { + constructor: XUnit +}); /** - * Write out the given line + * Write out the given line. + * + * @param {string} line */ XUnit.prototype.write = function(line) { - if (this.fileStream) { - this.fileStream.write(line + '\n'); - } else { - console.log(line); - } + if (this.fileStream) { + this.fileStream.write(line + '\n'); + } else { + console.log(line); + } }; /** * Output tag for the given `test.` + * + * @param {Test} test */ - -XUnit.prototype.test = function(test, ostream) { +XUnit.prototype.test = function(test) { var attrs = { - classname: test.parent.fullTitle() - , name: test.title - , time: (test.duration / 1000) || 0 + classname: test.parent.fullTitle(), + name: test.title, + time: (test.duration / 1000) || 0 }; - if ('failed' == test.state) { + if (test.state === 'failed') { var err = test.err; - this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + "\n" + err.stack)))); + this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\n' + err.stack)))); } else if (test.pending) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { - this.write(tag('testcase', attrs, true) ); + this.write(tag('testcase', attrs, true)); } }; /** * HTML tag helper. + * + * @param name + * @param attrs + * @param close + * @param content + * @return {string} */ - function tag(name, attrs, close, content) { - var end = close ? '/>' : '>' - , pairs = [] - , tag; + var end = close ? '/>' : '>'; + var pairs = []; + var tag; for (var key in attrs) { - pairs.push(key + '="' + escape(attrs[key]) + '"'); + if (Object.prototype.hasOwnProperty.call(attrs, key)) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } } tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; - if (content) tag += content + ''; } -}); // module: reporters/xunit.js - -require.register("runnable.js", function(module, exports, require){ +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../utils":39,"./base":17,"fs":41,"lodash.create":70}],35:[function(require,module,exports){ +(function (global){ /** * Module dependencies. */ -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:runnable') - , Pending = require('./pending') - , milliseconds = require('./ms') - , utils = require('./utils'); +var EventEmitter = require('events').EventEmitter; +var Pending = require('./pending'); +var create = require('lodash.create'); +var debug = require('debug')('mocha:runnable'); +var milliseconds = require('./ms'); +var utils = require('./utils'); /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +/* eslint-disable no-unused-vars, no-native-reassign */ +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; +/* eslint-enable no-unused-vars, no-native-reassign */ /** * Object#toString(). @@ -4325,77 +3944,85 @@ module.exports = Runnable; /** * Initialize a new `Runnable` with the given `title` and callback `fn`. * - * @param {String} title - * @param {Function} fn * @api private + * @param {string} title + * @param {Function} fn */ - function Runnable(title, fn) { this.title = title; this.fn = fn; this.async = fn && fn.length; - this.sync = ! this.async; + this.sync = !this.async; this._timeout = 2000; this._slow = 75; this._enableTimeouts = true; this.timedOut = false; - this._trace = new Error('done() called multiple times') + this._trace = new Error('done() called multiple times'); } /** * Inherit from `EventEmitter.prototype`. */ -function F(){}; -F.prototype = EventEmitter.prototype; -Runnable.prototype = new F; -Runnable.prototype.constructor = Runnable; - +Runnable.prototype = create(EventEmitter.prototype, { + constructor: Runnable +}); /** * Set & get timeout `ms`. * - * @param {Number|String} ms - * @return {Runnable|Number} ms or self * @api private + * @param {number|string} ms + * @return {Runnable|number} ms or Runnable instance. */ - -Runnable.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if (ms === 0) this._enableTimeouts = false; - if ('string' == typeof ms) ms = milliseconds(ms); +Runnable.prototype.timeout = function(ms) { + if (!arguments.length) { + return this._timeout; + } + if (ms === 0) { + this._enableTimeouts = false; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('timeout %d', ms); this._timeout = ms; - if (this.timer) this.resetTimeout(); + if (this.timer) { + this.resetTimeout(); + } return this; }; /** * Set & get slow `ms`. * - * @param {Number|String} ms - * @return {Runnable|Number} ms or self * @api private + * @param {number|string} ms + * @return {Runnable|number} ms or Runnable instance. */ - -Runnable.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); +Runnable.prototype.slow = function(ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('timeout %d', ms); this._slow = ms; return this; }; /** - * Set and & get timeout `enabled`. + * Set and get whether timeout is `enabled`. * - * @param {Boolean} enabled - * @return {Runnable|Boolean} enabled or self * @api private + * @param {boolean} enabled + * @return {Runnable|boolean} enabled or Runnable instance. */ - -Runnable.prototype.enableTimeouts = function(enabled){ - if (arguments.length === 0) return this._enableTimeouts; +Runnable.prototype.enableTimeouts = function(enabled) { + if (!arguments.length) { + return this._enableTimeouts; + } debug('enableTimeouts %s', enabled); this._enableTimeouts = enabled; return this; @@ -4406,20 +4033,18 @@ Runnable.prototype.enableTimeouts = function(enabled){ * * @api private */ - -Runnable.prototype.skip = function(){ - throw new Pending(); +Runnable.prototype.skip = function() { + throw new Pending(); }; /** - * Return the full title generated by recursively - * concatenating the parent's full title. + * Return the full title generated by recursively concatenating the parent's + * full title. * - * @return {String} * @api public + * @return {string} */ - -Runnable.prototype.fullTitle = function(){ +Runnable.prototype.fullTitle = function() { return this.parent.fullTitle() + ' ' + this.title; }; @@ -4428,23 +4053,27 @@ Runnable.prototype.fullTitle = function(){ * * @api private */ - -Runnable.prototype.clearTimeout = function(){ +Runnable.prototype.clearTimeout = function() { clearTimeout(this.timer); }; /** * Inspect the runnable void of private properties. * - * @return {String} * @api private + * @return {string} */ - -Runnable.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_' == key[0]) return; - if ('parent' == key) return '#'; - if ('ctx' == key) return '#'; +Runnable.prototype.inspect = function() { + return JSON.stringify(this, function(key, val) { + if (key[0] === '_') { + return; + } + if (key === 'parent') { + return '#'; + } + if (key === 'ctx') { + return '#'; + } return val; }, 2); }; @@ -4454,50 +4083,56 @@ Runnable.prototype.inspect = function(){ * * @api private */ - -Runnable.prototype.resetTimeout = function(){ +Runnable.prototype.resetTimeout = function() { var self = this; var ms = this.timeout() || 1e9; - if (!this._enableTimeouts) return; + if (!this._enableTimeouts) { + return; + } this.clearTimeout(); - this.timer = setTimeout(function(){ - if (!self._enableTimeouts) return; + this.timer = setTimeout(function() { + if (!self._enableTimeouts) { + return; + } self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.')); self.timedOut = true; }, ms); }; /** - * Whitelist these globals for this test run + * Whitelist a list of globals for this test run. * * @api private + * @param {string[]} globals */ -Runnable.prototype.globals = function(arr){ - var self = this; - this._allowedGlobals = arr; +Runnable.prototype.globals = function(globals) { + this._allowedGlobals = globals; }; /** * Run the test and invoke `fn(err)`. * - * @param {Function} fn * @api private + * @param {Function} fn */ - -Runnable.prototype.run = function(fn){ - var self = this - , start = new Date - , ctx = this.ctx - , finished - , emitted; - - // Some times the ctx exists but it is not runnable - if (ctx && ctx.runnable) ctx.runnable(this); +Runnable.prototype.run = function(fn) { + var self = this; + var start = new Date(); + var ctx = this.ctx; + var finished; + var emitted; + + // Sometimes the ctx exists, but it is not runnable + if (ctx && ctx.runnable) { + ctx.runnable(this); + } // called multiple times function multiple(err) { - if (emitted) return; + if (emitted) { + return; + } emitted = true; self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate')); } @@ -4505,16 +4140,19 @@ Runnable.prototype.run = function(fn){ // finished function done(err) { var ms = self.timeout(); - if (self.timedOut) return; - if (finished) return multiple(err || self._trace); - - // Discard the resolution if this test has already failed asynchronously - if (self.state) return; + if (self.timedOut) { + return; + } + if (finished) { + return multiple(err || self._trace); + } self.clearTimeout(); - self.duration = new Date - start; + self.duration = new Date() - start; finished = true; - if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); + if (!err && self.duration > ms && self._enableTimeouts) { + err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'); + } fn(err); } @@ -4526,14 +4164,15 @@ Runnable.prototype.run = function(fn){ this.resetTimeout(); try { - this.fn.call(ctx, function(err){ - if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); - if (null != err) { + this.fn.call(ctx, function(err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err != null) { if (Object.prototype.toString.call(err) === '[object Object]') { return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); - } else { - return done(new Error('done() invoked with non-Error: ' + err)); } + return done(new Error('done() invoked with non-Error: ' + err)); } done(); }); @@ -4564,10 +4203,10 @@ Runnable.prototype.run = function(fn){ self.resetTimeout(); result .then(function() { - done() + done(); }, function(reason) { - done(reason || new Error('Promise rejected with no or falsy reason')) + done(reason || new Error('Promise rejected with no or falsy reason')); }); } else { done(); @@ -4575,23 +4214,24 @@ Runnable.prototype.run = function(fn){ } }; -}); // module: runnable.js - -require.register("runner.js", function(module, exports, require){ +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3,"lodash.create":70}],36:[function(require,module,exports){ +(function (process,global){ /** * Module dependencies. */ -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:runner') - , Pending = require('./pending') - , Test = require('./test') - , utils = require('./utils') - , filter = utils.filter - , keys = utils.keys - , type = utils.type - , stringify = utils.stringify - , stackFilter = utils.stackTraceFilter(); +var EventEmitter = require('events').EventEmitter; +var Pending = require('./pending'); +var create = require('lodash.create'); +var debug = require('debug')('mocha:runner'); +var filter = require('./utils').filter; +var indexOf = require('./utils').indexOf; +var keys = require('./utils').keys; +var stackFilter = require('./utils').stackTraceFilter(); +var stringify = require('./utils').stringify; +var type = require('./utils').type; +var undefinedError = require('./utils').undefinedError; /** * Non-enumerable globals. @@ -4631,12 +4271,11 @@ module.exports = Runner; * - `fail` (test, err) test failed * - `pending` (test) test pending * + * @api public * @param {Suite} suite Root suite * @param {boolean} [delay] Whether or not to delay execution of root suite - * until ready. - * @api public + * until ready. */ - function Runner(suite, delay) { var self = this; this._globals = []; @@ -4645,8 +4284,12 @@ function Runner(suite, delay) { this.suite = suite; this.total = suite.total(); this.failures = 0; - this.on('test end', function(test){ self.checkGlobals(test); }); - this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.on('test end', function(test) { + self.checkGlobals(test); + }); + this.on('hook end', function(hook) { + self.checkGlobals(hook); + }); this.grep(/.*/); this.globals(this.globalProps().concat(extraGlobals())); } @@ -4654,33 +4297,29 @@ function Runner(suite, delay) { /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * - * @param {Function} fn * @api private + * @param {Function} fn */ - Runner.immediately = global.setImmediate || process.nextTick; /** * Inherit from `EventEmitter.prototype`. */ -function F(){}; -F.prototype = EventEmitter.prototype; -Runner.prototype = new F; -Runner.prototype.constructor = Runner; - +Runner.prototype = create(EventEmitter.prototype, { + constructor: Runner +}); /** * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * - * @param {RegExp} re - * @param {Boolean} invert - * @return {Runner} for chaining * @api public + * @param {RegExp} re + * @param {boolean} invert + * @return {Runner} Runner instance. */ - -Runner.prototype.grep = function(re, invert){ +Runner.prototype.grep = function(re, invert) { debug('grep %s', re); this._grep = re; this._invert = invert; @@ -4692,19 +4331,22 @@ Runner.prototype.grep = function(re, invert){ * Returns the number of tests matching the grep search for the * given suite. * - * @param {Suite} suite - * @return {Number} * @api public + * @param {Suite} suite + * @return {number} */ - Runner.prototype.grepTotal = function(suite) { var self = this; var total = 0; - suite.eachTest(function(test){ + suite.eachTest(function(test) { var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (match) total++; + if (self._invert) { + match = !match; + } + if (match) { + total++; + } }); return total; @@ -4713,16 +4355,17 @@ Runner.prototype.grepTotal = function(suite) { /** * Return a list of global properties. * - * @return {Array} * @api private + * @return {Array} */ - Runner.prototype.globalProps = function() { - var props = utils.keys(global); + var props = keys(global); // non-enumerables for (var i = 0; i < globals.length; ++i) { - if (~utils.indexOf(props, globals[i])) continue; + if (~indexOf(props, globals[i])) { + continue; + } props.push(globals[i]); } @@ -4732,13 +4375,14 @@ Runner.prototype.globalProps = function() { /** * Allow the given `arr` of globals. * - * @param {Array} arr - * @return {Runner} for chaining * @api public + * @param {Array} arr + * @return {Runner} Runner instance. */ - -Runner.prototype.globals = function(arr){ - if (0 == arguments.length) return this._globals; +Runner.prototype.globals = function(arr) { + if (!arguments.length) { + return this._globals; + } debug('globals %j', arr); this._globals = this._globals.concat(arr); return this; @@ -4749,10 +4393,11 @@ Runner.prototype.globals = function(arr){ * * @api private */ - -Runner.prototype.checkGlobals = function(test){ - if (this.ignoreLeaks) return; - var ok = this._globals; +Runner.prototype.checkGlobals = function(test) { + if (this.ignoreLeaks) { + return; + } + var ok = this._globals; var globals = this.globalProps(); var leaks; @@ -4761,7 +4406,9 @@ Runner.prototype.checkGlobals = function(test){ ok = ok.concat(test._allowedGlobals || []); } - if(this.prevGlobalsLength == globals.length) return; + if (this.prevGlobalsLength === globals.length) { + return; + } this.prevGlobalsLength = globals.length; leaks = filterLeaks(ok, globals); @@ -4777,16 +4424,15 @@ Runner.prototype.checkGlobals = function(test){ /** * Fail the given `test`. * + * @api private * @param {Test} test * @param {Error} err - * @api private */ - Runner.prototype.fail = function(test, err) { ++this.failures; test.state = 'failed'; - if (!(err instanceof Error)) { + if (!(err instanceof Error || err && typeof err.message === 'string')) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } @@ -4813,12 +4459,11 @@ Runner.prototype.fail = function(test, err) { * suite and subsuites, but executes other `after each` * hooks * + * @api private * @param {Hook} hook * @param {Error} err - * @api private */ - -Runner.prototype.failHook = function(hook, err){ +Runner.prototype.failHook = function(hook, err) { this.fail(hook, err); if (this.suite.bail()) { this.emit('end'); @@ -4828,34 +4473,36 @@ Runner.prototype.failHook = function(hook, err){ /** * Run hook `name` callbacks and then invoke `fn()`. * - * @param {String} name - * @param {Function} function * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , hooks = suite['_' + name] - , self = this - , timer; +Runner.prototype.hook = function(name, fn) { + var suite = this.suite; + var hooks = suite['_' + name]; + var self = this; function next(i) { var hook = hooks[i]; - if (!hook) return fn(); + if (!hook) { + return fn(); + } self.currentRunnable = hook; hook.ctx.currentTest = self.test; self.emit('hook', hook); - hook.on('error', function(err){ + hook.on('error', function(err) { self.failHook(hook, err); }); - hook.run(function(err){ + hook.run(function(err) { hook.removeAllListeners('error'); var testError = hook.error(); - if (testError) self.fail(self.test, testError); + if (testError) { + self.fail(self.test, testError); + } if (err) { if (err instanceof Pending) { suite.pending = true; @@ -4872,7 +4519,7 @@ Runner.prototype.hook = function(name, fn){ }); } - Runner.immediately(function(){ + Runner.immediately(function() { next(0); }); }; @@ -4881,15 +4528,14 @@ Runner.prototype.hook = function(name, fn){ * Run hook `name` for the given array of `suites` * in order, and callback `fn(err, errSuite)`. * - * @param {String} name + * @api private + * @param {string} name * @param {Array} suites * @param {Function} fn - * @api private */ - -Runner.prototype.hooks = function(name, suites, fn){ - var self = this - , orig = this.suite; +Runner.prototype.hooks = function(name, suites, fn) { + var self = this; + var orig = this.suite; function next(suite) { self.suite = suite; @@ -4899,7 +4545,7 @@ Runner.prototype.hooks = function(name, suites, fn){ return fn(); } - self.hook(name, function(err){ + self.hook(name, function(err) { if (err) { var errSuite = self.suite; self.suite = orig; @@ -4916,12 +4562,11 @@ Runner.prototype.hooks = function(name, suites, fn){ /** * Run hooks from the top level down. * - * @param {String} name - * @param {Function} fn * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hookUp = function(name, fn){ +Runner.prototype.hookUp = function(name, fn) { var suites = [this.suite].concat(this.parents()).reverse(); this.hooks(name, suites, fn); }; @@ -4929,12 +4574,11 @@ Runner.prototype.hookUp = function(name, fn){ /** * Run hooks from the bottom up. * - * @param {String} name - * @param {Function} fn * @api private + * @param {string} name + * @param {Function} fn */ - -Runner.prototype.hookDown = function(name, fn){ +Runner.prototype.hookDown = function(name, fn) { var suites = [this.suite].concat(this.parents()); this.hooks(name, suites, fn); }; @@ -4943,32 +4587,34 @@ Runner.prototype.hookDown = function(name, fn){ * Return an array of parent Suites from * closest to furthest. * - * @return {Array} * @api private + * @return {Array} */ - -Runner.prototype.parents = function(){ - var suite = this.suite - , suites = []; - while (suite = suite.parent) suites.push(suite); +Runner.prototype.parents = function() { + var suite = this.suite; + var suites = []; + while (suite = suite.parent) { + suites.push(suite); + } return suites; }; /** * Run the current test and callback `fn(err)`. * - * @param {Function} fn * @api private + * @param {Function} fn */ +Runner.prototype.runTest = function(fn) { + var self = this; + var test = this.test; -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - if (this.asyncOnly) test.asyncOnly = true; + if (this.asyncOnly) { + test.asyncOnly = true; + } try { - test.on('error', function(err){ + test.on('error', function(err) { self.fail(test, err); }); test.run(fn); @@ -4978,21 +4624,18 @@ Runner.prototype.runTest = function(fn){ }; /** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. + * Run tests in the given `suite` and invoke the callback `fn()` when complete. * + * @api private * @param {Suite} suite * @param {Function} fn - * @api private */ +Runner.prototype.runTests = function(suite, fn) { + var self = this; + var tests = suite.tests.slice(); + var test; -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests.slice() - , test; - - - function hookErr(err, errSuite, after) { + function hookErr(_, errSuite, after) { // before/after Each hook for errSuite failed: var orig = self.suite; @@ -5005,7 +4648,9 @@ Runner.prototype.runTests = function(suite, fn){ self.hookUp('afterEach', function(err2, errSuite2) { self.suite = orig; // some hooks may fail even now - if (err2) return hookErr(err2, errSuite2, true); + if (err2) { + return hookErr(err2, errSuite2, true); + } // report error suite fn(errSuite); }); @@ -5018,22 +4663,34 @@ Runner.prototype.runTests = function(suite, fn){ function next(err, errSuite) { // if we bail after first err - if (self.failures && suite._bail) return fn(); + if (self.failures && suite._bail) { + return fn(); + } - if (self._abort) return fn(); + if (self._abort) { + return fn(); + } - if (err) return hookErr(err, errSuite, true); + if (err) { + return hookErr(err, errSuite, true); + } // next test test = tests.shift(); // all done - if (!test) return fn(); + if (!test) { + return fn(); + } // grep var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (!match) return next(); + if (self._invert) { + match = !match; + } + if (!match) { + return next(); + } // pending if (test.pending) { @@ -5044,17 +4701,17 @@ Runner.prototype.runTests = function(suite, fn){ // execute test and hook(s) self.emit('test', self.test = test); - self.hookDown('beforeEach', function(err, errSuite){ - + self.hookDown('beforeEach', function(err, errSuite) { if (suite.pending) { self.emit('pending', test); self.emit('test end', test); return next(); } - if (err) return hookErr(err, errSuite, false); - + if (err) { + return hookErr(err, errSuite, false); + } self.currentRunnable = self.test; - self.runTest(function(err){ + self.runTest(function(err) { test = self.test; if (err) { @@ -5085,56 +4742,61 @@ Runner.prototype.runTests = function(suite, fn){ }; /** - * Run the given `suite` and invoke the - * callback `fn()` when complete. + * Run the given `suite` and invoke the callback `fn()` when complete. * + * @api private * @param {Suite} suite * @param {Function} fn - * @api private */ - -Runner.prototype.runSuite = function(suite, fn){ - var total = this.grepTotal(suite) - , self = this - , i = 0; +Runner.prototype.runSuite = function(suite, fn) { + var i = 0; + var self = this; + var total = this.grepTotal(suite); debug('run suite %s', suite.fullTitle()); - if (!total) return fn(); + if (!total) { + return fn(); + } this.emit('suite', this.suite = suite); function next(errSuite) { if (errSuite) { // current suite failed on a hook from errSuite - if (errSuite == suite) { + if (errSuite === suite) { // if errSuite is current suite // continue to the next sibling suite return done(); - } else { - // errSuite is among the parents of current suite - // stop execution of errSuite and all sub-suites - return done(errSuite); } + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); } - if (self._abort) return done(); + if (self._abort) { + return done(); + } var curr = suite.suites[i++]; - if (!curr) return done(); + if (!curr) { + return done(); + } self.runSuite(curr, next); } function done(errSuite) { self.suite = suite; - self.hook('afterAll', function(){ + self.hook('afterAll', function() { self.emit('suite end', suite); fn(errSuite); }); } - this.hook('beforeAll', function(err){ - if (err) return done(); + this.hook('beforeAll', function(err) { + if (err) { + return done(); + } self.runTests(suite, next); }); }; @@ -5142,32 +4804,35 @@ Runner.prototype.runSuite = function(suite, fn){ /** * Handle uncaught exceptions. * - * @param {Error} err * @api private + * @param {Error} err */ - -Runner.prototype.uncaught = function(err){ +Runner.prototype.uncaught = function(err) { if (err) { - debug('uncaught exception %s', err !== function () { + debug('uncaught exception %s', err !== function() { return this; - }.call(err) ? err : ( err.message || err )); + }.call(err) ? err : (err.message || err)); } else { debug('uncaught undefined exception'); - err = utils.undefinedError(); + err = undefinedError(); } err.uncaught = true; var runnable = this.currentRunnable; - if (!runnable) return; + if (!runnable) { + return; + } runnable.clearTimeout(); // Ignore errors if complete - if (runnable.state) return; + if (runnable.state) { + return; + } this.fail(runnable, err); // recover from test - if ('test' == runnable.type) { + if (runnable.type === 'test') { this.emit('test end', runnable); this.hookUp('afterEach', this.next); return; @@ -5181,24 +4846,23 @@ Runner.prototype.uncaught = function(err){ * Run the root suite and invoke `fn(failures)` * on completion. * - * @param {Function} fn - * @return {Runner} for chaining * @api public + * @param {Function} fn + * @return {Runner} Runner instance. */ +Runner.prototype.run = function(fn) { + var self = this; + var rootSuite = this.suite; -Runner.prototype.run = function(fn){ - var self = this, - rootSuite = this.suite; - - fn = fn || function(){}; + fn = fn || function() {}; - function uncaught(err){ + function uncaught(err) { self.uncaught(err); } function start() { self.emit('start'); - self.runSuite(rootSuite, function(){ + self.runSuite(rootSuite, function() { debug('finished running'); self.emit('end'); }); @@ -5207,7 +4871,7 @@ Runner.prototype.run = function(fn){ debug('start'); // callback - this.on('end', function(){ + this.on('end', function() { debug('end'); process.removeListener('uncaughtException', uncaught); fn(self.failures); @@ -5221,8 +4885,7 @@ Runner.prototype.run = function(fn){ // might be nice to debounce some dots while we wait. this.emit('waiting', rootSuite); rootSuite.once('run', start); - } - else { + } else { start(); } @@ -5230,87 +4893,95 @@ Runner.prototype.run = function(fn){ }; /** - * Cleanly abort execution + * Cleanly abort execution. * - * @return {Runner} for chaining * @api public + * @return {Runner} Runner instance. */ -Runner.prototype.abort = function(){ +Runner.prototype.abort = function() { debug('aborting'); this._abort = true; + + return this; }; /** * Filter leaks with the given globals flagged as `ok`. * + * @api private * @param {Array} ok * @param {Array} globals * @return {Array} - * @api private */ - function filterLeaks(ok, globals) { - return filter(globals, function(key){ + return filter(globals, function(key) { // Firefox and Chrome exposes iframes as index inside the window object - if (/^d+/.test(key)) return false; + if (/^d+/.test(key)) { + return false; + } // in firefox // if runner runs in an iframe, this iframe's window.getInterface method not init at first // it is assigned in some seconds - if (global.navigator && /^getInterface/.test(key)) return false; + if (global.navigator && (/^getInterface/).test(key)) { + return false; + } // an iframe could be approached by window[iframeIndex] // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak - if (global.navigator && /^\d+/.test(key)) return false; + if (global.navigator && (/^\d+/).test(key)) { + return false; + } // Opera and IE expose global variables for HTML element IDs (issue #243) - if (/^mocha-/.test(key)) return false; + if (/^mocha-/.test(key)) { + return false; + } - var matched = filter(ok, function(ok){ - if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); - return key == ok; + var matched = filter(ok, function(ok) { + if (~ok.indexOf('*')) { + return key.indexOf(ok.split('*')[0]) === 0; + } + return key === ok; }); - return matched.length == 0 && (!global.navigator || 'onerror' !== key); + return !matched.length && (!global.navigator || key !== 'onerror'); }); } /** * Array of globals dependent on the environment. * - * @return {Array} * @api private + * @return {Array} */ - function extraGlobals() { - if (typeof(process) === 'object' && - typeof(process.version) === 'string') { - - var nodeVersion = process.version.split('.').reduce(function(a, v) { - return a << 8 | v; - }); + if (!process.browser) { + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); - // 'errno' was renamed to process._errno in v0.9.11. + // 'errno' was renamed to process._errno in v0.9.11. - if (nodeVersion < 0x00090B) { - return ['errno']; - } - } + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } - return []; + return []; } -}); // module: runner.js - -require.register("suite.js", function(module, exports, require){ +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./pending":16,"./utils":39,"_process":50,"debug":2,"events":3,"lodash.create":70}],37:[function(require,module,exports){ /** * Module dependencies. */ -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:suite') - , milliseconds = require('./ms') - , utils = require('./utils') - , Hook = require('./hook'); +var EventEmitter = require('events').EventEmitter; +var Hook = require('./hook'); +var create = require('lodash.create'); +var debug = require('debug')('mocha:suite'); +var milliseconds = require('./ms'); +var utils = require('./utils'); /** * Expose `Suite`. @@ -5319,41 +4990,38 @@ var EventEmitter = require('browser/events').EventEmitter exports = module.exports = Suite; /** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. + * Create a new `Suite` with the given `title` and parent `Suite`. When a suite + * with the same title is already present, that suite is returned to provide + * nicer reporter and more flexible meta-testing. * + * @api public * @param {Suite} parent - * @param {String} title + * @param {string} title * @return {Suite} - * @api public */ - -exports.create = function(parent, title){ +exports.create = function(parent, title) { var suite = new Suite(title, parent.ctx); suite.parent = parent; - if (parent.pending) suite.pending = true; + if (parent.pending) { + suite.pending = true; + } title = suite.fullTitle(); parent.addSuite(suite); return suite; }; /** - * Initialize a new `Suite` with the given - * `title` and `ctx`. + * Initialize a new `Suite` with the given `title` and `ctx`. * - * @param {String} title - * @param {Context} ctx * @api private + * @param {string} title + * @param {Context} parentContext */ - function Suite(title, parentContext) { this.title = title; - var context = function() {}; - context.prototype = parentContext; - this.ctx = new context(); + function Context() {} + Context.prototype = parentContext; + this.ctx = new Context(); this.suites = []; this.tests = []; this.pending = false; @@ -5373,20 +5041,17 @@ function Suite(title, parentContext) { * Inherit from `EventEmitter.prototype`. */ -function F(){}; -F.prototype = EventEmitter.prototype; -Suite.prototype = new F; -Suite.prototype.constructor = Suite; - +Suite.prototype = create(EventEmitter.prototype, { + constructor: Suite +}); /** * Return a clone of this `Suite`. * - * @return {Suite} * @api private + * @return {Suite} */ - -Suite.prototype.clone = function(){ +Suite.prototype.clone = function() { var suite = new Suite(this.title); debug('clone'); suite.ctx = this.ctx; @@ -5400,30 +5065,36 @@ Suite.prototype.clone = function(){ /** * Set timeout `ms` or short-hand such as "2s". * - * @param {Number|String} ms - * @return {Suite|Number} for chaining * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining */ - -Suite.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if (ms.toString() === '0') this._enableTimeouts = false; - if ('string' == typeof ms) ms = milliseconds(ms); +Suite.prototype.timeout = function(ms) { + if (!arguments.length) { + return this._timeout; + } + if (ms.toString() === '0') { + this._enableTimeouts = false; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('timeout %d', ms); this._timeout = parseInt(ms, 10); return this; }; /** - * Set timeout `enabled`. + * Set timeout to `enabled`. * - * @param {Boolean} enabled - * @return {Suite|Boolean} self or enabled * @api private + * @param {boolean} enabled + * @return {Suite|boolean} self or enabled */ - -Suite.prototype.enableTimeouts = function(enabled){ - if (arguments.length === 0) return this._enableTimeouts; +Suite.prototype.enableTimeouts = function(enabled) { + if (!arguments.length) { + return this._enableTimeouts; + } debug('enableTimeouts %s', enabled); this._enableTimeouts = enabled; return this; @@ -5432,14 +5103,17 @@ Suite.prototype.enableTimeouts = function(enabled){ /** * Set slow `ms` or short-hand such as "2s". * - * @param {Number|String} ms - * @return {Suite|Number} for chaining * @api private + * @param {number|string} ms + * @return {Suite|number} for chaining */ - -Suite.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); +Suite.prototype.slow = function(ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } debug('slow %d', ms); this._slow = ms; return this; @@ -5448,13 +5122,14 @@ Suite.prototype.slow = function(ms){ /** * Sets whether to bail after first error. * - * @param {Boolean} bail - * @return {Suite|Number} for chaining * @api private + * @param {boolean} bail + * @return {Suite|number} for chaining */ - -Suite.prototype.bail = function(bail){ - if (0 == arguments.length) return this._bail; +Suite.prototype.bail = function(bail) { + if (!arguments.length) { + return this._bail; + } debug('bail %s', bail); this._bail = bail; return this; @@ -5463,14 +5138,16 @@ Suite.prototype.bail = function(bail){ /** * Run `fn(test[, done])` before running tests. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.beforeAll = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.beforeAll = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -5490,14 +5167,16 @@ Suite.prototype.beforeAll = function(title, fn){ /** * Run `fn(test[, done])` after running tests. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.afterAll = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.afterAll = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -5517,14 +5196,16 @@ Suite.prototype.afterAll = function(title, fn){ /** * Run `fn(test[, done])` before each test case. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.beforeEach = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.beforeEach = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -5544,14 +5225,16 @@ Suite.prototype.beforeEach = function(title, fn){ /** * Run `fn(test[, done])` after each test case. * + * @api private + * @param {string} title * @param {Function} fn * @return {Suite} for chaining - * @api private */ - -Suite.prototype.afterEach = function(title, fn){ - if (this.pending) return this; - if ('function' === typeof title) { +Suite.prototype.afterEach = function(title, fn) { + if (this.pending) { + return this; + } + if (typeof title === 'function') { fn = title; title = fn.name; } @@ -5571,12 +5254,11 @@ Suite.prototype.afterEach = function(title, fn){ /** * Add a test `suite`. * + * @api private * @param {Suite} suite * @return {Suite} for chaining - * @api private */ - -Suite.prototype.addSuite = function(suite){ +Suite.prototype.addSuite = function(suite) { suite.parent = this; suite.timeout(this.timeout()); suite.enableTimeouts(this.enableTimeouts()); @@ -5587,822 +5269,7771 @@ Suite.prototype.addSuite = function(suite){ return this; }; -/** - * Add a `test` to this suite. - * - * @param {Test} test - * @return {Suite} for chaining - * @api private - */ +/** + * Add a `test` to this suite. + * + * @api private + * @param {Test} test + * @return {Suite} for chaining + */ +Suite.prototype.addTest = function(test) { + test.parent = this; + test.timeout(this.timeout()); + test.enableTimeouts(this.enableTimeouts()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @api public + * @return {string} + */ +Suite.prototype.fullTitle = function() { + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) { + return full + ' ' + this.title; + } + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @api public + * @return {number} + */ +Suite.prototype.total = function() { + return utils.reduce(this.suites, function(sum, suite) { + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. + * + * @api private + * @param {Function} fn + * @return {Suite} + */ +Suite.prototype.eachTest = function(fn) { + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite) { + suite.eachTest(fn); + }); + return this; +}; + +/** + * This will run the root suite if we happen to be running in delayed mode. + */ +Suite.prototype.run = function run() { + if (this.root) { + this.emit('run'); + } +}; + +},{"./hook":7,"./ms":15,"./utils":39,"debug":2,"events":3,"lodash.create":70}],38:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); +var create = require('lodash.create'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @api private + * @param {String} title + * @param {Function} fn + */ +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +Test.prototype = create(Runnable.prototype, { + constructor: Test +}); + +},{"./runnable":35,"lodash.create":70}],39:[function(require,module,exports){ +(function (process,Buffer){ +/* eslint-env browser */ + +/** + * Module dependencies. + */ + +var basename = require('path').basename; +var debug = require('debug')('mocha:watch'); +var exists = require('fs').existsSync || require('path').existsSync; +var glob = require('glob'); +var join = require('path').join; +var readdirSync = require('fs').readdirSync; +var statSync = require('fs').statSync; +var watchFile = require('fs').watchFile; + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @api private + * @param {string} html + * @return {string} + */ +exports.escape = function(html) { + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} scope + */ +exports.forEach = function(arr, fn, scope) { + for (var i = 0, l = arr.length; i < l; i++) { + fn.call(scope, arr[i], i); + } +}; + +/** + * Test if the given obj is type of string. + * + * @api private + * @param {Object} obj + * @return {boolean} + */ +exports.isString = function(obj) { + return typeof obj === 'string'; +}; + +/** + * Array#map (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} scope + * @return {Array} + */ +exports.map = function(arr, fn, scope) { + var result = []; + for (var i = 0, l = arr.length; i < l; i++) { + result.push(fn.call(scope, arr[i], i, arr)); + } + return result; +}; + +/** + * Array#indexOf (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Object} obj to find index of + * @param {number} start + * @return {number} + */ +exports.indexOf = function(arr, obj, start) { + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) { + return i; + } + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @param {Object} val Initial value. + * @return {*} + */ +exports.reduce = function(arr, fn, val) { + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @return {Array} + */ +exports.filter = function(arr, fn) { + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) { + ret.push(val); + } + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @api private + * @param {Object} obj + * @return {Array} keys + */ +exports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) { + var keys = []; + var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @api private + * @param {Array} files + * @param {Function} fn + */ +exports.watch = function(files, fn) { + var options = { interval: 100 }; + files.forEach(function(file) { + debug('file %s', file); + watchFile(file, options, function(curr, prev) { + if (prev.mtime < curr.mtime) { + fn(file); + } + }); + }); +}; + +/** + * Array.isArray (<=IE8) + * + * @api private + * @param {Object} obj + * @return {Boolean} + */ +var isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; +}; + +/** + * Buffer.prototype.toJSON polyfill. + * + * @type {Function} + */ +if (typeof Buffer !== 'undefined' && Buffer.prototype) { + Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() { + return Array.prototype.slice.call(this, 0); + }; +} + +/** + * Ignored files. + * + * @api private + * @param {string} path + * @return {boolean} + */ +function ignored(path) { + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @api private + * @param {string} dir + * @param {string[]} [ext=['.js']] + * @param {Array} [ret=[]] + * @return {Array} + */ +exports.files = function(dir, ext, ret) { + ret = ret || []; + ext = ext || ['js']; + + var re = new RegExp('\\.(' + ext.join('|') + ')$'); + + readdirSync(dir) + .filter(ignored) + .forEach(function(path) { + path = join(dir, path); + if (statSync(path).isDirectory()) { + exports.files(path, ext, ret); + } else if (path.match(re)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @api private + * @param {string} str + * @return {string} + */ +exports.slug = function(str) { + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, and re-indent for pre whitespace. + * + * @param {string} str + * @return {string} + */ +exports.clean = function(str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') + .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '') + .replace(/\s+\}$/, ''); + + var spaces = str.match(/^\n?( *)/)[1].length; + var tabs = str.match(/^\n?(\t*)/)[1].length; + var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Trim the given `str`. + * + * @api private + * @param {string} str + * @return {string} + */ +exports.trim = function(str) { + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @api private + * @param {string} qs + * @return {Object} + */ +exports.parseQuery = function(qs) { + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair) { + var i = pair.indexOf('='); + var key = pair.slice(0, i); + var val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @api private + * @param {string} js + * @return {string} + */ +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew[ \t]+(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1'); +} + +/** + * Highlight the contents of tag `name`. + * + * @api private + * @param {string} name + */ +exports.highlightTags = function(name) { + var code = document.getElementById('mocha').getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +/** + * If a value could have properties, and has none, this function is called, + * which returns a string representation of the empty value. + * + * Functions w/ no properties return `'[Function]'` + * Arrays w/ length === 0 return `'[]'` + * Objects w/ no properties return `'{}'` + * All else: return result of `value.toString()` + * + * @api private + * @param {*} value The value to inspect. + * @param {string} [type] The type of the value, if known. + * @returns {string} + */ +function emptyRepresentation(value, type) { + type = type || exports.type(value); + + switch (type) { + case 'function': + return '[Function]'; + case 'object': + return '{}'; + case 'array': + return '[]'; + default: + return value.toString(); + } +} + +/** + * Takes some variable and asks `Object.prototype.toString()` what it thinks it + * is. + * + * @api private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString + * @param {*} value The value to test. + * @returns {string} + * @example + * type({}) // 'object' + * type([]) // 'array' + * type(1) // 'number' + * type(false) // 'boolean' + * type(Infinity) // 'number' + * type(null) // 'null' + * type(new Date()) // 'date' + * type(/foo/) // 'regexp' + * type('type') // 'string' + * type(global) // 'global' + */ +exports.type = function type(value) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return 'buffer'; + } + return Object.prototype.toString.call(value) + .replace(/^\[.+\s(.+?)\]$/, '$1') + .toLowerCase(); +}; + +/** + * Stringify `value`. Different behavior depending on type of value: + * + * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. + * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. + * - If `value` is an *empty* object, function, or array, return result of function + * {@link emptyRepresentation}. + * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of + * JSON.stringify(). + * + * @api private + * @see exports.type + * @param {*} value + * @return {string} + */ +exports.stringify = function(value) { + var type = exports.type(value); + + if (!~exports.indexOf(['object', 'array', 'function'], type)) { + if (type !== 'buffer') { + return jsonStringify(value); + } + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); + } + + for (var prop in value) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { + return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); + } + } + + return emptyRepresentation(value, type); +}; + +/** + * like JSON.stringify but more sense. + * + * @api private + * @param {Object} object + * @param {number=} spaces + * @param {number=} depth + * @returns {*} + */ +function jsonStringify(object, spaces, depth) { + if (typeof spaces === 'undefined') { + // primitive types + return _stringify(object); + } + + depth = depth || 1; + var space = spaces * depth; + var str = isArray(object) ? '[' : '{'; + var end = isArray(object) ? ']' : '}'; + var length = object.length || exports.keys(object).length; + // `.repeat()` polyfill + function repeat(s, n) { + return new Array(n).join(s); + } + + function _stringify(val) { + switch (exports.type(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'number': + val = val === 0 && (1 / val) === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'date': + var sDate = isNaN(val.getTime()) // Invalid date + ? val.toString() + : val.toISOString(); + val = '[Date: ' + sDate + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = (val === '[Function]' || val === '[Circular]') + ? val + : JSON.stringify(val); // string + } + return val; + } + + for (var i in object) { + if (!object.hasOwnProperty(i)) { + continue; // not my business + } + --length; + str += '\n ' + repeat(' ', space) + + (isArray(object) ? '' : '"' + i + '": ') // key + + _stringify(object[i]) // value + + (length ? ',' : ''); // comma + } + + return str + // [], {} + + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end); +} + +/** + * Test if a value is a buffer. + * + * @api private + * @param {*} value The value to test. + * @return {boolean} True if `value` is a buffer, otherwise false + */ +exports.isBuffer = function(value) { + return typeof Buffer !== 'undefined' && Buffer.isBuffer(value); +}; + +/** + * Return a new Thing that has the keys in sorted order. Recursive. + * + * If the Thing... + * - has already been seen, return string `'[Circular]'` + * - is `undefined`, return string `'[undefined]'` + * - is `null`, return value `null` + * - is some other primitive, return the value + * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method + * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. + * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` + * + * @api private + * @see {@link exports.stringify} + * @param {*} value Thing to inspect. May or may not have properties. + * @param {Array} [stack=[]] Stack of seen values + * @return {(Object|Array|Function|string|undefined)} + */ +exports.canonicalize = function(value, stack) { + var canonicalizedObj; + /* eslint-disable no-unused-vars */ + var prop; + /* eslint-enable no-unused-vars */ + var type = exports.type(value); + function withStack(value, fn) { + stack.push(value); + fn(); + stack.pop(); + } + + stack = stack || []; + + if (exports.indexOf(stack, value) !== -1) { + return '[Circular]'; + } + + switch (type) { + case 'undefined': + case 'buffer': + case 'null': + canonicalizedObj = value; + break; + case 'array': + withStack(value, function() { + canonicalizedObj = exports.map(value, function(item) { + return exports.canonicalize(item, stack); + }); + }); + break; + case 'function': + /* eslint-disable guard-for-in */ + for (prop in value) { + canonicalizedObj = {}; + break; + } + /* eslint-enable guard-for-in */ + if (!canonicalizedObj) { + canonicalizedObj = emptyRepresentation(value, type); + break; + } + /* falls through */ + case 'object': + canonicalizedObj = canonicalizedObj || {}; + withStack(value, function() { + exports.forEach(exports.keys(value).sort(), function(key) { + canonicalizedObj[key] = exports.canonicalize(value[key], stack); + }); + }); + break; + case 'date': + case 'number': + case 'regexp': + case 'boolean': + canonicalizedObj = value; + break; + default: + canonicalizedObj = value.toString(); + } + + return canonicalizedObj; +}; + +/** + * Lookup file names at the given `path`. + * + * @api public + * @param {string} path Base path to start searching from. + * @param {string[]} extensions File extensions to look for. + * @param {boolean} recursive Whether or not to recurse into subdirectories. + * @return {string[]} An array of paths. + */ +exports.lookupFiles = function lookupFiles(path, extensions, recursive) { + var files = []; + var re = new RegExp('\\.(' + extensions.join('|') + ')$'); + + if (!exists(path)) { + if (exists(path + '.js')) { + path += '.js'; + } else { + files = glob.sync(path); + if (!files.length) { + throw new Error("cannot resolve path (or pattern) '" + path + "'"); + } + return files; + } + } + + try { + var stat = statSync(path); + if (stat.isFile()) { + return path; + } + } catch (err) { + // ignore error + return; + } + + readdirSync(path).forEach(function(file) { + file = join(path, file); + try { + var stat = statSync(file); + if (stat.isDirectory()) { + if (recursive) { + files = files.concat(lookupFiles(file, extensions, recursive)); + } + return; + } + } catch (err) { + // ignore error + return; + } + if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') { + return; + } + files.push(file); + }); + + return files; +}; + +/** + * Generate an undefined error with a message warning the user. + * + * @return {Error} + */ + +exports.undefinedError = function() { + return new Error('Caught undefined error, did you throw without specifying what?'); +}; + +/** + * Generate an undefined error if `err` is not defined. + * + * @param {Error} err + * @return {Error} + */ + +exports.getError = function(err) { + return err || exports.undefinedError(); +}; + +/** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). + * @returns {Function} + */ +exports.stackTraceFilter = function() { + // TODO: Replace with `process.browser` + var slash = '/'; + var is = typeof document === 'undefined' ? { node: true } : { browser: true }; + var cwd = is.node + ? process.cwd() + slash + : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + + function isMochaInternal(line) { + return (~line.indexOf('node_modules' + slash + 'mocha')) + || (~line.indexOf('components' + slash + 'mochajs')) + || (~line.indexOf('components' + slash + 'mocha')); + } + + // node_modules, bower, componentJS + function isBrowserModule(line) { + return (~line.indexOf('node_modules')) || (~line.indexOf('components')); + } + + function isNodeInternal(line) { + return (~line.indexOf('(timers.js:')) + || (~line.indexOf('(events.js:')) + || (~line.indexOf('(node.js:')) + || (~line.indexOf('(module.js:')) + || (~line.indexOf('GeneratorFunctionPrototype.next (native)')) + || false; + } + + return function(stack) { + stack = stack.split('\n'); + + stack = exports.reduce(stack, function(list, line) { + if (is.node && (isMochaInternal(line) || isNodeInternal(line))) { + return list; + } + + if (is.browser && (isBrowserModule(line))) { + return list; + } + + // Clean up cwd(absolute) + list.push(line.replace(cwd, '')); + return list; + }, []); + + return stack.join('\n'); + }; +}; + +}).call(this,require('_process'),require("buffer").Buffer) +},{"_process":50,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41}],40:[function(require,module,exports){ +(function (process){ +var WritableStream = require('stream').Writable +var inherits = require('util').inherits + +module.exports = BrowserStdout + + +inherits(BrowserStdout, WritableStream) + +function BrowserStdout(opts) { + if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) + + opts = opts || {} + WritableStream.call(this, opts) + this.label = (opts.label !== undefined) ? opts.label : 'stdout' +} + +BrowserStdout.prototype._write = function(chunks, encoding, cb) { + var output = chunks.toString ? chunks.toString() : chunks + console.log(this.label+':', output) + process.nextTick(cb) +} +}).call(this,require('_process')) +},{"_process":50,"stream":62,"util":65}],41:[function(require,module,exports){ + +},{}],42:[function(require,module,exports){ +arguments[4][41][0].apply(exports,arguments) +},{"dup":41}],43:[function(require,module,exports){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Note: + * + * - Implementation must support adding new properties to `Uint8Array` instances. + * Firefox 4-29 lacked support, fixed in Firefox 30+. + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + * + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will + * get the Object implementation, which is slower but will work correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = (function () { + try { + var buf = new ArrayBuffer(0) + var arr = new Uint8Array(buf) + arr.foo = function () { return 42 } + return arr.foo() === 42 && // typed array instances can be augmented + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +})() + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } else if (list.length === 1) { + return list[0] + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` will be removed in Node 0.13+ +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` will be removed in Node 0.13+ +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + var res = '' + var tmp = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + if (buf[i] <= 0x7F) { + res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) + tmp = '' + } else { + tmp += '%' + buf[i].toString(16) + } + } + + return res + decodeUtf8Char(tmp) +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = value + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = value + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = value + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = value + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = value + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = value + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = value + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = value + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = value + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = value + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated, will be removed in node 0.13+ + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + var i = 0 + + for (; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (leadSurrogate) { + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } else { + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + leadSurrogate = null + } + } else { + // no lead yet + + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else { + // valid lead + leadSurrogate = codePoint + continue + } + } + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = null + } + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x200000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +function decodeUtf8Char (str) { + try { + return decodeURIComponent(str) + } catch (err) { + return String.fromCharCode(0xFFFD) // UTF 8 invalid char + } +} + +},{"base64-js":44,"ieee754":45,"is-array":46}],44:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],45:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],46:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],47:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],48:[function(require,module,exports){ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; + +},{}],49:[function(require,module,exports){ +exports.endianness = function () { return 'LE' }; + +exports.hostname = function () { + if (typeof location !== 'undefined') { + return location.hostname + } + else return ''; +}; + +exports.loadavg = function () { return [] }; + +exports.uptime = function () { return 0 }; + +exports.freemem = function () { + return Number.MAX_VALUE; +}; + +exports.totalmem = function () { + return Number.MAX_VALUE; +}; + +exports.cpus = function () { return [] }; + +exports.type = function () { return 'Browser' }; + +exports.release = function () { + if (typeof navigator !== 'undefined') { + return navigator.appVersion; + } + return ''; +}; + +exports.networkInterfaces += exports.getNetworkInterfaces += function () { return {} }; + +exports.arch = function () { return 'javascript' }; + +exports.platform = function () { return 'browser' }; + +exports.tmpdir = exports.tmpDir = function () { + return '/tmp'; +}; + +exports.EOL = '\n'; + +},{}],50:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + currentQueue[queueIndex].run(); + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],51:[function(require,module,exports){ +module.exports = require("./lib/_stream_duplex.js") + +},{"./lib/_stream_duplex.js":52}],52:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +module.exports = Duplex; + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} +/**/ + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +forEach(objectKeys(Writable.prototype), function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +}); + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + process.nextTick(this.end.bind(this)); +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +}).call(this,require('_process')) +},{"./_stream_readable":54,"./_stream_writable":56,"_process":50,"core-util-is":57,"inherits":69}],53:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; + +},{"./_stream_transform":55,"core-util-is":57,"inherits":69}],54:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Readable.ReadableState = ReadableState; + +var EE = require('events').EventEmitter; + +/**/ +if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +var Stream = require('stream'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var StringDecoder; + + +/**/ +var debug = require('util'); +if (debug && debug.debuglog) { + debug = debug.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + var Duplex = require('./_stream_duplex'); + + options = options || {}; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = options.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options.readableObjectMode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + var Duplex = require('./_stream_duplex'); + + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (util.isString(chunk) && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (util.isNullOrUndefined(chunk)) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + if (!addToFront) + state.reading = false; + + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) + state.buffer.unshift(chunk); + else + state.buffer.push(chunk); + + if (state.needReadable) + emitReadable(stream); + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 128MB +var MAX_HWM = 0x800000; +function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (isNaN(n) || util.isNull(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; + + if (!util.isNumber(n) || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) + endReadable(this); + else + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) + endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } + + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + var ret; + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (util.isNull(ret)) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) + endReadable(this); + + if (!util.isNull(ret)) + this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!util.isBuffer(chunk) && + !util.isString(chunk) && + !util.isNullOrUndefined(chunk) && + !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && + (!dest._writableState || dest._writableState.needDrain)) + ondrain(); + } + + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + debug('false write response, pause', + src._readableState.awaitDrain); + src._readableState.awaitDrain++; + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EE.listenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) + state.awaitDrain--; + if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); + } + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + var self = this; + process.nextTick(function() { + debug('readable nexttick read 0'); + self.read(0); + }); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + if (!state.reading) { + debug('resume read 0'); + this.read(0); + } + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(function() { + resume_(stream, state); + }); + } +} + +function resume_(stream, state) { + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) + stream.read(0); +} + +Readable.prototype.pause = function() { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + debug('wrapped data'); + if (state.decoder) + chunk = state.decoder.write(chunk); + if (!chunk || !state.objectMode && !chunk.length) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }}(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(function() { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + }); + } +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf (xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} + +}).call(this,require('_process')) +},{"./_stream_duplex":52,"_process":50,"buffer":43,"core-util-is":57,"events":47,"inherits":69,"isarray":48,"stream":62,"string_decoder/":63,"util":42}],55:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + + +function TransformState(options, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (!util.isNullOrUndefined(data)) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(options, this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + this.once('prefinish', function() { + if (util.isFunction(this._flush)) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} + +},{"./_stream_duplex":52,"core-util-is":57,"inherits":69}],56:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +module.exports = Writable; + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Writable.WritableState = WritableState; + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Stream = require('stream'); + +util.inherits(Writable, Stream); + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; +} + +function WritableState(options, stream) { + var Duplex = require('./_stream_duplex'); + + options = options || {}; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = options.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options.writableObjectMode; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.buffer = []; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; +} + +function Writable(options) { + var Duplex = require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, state, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!util.isBuffer(chunk) && + !util.isString(chunk) && + !util.isNullOrUndefined(chunk) && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + + if (util.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (!util.isFunction(cb)) + cb = function() {}; + + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function() { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function() { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && + !state.corked && + !state.finished && + !state.bufferProcessing && + state.buffer.length) + clearBuffer(this, state); + } +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + util.isString(chunk)) { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (util.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) + state.needDrain = true; + + if (state.writing || state.corked) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, false, len, chunk, encoding, cb); + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) + stream._writev(chunk, state.onwrite); + else + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + state.pendingcb--; + cb(er); + }); + else { + state.pendingcb--; + cb(er); + } + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(stream, state); + + if (!finished && + !state.corked && + !state.bufferProcessing && + state.buffer.length) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + + if (stream._writev && state.buffer.length > 1) { + // Fast case, write everything using _writev() + var cbs = []; + for (var c = 0; c < state.buffer.length; c++) + cbs.push(state.buffer[c].callback); + + // count the one we are adding, as well. + // TODO(isaacs) clean this up + state.pendingcb++; + doWrite(stream, state, true, state.length, state.buffer, '', function(err) { + for (var i = 0; i < cbs.length; i++) { + state.pendingcb--; + cbs[i](err); + } + }); + + // Clear buffer + state.buffer = []; + } else { + // Slow case, write chunks one-by-one + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + c++; + break; + } + } + + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; + } + + state.bufferProcessing = false; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); + +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (util.isFunction(chunk)) { + cb = chunk; + chunk = null; + encoding = null; + } else if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + + if (!util.isNullOrUndefined(chunk)) + this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(stream, state) { + return (state.ending && + state.length === 0 && + !state.finished && + !state.writing); +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else + prefinish(stream, state); + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} + +}).call(this,require('_process')) +},{"./_stream_duplex":52,"_process":50,"buffer":43,"core-util-is":57,"inherits":69,"stream":62}],57:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return Buffer.isBuffer(arg); +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} +}).call(this,require("buffer").Buffer) +},{"buffer":43}],58:[function(require,module,exports){ +module.exports = require("./lib/_stream_passthrough.js") + +},{"./lib/_stream_passthrough.js":53}],59:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = require('stream'); +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +},{"./lib/_stream_duplex.js":52,"./lib/_stream_passthrough.js":53,"./lib/_stream_readable.js":54,"./lib/_stream_transform.js":55,"./lib/_stream_writable.js":56,"stream":62}],60:[function(require,module,exports){ +module.exports = require("./lib/_stream_transform.js") + +},{"./lib/_stream_transform.js":55}],61:[function(require,module,exports){ +module.exports = require("./lib/_stream_writable.js") + +},{"./lib/_stream_writable.js":56}],62:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":47,"inherits":69,"readable-stream/duplex.js":51,"readable-stream/passthrough.js":58,"readable-stream/readable.js":59,"readable-stream/transform.js":60,"readable-stream/writable.js":61}],63:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} + +},{"buffer":43}],64:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],65:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":64,"_process":50,"inherits":69}],66:[function(require,module,exports){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +(function(global, undefined) { + var objectPrototypeToString = Object.prototype.toString; + + /*istanbul ignore next*/ + function map(arr, mapper, that) { + if (Array.prototype.map) { + return Array.prototype.map.call(arr, mapper, that); + } + + var other = new Array(arr.length); + + for (var i = 0, n = arr.length; i < n; i++) { + other[i] = mapper.call(that, arr[i], i, arr); + } + return other; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. + function canonicalize(obj, stack, replacementStack) { + stack = stack || []; + replacementStack = replacementStack || []; + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + key; + for (key in obj) { + sortedKeys.push(key); + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + key = sortedKeys[i]; + canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + return canonicalizedObj; + } + + function buildValues(components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = map(value, function(value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + + component.value = value.join(''); + } else { + component.value = newString.slice(newPos, newPos + component.count).join(''); + } + newPos += component.count; + + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = oldString.slice(oldPos, oldPos + component.count).join(''); + oldPos += component.count; + + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } + + return components; + } + + function Diff(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + } + Diff.prototype = { + diff: function(oldString, newString, callback) { + var self = this; + + function done(value) { + if (callback) { + setTimeout(function() { callback(undefined, value); }, 0); + return true; + } else { + return value; + } + } + + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return done([{ value: newString }]); + } + if (!newString) { + return done([{ value: oldString, removed: true }]); + } + if (!oldString) { + return done([{ value: newString, added: true }]); + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{value: newString.join('')}]); + } + + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } + + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function() { + // This should not happen, but we want to be safe. + /*istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + }()); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, + + pushComponent: function(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({count: commonCount}); + } + + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); + }, + tokenize: function(value) { + return value.split(''); + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + + var TrimmedLineDiff = new Diff(); + TrimmedLineDiff.ignoreTrim = true; + + LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { + var retLines = [], + lines = value.split(/^/m); + for (var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1], + lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; + + // Merge lines that may contain windows new lines + if (line === '\n' && lastLineLastChar === '\r') { + retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; + } else { + if (this.ignoreTrim) { + line = line.trim(); + // add a newline unless this is the last line. + if (i < lines.length - 1) { + line += '\n'; + } + } + retLines.push(line); + } + } + + return retLines; + }; + + var PatchDiff = new Diff(); + PatchDiff.tokenize = function(value) { + var ret = [], + linesAndNewlines = value.split(/(\n|\r\n)/); + + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } + + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2) { + ret[ret.length - 1] += line; + } else { + ret.push(line); + } + } + return ret; + }; + + var SentenceDiff = new Diff(); + SentenceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); + }; + + var JsonDiff = new Diff(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + JsonDiff.useLongestToken = true; + JsonDiff.tokenize = LineDiff.tokenize; + JsonDiff.equals = function(left, right) { + return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; + + var JsDiff = { + Diff: Diff, + + diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, + diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, + diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, + diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, + diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, + + diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, + + diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, + diffJson: function(oldObj, newObj, callback) { + return JsonDiff.diff( + typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), + typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), + callback + ); + }, + + createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + ret.push('==================================================================='); + ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = PatchDiff.diff(oldStr, newStr); + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + // Formats a given set of lines for printing as context lines in a patch + function contextLines(lines) { + return map(lines, function(entry) { return ' ' + entry; }); + } + + // Outputs the no newline at end of file warning if needed + function eofNL(curRange, i, current) { + var last = diff[diff.length - 2], + isLast = i === diff.length - 2, + isLastOfType = i === diff.length - 3 && current.added !== last.added; + + // Figure out if this is the last line for the given file and missing NL + if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + + // Output our changes + curRange.push.apply(curRange, map(lines, function(entry) { + return (current.added ? '+' : '-') + entry; + })); + eofNL(curRange, i, current); + + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length - 2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'), + hunks = [], + i = 0, + remEOFNL = false, + addEOFNL = false; + + // Skip to the first change hunk + while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { + i++; + } + + // Parse the unified diff + for (; i < diffstr.length; i++) { + if (diffstr[i][0] === '@') { + var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + hunks.unshift({ + start: chnukHeader[3], + oldlength: +chnukHeader[2], + removed: [], + newlength: chnukHeader[4], + added: [] + }); + } else if (diffstr[i][0] === '+') { + hunks[0].added.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '-') { + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === ' ') { + hunks[0].added.push(diffstr[i].substr(1)); + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '\\') { + if (diffstr[i - 1][0] === '+') { + remEOFNL = true; + } else if (diffstr[i - 1][0] === '-') { + addEOFNL = true; + } + } + } + + // Apply the diff to the input + var lines = oldStr.split('\n'); + for (i = hunks.length - 1; i >= 0; i--) { + var hunk = hunks[i]; + // Sanity check the input string. Bail if we don't match. + for (var j = 0; j < hunk.oldlength; j++) { + if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { + return false; + } + } + Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); + } + + // Handle EOFNL insertion/removal + if (remEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + } + } else if (addEOFNL) { + lines.push(''); + } + return lines.join('\n'); + }, + + convertChangesToXML: function(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes) { + var ret = [], + change, + operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } -Suite.prototype.addTest = function(test){ - test.parent = this; - test.timeout(this.timeout()); - test.enableTimeouts(this.enableTimeouts()); - test.slow(this.slow()); - test.ctx = this.ctx; - this.tests.push(test); - this.emit('test', test); - return this; -}; + ret.push([operation, change.value]); + } + return ret; + }, -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ + canonicalize: canonicalize + }; -Suite.prototype.fullTitle = function(){ - if (this.parent) { - var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; + /*istanbul ignore next */ + /*global module */ + if (typeof module !== 'undefined' && module.exports) { + module.exports = JsDiff; + } else if (typeof define === 'function' && define.amd) { + /*global define */ + define([], function() { return JsDiff; }); + } else if (typeof global.JsDiff === 'undefined') { + global.JsDiff = JsDiff; } - return this.title; -}; +}(this)); -/** - * Return the total number of tests. - * - * @return {Number} - * @api public - */ +},{}],67:[function(require,module,exports){ +'use strict'; -Suite.prototype.total = function(){ - return utils.reduce(this.suites, function(sum, suite){ - return sum + suite.total(); - }, 0) + this.tests.length; -}; +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; -/** - * Iterates through each suite recursively to find - * all tests. Applies a function in the format - * `fn(test)`. - * - * @param {Function} fn - * @return {Suite} - * @api private - */ +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } -Suite.prototype.eachTest = function(fn){ - utils.forEach(this.tests, fn); - utils.forEach(this.suites, function(suite){ - suite.eachTest(fn); - }); - return this; + return str.replace(matchOperatorsRe, '\\$&'); }; +},{}],68:[function(require,module,exports){ +(function (process){ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) + /** - * This will run the root suite if we happen to be running in delayed mode. + * Module dependencies. */ -Suite.prototype.run = function run() { - if (this.root) { - this.emit('run'); + +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; + +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; + + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; } -}; +} -}); // module: suite.js +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} -require.register("test.js", function(module, exports, require){ /** - * Module dependencies. + * Expose `growl`. */ -var Runnable = require('./runnable'); +exports = module.exports = growl; /** - * Expose `Test`. + * Node-growl version. */ -module.exports = Test; +exports.version = '1.4.1' /** - * Initialize a new `Test` with the given `title` and callback `fn`. + * Send growl notification _msg_ with _options_. * - * @param {String} title - * @param {Function} fn - * @api private + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public */ -function Test(title, fn) { - Runnable.call(this, title, fn); - this.pending = !fn; - this.type = 'test'; -} - -/** - * Inherit from `Runnable.prototype`. - */ +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; + + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; + + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, quote(image)) + break; + case 'Linux': + args.push(cmd.icon, quote(image)); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } + } -function F(){}; -F.prototype = Runnable.prototype; -Test.prototype = new F; -Test.prototype.constructor = Test; + // sticky + if (options.sticky) args.push(cmd.sticky); + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } + } -}); // module: test.js + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } -require.register("utils.js", function(module, exports, require){ -/** - * Module dependencies. - */ + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.subtitle)); + } + break; + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg)); + } else { + args.push(quote(msg)); + } + break; + case 'Windows': + args.push(quote(msg)); + if (options.title) args.push(cmd.title + quote(options.title)); + break; + } -var fs = require('browser/fs') - , path = require('browser/path') - , basename = path.basename - , exists = fs.existsSync || path.existsSync - , glob = require('browser/glob') - , join = path.join - , debug = require('browser/debug')('mocha:watch'); + // execute + exec(args.join(' '), fn); +}; + +}).call(this,require('_process')) +},{"_process":50,"child_process":41,"fs":41,"os":49,"path":41}],69:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} +},{}],70:[function(require,module,exports){ /** - * Ignored directories. + * lodash 3.1.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ - -var ignore = ['node_modules', '.git']; +var baseAssign = require('lodash._baseassign'), + baseCreate = require('lodash._basecreate'), + isIterateeCall = require('lodash._isiterateecall'); /** - * Escape special characters in the given string of html. + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. * - * @param {String} html - * @return {String} - * @api private + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} -exports.escape = function(html){ - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>'); -}; +module.exports = create; +},{"lodash._baseassign":71,"lodash._basecreate":77,"lodash._isiterateecall":78}],71:[function(require,module,exports){ /** - * Array#forEach (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} scope - * @api private + * lodash 3.2.0 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ - -exports.forEach = function(arr, fn, scope){ - for (var i = 0, l = arr.length; i < l; i++) - fn.call(scope, arr[i], i); -}; +var baseCopy = require('lodash._basecopy'), + keys = require('lodash.keys'); /** - * Array#map (<=IE8) + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. * - * @param {Array} array - * @param {Function} fn - * @param {Object} scope - * @api private - */ + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} -exports.map = function(arr, fn, scope){ - var result = []; - for (var i = 0, l = arr.length; i < l; i++) - result.push(fn.call(scope, arr[i], i, arr)); - return result; -}; +module.exports = baseAssign; +},{"lodash._basecopy":72,"lodash.keys":73}],72:[function(require,module,exports){ /** - * Array#indexOf (<=IE8) - * - * @parma {Array} arr - * @param {Object} obj to find index of - * @param {Number} start - * @api private + * lodash 3.0.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ -exports.indexOf = function(arr, obj, start){ - for (var i = start || 0, l = arr.length; i < l; i++) { - if (arr[i] === obj) - return i; - } - return -1; -}; - /** - * Array#reduce (<=IE8) + * Copies properties of `source` to `object`. * - * @param {Array} array - * @param {Function} fn - * @param {Object} initial value - * @api private + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. */ +function baseCopy(source, props, object) { + object || (object = {}); -exports.reduce = function(arr, fn, val){ - var rval = val; + var index = -1, + length = props.length; - for (var i = 0, l = arr.length; i < l; i++) { - rval = fn(rval, arr[i], i, arr); + while (++index < length) { + var key = props[index]; + object[key] = source[key]; } + return object; +} - return rval; -}; +module.exports = baseCopy; +},{}],73:[function(require,module,exports){ /** - * Array#filter (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @api private + * lodash 3.1.2 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ +var getNative = require('lodash._getnative'), + isArguments = require('lodash.isarguments'), + isArray = require('lodash.isarray'); -exports.filter = function(arr, fn){ - var ret = []; +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; - for (var i = 0, l = arr.length; i < l; i++) { - var val = arr[i]; - if (fn(val, i, arr)) ret.push(val); - } +/** Used for native method references. */ +var objectProto = Object.prototype; - return ret; -}; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); /** - * Object.keys (<=IE8) - * - * @param {Object} obj - * @return {Array} keys - * @api private + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. */ - -exports.keys = Object.keys || function(obj) { - var keys = [] - , has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 - - for (var key in obj) { - if (has.call(obj, key)) { - keys.push(key); - } - } - - return keys; -}; +var MAX_SAFE_INTEGER = 9007199254740991; /** - * Watch the given `files` for changes - * and invoke `fn(file)` on modification. + * The base implementation of `_.property` without support for deep paths. * - * @param {Array} files - * @param {Function} fn - * @api private + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. */ - -exports.watch = function(files, fn){ - var options = { interval: 100 }; - files.forEach(function(file){ - debug('file %s', file); - fs.watchFile(file, options, function(curr, prev){ - if (prev.mtime < curr.mtime) fn(file); - }); - }); -}; +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} /** - * Array.isArray (<=IE8) + * Gets the "length" property value of `object`. * - * @param {Object} obj - * @return {Boolean} - * @api private + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. */ -var isArray = Array.isArray || function (obj) { - return '[object Array]' == {}.toString.call(obj); -}; +var getLength = baseProperty('length'); /** - * @description - * Buffer.prototype.toJSON polyfill - * @type {Function} + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. */ -if(typeof Buffer !== 'undefined' && Buffer.prototype) { - Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { - return Array.prototype.slice.call(this, 0); - }; +function isArrayLike(value) { + return value != null && isLength(getLength(value)); } /** - * Ignored files. - */ + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} -function ignored(path){ - return !~ignore.indexOf(path); +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** - * Lookup files in the given `dir`. + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. * - * @return {Array} - * @api private + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; -exports.files = function(dir, ext, ret){ - ret = ret || []; - ext = ext || ['js']; - - var re = new RegExp('\\.(' + ext.join('|') + ')$'); + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); - fs.readdirSync(dir) - .filter(ignored) - .forEach(function(path){ - path = join(dir, path); - if (fs.statSync(path).isDirectory()) { - exports.files(path, ext, ret); - } else if (path.match(re)) { - ret.push(path); - } - }); + var index = -1, + result = []; - return ret; -}; + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} /** - * Compute a slug from the given `str`. + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * - * @param {String} str - * @return {String} - * @api private + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} -exports.slug = function(str){ - return str - .toLowerCase() - .replace(/ +/g, '-') - .replace(/[^-\w]/g, ''); +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; }; /** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} -exports.clean = function(str) { - str = str - .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') - .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '') - .replace(/\s+\}$/, ''); +module.exports = keys; - var spaces = str.match(/^\n?( *)/)[1].length - , tabs = str.match(/^\n?(\t*)/)[1].length - , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); +},{"lodash._getnative":74,"lodash.isarguments":75,"lodash.isarray":76}],74:[function(require,module,exports){ +/** + * lodash 3.9.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - str = str.replace(re, ''); +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; - return exports.trim(str); -}; +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; /** - * Trim the given `str`. + * Checks if `value` is object-like. * - * @param {String} str - * @return {String} - * @api private + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} -exports.trim = function(str){ - return str.replace(/^\s+|\s+$/g, ''); -}; +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * Parse the given `qs`. - * - * @param {String} qs - * @return {Object} - * @api private + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. */ +var objToString = objectProto.toString; -exports.parseQuery = function(qs){ - return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ - var i = pair.indexOf('=') - , key = pair.slice(0, i) - , val = pair.slice(++i); - - obj[key] = decodeURIComponent(val); - return obj; - }, {}); -}; +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); /** - * Highlight the given string of `js`. + * Gets the native function at `key` of `object`. * - * @param {String} js - * @return {String} - * @api private + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. */ - -function highlight(js) { - return js - .replace(//g, '>') - .replace(/\/\/(.*)/gm, '//$1') - .replace(/('.*?')/gm, '$1') - .replace(/(\d+\.\d+)/gm, '$1') - .replace(/(\d+)/gm, '$1') - .replace(/\bnew[ \t]+(\w+)/gm, 'new $1') - .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; } /** - * Highlight the contents of tag `name`. + * Checks if `value` is classified as a `Function` object. * - * @param {String} name - * @api private + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false */ - -exports.highlightTags = function(name) { - var code = document.getElementById('mocha').getElementsByTagName(name); - for (var i = 0, len = code.length; i < len; ++i) { - code[i].innerHTML = highlight(code[i].innerHTML); - } -}; +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} /** - * If a value could have properties, and has none, this function is called, which returns - * a string representation of the empty value. + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * - * Functions w/ no properties return `'[Function]'` - * Arrays w/ length === 0 return `'[]'` - * Objects w/ no properties return `'{}'` - * All else: return result of `value.toString()` + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example * - * @param {*} value Value to inspect - * @param {string} [type] The type of the value, if known. - * @returns {string} + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false */ -var emptyRepresentation = function emptyRepresentation(value, type) { - type = type || exports.type(value); - - switch(type) { - case 'function': - return '[Function]'; - case 'object': - return '{}'; - case 'array': - return '[]'; - default: - return value.toString(); - } -}; +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} /** - * Takes some variable and asks `{}.toString()` what it thinks it is. - * @param {*} value Anything + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. * @example - * type({}) // 'object' - * type([]) // 'array' - * type(1) // 'number' - * type(false) // 'boolean' - * type(Infinity) // 'number' - * type(null) // 'null' - * type(new Date()) // 'date' - * type(/foo/) // 'regexp' - * type('type') // 'string' - * type(global) // 'global' - * @api private - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString - * @returns {string} + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false */ -exports.type = function type(value) { - if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - return 'buffer'; +function isNative(value) { + if (value == null) { + return false; } - return Object.prototype.toString.call(value) - .replace(/^\[.+\s(.+?)\]$/, '$1') - .toLowerCase(); -}; + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = getNative; +},{}],75:[function(require,module,exports){ /** - * @summary Stringify `value`. - * @description Different behavior depending on type of value. - * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. - * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. - * - If `value` is an *empty* object, function, or array, return result of function - * {@link emptyRepresentation}. - * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of - * JSON.stringify(). + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** + * Checks if `value` is object-like. * - * @see exports.type - * @param {*} value - * @return {string} - * @api private + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} -exports.stringify = function(value) { - var type = exports.type(value); +/** Used for native method references. */ +var objectProto = Object.prototype; - if (!~exports.indexOf(['object', 'array', 'function'], type)) { - if(type != 'buffer') { - return jsonStringify(value); - } - var json = value.toJSON(); - // Based on the toJSON result - return jsonStringify(json.data && json.type ? json.data : json, 2) - .replace(/,(\n|$)/g, '$1'); - } +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - for (var prop in value) { - if (Object.prototype.hasOwnProperty.call(value, prop)) { - return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); - } - } +/** Native method references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; - return emptyRepresentation(value, type); -}; +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; /** - * @description - * like JSON.stringify but more sense. - * @param {Object} object - * @param {Number=} spaces - * @param {number=} depth - * @returns {*} + * The base implementation of `_.property` without support for deep paths. + * * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. */ -function jsonStringify(object, spaces, depth) { - if(typeof spaces == 'undefined') return _stringify(object); // primitive types +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} - depth = depth || 1; - var space = spaces * depth - , str = isArray(object) ? '[' : '{' - , end = isArray(object) ? ']' : '}' - , length = object.length || exports.keys(object).length - , repeat = function(s, n) { return new Array(n).join(s); }; // `.repeat()` polyfill +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); - function _stringify(val) { - switch (exports.type(val)) { - case 'null': - case 'undefined': - val = '[' + val + ']'; - break; - case 'array': - case 'object': - val = jsonStringify(val, spaces, depth + 1); - break; - case 'boolean': - case 'regexp': - case 'number': - val = val === 0 && (1/val) === -Infinity // `-0` - ? '-0' - : val.toString(); - break; - case 'date': - val = '[Date: ' + val.toISOString() + ']'; - break; - case 'buffer': - var json = val.toJSON(); - // Based on the toJSON result - json = json.data && json.type ? json.data : json; - val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; - break; - default: - val = (val == '[Function]' || val == '[Circular]') - ? val - : '"' + val + '"'; //string - } - return val; - } +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} - for(var i in object) { - if(!object.hasOwnProperty(i)) continue; // not my business - --length; - str += '\n ' + repeat(' ', space) - + (isArray(object) ? '' : '"' + i + '": ') // key - + _stringify(object[i]) // value - + (length ? ',' : ''); // comma - } +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} - return str + (str.length != 1 // [], {} - ? '\n' + repeat(' ', --space) + end - : end); +/** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); } +module.exports = isArguments; + +},{}],76:[function(require,module,exports){ /** - * Return if obj is a Buffer - * @param {Object} arg - * @return {Boolean} - * @api private + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ -exports.isBuffer = function (arg) { - return typeof Buffer !== 'undefined' && Buffer.isBuffer(arg); -}; + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]', + funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; /** - * @summary Return a new Thing that has the keys in sorted order. Recursive. - * @description If the Thing... - * - has already been seen, return string `'[Circular]'` - * - is `undefined`, return string `'[undefined]'` - * - is `null`, return value `null` - * - is some other primitive, return the value - * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method - * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. - * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` + * Checks if `value` is object-like. * - * @param {*} value Thing to inspect. May or may not have properties. - * @param {Array} [stack=[]] Stack of seen values - * @return {(Object|Array|Function|string|undefined)} - * @see {@link exports.stringify} - * @api private + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} -exports.canonicalize = function(value, stack) { - var canonicalizedObj, - type = exports.type(value), - prop, - withStack = function withStack(value, fn) { - stack.push(value); - fn(); - stack.pop(); - }; +/** Used for native method references. */ +var objectProto = Object.prototype; - stack = stack || []; +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; - if (exports.indexOf(stack, value) !== -1) { - return '[Circular]'; - } +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - switch(type) { - case 'undefined': - case 'buffer': - case 'null': - canonicalizedObj = value; - break; - case 'array': - withStack(value, function () { - canonicalizedObj = exports.map(value, function (item) { - return exports.canonicalize(item, stack); - }); - }); - break; - case 'function': - for (prop in value) { - canonicalizedObj = {}; - break; - } - if (!canonicalizedObj) { - canonicalizedObj = emptyRepresentation(value, type); - break; - } - /* falls through */ - case 'object': - canonicalizedObj = canonicalizedObj || {}; - withStack(value, function () { - exports.forEach(exports.keys(value).sort(), function (key) { - canonicalizedObj[key] = exports.canonicalize(value[key], stack); - }); - }); - break; - case 'date': - case 'number': - case 'regexp': - case 'boolean': - canonicalizedObj = value; - break; - default: - canonicalizedObj = value.toString(); - } +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; - return canonicalizedObj; +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; }; /** - * Lookup file names at the given `path`. + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false */ -exports.lookupFiles = function lookupFiles(path, extensions, recursive) { - var files = []; - var re = new RegExp('\\.(' + extensions.join('|') + ')$'); +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} - if (!exists(path)) { - if (exists(path + '.js')) { - path += '.js'; - } else { - files = glob.sync(path); - if (!files.length) throw new Error("cannot resolve path (or pattern) '" + path + "'"); - return files; - } - } +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} - try { - var stat = fs.statSync(path); - if (stat.isFile()) return path; +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; } - catch (ignored) { - return; + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); } + return isObjectLike(value) && reIsHostCtor.test(value); +} - fs.readdirSync(path).forEach(function(file) { - file = join(path, file); - try { - var stat = fs.statSync(file); - if (stat.isDirectory()) { - if (recursive) { - files = files.concat(lookupFiles(file, extensions, recursive)); - } - return; - } - } - catch (ignored) { - return; - } - if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') return; - files.push(file); - }); +module.exports = isArray; - return files; -}; +},{}],77:[function(require,module,exports){ +/** + * lodash 3.0.3 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ /** - * Generate an undefined error with a message warning the user. + * The base implementation of `_.create` without support for assigning + * properties to the created object. * - * @return {Error} + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} -exports.undefinedError = function() { - return new Error('Caught undefined error, did you throw without specifying what?'); -}; +module.exports = baseCreate; +},{}],78:[function(require,module,exports){ /** - * Generate an undefined error if `err` is not defined. - * - * @param {Error} err - * @return {Error} + * lodash 3.0.9 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ -exports.getError = function(err) { - return err || exports.undefinedError(); -}; +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; +/** + * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; /** - * @summary - * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) - * @description - * When invoking this function you get a filter function that get the Error.stack as an input, - * and return a prettify output. - * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). - * @returns {Function} + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} -exports.stackTraceFilter = function() { - var slash = '/' - , is = typeof document === 'undefined' - ? { node: true } - : { browser: true } - , cwd = is.node - ? process.cwd() + slash - : location.href.replace(/\/[^\/]*$/, '/'); +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); - function isNodeModule (line) { - return (~line.indexOf('node_modules')); - } +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} - function isMochaInternal (line) { - return (~line.indexOf('node_modules' + slash + 'mocha')) || - (~line.indexOf('components' + slash + 'mochajs')) || - (~line.indexOf('components' + slash + 'mocha')); - } +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} - // node_modules, bower, componentJS - function isBrowserModule(line) { - return (~line.indexOf('node_modules')) || - (~line.indexOf('components')); +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; } - - function isNodeInternal (line) { - return (~line.indexOf('(timers.js:')) || - (~line.indexOf('(events.js:')) || - (~line.indexOf('(node.js:')) || - (~line.indexOf('(module.js:')) || - (~line.indexOf('GeneratorFunctionPrototype.next (native)')) || - false + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); } + return false; +} - return function(stack) { - stack = stack.split('\n'); +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} - stack = exports.reduce(stack, function(list, line) { - if (is.node && (isNodeModule(line) || - isMochaInternal(line) || - isNodeInternal(line))) - return list; +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} - if (is.browser && (isBrowserModule(line))) - return list; +module.exports = isIterateeCall; - // Clean up cwd(absolute) - list.push(line.replace(cwd, '')); - return list; - }, []); +},{}],79:[function(require,module,exports){ +(function (process,global){ +var Mocha = require('../'); - return stack.join('\n'); - } -}; -}); // module: utils.js -// The global object is "self" in Web Workers. -var global = (function() { return this; })(); +/** + * Create a Mocha instance. + * + * @return {undefined} + */ + +var mocha = new Mocha({ reporter: 'html' }); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -6414,19 +13045,6 @@ var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; -/** - * Node shims. - * - * These are meant only to allow - * mocha.js to run untouched, not - * to allow running node code in - * the browser. - */ - -var process = {}; -process.exit = function(status){}; -process.stdout = {}; - var uncaughtExceptionHandlers = []; var originalOnerrorHandler = global.onerror; @@ -6462,13 +13080,6 @@ process.on = function(e, fn){ } }; -/** - * Expose mocha. - */ - -var Mocha = global.Mocha = require('mocha'), - mocha = global.mocha = new Mocha({ reporter: 'html' }); - // The BDD UI is registered by default, but no UI will be functional in the // browser without an explicit call to the overridden `mocha.ui` (see below). // Ensure that this default UI does not expose its methods to the global scope. @@ -6556,9 +13167,25 @@ mocha.run = function(fn){ }); }; +/** + * Shim process.stdout. + */ + +process.stdout = require('browser-stdout')(); + /** * Expose the process shim. + * https://github.com/mochajs/mocha/pull/916 */ Mocha.process = process; -})(); + +/** + * Expose mocha. + */ + +window.Mocha = Mocha; +window.mocha = mocha; + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../":1,"_process":50,"browser-stdout":40}]},{},[79]); diff --git a/package.json b/package.json index fb7a8476b4..d3ebaec6a0 100644 --- a/package.json +++ b/package.json @@ -263,7 +263,6 @@ "boneskull " ], "main": "./index", - "browser": "./mocha.js", "bin": { "mocha": "./bin/mocha", "_mocha": "./bin/_mocha" @@ -287,9 +286,12 @@ "supports-color": "1.2.0" }, "devDependencies": { + "browser-stdout": "^1.2.0", + "browserify": "10.2.4", "coffee-script": "~1.8.0", "eslint": "~0.23.0", - "should": "~4.0.0" + "should": "~4.0.0", + "through2": "~0.6.5" }, "files": [ "bin", @@ -300,6 +302,11 @@ "mocha.js", "LICENSE" ], + "browser": { + "debug": "./lib/browser/debug.js", + "events": "./lib/browser/events.js", + "tty": "./lib/browser/tty.js" + }, "licenses": [ { "type": "MIT", diff --git a/support/tail.js b/support/browser-entry.js similarity index 89% rename from support/tail.js rename to support/browser-entry.js index 030177aad7..7655807fae 100644 --- a/support/tail.js +++ b/support/browser-entry.js @@ -1,5 +1,12 @@ -// The global object is "self" in Web Workers. -var global = (function() { return this; })(); +var Mocha = require('../'); + +/** + * Create a Mocha instance. + * + * @return {undefined} + */ + +var mocha = new Mocha({ reporter: 'html' }); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -11,19 +18,6 @@ var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; -/** - * Node shims. - * - * These are meant only to allow - * mocha.js to run untouched, not - * to allow running node code in - * the browser. - */ - -var process = {}; -process.exit = function(status){}; -process.stdout = {}; - var uncaughtExceptionHandlers = []; var originalOnerrorHandler = global.onerror; @@ -59,13 +53,6 @@ process.on = function(e, fn){ } }; -/** - * Expose mocha. - */ - -var Mocha = global.Mocha = require('mocha'), - mocha = global.mocha = new Mocha({ reporter: 'html' }); - // The BDD UI is registered by default, but no UI will be functional in the // browser without an explicit call to the overridden `mocha.ui` (see below). // Ensure that this default UI does not expose its methods to the global scope. @@ -153,8 +140,22 @@ mocha.run = function(fn){ }); }; +/** + * Shim process.stdout. + */ + +process.stdout = require('browser-stdout')(); + /** * Expose the process shim. + * https://github.com/mochajs/mocha/pull/916 */ Mocha.process = process; + +/** + * Expose mocha. + */ + +window.Mocha = Mocha; +window.mocha = mocha; diff --git a/support/compile.js b/support/compile.js deleted file mode 100644 index cd99fc47bc..0000000000 --- a/support/compile.js +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Module dependencies. - */ - -var fs = require('fs'); - -/** - * Arguments. - */ - -var args = process.argv.slice(2) - , pending = args.length - , files = {}; - -console.log(''); - -// parse arguments - -args.forEach(function(file){ - var mod = file.replace('lib/', ''); - fs.readFile(file, 'utf8', function(err, js){ - if (err) throw err; - console.log(' \u001b[90mcompile : \u001b[0m\u001b[36m%s\u001b[0m', file); - files[file] = ~js.indexOf('require: off') - ? js - : parse(js); - --pending || compile(); - }); -}); - -/** - * Parse the given `js`. - */ - -function parse(js) { - return parseRequires(js); -} - -/** - * Parse requires. - */ - -function parseRequires(js) { - return js - .replace(/require\('events'\)/g , "require('browser/events')") - .replace(/require\('debug'\)/g , "require('browser/debug')") - .replace(/require\('path'\)/g , "require('browser/path')") - .replace(/require\('diff'\)/g , "require('browser/diff')") - .replace(/require\('tty'\)/g , "require('browser/tty')") - .replace(/require\('escape-string-regexp'\)/g , "require('browser/escape-string-regexp')") - .replace(/require\('glob'\)/g , "require('browser/glob')") - .replace(/require\('fs'\)/g , "require('browser/fs')"); -} - -/** - * Compile the files. - */ - -function compile() { - var buf = ''; - buf += '\n// CommonJS require()\n\n'; - buf += browser.require + '\n\n'; - buf += 'require.modules = {};\n\n'; - buf += 'require.resolve = ' + browser.resolve + ';\n\n'; - buf += 'require.register = ' + browser.register + ';\n\n'; - buf += 'require.relative = ' + browser.relative + ';\n\n'; - args.forEach(function(file){ - var js = files[file]; - file = file.replace('lib/', ''); - buf += '\nrequire.register("' + file + '", function(module, exports, require){\n'; - buf += js; - buf += '\n}); // module: ' + file + '\n'; - }); - fs.writeFile('_mocha.js', buf, function(err){ - if (err) throw err; - console.log(' \u001b[90m create : \u001b[0m\u001b[36m%s\u001b[0m', 'mocha.js'); - console.log(); - }); -} - -// refactored version of weepy's -// https://github.com/weepy/brequire/blob/master/browser/brequire.js - -var browser = { - - /** - * Require a module. - */ - - require: function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - }, - - /** - * Resolve module path. - */ - - resolve: function(path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }, - - /** - * Return relative require(). - */ - - relative: function(parent) { - return function(p){ - if ('.' != p.charAt(0)) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }, - - /** - * Register a module. - */ - - register: function(path, fn){ - require.modules[path] = fn; - } -}; diff --git a/support/foot.js b/support/foot.js deleted file mode 100644 index 0319a0fe5f..0000000000 --- a/support/foot.js +++ /dev/null @@ -1 +0,0 @@ -})(); diff --git a/support/head.js b/support/head.js deleted file mode 100644 index 55d38175ec..0000000000 --- a/support/head.js +++ /dev/null @@ -1 +0,0 @@ -;(function(){ From 864ec2077ac8114449099f53189779a257a4e517 Mon Sep 17 00:00:00 2001 From: Duncan Beevers Date: Tue, 25 Nov 2014 07:06:10 -0600 Subject: [PATCH 0311/1771] Decorate failed hook titles with test title Fixes #1230 --- lib/runner.js | 5 +++++ test/runner.js | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/runner.js b/lib/runner.js index f6a8fc2437..0e3309473b 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -245,6 +245,11 @@ Runner.prototype.fail = function(test, err) { * @param {Error} err */ Runner.prototype.failHook = function(hook, err) { + if (hook.ctx && hook.ctx.currentTest) { + hook.originalTitle = hook.originalTitle || hook.title; + hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"'; + } + this.fail(hook, err); if (this.suite.bail()) { this.emit('end'); diff --git a/test/runner.js b/test/runner.js index 08a5ce3e78..1e023143a2 100644 --- a/test/runner.js +++ b/test/runner.js @@ -275,6 +275,19 @@ describe('Runner', function(){ runner.failures.should.equal(2); }) + it('should augment hook title with current test title', function(){ + var hook = { + title: '"before each" hook', + ctx: { currentTest: new Test('should behave') } + }; + runner.failHook(hook, {}); + hook.title.should.equal('"before each" hook for "should behave"'); + + hook.ctx.currentTest = new Test('should obey'); + runner.failHook(hook, {}); + hook.title.should.equal('"before each" hook for "should obey"'); + }) + it('should emit "fail"', function(done){ var hook = {}, err = {}; runner.on('fail', function(hook, err){ From b325391d04b54c02fd65fa28b49f35db7a8374f3 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 20:35:58 +0200 Subject: [PATCH 0312/1771] Revert "Adds maintainers to package.json and footer." This reverts commit b8689990f4f75aaa65ea675093b98cfce6ce142d. --- _includes/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index d4fbe54982..300314d5c6 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,3 +1,3 @@
              - © 2011-2015 TJ Holowaychuk, Travis Jeffery, Christopher Hiller & Joshua Boy Nicolai Appelman. All rights reserved. Licensed MIT + © 2011-2015 TJ Holowaychuk. All rights reserved. Licensed MIT
              From b79170a673513cb13de05812d315d3dc6ffd2814 Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Sun, 5 Jul 2015 13:40:46 -0700 Subject: [PATCH 0313/1771] Remove TODO from Browserify transition --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 656916c806..53cb5657a1 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ SUPPORT = $(wildcard support/*.js) all: mocha.js -# TODO: Remove filesize echos, just for comparison during browserify transition mocha.js: $(SRC) $(SUPPORT) @$(BROWSERIFY) ./support/browser-entry \ --ignore 'fs' \ From ee695d9b7ced2bb8a3ee7d66d69677ca0ef4144f Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 23:45:42 +0200 Subject: [PATCH 0314/1771] Completely reverts licence to original version. --- _includes/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index 300314d5c6..9d5c068ac4 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,3 +1,3 @@
              - © 2011-2015 TJ Holowaychuk. All rights reserved. Licensed MIT + © 2011 TJ Holowaychuk. All rights reserved. Licensed MIT
              From 1a68cc2f102dcf73dc53515aed9112360632b1b4 Mon Sep 17 00:00:00 2001 From: Tingan Ho Date: Tue, 16 Jun 2015 10:47:42 +0800 Subject: [PATCH 0315/1771] Fixes maximum call stack error --- lib/runner.js | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index f6a8fc2437..a7c65cad18 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -71,7 +71,8 @@ function Runner(suite, delay) { this.on('hook end', function(hook) { self.checkGlobals(hook); }); - this.grep(/.*/); + this._defaultGrep = /.*/; + this.grep(this._defaultGrep); this.globals(this.globalProps().concat(extraGlobals())); } @@ -470,7 +471,20 @@ Runner.prototype.runTests = function(suite, fn) { match = !match; } if (!match) { - return next(); + // Run immediately only if we have defined a grep. When we + // define a grep — It can cause maximum callstack error if + // the grep is doing a large recursive loop by neglecting + // all tests. The run immediately function also comes with + // a performance cost. So we don't want to run immediately + // if we run the whole test suite, because running the whole + // test suite don't do any immediate recursive loops. Thus, + // allowing a JS runtime to breathe. + if (self._grep !== self._defaultGrep) { + Runner.immediately(next); + } else { + next(); + } + return; } // pending @@ -563,7 +577,17 @@ Runner.prototype.runSuite = function(suite, fn) { if (!curr) { return done(); } - self.runSuite(curr, next); + + // Avoid grep neglecting large number of tests causing a + // huge recursive loop and thus a maximum call stack error. + // See comment in `this.runTests()` for more information. + if (self._grep !== self._defaultGrep) { + Runner.immediately(function() { + self.runSuite(curr, next); + }); + } else { + self.runSuite(curr, next); + } } function done(errSuite) { From 31f3e80cdce09707f3b6035b9314ebe3e08b5179 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Mon, 6 Jul 2015 17:51:11 +0800 Subject: [PATCH 0316/1771] Update example CDN URLs --- index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.md b/index.md index e39cda4b2d..01a6339ffb 100644 --- a/index.md +++ b/index.md @@ -887,14 +887,14 @@ A typical setup might look something like the following, where we call `mocha.se Mocha Tests - +
              - - - + + + From 3186f53c4c97fa177e98cb62b09578fe69d0e0c3 Mon Sep 17 00:00:00 2001 From: Sune Simonsen Date: Mon, 6 Jul 2015 21:43:40 +0200 Subject: [PATCH 0317/1771] Fix: html-runner crashing because of missing process.stdout shim When running mocha in the browser you get a crash in the following code: if (isatty) { exports.window.width = process.stdout.getWindowSize ? process.stdout.getWindowSize(1)[0] : tty.getWindowSize()[1]; } That is because we need to shim the process.stdout before requiring mocha from browser-entry.js, I fixed that by moving it to the top of the file. --- support/browser-entry.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/support/browser-entry.js b/support/browser-entry.js index 7655807fae..c711ce3e3a 100644 --- a/support/browser-entry.js +++ b/support/browser-entry.js @@ -1,3 +1,9 @@ +/** + * Shim process.stdout. + */ + +process.stdout = require('browser-stdout')(); + var Mocha = require('../'); /** @@ -140,12 +146,6 @@ mocha.run = function(fn){ }); }; -/** - * Shim process.stdout. - */ - -process.stdout = require('browser-stdout')(); - /** * Expose the process shim. * https://github.com/mochajs/mocha/pull/916 From 952dca73d1c24132b0fb8e30e3300b5346f0f1c1 Mon Sep 17 00:00:00 2001 From: Guy Arye Date: Mon, 6 Jul 2015 14:57:03 +0300 Subject: [PATCH 0318/1771] Scope loading behaviour instead of using early return Fails under babel_node node_modules/mocha/bin/_mocha Transformation error; return original code { [SyntaxError: node_modules/mocha/bin/_mocha: 'return' outside of function (392:2)] pos: 9902, loc: { line: 392, column: 2 }, raisedAt: 9908, _babel: true, codeFrame: ' 390 | });\n 391 | \n> 392 | return;\n | ^\n 393 | }\n 394 | \n 395 | // load' } based on advice from @oakfang Signed-off-by: Joshua Appelman Closes #1787 --- bin/_mocha | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 63ab9a42e5..1129178b54 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -393,13 +393,14 @@ if (program.watch) { } }); - return; -} +} else { // load -mocha.files = files; -runner = mocha.run(program.exit ? exit : exitLater); + mocha.files = files; + runner = mocha.run(program.exit ? exit : exitLater); + +} function exitLater(code) { process.on('exit', function() { process.exit(code) }) From 66df628bed1ce4bcfe4e3419f5320fa373cb68b7 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 10 Jul 2015 12:41:12 -0700 Subject: [PATCH 0319/1771] add google analytics; closes #2 --- _includes/ga.html | 10 ++++++++++ _layouts/default.html | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 _includes/ga.html diff --git a/_includes/ga.html b/_includes/ga.html new file mode 100644 index 0000000000..94bc6dc8f0 --- /dev/null +++ b/_includes/ga.html @@ -0,0 +1,10 @@ + diff --git a/_layouts/default.html b/_layouts/default.html index f71fd1faff..1e338b2e45 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -12,7 +12,7 @@ {% include footer.html %} - + {% include ga.html %} From f53300dd7100e481724c328b52fdc1a509e65225 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 11 Jul 2015 21:11:54 -0700 Subject: [PATCH 0320/1771] correct default reporter --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 01a6339ffb..bb8cdab4d9 100644 --- a/index.md +++ b/index.md @@ -565,7 +565,7 @@ The `--ui` option lets you specify the interface to use, defaulting to "bdd". ### `-R, --reporter ` -The `--reporter` option allows you to specify the reporter that will be used, defaulting to "dot". This flag may also be used to utilize third-party reporters. For example if you `npm install mocha-lcov-reporter` you may then do `--reporter mocha-lcov-reporter`. +The `--reporter` option allows you to specify the reporter that will be used, defaulting to "spec". This flag may also be used to utilize third-party reporters. For example if you `npm install mocha-lcov-reporter` you may then do `--reporter mocha-lcov-reporter`. ### `-t, --timeout ` From b2def32ac70b666bd095beae840a58a9e4ec18ea Mon Sep 17 00:00:00 2001 From: Nik Nyby Date: Mon, 13 Jul 2015 11:28:58 -0400 Subject: [PATCH 0321/1771] Fix broken link to mocha-opts anchor tag http://mochajs.org/#mochaopts doesn't work, but http://mochajs.org/#mocha-opts does. --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index bb8cdab4d9..4acbba68a0 100644 --- a/index.md +++ b/index.md @@ -60,7 +60,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no - [Interfaces](#interfaces) - [Reporters](#reporters) - [Running Mocha in the Browser](#running-mocha-in-the-browser) -- [`mocha.opts`](#mochaopts) +- [`mocha.opts`](#mocha-opts) - [The `test/` Directory](#the-test-directory) - [Editor Plugins](#editor-plugins) - [Examples](#examples) From 058d551570365060966b8eb9f4093695e601319c Mon Sep 17 00:00:00 2001 From: Artem Govorov Date: Thu, 16 Jul 2015 16:26:47 +1000 Subject: [PATCH 0322/1771] Added wallaby.js plugin to Editor Plugins section --- images/wallaby.png | Bin 0 -> 49021 bytes index.md | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 images/wallaby.png diff --git a/images/wallaby.png b/images/wallaby.png new file mode 100644 index 0000000000000000000000000000000000000000..ac68bac80eb53587aa09ba4a89e909efd541462a GIT binary patch literal 49021 zcmcGW^+VKK)4&yx5J8ac?(S{`>F$*7PU#Rty1To(ySrmy>28p2co)6i=lTb{{^Bxw zc24Yk&zbqmoDGzb5`le(@$S{DSFoa=h2&nn0_%VE>NPwR1V~as<5K|o@3ozrh`_7T zQLH`CYgH2k6?+v)2@X9g3z{$bR=Nf>&KB07Rn zf&=vWMNCV8_p6D$88?B7qzs;*m8}6DGYu0B9RbffJUl!uTYW1!}nZ9+oOvK4NhVVe&JlCX#hY{rI3&`khbWYJ0(?+VukrD~{k-7e!35H;5TQyQHKTFf{ZIDN;2HY6 z&mk}60Qo=detk#=66(8;1|)=PBiVn&tGuse!yk=^*}wf#`H%knS0L#@JDxb|U*ZQ+ zymyt)#YA~8z5f{sA2uG|J6mit{k_cpioKq}h4`=1Vm6Wf*VGF>{|!i5`o@<^^Dptw zG%vFLr>e;0f3?1h#=#3Db zcW0XeQIB!f6`R8ezWfLX@rkkx5JnQrWK9PSRK`mfyfjzJ+qw^PcL;}y~=d>s+%??~pi=}$G_7t6F6vfWkI zx&oLLe&0%(mg7c5>?}+wZn-v-l3q0dsnHnd)W3(i2IyJPbs|<;OUpJ8&VXg(1;cU(A@P+%g#v)ys!f3VbAj)qO zlIucjOGtND^BrT^Rz@ViD^s&#&h&~>d<1j&?v)Yr$>N}GgFY@P=&kyD0)llqZp6>n zR-Q;G^iX#8V^a)~1GxgUdY8^jrK9RUz@6UCKi$aNxvKoUqfyQd!nLUvs?TnSv1=5s z=f+_9DsiOddoDqHUYNkPB|*>4aeGH*x}rGOjL_erZnuK=O~Rd3;;#J|hqu+zj=SPg zduKAkDyR$Fk9r286raj-`hd*@DCX*uA)%gFSL-Y;NNj+?Iy3f^@RP|Z=qRyYLC*k_ zFwShCp1xMa{dutzn$Zc{L9#vsa%X0ri87C(SjgQg>}k(A!DDn7ZFkW0==w0tVzJtu zQPzt(Z5HCW)Fr8UP|LS=l4ON@8ET(M@_iRsu4$WUBAc14t_O3!VvtJGfv ze011J-YEjqZ;X1RI$LB%MQO(FBrhm57Xms}7?kesqVl4DpJl^k+m8AaG=@mzNP zdXQFU8(IhpXTH^}jVP=)wv}vtskc?!U7UQ}sKB*U#(!?>pN8y^vJ31?BV1zMF%P?s zz+{Z8a5zZ&!nw5Nl6vBz0-#yCG#}bi3)rjKoTQ=H^Eg(ukkNGY;0(OHerOX)>3)djvF>LprE`l#M-~`w?1AitUVPnJH1xi|IDSU2ZlJFZN!_j zb%~HQ?;1sSVbCORRhJ5fyB!rYX=6GWC1u9MU3$!ELMU}mQtQp^8*B{|v0z1V2eA|| zSN}onoP*~UFL7RajyKUgzU4B^rGW24+%E8AEA~l+0uL z&T_NSfZjAHwufv)owFroYBG4){d&wV4`j&EjHZ4l%6n$IOdOM!^_~$&K3unVcKs<# zC@IVhh9@zlVQ-Z(Jq?enyAKRP`2#$FM#CkZ7cSky0U!LjDq1YLQAni7FwaC7#*bEB-HdcVY<1E^>s&H zi=x!-?K8wBco*m|hki~&t6!;XkP$@yZ9|FBWVrgJ=Tp+WCEJB&Rt_UL8b6xmzsYkC zwj_D%@OCaG%4xVZY3`*mA1q_$p&ZK{BVnf|e}9BQjaqL)knFva3$Ke3;6~Jo<3K(W zV_oM$xmf0eF>ReI*&oz9sJ_Oseu+sxUFMx)?dPdE6r&H*#OQBDF|!rEc{PNt>l|;avg$7@=FC!_o9J zB1p77>VDMeT&NXvqIn=#tAsxeYEm-x;Kh>U>L(;ZJk(&IwWB{W9BXkSN=~BOX#h*+ z;{&5l*z?k8Z!IjvrldRPeZX?WBgQsP9?yv()bm+$^|aHs6qFk?OsrO?rD)$J^T&;3 zHeZD;G#KEsSeyh(WepTUR=QbDTrUaj?^f*AM?|v_3bu$MXisP@>=l)(eudrFjwuba zT?_2qEcpW~2wRgtoP{W_dZOY9aXpO_+ruGgMpo|5xqQ;{ zbQ@sr?!1rV7+&mYa_q8OR6ST^Q5STcsW#Ni zT*JTi)^Obw9+}5Es*)Qxs44{LNF>`je3tw$n$2(z$Vx6 zi`u`S7Sq3m`D(+}#?%uR=ec3`NW^pLjx9*3KAd;M=8FC`ExN?6;b)PeaDtoX*bdca z!t2mLlBk*xeX(SaiK23Phc_^ZjwzEiQ@`0MI{cI-C0`2JW1tsXY~V8SA;&&F7G4KH ze5QesxYK;PiHy&3sS#rH;jX#p49?r2in-pu>B#v6{JuRDvP4oi!6>R-_2jG#%KQgWBz-5uNelrpth@amLO2Q{wZ0 zxJ?AG87Uol+bKS2)53hL^GRE$sLPwIW{P`8Wlk{HZ_V}wSP5E)kyRBervf$W1jT@% zYq#F%)6bHbA({O?*fKie9)`8RZ?xl?uV)AoK<+FXEx3TQ1FX|PGy8Y4(NYCx>aB}F z-3Xf;0waM{0eGD{h$PMcCD*6~#VVYtw_o2<&MQV|)rc(9N`c|5oSVNb?KDLK!osL@ zz}b_w1|eott3gd;fMwzV5;LMh|KpwWL4o`7VaI2qzLy{n{I5@%Ui#vymIhZ}{N=&6 z(}I-Te-mW@xrKi`d_JgY|b-6SqqRx{P zw}o_g0~yBg@SP1;&z?vBZUT9L;2$@CwHe;poEiK3h28<{+6}}4Nty7Ln$|32$=x-x zSY$nh5FUMx0ArC0A+lN#fqe&oSxgdFFYn8T~9%BK?EHP)Ndd}2g9%f2O;2Y0(B8vzJ^4MW_nj3@~`;4)h z!4A|#1Dl#T)p~9xvx+v2?|kf zne`_^%fAw{#jsGu8%d|7foC5eS`ctORS7WSRKs&a*R;r`TV&?oxSO5M4=AMN{&fCs z6Zn&4idgRzsi8$+LTxNCC1ev^S7c!Wc&D>68xylp&m=Ke+gHT%-d0x3V%U7|JW9@; z(N4bp@v>{XV#}tgW{N#@N;et4H*aBM=S{*?ie6C&XPmpoI1ArUh;*m zx(*B>d5SS@)%vaDMmpSfI>FhqQT4KdaB3EM$us zUK4+z7d$nblud86x4$8BkkEKOh~0}vgO4~BRlsl^UNutEy5}*w^C`EG5N1K;K2P0? zJ?b%fuZo)fdk85HOGjvGcW{!Q-!!^Z+&ei-qwpRsDZTxE^mgw`JhM`)(QBl%TqAYt zT1N<(v^LcOk29u>Ck{yvjJc+zm|R>0qR8kLISL<4Ls{XT{p}> zTZA>C4l|V9&M5PD2jQ)f1>+H^1S60e&w-1gRc{?z2+(A*jOfs-^~P_=~9@Pqv{^7r9y)2byQ zrCW#G3-k*d;}Zeiv-6yXr{Kbrs5qrTdHS(?=2h$&>A5mZP^>irSCha3T=63AFqT@s z;RtQYyqX1W$sho*_|!2hFCyFqfY;Dw28bkOx=yyG`Db@(_vM4?tKS>`137T0cV2>h z?;t-f3-_&R(Rrr53W_jHn#f}@#@{RgFCV`jsf#<7L}y z?-A!ys;GDFlTv%>;`Qqqx5Zo4?Cx}yz>mMbW8h~#s{R@qg&gU>s6q@0h+^bSi1Pnu z^M&#THAdP5vK3B}{v{RzA&7>_-R$%~kJHP$d=^9?6&6^Edr^Ohb3iyo!^B=r=C4D5 zaXfhnSRNA%CK{emwtCZOF(86yShFP4%Y@}eRn zi^Bc)gkS$2c|H>e=}?A9z55FmO$)yqFTJucJb#@!3W*@{5+h9d_AmTnN(fS6wvjKE z_U|75qMSk!v_@iCQ9ggIXH5i1#sAYX>*V7}r*bv0T-88akiU^9%q1Y~ryhvM@cs_9 zU{=Vw#%@QKKX{pz#&Z+ocW*k~$L`Db-n@+8?jgnz=WNRht*bm_Cxa#6^9LHPS#Y03 z`GVE@++ZDLF8KOAlz^H+MZ#(}jn9FMZHzuW}(krLkJ2N>3cWvpYVVpOdDo8eco@n~2c*SQx;k z`{QkFG}bUWQotdeLV_UBaPdOogDCXCyb9+CVIz>BUUP#UH&&>QVlP*Rl4NUM?Jw^DQgdq+P_JSqe`YLStaa&yuUPqKy%{8N{T!86) zk2ID**#X6TtR|ofZ7>-;X!bB zFFa`Iv_~4x5U8dSO)xyWZZBak8%<#rRZM^?2PBaWBh49+HyD~1uG}aRVZWM(nH&d1 zW@=e^cz>JJfpWy-SPdKwUDQtx;v#KU8y^=jVn+)6knHp7)6xxeA674*vimo+U>+Gnv~5`;quunF9?N`hY%RZk!f3iOpb%PvhHc z4oxa1TEw$n>&B{a`0@i^o{&V7{aF4P&dE6k-yxIB3L9>RW=2g+EqC;tx%qqj-+X5D z=wcQH8#zpnkY-dOFg{gc_ENtDFdDtjHQ9u=i@R2I(-+H@sO#Eo<+?axq8?X1Bkd}5 za<{u8k^8ZBlRiNFO%qG8r>{GHb>E{Xo40g$7WW-s=0q}ATy2u{`|-rggk>3|;b66< zO(;vb1_fNBOU^JMKBe5Bt+nJ$;Qis&3KHYizjkh!nG(5fg`TbO~4sYWamDQFOD zG8WRwa1e8@XVwtcVC%ua;pr)?JdU@(M&lXha1Cfl9%7HH+S$;L$$jBTAU^erCn=@a zfM}AxmE~n2m)0HM-s1I7@2V0tRxB!wJ3(|1OfpK}udiywu7c!XN5~-m%3^6jEE^4= zj+7ED4xuKM^@R%CNS?wnFn(pMf@Q))HOeGi(Vd`=8CphNCDPbpxibd@W~R8B1@T`t zlAUNM2zQx%BJJD_FB7-IW}?vh=yWkrJA2qODg-$1nLVrxQwx(jO8|(dD+hZleHAuX zGFjpTUOnnknsEX)>j%r#E_cL2HFK+!b|S<)6##gyky;QU>|;k3HqkZ~LGqQS2!Oid z%M_fzTF3o1K?^K4LO==a2A9)Lrd3|bmv(n;^Q9u7(KPKw>jH4Qg?bbYbHE`N0~~Rwo6T^K`<#kvlDTF>n-WmdZeW8wJ~LMfR&7gyuFn@!(%kDrovhyR z_289s!g$Pq4+h*1yaRReK|z6nK1*h7M*J8IQHEbEf;D;W!$~AXI55*{*j5yqw);Pe zmt9$4wsCvupQ>>BkJ?J`!oOT-Jo9Igv}aZmLNP3%ii~lf2ie zGjY2nBub~#ZBHNS^Ns{W9kr{SKL_pD;i(OjkG!+Dt=KAghW9PdU$MdFAg}vDJh;`B zqb;u0^EzDnB1mn;Vxzsrq@$i%jiL>*H%J^UGy>ORtha$3)6K0@#MBi*XF&%y9qvo55BI?HPItGE5(QDd(D z)RT+&`K*)G7MY|EeEl3089jU82#e!4GSKl+1>o+YY<)us6Zl@u>U(}fr z9!72NrT9cF$SzI%`+D^@YpDHgFCuyw6c_m1$1gl{hRvS#Y8j5SorpNV?@VEuRyJD_ z`B|Cyo<=qM7fzuQNn3Zxtn61WInG&*g*&U+XaO}x7(}?vzAx*v>||%C7PYAfr6B>{ z4SDMps-*jlYJTAJXGy1<))6?(`u~hR1D2}ky$LAss^kgnPaW#w~^ibx*-&C}o!@@Yp zG$B16=GxRsGf2e2>hbns+2Y`ytp|NyK25iqXHpVyK+HSCA#D31SBX`G7e8<~i#>56 zl-q58%dA8ek_63|kj(9xH*yji-Fdm``CfBDB6~jbXs|Rdtpc@(f|5DWt%RrKqdP|5 z9=l@B36(f$({2cBvR>|GO64Xui-f8aXXR-A&{&TqFq7c$nN3^6X=x;kXJU752n|GR zKL?8^2TGK=uQJ&D#NuqyiK-=gYui`Ue{u@1=5+Mh?G}&w(?qmooUlu(F~fYAvS*5m zMP43S9NN?YQ2n_%C&IoY#eUaTG9U9j?XU(02`MPi1ahm{clGp>>~l-RvG^JL*Y|E4 zq-h~-3sg9Hai%s7%`p0MzQ|pv-S5A-8c?F3hBJwZ3DLkPBy>K&ZF;SrOF(If)nM4IqoIK!$9O5G`3oS9<*=}T^(GzHFdHhz zHck@@8+lZ`QK_I;I}#wT<@ly;mbx#HY39z${mrb&Yu9dOE4KPwq_Fr&|Ew7^t>b#m<|tk~}y++6diXy{={CD%1cbM%rG*V4zm zCdcnML(RC9F{wX?bY^i&1o6l=rDfdLGCu{7Al{Vkb>BeJwXrnhVDVM3O91rj(r$49 zNe~293Gm<<;z;&xP4nsuR^4J^?D64|z?#8?HCPNAsMt}F22ktZ%QWWloFUe+Sk*in zW6~&w(=jR3E)wnUO+T2c@{D)&^VR{A4yrL5Xz@&=J%;H#8d^XGe{U_;lnNctI`H5wUe<%Vs2O4J~}Af*=Z z!@hh;v7*Lm7;=8e_l)uBPWTH7Ee_{dcdgb5H_9!r;lN*^Obm(6t}cF(uR>xT5?2_w z^VxX=9HE5`jNFazbe zy}dHtHqh8>-2D~x;eiK(QugLTpVt2hxAv((QP{!ZxOm@R!P)P&IicMK5;bKF5>XXC z%%}%${ahzq9pX6?vo?1%p)Ogm{4s0m((GAx54%KFu(NEpvMEL=me=X*9rJwM@{Qep z@MS(dIF`C3OxTL^KhX$g&uGYMZ526B5zbNzkGSLqM=defURMdd`)uK|u?K zYtHAc-*d!61Ml|1djEqU>k0wSz`7*oqnMGwkPG2wv4hRM)A$qHo%STJ@u&Io$_NQ{ zJxJ1UiJEi5B{ta=>iMW}lpRx5X^D&_G@A}3X)jDR!97bJ)kU*nuF!VbbxCM;S$P)iTtNMvyJ44=R zMT6kn3tse>uTfu^Rj-N%zS~_WC=;)l8tL&mhpS|rE>4cz&*8Cp+^9q!s4in}(FpFd zkJX(}b+V8w13m}aXOj@=HMS7cNHWVs9Iw0Tu3T}=6HhA9p0q2Y*F_iBsEPf-I#3*- zuh=)V`tEI|ZZ1w+)r@qD9M)j8t;_g&Ra6A?GVj~Tq~XD<@nY)ciEll+ReqI4UL_wK zx5AKzUf|(uapEFm%9%uns3f6aVN2L~)FLuR)@-A?SX2gUClI)2k`R)>0wbDWq7t4p zFwFPW^rN9<)e)rinkkJJWrb&bauq{dyJ1Ch>T{drrS=4dSy9*>d*?Z^f$ zDC;mF$~Vg*5}??p*DEO?VA@zTR_iac{Kq1v!9Z9+`@+{)K0T7TD$UjNP>I_>)8Qtz z(a4tf8h?trsck35IH*#WWW+}kvgWn}l*duet0Epr%#G%-grF>-Nre)&u&av3FrW_= z?-nZL94W=$8BXw?&JGMsLfBwHIw)yPw&*9IECJSpI+X^cA7yZZ_Yht^9Q1{%VY7;u z<>AjF6mfnJ{KQoQl(aIu+28IZ^-LjS|AR_o5MPiAq6o3E1;N4Q4OOD?R(0z>bq;?~ zFD*ZF0ksG79G(37g?_ld1SR{X&TG|DNh^u>;+R6)`h-!77?s#4`Zz^+O;TtIW=P10 zn9|!fr}6wK7D1D?b~=m{%2|$<({zELVEH$w8F@i6hN~TAG!Qn>3GtSjh=s*bqZspX zGqoJvjH5UGK@y65RXCFr@BYDuI*-FQHm#O&Xbl>}cyYdLo(?R8ZFBK#L~I(wV7qUw zxec+5_c2iPsnVaLR^xVj>+U|1MlST)qrs-xnKLbqqP2wv-yN6W)qP8r#5%@8-waDm z@Cz&*9ouvoRkC_hRNKNcLb{-?_)-h-yOu~8u^hv%!EOhmn-f1rSbjL(wHhWr(vAkd`kF) zZHo$4$3F7|J`r39HKP-2`%YPH=X#pdNY&h`k*kMB){>HAmuhE27K63USM~W~imn<4 zjpw#oCR(@yc6+Qbm~2VAoNume(%<-_j9EB_matsWSWIp<3Yl(6F4r)K)l!<3`0WQp zNR$-ICMv1?Yj+yp-~#m_#~2UIF6VSE4Al6<{2-PHBh4qNuo>t!IuQ57OyR49h5iBD zEJRv%rWqnHJZ5q4wBW0l!V)>j6V8qye!@ytVTi{Xcjh~W!u5Ij*QIq>3 zBNHWRw+Fhvy?Gi*JJlSdxWED;$AyK7JoK|oo5ANyZl%FPvApa{ptbxTEPRcqQ}<3O zl)5L;_7F*y|A+0jm}moWs9M?u-;|;2j1JF(tg-UcQ3+cjaGw{Jir0xG`)A~Se5>Gd zwhtZEv@*i6dP@EyzQ|j%3}SF^65@&L5mrS*VyjS?8|VorK4yG5Ot(D^U=T+iq(+8< z{qRXh|1!U{@<)$Ly`?$hoymeumLjC{Kq#2nsyHSMrEVh{w;SPYC#-@X#0Ed}NrKIKaX19bo%n;MU z*9yB_(oO?W6}3t;B{%T(+}=UcSEvKde;9Uq@+(TEm9{nvYEBlxbzcAhSEuKUz&Se& z=gywe7p<&k^1M*g^`n68%=KbqR<5tqAN#H5)5=@d43f6Az?~K6igExg$6m~IF zd8_7R9tiD;9dd)v(j1syTfII-%;t~|Z*&%fCW_?|nJnjDZ5eE_x#Yv=U8AhYj3S`EO(@xeti=&f5klkW)l^H-1iSv`J}xMb z;?Ci^O+_F;uv_38L$#d4Zxu$?&o8nc)-EI=ox9W@$w)^{JW=zijG2=MS(Jb2ak%Ck z`@eg-BG_9IsV_^Y>gG{9hj1P0C`aAm>?iA`Mx=O#I;c|=Sh0GDTWnNB5(72Bt;Ba{ z5%3r&KZ;1S{JAMnb@~RE*lg-wjV!QSs+o@UKC;!G6Ln?@PIyXa$6P0hDrbI~x-(uZ zMBun8)!G_2)1yqdnV}Rf4~yRDH(aYf--F&2Jdh9(7NKZ6&XgyfYj)$z#29a&$>zO= zRmwBe9Y*Xb)a0LK?y^Diw4hylv}G6QALIDq=P3<=_3e=j9#@|iPmx%BmW2i1)j!@Q zDm*+f^!*r7AgIjd_kpzmUCum)(TTX9T(vb=jDoe|{;_Q79^d2P#;A*@_}-C_2XDxR zyhLe@9iJ9_O&|HtRZyB}5e-r)x(H)^cfwU62r3#`HKJwmhE-L&&)1$G>pYu1MKC;9O+!0T!^37Jf(S!^%jI?wYS!Y=I&jQATd z90Jf3S=bUeW3wAxENoJQ%b7U0l?j>}$VzCUs4S0BXa0Q|&|7X_JT#XL*ug%Ugqs66 zY(!d+<+Tm<5rY@MKi6+PM|Y0-@xyipR@7jh!=?IF59yffhoN!ijI0%cPC|WXFf35fl4!0_8`5tB_mHWxf{Xr9;x@zQ!IL zjg69Q5TNe6I&Y@JB5K=oO>IFBaKe_4-C%fA_oF=AdfH0sL*26-6~ywm^kvlJ7hhy& z$X4y=I`k&MVc*2!Mt!!txZnim>~TkeAaOo`;$4fsz0>Bv&`96@bBUmR)K|3Aqz)QH zgb(JN!83aY6;>Pk4tnF|ih}mIa|m6e+TZRZGh@{Iq)p7=XXri>M)~6rP;}xebF#Ty zAW6pGzrDl|CclliOm+#yW%DkfbRsYs(b_!XgfmM(9sx4*rp2U1ta(T2UpufekayBx0vBgdw8QM<`f>P7|hEE{3Yhi%YLaL*t6CWj}7)X)rRgSS}_{3$r*ql1c`iZmAN zf19D2M3N2enGubk6gj^|;IxF_Y`w5x>ePH@SIpI<#y6jn=`LWlcv+S-!BcBNm$-pX zXsBbvbTke1t)XYG*&LHb6k|UkfY3v;K4Ouh6M>f_Rs$A;?W{bq@!_)OyE*cYFHTy= zGT{K4VF92vO1qlGIZ~IHs48q%2er%G{RaO*4OD6C`8&aH zS4`xtD{Y2DjE7hJ<4Bt!yyji^AD%zVR^gW`BnvvfIU6CNyo?yRoojSvtqm{x=}x=2 z)_-DL9`~kpxb7H;Me3B+aa~X}(V#6NUl%y33&WuG@EQSGmaHbWFe!DZ=t^&8zf1q< zgP{I_OwI-FQdHQMRq-eA(*}Rb_rXY;S@&nBgj)pw8Z5w~Lr##-gXaD_x0nZP0qQk2 zWe=1~j8CiWv0Zaj4|ug@z;C(sg6&E=?qtKX-A-jCxn{woE$WbsWc~Lh3~SA8V|{B> zjTx(L`L=#h1n%E^{TEsvTC}Ynvy?ad@5^#H-?k|1RFL&cq0D@Zeko88ty*RI6sFYt zT@b8>h%w2XVXOlO!5X!=7%Z&GP(JUBTQ!IfSkDZlJt#m zhR37-W@Sbu*Hgo`jUk7a*+fexWnZ)00!Wu6Xd=rV-?Y;cjcO7Mny=Uuo-^+0L zdwoiuPCqvp@cOMm<)#wx(aAtCd6KRtOsw&};2wnc z{Q$};ta$C}0cxu}rBU>`)Q`q?N_9E_l%+2sdgu|aH|y~;R8PQIhUT+U{gd|^$o)k5 z^5qMg!y%K$lP-5`%RNl1%dvZX}n}I3sP4f?z@%HOB@zH#N zHknw;JKsNR{yvT1vA}$d*O4fFaGxDsJG(F$bYwl>wGY}n=3dfWRUn{wTr0l5zuPys zb>&+1Z&issgRy1B>dwFx;VPb)r*up|tVWLOuH^$bue3Hac`OC}VB|Z{8lgX4lMOX2 zA7iBT-8TGbpABg{Zf4E;{_|nLwtfNt(s6~Y{F2T?a!7b~vg9>+Kh@44^rNhEC6xB# z4yUYhCZRks+z*qUVA?e8 zV$0~#+b%o_w{?h=YJW8DEz_-_rxjk0-a7e4rVYVb23ltmdNH`T%*S-`pM7;F_{4Js z;pcPqyECDsEq5wRJET-Z2hN@O%l<bZD=ExQpIWt@R_M5Xt~8D3O2Z^`%l;^Pe&p6_KF~C$SKZ56*zjk*YfN6-$Cw|oP{=obz^&Sj1ul2`-6-zO6#? zZI2`cBlAKZz0wnyA#IBlV?-B!J|Tf8?0cVYnp?PxtW_ z$7MrwD#MMEs$JCwf=vxFHAjmdQtk^)K{m-E%-;ouw^H(tWe%5|+Y!om=~_M|f=UVq zS3s9ou={LRle{d7OrqSHgOj|CzKL1}{;phljc+ZBaKr37%kGiv9-e}DHkae$yX`xC z((~5n^mh0YTe$m8^F5x~tNHyqhcg2bIP+XZ zq920;k%Jy>N?V>oSVgAZWg>&?4sF=}Jb;V#yfJ;9ov{0#m!7fY&x=JT&6DYh9YGXq zwrbF3OFdK1s@met*#(V-WBwb}Kq$(V5l$u%zc2=irn+8;1C}#Yo;?CVPWlqrXkFNd z=0A)K9;_8gXc`963hXRHkiAy2aD9X)v!6p%O%CFb0;PB{X6hZd8R!7#=@1z^pg>Vu zPnjQH|lTS~&X1_47{iv&$i(xq2fejP{eawXFoVg)biu`SoNB-)Ao=aQ8dv^QPiaLw7db_56YQbjkW(H8L{2b^&L zDNhsbb*nukfw8;xa=9R`GqKNOg2?G0_sIspie*2_$7A^2K|1DrA@)NhN=4GAhQx9w zx&yM#B>&8lnTpqdc~5&>iKJ`JhpUl=agx*r7Z|bATltmA5ikp}OqfH6wOV*z#+i0O zA7v+-eiRg~hA53e%Zy%hjB##F}amnp$;kzVd20Va`o^6`qYKv*quS z2Piu-QbZmibI8kw0f)JKLtS7sN`Ne6GL-~w_h3WLuh2P0;w{-6Q3QvS0md%-c#GiRiQSGy$ zspgkSsH6nRR3pcfAIpgw$lB1J-FF$?=9TfJ*wmE7iX2r4~@ET5GLj=z5O84?2%6HT>aR0V}zo9}85CN~_H6*iXoCc~vc zD^`hpIR4%7@qn`ulAyow@jMQ*Jb`6H=dFAA0zN zz#1gXo^rfYy&`i6yiI`Hil8pU66=2_hJn=yt2Die`8~~KhoePtR%!71nX$SVQ~HJx zrdd7hn_CKH|BuD>NyAX{FQz+9@X0xsflGpRqo^jIWVPsR2kI8Me{Pd3iYR4X;>X5T zY=rRGDjoKCBSL;6d zP_vbTINI&ZtL6nQJbc#~DSZzS3nBwWm{>V27V|tg$Aun^%uGzCqA;2_z@h;?bXw1_ ztZXk+Z{>8*NnvZQRxL=rhb7HX@eagB+fWFK39z{R9USH(n+AwOq6J#rFKMiK z*{xS@IgBSt$${4yBW&=YZ|!1z>PBb5?&Un$jSw6ko6~>?jaXV`MU7dK8g@W(_?y+S zy}_kVlzk_hq7m+%z-KJX$la;nP#4&p?f_vjOYs$zZ#gGrGMJ&e=f}YE59d#3!~%nz zbh?9zH15+oj49c9V+x$1h`(SFEK9z)1pXGgPxQ`SAdVR#AhcDS_K&54$MMMnn|0eq zS}MGeR8`EyY|AE==v-!<6uvQ@MuIPPx@CO@7qUm&DK>WnjCoHQs{n*93R>-}{r< z9LmvcKbe(3_FdbUi@esVzqCjsn?sM-{A%-E<29TiZcjd>zs{){Zv)vvbJikojCFnP zD$4n(whrFTz=+w~`nvIvj7!PS%+r%Nwxy;wM^Xd7E@GjO9C+;h4)#NiMJ~+g?F#Bz z(A`R=A^>G@UE8)1JfLnHpMnTuL=R(QG_TkD+%#j1xkBaY3PW!AgU+btNq!86n28C{ z_1P{7$RF-h?7HKGOXzg;g-F`%&5{W^vzD6Gb8goKQ~Il}JS}fr`PoPqe>?Mp+Z6kj zX8KFPO#^veD|Z-ff5%TP{<3Ti)$mP9ha!jlG^>gOrCIKzt%9@V6rG2Gm+0BQj*aw>6M{#Kp=8Ja_((B-+94IF&28 zy8v)JZOqdg-eK3~4k>AQ@=oGnDG1^(^FLYLrd`;;Jr1n4v=LgQ?#DJ(IM&U@xA;S- zWn91_nAVON64OzfB%P8uUE$n?uiI0e(RLiT)!i+Q8nu09m(+EJJ}i8xDKD9}<+;LD;ySYD79N<$i>=v*#!4M)-W}=oUTWQ0 z>NT7}6a$b9%!ycE@RbJ!p$~KudIc$nSCN(EA&^TO|X&} z=JO@!p@-c58?NuHgJ%N_zctw;`G3y5a!kj*ag4BCskD>-X&I#9FL+)n8FS`&*bj}h zB5uA*vfj^P=mOz;g5xF1*q7xMy`|S(BG|^V%iNvYjT|L?J*&uW>?SH$!-#hs^rk7l zTWbb3?!r72(WTo3bE(>#+nbPyr|)_z>rF@(>{MxQeSk1N*JN$vH;UaWTEA+`Fv>^( zUunotvw=iNdoWv+=KdUN!la?9+-ju+J!Sufd<4^q4^kXBYosm3KdB|qMHmU4rFF@h zRRq8ctsC?g-W}d?8f*8`<2}kE6OJYbl|#fqf`dJ8;v&vUYCX1O7K`W(AGL8lP3wBsLVpL+#mP>)fbzB`GKshlpoB)4+iX6$Pv8@Iz z8u_oYK4fY+8O-FFYt=%kpBhRY7fDi~`n?q!83xBF4S#m?OF}CKT0YNluWv?xor&Zk z6MaV1H>06EOU&GhU9uUBT6t$Ij}*I9DaeS5Yd6|WgWQZ`L(Yx9nnYH6`$0J3&u;-d z2@46&0mV^vWF~cLt~mTAU)OPm4I-l=Mdc*VGLZBn)cJ3>C#&8X1+lCwT9=2Ujm-F# zoN`Fx#*98YFFHGMkKi_IWqmcCZ*5rL>DRZF$wSgNY)8CW&wVp6Z??2Z&OjHlNVU$j zF4-?y{clw{sI=k$#iAFoT1W$(Jd{gyOc~1G=dcJ)v}^%iLPnH6Fmo%g5e?jlUkq#_`o>({%5slp)oqYqTq5dF%k-e&ADuo|Ll=c9FV1C$lV zN8#2Q?$W*B0Xs{9>!*}AB?4zKuiK!f$zdv4DcE5q!xNZ>W}f3=y1VhcL6?kSW7~d` z$V~n@4xqffpnmS7G|!xawteD++T3l}PtNYaB-j`kp1M{wN;Uy(JDYW0e&UAs@Gn17 zfL#2Zh_X%JSJjz*gO1$$b zFUe&KYP14AybzefXZ}%88r&x_eP@(bZ{InaWF(-;tkOb2o8)68s6fyfmFRyZ8+=`)wWE*n72W%@K;H_IWq9fe$bT6Y-fN^4RZ%W_FxvT zMwI2n-4mk<~$cw0TUoJdo3OMCwcx4{1tAW_MsB1@c;a8cJtR8`yahI z>W0-dF*Npy{xt|Z(Cvd&P>vZcIU)MLQ3HH_&r9aH$Cpy`Pu>F56!g6%gVKoJj8Px| zw@e^iHSsSc`_9%mW`BvjU#haK4dn#>x~PDH2t`gtR^E6`%gc*PtyXOv7HjvPGFrFQ=!61F<-2w4_@bH5cB)*xItw-2A~TanX$0>_9B1vVEQt23|?~T zfA^6Wr9&@2V=)Aw(D~Y4?8D$ig~1z&r9X*{U$f8002xkE zuk^q57QeJiGk~ojARzc_R;rcc=jYQ&z$g&`WR;X4EZ>xIl7jNc|0w;{Sc42Kkq1LS ztgufQe=+~;%r=?bZo9cQtcb_)5Di#k761W@kql@Qs{ebcptM81%8j7tOHul-q5SR{ z{pAuyLPl)ppY+5p@eSxQlD;RID9(SHLV0t%Tv6g+oSu~ZulThml;3^S0JpTtXEXr; zE(fzzdu2;%yD^&oneDGM|7s>ae7O&n*pJh-|0C}!yW-lKZiBl839i8{KyY^pArRbx zOK_J48h3YsG!DTfxVyV+U_#R>#MFg;4K|;ab3*{yY6kxQ}Ca-q6Qp&dTiNeFeCh}zC^}}xD@#cr+ zuV+fs$19#6zqB}vk7e*r=18Lav079HeeD0Y^?d6`gv}$b*>QW=piXJOGs4k!L*h{j ztkst^))0(na$@RpX;KaU?1_OinM_4*vv(ROCnr~FGK{Cegm-4 ze$4|#rvPww+OQSHPi&FMyU^m!F*QAnMM@gQX4I$O;RBV3MPsv|xl+%zQqi9oZ-N!edWO*M za?HkePX|Q>-}Z#xLQ_)kR~*L$MH7d++^laa+8&XUe|R@)kxsSxDWq{xP*Y2KA(&fg zHtn(T?VUw}UvKMq0Jlu9*M-6cGet^Liyy!K+hh(Aq1qK>t$2mpPhs&+pP;EtBoQ$p z^V9=QaYL)a*qHcGvq##5{KIp6<^2W2vNd zxac$+9jK+Eh(k4NOgF}XuNGw4J@+KkU#F)pLQQr1m4bO?+=GbW`ZvDLtSF8&dk&{3y6e8Eq)h1 z(6UC~GiAjlxfe__7iB+tjC60ECrtfY?Kg4i) zL$PTS@>9sd9oEsLZCY>CMnJ-3FbL=>_NQ+yXKRsue$cAr_FH{&Y6b=r4a~&%DdM?O zkqOkLkSCoY2;gFAK4!$S+}_>I(XO{yf2_58ytb$m)6>#IwxMEtB&21IzSUDQkW})*RHunOvV-o?I~GK}>jfC*4W0JTJ<7 zbJr7EqtRr{9fJJ&H0gF7Vf}Sp7FKs}Z-2KkVo4iRPBy0QSJ1=7z>r>^O4)Qv`TK`S zvFDeFc#Qc}&=0>AufoY3lh1rk=6OS)j|IYSo|y7&tK#!>7ER@pgR10OoEP^Oh7qLG zxKvUu6pW2W)5$rMuf(`TE`JJ+d|?WKn zt7azbe|;^KC0r>T;EvVw4#_(eK@FMHL72#4ma2nTRa$D^+99O6z*RwYjt)D-OtEH|m*ccBiEG*=Z%o;HSuVa2<4-0wTe=2V}WN10> zLeWZOIV+6D+ibK{o+wvjOdnwGh>h%L+q__8yGUh2L__KAk7n*^b4HjfFk`gRjPc)H zP1Aq8e6s&cOLnICLJXIuFZns7Bfw0`U?D+tKt?ZUr=r|9al!PJl_-tFCF{-F%Wm9q z%ieBSsYQ6lk$6-nYGUBq%K3Z=o9WW*{l#kSy~i8|ouF=5#_+9yX?yadksJ34FD=%1 zv>QSdRddN@DJCrj07VzUwWmlJtuNeYO+4DNiQKiDB7NycNLswK(YCn1{h}b7kW6^fg#q7xHMT zlpZ$b*dlAiQ?@ug=>DOi`E+@RVef~tDm8j&Fp1&HtHY#LCgAh?&O6Wx@Rf>>0ktMh zdOaEgtz(HZ*nVrky}`rDtn~TxT~`<5`9*U5<`PzhU_*oS^LaPMA-pPCyYb-ro9*C4 zQ&S$dbA5rA>*>RqlJUJWwrD8rSWSYp8Z(Rng|wi&ypPiMZEU98jNV~eqa?#hKIjX* ze(k{PtrEp#qko@^B5hb`wHSZjU|igj{N#Rn;sw4Qxy@qLk_70I@$UX-s@wamXhusM zMa0c54B_XAZ1St<^TBx9$!1quX(cs%O{muGIQf}qTE=Co$<0ca6Rlq@Gg5;)WP{er zb@aovYAI!%$$B2YhkMBCSgxW!X}f9uHnW^{1$zZU{>#?G9;hD@f4Oh`hx>^af*&A9 zz6%n$3q5}|J018f+ccxuwp_sPj-=)q+wm_v-Y!{I&!4_a$e z?t&{OcEY0YJ-{MP`}25Y&$lQ&Q3pY>7#K=;kdiR3u=lZLI-gF6u&4b8E)%P6GevKI z78w4&=&s2oOGnS^;0N>78aSKBemaTx_j7sHR8GysRCB;4g8FC6&n{(Sy|326Y~FKp z0TT;&ae>$SW1e5UcWClcfHyO)4bM?-Or9-mHZ$)yGk&mp=CVF3uavv5*1CTrB85qsSg`P@(zwevdXaq&}12c64cjWIjYF)7> z^X0!gdtK!f?ma$p+a%+qCWGg)@i@G z_3-@68jiDz>@15rh3yYsO%~+e-!9u6>tHw@m4y!6{&^5v6@(}cZq*gfy$nJC zMZND2jpjYai05)l-_npZ+39@gPrAB{CR0o|8fIY}c!uG&-<0^O>`QxCDeu1~H|oBC zd=Kfg<0s9%#GpqQ8@C}K)~Iq(FX!OkNX-9cQu(%3SK}}&)OUOek>qGSHL@O$4-8em zA|&G;@}ITDGr0*SCM+yysD1#QNAoIT8V(aOUJx&sbZZxp_ZEXms`de17!H;p9mRic zc$!{Plw(qLYjz{;wJ*_zc6@iXO-cK*OLJ51SIm3#mT_aZk*j_U9qZPRi39n+HChHt zAtOLaaiUC`ZoJ!jnLTZs2yEA`FqqucM2&)bGwh6lq6B|bJd*_%1fJc6AtfW7{l`y||Cb8dYz;C&;!J8}PDZ*Li zY$wi{OWr(t!w=e+ci9w+>exGLO$(*l>^a53+CIz)q!3@89@Q*&DPFrf<_$b)jyCN3 zK5sbVteYVAa;T44ACY33^ruW9Iok2DJv0J zPT#4dPExO*=z@Tr1L?MC@rPYEwWvk)$<@N-vi4wf60vsg7ZrQ8q(#0FJQH*)_p!0D zK3nfABImKUdxY2W=2PW(ghsR#HSa$o$gBvr2D?Zh_V)IN>2Foc+sV%sRWdYWud#z4PA>zd68;Y57o}j5MZ}j86VPEIOqCO==w0e32Vs%ku+TaO0 zZN0Rq1C@_MZVt)I6IJ<3a%xhy%xWgxGO^-CxtZ0<%1mh2G3DwmB73jNo68@(#X391 zbhxs)4>==Lt8#6ABu@YP*Qk|G#SWJ2`YaF7LKE?1>eaF%@T)cn zWo=lbvRfiNOwnfT8jUA~T$kS4rYDOB=qBCTl=y!a+m~YZGp^D`20fvdHeBv;($XS4 z%6cdYJ>(JAOOv`w=yrRSUG2%Cc*YO!mC9Id<>wQ$I+CjS@t*Uy|9Q1vY4dtYh$~+; zcSzSl_364*cRFha7Pk~{qKIZG3 z+p1`P)oPSKS5_=Fu5K?cNO#cF8%{{H^jdF%lwrt>&;=T!$&hNO(-K+Kgm@#pQWv{Q zG&>v6tW2g93ydC~4Z;2Q_ii`$DbuxN#x@vtk~QY`UeCGZAmag{A*QX}G}~Qc6S#TC z8HTCXXkCtlip$@HnN!kKrFtosxNEJu@4Qo!Wq(@IX*pXS#7S42*X8s-G4I!&){OG} z;lwBrg7oj$#EduJcxzl)ojOa0}m#mI813{W$ zWByAe9+c+Fny{KN(J?z7<4Z7~AI|cWtKA*eaO1aPuZHz-NCo_dX?yvXdY#MPD2blt z$hwxsxhVLmNtbSHB5yCOzj+kksDJ(1(a;_(@|O0L<9vrF$7^Ou{^WU;ay1%-hfcN_ z>SEm-AGeg;*FxX8d;ERqeY0Mrjpz9~dZP24jrWpWRFwEcodS2*xY9h`6BQXxWk$Jt zVXta@8E{Yf@fgnz5|xYR8|=3daHqkw-kgCN@q@^Av9+*ZU_Ay(+a_0>ZToCNha+ig zS3eoGS`GrLxjcQg+fIIM&pJ=iOC`p!bZMZJlekk;3nJL~SosuRXLq5B(nHJvHP{@L z$7<0tLg!0VF3AI(tJO3r$m`4NF3ugx1D7MwIcF-_jku}d2poM zY9Wi8!}Fg&SJQY3ojabat=Dl5_3Pu+6&=p!u270TI~|N_=dOOQeQ_YB3$%)MqizQ` zXcnMQ?HNK;Jo&%v(mB}&jJJ*am}v8U5r^9~HQ-wC$~+g-Av#N#xe|KyQw~=7*(XwK zLY?9S6J`a#9+{5X$Hn#(;K#+Bl9z8kqjhTu4oaCWoAQq1I)qDGdI+`M78LF7&o|bQ zoQ^Ao=a%cNmy2=9{&?K?yFn13Mym(s>wUj)vF1sxbaWr!thLZH5aQ*A*ea5T7)|Zm z>kw<+_skhuJCF`1>*~wlA?v-d3{`?UjheV|UtQ(}vsCr< zb+@{&_U-P~6pAc{KTNz=MuZZ6Nv0g_a1p}2PMT7SXhZeH21odyndket0D8E1kH?aL21 z!)atRGxQGz*P!4Wj7C#C{oartOA0vsy>~>utZkl9W?^5aY9)sF%2Yb>4D^oN7A9l| z?sw7tjOu*h7KKYt0}Ul*t5;+jJL?6_V7z`&o1)pa)ZY9qO3H4Gc(0n;(T#b?g@R zLS!4+yG~J;mbh#a-J27*JgB?R;bgT8%Q&}ExWaGx{J^g29#I|nhVP%R#%D)y zKu<*XG#R!DwQ116VOgR7(8$b)!4YJ*!AVlO_)OoR$Q_H<9WJ7R7a= z{P?ogQXR{%S~XhXs696|5l(KjSE%h!yHfM&&EiCZz>G2-f$U(it4m~TCT)~o0ND1L zxDodT)Mf{#gDFY+MS(`e8gfTomzoLE8wY|>%F)*mtHIqzPHyzE@e`9fjJsDy!f2Q$ zKF2hT)V+?mRp7NJ(!7uZb$Q#H!{v^kxSY9mK)hr!3}Ysq1JGPnzNnFL2yXih;I_5t7j}@kqF-d`z;Qn2zGKT6mqf|2sPLw*D`uznJ zdcsB`bgERGlZ)}Fo|OIyHQu{d56p3$2f|Z#FX%GkN!&g2O>#vB)a+Smo&-GYqD+Bb zJ{kc9Cuv!#$-5yRhq(|;dyv_+Q682i#k^ld4Ly9^T$GU6`{yfcEx9XHlr&`UrdtQ>+!m@wkoS0-%IoOrBZAP1}{{q^46s%5qnf+Ry28YI;-5 z!f&NhX3Z|vavmu*W(Mo-dLn6Z&JJU5!;{a&_w&si_zk2k)5wEg$G)e zMN3td>QI6wNa`okhZnbF$c$jCYQqs^CLsD^@vx$$TZUoV#@4vTe7WxIUZ{HQI?-3X zUrJBu_=9`ntU&L3$KD-Hu4au3Im&0R-gt+H->4Oo-6hleiFQ=(k32S1;PdLs(Q@*o zFrG&N2d4k{-(ZmrWcJ*Ro2bFIZPCy~!@AE;*!RJ|AQ?(vDDcx_v2h;pBUK5@F0Xyo zJK*WFfRunhN|Gv(b}r`muR$`w&t&ams{u45L>q%9ce%1e%Y048=$Fx*teb7gww(jQ z=;cZ$Nqw-v@4y|Gk*MJFmmOB1l3dyDkC8AY#{K71GA=9p)7Cq^9q-O^1qii<@;no` z`s>~_0fuqe~^x3 z&OMG=7jkFOaGp`)Z80W#!mK}A#)GI~%9U12vj&aZC**KiG-bd<9_w-V%YCdX1K{qDC} zgH&z&)RFBvnShI`K3pnUs@%V_!M{s8kl|$D_-kUwj3%B0Pbl%@XkL;FC;fcg69&Sm zax)q{Dlfg4s?!NJts zQtr8}wS#Rb+Bd1d83{tTD`UU06tp!sb&O-{F$d5(!&k2)gL0_T{#WGs7LIg(R@o0} z?|Py5HJ?Q-snn=pUXHiaoR6dQ2SyLyHr5l$3u+OAt;w6GjBBH@?nKz^HGt?nxPO`> zY4Wj#*Bgy_JbkY$h_xW~WLyws#huFTO|WAt`ux;?tX$8&7uRhg@PmMjPdcxkWP0Lh+_v@@Ee4U3%0Z_O ze+`%ZPf77FGVV^ae8V&IVGp_GZm!~I>*8+=)UFZW(j553=74mC{{e-V)+E9;oydC@ zfX~eq#iiBIX&J4txQm8P>UFJ@?0Il-@Dm18FF6Hw8ws1H$fRIpo_G%Vf^ev%fP+;w zA5IM#vU<7c`PEYSsY$c*QNdiW3z$5>6=|FE$EfKst1fg;>?ybz<9yRf+gknu%vRrW z)M7@U$yHrb3sP7`2lBxU)n4`wF-tA~I!tYLjLo$tg!S3^ivDoNIr7vL5F@?xQ#sm2 z-!gYG8gpNSTzArqw2YJB3g8J^f)lYb?JQCfxP*3k>3z07&Jnb+Aq~HglqRf>L51h- zNV~eAVSl9n`h5rghxA-g-o>C}J?b9(pVS1Ox?syz>VKn59r$I2RDSf^;Y9b;-jRZ{j{v0h=?RB zBPQ?vF8hu~wFfn0ap&*z0esa56tnFo+Gap2)^YyW2 z@9(5WC$cUlcs}E8q{01UT4-h;5L!3@bUS*tQ(x7acHm$azK?`^X%G(MXt;Df&P^98 zmgtnXJXcx^mZ4defxVxs6Q|@DjV?#swcVj`^k&ChVqwRQhEPZ=5mczgzZ9pgTpoHR zg`1drU2>f=VG_e%u0W@~LT9?AC*gCIEm)WLh360pd#`xv%%TIpTOs%$-gw_+J(7sR z%+vgB#+EOa5rxTH7t&8gT|ISf$FZs@eC}+wQVRVA%?=?H)^(GZdDZSkqLtlwJgcV!7Qmw(WlB0BK4;!S}@AYzCiUOmT+W zb5R6-8thu9=#)6F@l}l2&PNvmwT-IqCuzk<1t%$TRT*j>b$*Fygx*@^`-3Eu&LK9t z2XwGdZCAcz!63yAkgb={9|ZMRc}~(Zu$IS>UvX^7qL`6xAfW+{qKSE-X$FpU*Bb0| zesN=RVpfo z&lx#`&sn)}A^d58Dw@v0d0y95iI0~X7gY^+V>`bP1blU`9jV<#+kI^L!UAwy{63PW zz|jVO*Xnej{PE+*lpP!a7rmbksb-l<@_Lpx%=Mxa9ggEL(L%7O6aOo+RDDyxyE7zK0`rd*|c=2VItQ9ypUHI|B#qpG}w}o1$!MS%fITZ*ul{|m%}ZX zxzV6BYv+7Rn|;;B`UWu=2L1HfP_#1+thtXYo>nFF_4C0ANdL2g4q*&m2Prjw05`j@ zBTZZ!$V~WK^Z-}xbcpP1 z%!Jf%ef%*rK38QV4GRZnAsI%;UR83a)%uiD41UY9XttrZ!x&`xymeH~v^^&&E%7cX~Ub-u-- z(VM*T|C|uWMTZ1&CY>BR`%_HeXOLg_N)Ec#9@=!Jor9D?+8mwrLd@zPtpn<1nvdIt z_v>f&LM*}Mnqg$Xu&x{s#+Glt$Hs|kaIt;mUPGOD^Ua+01@w-nX$3PNoR_}~q8K@c zRDVjyx##E|E0gmP7H$hPSp}?@J}(vU-`0Ua%K!E!|Jt-SbJ(Bl zGoM?3l~*KQr{q=I)LTp!Y-?T@UHPwnHcoe}5AYk(5E5OT?tcfIB12GuhZPcXVNz}N zu$>M{F+z(pc^6Ns2#;+-qgiS+Ix?aH8!i}gY_Ln-(icfI-9?o>#HiC<&Z@;JH{~-* zq(EPSfC@b*F~r&%z$PG|1Nljw5xjN%Q#vY-fz|VBm*%WeEe*8M)*AY8Q6|?%QvHu5 zIK_`__{h$KYs^nc!Yd%ieL9Ew6z4i6SeJimvcTFXPT|bpAJ5rCQuywDfx%?}H{U?$Y35uGIgnZPNRI}juh5y?{<)p3+$)WZ`sW==> z&zBaB_z`+A4-70IZc$@?C=TH(3726{NW0+1W+^_?QPI$rEc#jzBEqGG~%{_4lH6Ewf@;Nl~qtw-K_1c=)Dg zEeX1wu=jgmAS~Mx0%0Q{Br{RiE1&}$+%E7 zZHYS}ZKW{r;V6H56I@>rNvJ(sHYzfaM>qK=(CCZ?aKyVMv zeob~lNvW%M=oi_2MSk^0Oqk$saw=Vn7O}TyOHWUK_2#CadjD_e^smj%%ET%n;Adzq ziXEtO^b}aZkb-`AzzyDnv=q5u(V?Qjyk=)^U-ieu5@w)h_><}>2u`+miAbjZR8m$+ zh{mRMnN08Y>FD_M*@jppd@fNvG9sb}BCrVIUUP%-@F<^Mgv^$ifQa3`qQ3F~9S{@w_?9jb4F98;&UDPe6{?@nV8d`g+(lT!qHlR(b` z4N{~5;x1evljh8CO3SP5#2xD2KN#NbvsPW#Iy<-BO-;Se%j+?m-UU?w#^dGG1qtSnrK5pO7y{zdu?@=a>$=u@ z!Jb|yr)^t`&sF#M@5hp(Iry6q$H#TTx3>iVqsK{!3Haxmr8gm=V}JNSu}VJ4KUP9U zM#M@Sc>ibfu)ZY-zFJipB(0|EnMQHS3!F5)y^>)v%Yr~86qIU|*bJSoaew4L?BG(c zb}v0yld~ItWTn#9Yr5fO*=l3Qu7Ny~p;=L@Kmstvt+&Z`2U6M2P8 z4ipuT8i}gI`tEM1sDDA0!jaI-k6t+`hcr{OLI#YQlf{;nFP}QOG$DP83spuuPWzaU z7pXzmLWs6UV&FSN0tNv)tc{J0MvbXLpksc1zJ8;W*8<6O(|T$uOw6y8aBgrLUPUV# z?CELLVIVA+QCnHLd=@2)(u2j`e)0Y^O~&)_!TH|lRpYw3ps`q6WV~-uDVVjLAo$#l zOttT=Qav@Yb@un~x$&0DO4yaX75Ci9Tr+Id=(mmPR>1qJ{rTK=zAr28GG7XYgG^P` zn}Zs^{lkN)oH~s@Y2#>`hdN0xDmnWSg-$5$giaJ zEi7tl$?zE%)SaOR1_ItFx3Sq=oSb_GN6qX;Ggj@o<+}~&IQ3@{(yAUx1nH>7wwESw z-yW?5x;!{(yVCswIg&Pd`tTdvn)J8hU+hQ!oZ97k*~Y2ulQ516Ivfy&>uCgvGe(I^ z$N7@R^BJz7h;MAGwbsq+7s-raW9L>`JqX-rqzFV2vt_h&S>w{{)$CfP^AaKb0GraW zut+qAK<&?16cslcbi*^;1%g1JhuDIGg3XO!GAS*sUsKdIt`DQ!;E%F?p(=b6c|{OG zqehbxq`mJ#%8`F96@pz14Gk;JCn?N4x-`C{);-;fTQQBxsx;cUNb+X^1_?6p+C*0l9b>j$bemXDb(ae%G;rQ>2 zqyr4?8^&~M%T|g)))O@DvVO-sM{a1$gSBpOj&c)}ore=U9JRSeo18Nm^9j`>i*{~& zISBX6>e~l7zSuCY@aQapgFqrUccYtT?O1yul+Z%ui=!IG$-`gz&w$Aj{L8a7J3EJO zYyCgW$~)FT7zW!BujX?U?@$U@yMCWk6${hM;YJ8V0^92Fw1vR_Y~vVxSx*3ihh?Iw zixOSj;<-E@q^r1mN6hyt1odA$pvt-dB}TXSWP(k&{ZY343fQ1-&KDas!rhe>RL6Sh zXj1C;7MGPj1BpxTw&N8IA$ih0BzumHiSbbseo^5stJ~Pv;Bh|0iIs`JQ{^8t3C18R z=VrZ(I@t?(mmKffHda?wwb0HDHGOsxhOws;T+5gnnqbBddAX%{+c#m^{mIG-U+BRK zRnNnOT)(`efCxKAKANU$v&$X}efrG19l%^c6adBiHqC(-w7kJjv3v_g+L zAwo<&sj7E)7>>1_4>O|~-f$>`gzYY#EzGWlYiW5Imr*@k{@{$i>W4WBC~KgK99 zWbKTl4dX@y_Hoc!a91(B818+thn+#N7oQbd%xdgeyr`3 zB6E$nGm2)l6?~LQ1Z{>v+hY|j>GG4*Jy~~st^=-r4ip5GCv$2kXV!8;mG~;hf?mPn zOIq*RHG%Myy_Hh8P=AhzULh2fv|UwacDxv+PVZC1O@RdL%AT+cY z^AtGLXV3I3U|p)ak+ibHgZ||);g!}>)7ECAk`!vQnnq6EaoOgyP3_FXh zBtxpt=mK=7MZt{ zCr$nGTUt{JHW_}*E@%EBkTy?ru+HOUbxL6R|ZL=uvRs|1i6+||e|>*Nw70z_L6 zofPM9<@hTx7P>La!J|lsthiRb>mt;)nksC|~(tAGn?3*PQgdl(>zbOx1=krpYS(cBz*;>||)C zlc`$3d`!znMAxohV4_rG+6k`l~8 zIWD@oL^0~zojS({2jZ}czU&<7N+tvZp%PIj8wUsBecluy;lepX@^WFaEcQ!bEti~e zadD-H=ewh6lTFT+`Lw$}EhAsh&l&Id9LPrtPjjwY<)_C+rM}3-{h38F z|6tg(@xiFSGYp7Fn$a;7MV*q-L`4pjX#55b+pA%9mOLP?G@L}2KY#P_{Er|&HcDE6 z&1c|DbA(Ktv@%MHIp>;#_*O3tIr`Cb9JMqiY-TbeZ z0E(nPqtcxR8&=ky^w;x8KAhY|KOv)+kNNGHvL#f>J>qQ<bB157BD)pmv+JJh4Zjd;9}*e^kLF5e$i+Oj`~?{li7De}Ea`d%Eu4_~;6;inUSu z;j)uTBW>a!9ip7#g751e0V({kUp7CwXYT=<5bUcKLj+R;Km5>8-0^JyczjT;kBw%$ zw5aBE9y*f?7uY&zGgY)N{0en{|B`Xc2Fo(%}3!`f7c8dnl|W| z7QJpWiZ#`mO4-7j$0&3;FMCP%A^WD|+h_DE)z%vIRL;(_M>q;z8nn=U<%w!r%mr-E zuxf&I;V)~N$ZbC-^Xa?j^%djsd&s_a9ax)9bo7&8b!+`b#aps#Y_EA5r;6{}{E~{= zb>M-%eeoq!wqN#AZ%@gCr(K^cAkK7gdR#nq>SVc|F%%B_yLRNKyR^(qpZj|w^M#4z z0eyt&1;rDJR;vgtkv!Fs%w1_^6%`RtD+HMjE3hSMz^IVA`7G^vrKR)pS@je9My0)Y*XOyI<9L&Oy6&=b3$Pj)$7k4CUiBC(DUu5IUhBSfP z9~6R01!mQ7OL+AydVkGMGT4pv_KN2JIGSJ+v53meChj#+tNpIdHe6am-Zr1g^Z{O;ipNMwObi_k zrjMSrYOa7@A?op(Q|)p9MOsaT?bR#vxc64z3vbLHZvIfd=eP z#h3@R!S7aoKK7f`D`w0NIeJzhUgAD|KD1a*pJQfsAi?Uu8yJx3>QfLlx-4T=n$Y`x zh09YE#i8hQx}s@Pp2F|Sk}tW1d$hke<+xpn(XtbYVpcPdC94!qqY#4s%NSitx>UaH zsJ!_c(sx70UY7Xwy$;|)tABAOU1={)jK|uj33)M`Vxw!L;(ytT^`DaKU5E~X*%Yvi znLd9Gg1&c@Y2T43PjAWqkHSt@rQ-V=TNTPKyIWcWo@`Nykg-k2zA9{nkP?5tv3;}~25dKcG z|DyA5LVPf{Jz&2#{gXft!ECt1f_$SLVe!WQyRxr`ga~9K{OEQ6K`c{Cb(p`CLpIN@ z-jw$=Xk3|%@Y$O6bab%&dnvmcO8pT9KMGS4Cwt56D{BnhXzB8`v_$^qJVZp%wmiGx z-oNi7O9=B*L8g!W)^|G@t->ZoAu{;FQw%6RcV0cR``78G7*G!IQPF3m{l8(sE|5ZB zpdKa&Em{=Rg5H}~O2=%VHRc@J`_W6`%C$gsXBqL94}%%ZXW`zx)-QR(wE5(kZPtZTTD_U7*-t8Xt1*0hM+ z!us-2lEXGey_0kN`x!OdBjRJ|tagpufRmNn0IZ&ptbami_j$G#4suFUw96lP_($O%$4%mF|K ztHMaNC6eGFJsjot4)YpdVWv?fcx1X{^WpXbW6(RJk83rfs<SmHYBUCz*~ zFKS9tJ)Rk8D*<~QRr|2*q6y$P8pBRq_j#?3viz;6$I8c8(ou_9pcMc9jw zbY?DpBmc#LeL_OuWn1>M)g<)S)6-qRZ!6lw)5#iHY@TT_z5H-kq~vC&3{PWIwtX=A z`T1SF0P_>XHqW_5I=-dA8CiJe^D->B=Q}q30s6Dx;2DX+N6;pBVz$CQhR}<}u;L7a zuaxgvtnCLYD*kvTMR`LZ@uHyQMi>}lc$=t-YI9qCt&f>1{|M=_9g-yVqF((F&tvh@ z#KGfEStb@4y>}{_w%&-pv`5tP@VJY-cY+IPm4%1Avrh78uIwb^RXgdW5g(re79YTT z-s{OJ%NadAJ&g^~+cBWR1I~Vr%pSJX*xFK>3f175jZKUXs@iZjP zJS6N^9jwHSnz!s*b6}xVOWrj z8V*k5w&NwtN(~(D9BJ6pFIm4DHnMMigq^%j$4vn>eAfuf?HAI_TdWm zkiAp5&4Jpx-HSbrl8P}s85&~m4bQ@SX(;dB2{y?}h^ip&`y+_XHxMyUF-!3o+5Hwq ztEOPY%TLo&lBg3>-{;7@$Ih1z!Le-th1k>XYwNl`bS7dgNM`Mp(^Iy1yml#4Tpn#& z9ge8ktRKS~n{-i7k-*<}=@>(s-bEEnjE|E5ZWV*0qqPGWz^oyDARx?h+p#GuyoU;p zZN)kS_lQB-+Wu;SbbdTzsSPQ381BaQy#qo)L;D`VLt&lxSU#qmo#%APE>1#>`qHCxzuw|nE0Wt?>ny%t0j{6FrEm=^6BBjs*WLs{0VoHD;^XnW zn+f;#G2+7YXskJ|@jy~F!3!QkZkvt}3?XIG(S|bZETciCR9sV&&cSXNk8t)AVn7Bj zu+YSdDzZ7Ra>B#(``mg@oG@0i1$NWd_I{_e+q-W^3x?Y1$-x<9Ezuiit@GrFltpj$|{dr|&>4wJqT!)jiZU}9efzdcZ+i>M0+GB3` za&j{owI~fw4+ht?pspHCjxrhR#hQ_x)!vfl;W)wV6<6_M?Q{?ZZT)3CTBkoeg^xD| zL{x$VuCp$CoI(#9%a~285>1FhtZQBEH>VUjC#HJ7>_+Z zTj+htz=|8BiqXO5P9?Y5-0k}jvq=i~tjaa@$ zsp&;wy@&M=$ScaMF2 zJ1bXsndZ0o)2`4ysoKkOwZGZ-DsDd6LHSv*7vaH;pxERs@pwo4hgZg9rqmU-dcwzS^?PUf@z^7%Z8s!esYg^ zmXoP52}jn0SNx3QN}V7zE#If4X|H#VLZp%l_!sLi!yCuPA^~%7@~=D*nXUd8ufg5+^CUpZ&!t#n znS&xuPK24Myzj7Ws})T@6XP*yyvtnq)HfypZ8nx3TCS@gj1h4_;<}P;_gB;1hJJ9v z&li)<$z>-Q~Pw*?C1Wv2{X3J)bvBYv?qSkE0SxaGa~kmiL<9R+T+y$*PKerT?nG7E+}H-r-M01MC>q`7th0E< z-&~0=H8&^qb}qwsc_hMNtst+kEg(~0mbzXb(V)m&+qpno5tt@mI4fC?%eBgXz)4gJ z-r>M{qOlb)c{eFN`8qdv_&h1uZgBSeU`Hc%Bzp-Dp0j2gz#Ac%9DA*3QvvccuL3w2z#vpc3M}+B!biV9q8a(M?xq&TV&VpV zi^E4tzsX6Bp*;mFUdBnCBO+E3^L=H}E=(6nl5$&nt%WQ$MQ z_D!puSYc?e*W5OyHta5@o>Pu2aJ5~sxA^%_x-Vta&F*MGFv2l;))m#@Vx>FXix=@X zl?yaBokJSyX%-8fXOyzBdaUQD*%bTt*Ztr4O=@3^6hC{f$#2hn`>8sHaP17w{b+MW zavYfacr@`iVm1NNmh90Bp1O_hr~-fKm?WW9?Ar+JMJNg!JouJP#i0LqvU?oj0;T8n z^9${@<+OyC?NW)QcG3?GKh`}=HAE|8 zv$}+^+Qi-453-UpH-E6|si@+IM@Q}*>|V5Un9H_pC;wxi?cK(%pW4tj`N2MoYlqUq z^>Ne0uNU?&rbHAgmh5(*?RrW+(b=Er(JzC`n$TeoJAd@O{NOYvq-ZQzE&Q;J%^26$ zla91{2L?uKOv(JTPBE{U*~*O;qGTEIhd5O>iT;Ao6^m|8%3azRh-&9T*t6 zfr*v)OT)$nORbD2a)&X>Xl0=epN&Ds-7Ysr`IG$$a1tnkdD>RbzvktI@`_u7KdinQ zCghcdb-*g&q=Ve#az~3%{lUFPFeX(q;D#uA+AFw7-d1Dyu1{d12=Q_k&7OzUixlRu zwr60nOtr<#+Z#!ZHB>6}0_POiK%~YZ6sWGZ62LZJ8$k5Ju4XDKAq4ikQus`^_~l)c%Ei!bPm+(4htrg*uDcB>=SJpkXx>u5w1KR88%Ew$kYT$6g&!X!VJ2S zh}}J%N<03#XwY(#t@Wr|cKKp8C_bt;D_Zd?jU_P89?b{Hu77_p78c29E9EBfaxNHq zr;qCSfJ;oXICHyrM(;=5?!`YRD2$ye^oale+Iq{dwz{@k8!b|t;!Yqyad#^koKV~y zin|pk#T|kaFYaF4rMSBncPsAj<@w%yzxQ(-d*^qulB~7nT-Th}80Wy?y0|x9#JWzs zQ1H?f^ifdAv*swo-eGp=fMtDrFs-Ts+;rdlzH|59MYa8UgBOhH4_Z=hgSfkL=*R;xEqQg|dC_%U*uRo14B|UApd0Q<=KX zV85I}NFJ2!b;NBo-&i%DKh5k@j(g|_0UeJbJglCr@ySm343}~zHN@jWYg-j;Sl?}T zwuUUYmrefpC8qnx-xbg2=6%WBOzg=$j$4*}NF_2REr@jv)Rqmx)kyW2N@Z9 z3R6D+ey&D0ToaCK8|ttyFzRT?%yc>A4~tUHvq?-G2qAI}i%=d|O0-2t2yOkynA2Id zcael`HsUaf(-QCmf7y{`fylRPd2NR zOwgSk;&xiUprcWSmi7H?Ex3{R~|Dm!4NCpciY7&vmC@j1nxDW%lUX$kp)^3L(+PS8thE*n11Xvm1TMpZmd^hxKr<(#W62 zeI>b19-#HI;FP9fwp|0w51j3TXVj$V@1!`%LFRq|ABp74zcIrdp0le|b$yx{yg<>bk zAoXbJoE)PEvG*R2reYh>y1)UxHP-&EdXUovPxsKyd=MxKuhpvhpu*t5#a=o4kQkqE*D9uHIq*dT7TC&R~49#mEJ}#Ik8ztF-{ad zZcTA2*4{%(b8DU{`S2cTzAlS?lUBOT)J^gj+esbA z@roT`>CeE6_q@CH`)jA-D{2XLb`0rYtdJG)YBQaF?-b514s{AQh!zl!3f! zfgBilE$^&@@fwJWHgS`m`XY>EsDXKL{kBV0rCJ&qAxL=U1jkqslAVdKmB%+2tNQKQ z(EWqcZ>Q)5K(~|nvLcT8%35t4R*}60SRs&c&q&pk4adq~>R7x4Rg761&D+QHr=zJn zB)&yE=-zUKRW!M93pkc#!IJgra(84dId;jD6e>AI&St$i-AVmL`z6ELM6~^Jj3%V) z1%}=0FW}O3&251JVtF+5xL!CG;PnO@g8jocniRs?4s*}bQ0bD)L3960sVzkMN+Kv! z_qY`dzAUaM7xncI>#q#`6^Y^N9WpJP_IIJ7z`RQO9=seYZN5lyK*at2k}JW~zIP(t zGD9&f#iB)Nyf8dgI=?BV0xzNRZd~v@KPsqi!?KqHzdw%Ma{J{^yUz+w*$sQbNY9DF zeFOE6_GsFZl~6oP(IBj}=lf|AWT5rgE9_CdNJ3{}yW$`DceJTtnyu;f4Tm{f#?W)H z6HLj>j6JeUct;`PZW|0#K$wXkQzy4RHG79x!9O$6P{?TEK!Gnw%x_kQMF<8rh2I;1Xs ziE$hPX}|?8x);T0KgP>kV2Ri*r%kwQn9#J(SxeY0%BTB1ei+j3XRwy)U*be25&1M{ z&M%Lm2m@_${1)m$u+PSvQqiW%4&YmIkH+3XXpjcxMk;)!Q>Kg1tD9n(TzlE| zsign*p?5?ICpHbH8wv<8+_orvN%Q8#2irK1ZzTIzE|kvqTRW*tUVFS#glh%whQUoX%dbP1YDbsOUiTJiaA%WK#@un-@E?P zDLzeHW5(qMc9*NoN1>2YTs2qZOPFJ(6x7q&?HWw`1A)M_$Yw=0F9ezRTgZUXgg^oy z%GY#aoFj9s1Dg>1+FpsOjEmB;o6Mn^(ysJH#R5`HcrpKm-d8+jEE$E)=f@OHLkXm| zL#^hd6v>jMIn2(;Ahp6VPTQoV+l7ud%zaarN$NVGlnB-`#do%$+1OiY&sLdq4m3Wu z9=Oe>4i8YnXJVVwal+GrEG7i@x2D=+GX z14|~L!8cHgs3dQBD6B|bdjOis)G;zxt}(UZbjn2~W*Qz-okl&Qw>ULSGzX|#e`R#F zRo#%jMEDV6uz2_Il{Wl9MOxCs|1q4pX(4$?PRnvN#c$z0mLlPN^*6%(3K6HrSjiG8 zs398>pJQ*u@{Qs!O;k0_NW?HB0rA$ra@z0gflvMCN)}DL$Z_;s{Xq&my32u%pZNuX z9+U|FOv`O@`=kNu`!%K_5!j~t$6L*Kc0ZiX=2|E%ZoupOc_L0aA>);%wV7Vrzi@M? z^Lv+i^tbUTbXu0~NfM=mnYIS*lPRLqVLftQ z>oId1PbZF2{;qiQko~L@{BBuwZsAti5_n37gOxr$&Wn3EH`N}(?c6t7qd(P@!x#~E zO+hs@2zjxriTndx+0C8P&kxx@c-8S9vqB5+y zyZ2LPMULQ{kBW)}*Zv+IP4&m8R4v{jM2cernAM-fF*Lae!Vy?dKcH(s%cDB>r=N#-dU+t5{=YcPu^8O#Uy)&miu9# zs#AeTco6heggCo#%R*2b`=z{$98^_hV{&3g7v7d;t2N*0=8S;<6*qh+!B6Urd@L>* z61hbUxTWZjQ9oYoqxh5PzHg}JC!ul`;^{vwi$;MR5%w2&Z*^v2tLKl;Ac^+!er;@R zZ;Ap|lNUF99yJv!p$Z2vU&>-$S;=Sdo$2!6`=@J8B)J!-}w>_qtPmOn16^JCsh@eNnFfr-K?FTsxAT@4~i&~n5YB)i2W|tjm+Z8 z0;fSs`8lDg6Mpkg`nb?RXt3>JH$aT~*XBgx@h!3oyb_+r&cYj2 zv>8ux_&&XrJW7dSf@Qd2hS1c7zSdC#Rv%`FMFuq?ft&Wc+-%hlsMBMOJ<01!CGmF57f( z)2l5pl`0K_uectD=rAwwQMYX7e-ZHE28a4n@-?xsU&4%68Y=%5l`${ilW5vkL%8-v zmE92<7@&`R8oXm*OQ3r)dq&e2BH5Y{EGj`k^BHUh0ZygJ_tx!GgEY9}L39~fw>{q0 ze$m4dE_fi7WeoDqcHgpi{E~xre*Y}U?m-Sx%PvfTHaPSs;db=rxY2THi^3_@2owsU zB-7kJTx(b|j%pxi-}I8Ts+5CM4VoT1+&;u9DzQtwtr@)ydyS_QjZg+6`I2sv5j@ZCAMd96^ z8T<)N5-t*CDN{K%@+nSOSl@9SUVkW1Pk~%q=0>1B$gfGjovZ!b?!x2wD0%4)OtR$A zp9-Di=)8qGD8#R~#qF4_T)}5(Upu$!kKQfKTV~Wfvfne=y&o*fo;CIDiVo@{$4h02 z@%T?s!}#s4t}bHq^qEcHhdxi#&rqvly>v&%*+AnlNQW+jScS*0-N89Cftb-SJrA-Eo?9s zB|bftk$ldkpb))xR9@xFVQy*AYV8c%Rw;Nu*>J44) zy?~wi2^wug*2OIe|AfN0ws7HTA{yqF&2+?%i%K^#Z){n-FSo7JpRQh<|572%>341j z;*}4Yr4VRXgZ!Tqh$SKrbN%Szkc6@U!V<)4icxgZ=xKR~hUsg4mdf{7YlOc?347Rf!ht=%dZ>l8I`! zgMs;o5hI}d5{IWIsvAQWM<)Pt#!`5GTD$DFj@2DKK5KfBMJOaj^zqBb?LqT!piTHl zt%)a}Amwjh++=*lhq153MxUzQ9pE1!B}1^9+$er2V%7r(pUqWPD}|%Dx=^K!jt|uL zcmI-KX%TZd_SXq2=I8Y+7Jus;uqRbU=t$m^HcZYi|1?wO>@rXD_IO-XTF!Cqz|5*v zHK$Gdu!HubZ{YuOvv=)!YoqnUdAMG%Q2nd$L_OcawZ2DsTl9Q|f()4;Paz8G3)Qb` zrOfAU3LhS0ljg$Df)kf1{))_F@DxIeLA})O}D7FXo?2FRA>MeeO*`dXqKCx~RCu9stOD{q9Sm(oFVhR%(1_ zD7;ohu=`fewbxI4SI@L?`##*N5`2j|ldcKef9ZvvOo4mK#i=c3AF>D!stk+hU6WXz z7ZooIAe0ppc6eb&vsyvWmnir8#-p^tEMd<>43L-S!49XGqAi9S+H1*qoySphS@B*h zArqfxk)>I@B(K{l^CB_EeVMTCLPZ4Uu=;2U{PnAIwjKFi(D}oIaVK`q z$3pwv2rHk|A1IoM(TuJ+%_-ieRS3CS&+O{BswB~QZnwNc2#{EY3a3d3w_`lZ&r8{3 zP25PWZqE%c`Z&qR8xObc3^LqB$tOw_1GTaw;(8(PBb4Da*6t#}hTgeNOAEmjY z+MS%ckISKJZ|xUo@4msh?LaHuGPYbNJ`z}DWo-yPt*2ev?gau zHU(m*x>TK-%ViC%K;KFAPNQLa4>2GNe<7v)j4(P}sQy~|Mp7D^*&PyG7)@OK@XbBE z#f}L3)|DhK%`oC2G4!FG;SV?UX0#`@%AT->uL|`y3Xd%5luo*SxA)=+((?&PEz!S@ z<_Vi=^ZbUxH*4 z0phDWwKDw>u#`hajwxGP+JMS$$s2Bpw5c#UnrksL%}0|cyYcEn!SUxtu)Ap8A=Zxk zGy>+mO7&MAa-aH=xc+Exm+Q-NwnxI@Xg`hOLV};h!A2&8 zm8XlV2DoJ$N`m{+qg=7mjU`XCkW9_oUYAHrliqj)g;R={4lWIYg1;u|SUZu?)z_^5 zDqe0vVQ|&nI}a}b<%DH5i{tgu8HvVE5pwanusShf`k*NdvIb($DnI<;Xi;q!IXjaEOd)lLd?3_7_K?qs;E#ax%Cwv;ax; zSF|m=npmhL<4$qy_NM$#_$9U(NnpHU0ne*g2U5glmUL0J3yB&q`Clhau!|;NT--m&zoZHU zISgt=CDB1@B9h0*XQvGdhFb$<@A|m>WGMgJFV=+@`7K6x5I;ZF;dh)HegR2VsPUNZ zb0XVrg+0^94k`bXFTNa?gIQVT)B(G52GTB`oUuwYj)7v)q-aR787>@+o*sb!g zqU2=Aoj^6+_4paScE3U@$+#K*mX;3esN$%``_d|rGKad=yL&$2h?;Xsj z{X{c@PHR$k_RXCY;Gt`w>uW#b10`n^UCf3OICF+!hAtNBIpTo*&(`hM+Sa@fcfN$X z77FWl26~yYn4LCi)B|}QiUl{iTra??M3zCOTI!D2+C@N1{5{?*^i3c^X>MiDbz!g0oeBZE?q zlWORZLNY0`U8kbiq{o6K#uAjVNzmV7(l zT3K#h|EJ+aH<-t*&vVHr*5R6T2hz{TuDpmw>6OK4)1tExAa)-S?(>S4Z`isZ%&%7& z>WOJg;$?b=$>u0+)uA;_lZm}4O9J}o@MAJ{mwkXdf$nIb`Xr(v(UFfdw^c;UbyG>n zg}07w8VH>L5c9R%zAlgVk>66lFP&2XJ0f1*VQQYNw$?RICsykHw3oV<4>3RGi=@Ei zsx#wP$rD0cx$xeI55+zWLPfVI@B8U!8?h)H1fr`JD1eYr-1tXcsD>=I5m{=nwPRHh!y%7?bEqbj^9#kuX%&*F%^?f^sC>si_Qb{Gpx6Iy_Q5|SmOS>!r*Bu)wsW6 z4tDgVz7)W0{3WjWsmn?22mFMXQWljlekIWbj;{B2XlQi$oVaE!u-+J!obUf0F8Ah- z?9EmtdGwT>`^w5&8{%%6qK4E_F70Vt8%0D!{vC$M+6sJnbbL)Mwk$IVyZK6csPvDT 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 **Plugins**, assuming your license allows it. +### Wallaby.js + +[Wallaby.js](http://wallabyjs.com) is a continuous testing tool that enables real-time code coverage for Mocha with any assertion library in JetBrains IDEs (IntelliJ IDEA, WebStorm, etc.) and Visual Studio for both browser and node.js projects. + +![Wallaby.js in Action](images/wallaby.png) + ## Examples From ebc6aee50dd1fdca9ab940b43ab79db72f0a4f93 Mon Sep 17 00:00:00 2001 From: Ajay Kodali Date: Wed, 15 Jul 2015 16:09:16 -0700 Subject: [PATCH 0323/1771] * Fixed async hook error handling issue where an error in the hook was bailing sibling suites too * Added unit test cases for async hook error handling * Fixed minor issue in existing sync hook error test case * Moving code to fixtures dir to make the hook.err.js tests more readable * Trimming the hook error test cases by removing hooks not under test * Fix indentation * Rename var to afterAllHookCalled --- lib/runner.js | 36 +- .../fixtures/hooks/after.hook.async.error.js | 19 + .../fixtures/hooks/after.hook.error.js | 17 + .../hooks/afterEach.hook.async.error.js | 19 + .../fixtures/hooks/afterEach.hook.error.js | 17 + .../fixtures/hooks/before.hook.async.error.js | 19 + .../fixtures/hooks/before.hook.error.js | 17 + .../hooks/beforeEach.hook.async.error.js | 19 + .../fixtures/hooks/beforeEach.hook.error.js | 17 + .../hooks/multiple.hook.async.error.js | 139 +++++++ .../fixtures/hooks/multiple.hook.error.js | 129 +++++++ test/integration/hook.err.js | 339 +++++------------- 12 files changed, 529 insertions(+), 258 deletions(-) create mode 100644 test/integration/fixtures/hooks/after.hook.async.error.js create mode 100644 test/integration/fixtures/hooks/after.hook.error.js create mode 100644 test/integration/fixtures/hooks/afterEach.hook.async.error.js create mode 100644 test/integration/fixtures/hooks/afterEach.hook.error.js create mode 100644 test/integration/fixtures/hooks/before.hook.async.error.js create mode 100644 test/integration/fixtures/hooks/before.hook.error.js create mode 100644 test/integration/fixtures/hooks/beforeEach.hook.async.error.js create mode 100644 test/integration/fixtures/hooks/beforeEach.hook.error.js create mode 100644 test/integration/fixtures/hooks/multiple.hook.async.error.js create mode 100644 test/integration/fixtures/hooks/multiple.hook.error.js diff --git a/lib/runner.js b/lib/runner.js index 1b5b4084cb..a63bb9ee82 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -538,6 +538,7 @@ Runner.prototype.runTests = function(suite, fn) { } this.next = next; + this.hookErr = hookErr; next(); }; @@ -552,6 +553,7 @@ Runner.prototype.runSuite = function(suite, fn) { var i = 0; var self = this; var total = this.grepTotal(suite); + var afterAllHookCalled = false; debug('run suite %s', suite.fullTitle()); @@ -597,12 +599,23 @@ Runner.prototype.runSuite = function(suite, fn) { function done(errSuite) { self.suite = suite; - self.hook('afterAll', function() { - self.emit('suite end', suite); + self.nextSuite = next; + + if (afterAllHookCalled) { fn(errSuite); - }); + } else { + // mark that the afterAll block has been called once + // and so can be skipped if there is an error in it. + afterAllHookCalled = true; + self.hook('afterAll', function() { + self.emit('suite end', suite); + fn(errSuite); + }); + } } + this.nextSuite = next; + this.hook('beforeAll', function(err) { if (err) { return done(); @@ -648,7 +661,22 @@ Runner.prototype.uncaught = function(err) { return; } - // bail on hooks + // recover from hooks + if (runnable.type === 'hook') { + var errSuite = this.suite; + // if hook failure is in afterEach block + if (runnable.fullTitle().indexOf('after each') > -1) { + return this.hookErr(err, errSuite, true); + } + // if hook failure is in beforeEach block + if (runnable.fullTitle().indexOf('before each') > -1) { + return this.hookErr(err, errSuite, false); + } + // if hook failure is in after or before blocks + return this.nextSuite(errSuite); + } + + // bail this.emit('end'); }; diff --git a/test/integration/fixtures/hooks/after.hook.async.error.js b/test/integration/fixtures/hooks/after.hook.async.error.js new file mode 100644 index 0000000000..dc55537a60 --- /dev/null +++ b/test/integration/fixtures/hooks/after.hook.async.error.js @@ -0,0 +1,19 @@ +describe('spec 1', function () { + after(function (done) { + console.log('after'); + process.nextTick(function () { + throw new Error('after hook error'); + }); + }); + it('should be called because error is in after hook', function () { + console.log('test 1'); + }); + it('should be called because error is in after hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/after.hook.error.js b/test/integration/fixtures/hooks/after.hook.error.js new file mode 100644 index 0000000000..e84856e433 --- /dev/null +++ b/test/integration/fixtures/hooks/after.hook.error.js @@ -0,0 +1,17 @@ +describe('spec 1', function () { + after(function () { + console.log('after'); + throw new Error('after hook error'); + }); + it('should be called because error is in after hook', function () { + console.log('test 1'); + }); + it('should be called because error is in after hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/afterEach.hook.async.error.js b/test/integration/fixtures/hooks/afterEach.hook.async.error.js new file mode 100644 index 0000000000..d4f4c9bdd9 --- /dev/null +++ b/test/integration/fixtures/hooks/afterEach.hook.async.error.js @@ -0,0 +1,19 @@ +describe('spec 1', function () { + afterEach(function (done) { + console.log('after'); + process.nextTick(function () { + throw new Error('after each hook error'); + }); + }); + it('should be called because error is in after each hook', function () { + console.log('test 1'); + }); + it('should not be called', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/afterEach.hook.error.js b/test/integration/fixtures/hooks/afterEach.hook.error.js new file mode 100644 index 0000000000..9d28632fa3 --- /dev/null +++ b/test/integration/fixtures/hooks/afterEach.hook.error.js @@ -0,0 +1,17 @@ +describe('spec 1', function () { + afterEach(function () { + console.log('after'); + throw new Error('after each hook error'); + }); + it('should be called because error is in after each hook', function () { + console.log('test 1'); + }); + it('should not be called', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/before.hook.async.error.js b/test/integration/fixtures/hooks/before.hook.async.error.js new file mode 100644 index 0000000000..10ea95156b --- /dev/null +++ b/test/integration/fixtures/hooks/before.hook.async.error.js @@ -0,0 +1,19 @@ +describe('spec 1', function () { + before(function (done) { + console.log('before'); + process.nextTick(function () { + throw new Error('before hook error'); + }); + }); + it('should not be called because of error in before hook', function () { + console.log('test 1'); + }); + it('should not be called because of error in before hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/before.hook.error.js b/test/integration/fixtures/hooks/before.hook.error.js new file mode 100644 index 0000000000..b3d6ea6640 --- /dev/null +++ b/test/integration/fixtures/hooks/before.hook.error.js @@ -0,0 +1,17 @@ +describe('spec 1', function () { + before(function () { + console.log('before'); + throw new Error('before hook error'); + }); + it('should not be called because of error in before hook', function () { + console.log('test 1'); + }); + it('should not be called because of error in before hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/beforeEach.hook.async.error.js b/test/integration/fixtures/hooks/beforeEach.hook.async.error.js new file mode 100644 index 0000000000..a34ed755e2 --- /dev/null +++ b/test/integration/fixtures/hooks/beforeEach.hook.async.error.js @@ -0,0 +1,19 @@ +describe('spec 1', function () { + beforeEach(function (done) { + console.log('before'); + process.nextTick(function () { + throw new Error('before each hook error'); + }); + }); + it('should not be called because of error in before each hook', function () { + console.log('test 1'); + }); + it('should not be called because of error in before each hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/beforeEach.hook.error.js b/test/integration/fixtures/hooks/beforeEach.hook.error.js new file mode 100644 index 0000000000..bd84e8fe74 --- /dev/null +++ b/test/integration/fixtures/hooks/beforeEach.hook.error.js @@ -0,0 +1,17 @@ +describe('spec 1', function () { + beforeEach(function () { + console.log('before'); + throw new Error('before each hook error'); + }); + it('should not be called because of error in before each hook', function () { + console.log('test 1'); + }); + it('should not be called because of error in before each hook', function () { + console.log('test 2'); + }); +}); +describe('spec 2', function () { + it('should be called, because hook error was in a sibling suite', function () { + console.log('test 3'); + }); +}); diff --git a/test/integration/fixtures/hooks/multiple.hook.async.error.js b/test/integration/fixtures/hooks/multiple.hook.async.error.js new file mode 100644 index 0000000000..c5474ad99b --- /dev/null +++ b/test/integration/fixtures/hooks/multiple.hook.async.error.js @@ -0,0 +1,139 @@ +before(function () { + console.log('root before'); +}); +beforeEach(function () { + console.log('root before each'); +}); +describe('1', function () { + beforeEach(function () { + console.log('1 before each'); + }); + + describe('1.1', function () { + before(function () { + console.log('1.1 before'); + }); + beforeEach(function (done) { + console.log('1.1 before each'); + process.nextTick(function () { + throw new Error('1.1 before each hook failed'); + }); + }); + it('1.1 test 1', function () { + console.log('1.1 test 1'); + }); + it('1.1 test 2', function () { + console.log('1.1 test 2'); + }); + afterEach(function () { + console.log('1.1 after each'); + }); + after(function (done) { + console.log('1.1 after'); + process.nextTick(function () { + throw new Error('1.1 after hook failed'); + }); + }); + }); + + describe('1.2', function () { + before(function () { + console.log('1.2 before'); + }); + beforeEach(function () { + console.log('1.2 before each'); + }); + it('1.2 test 1', function () { + console.log('1.2 test 1'); + }); + it('1.2 test 2', function () { + console.log('1.2 test 2'); + }); + afterEach(function (done) { + console.log('1.2 after each'); + process.nextTick(function () { + throw new Error('1.2 after each hook failed'); + }); + }); + after(function () { + console.log('1.2 after'); + }); + }); + + afterEach(function () { + console.log('1 after each'); + }); + + after(function () { + console.log('1 after'); + }); +}); + +describe('2', function () { + beforeEach(function (done) { + console.log('2 before each'); + process.nextTick(function () { + throw new Error('2 before each hook failed'); + }); + }); + + describe('2.1', function () { + before(function () { + console.log('2.1 before'); + }); + beforeEach(function () { + console.log('2.1 before each'); + }); + it('2.1 test 1', function () { + console.log('2.1 test 1'); + }); + it('2.1 test 2', function () { + console.log('2.1 test 2'); + }); + afterEach(function () { + console.log('2.1 after each'); + }); + after(function () { + console.log('2.1 after'); + }); + }); + + describe('2.2', function () { + before(function () { + console.log('2.2 before'); + }); + beforeEach(function () { + console.log('2.2 before each'); + }); + it('2.2 test 1', function () { + console.log('2.2 test 1'); + }); + it('2.2 test 2', function () { + console.log('2.2 test 2'); + }); + afterEach(function () { + console.log('2.2 after each'); + }); + after(function () { + console.log('2.2 after'); + }); + }); + + afterEach(function (done) { + console.log('2 after each'); + process.nextTick(function () { + throw new Error('2 after each hook failed'); + }); + }); + + after(function () { + console.log('2 after'); + }); +}); + +after(function () { + console.log('root after'); +}); +afterEach(function () { + console.log('root after each'); +}); diff --git a/test/integration/fixtures/hooks/multiple.hook.error.js b/test/integration/fixtures/hooks/multiple.hook.error.js new file mode 100644 index 0000000000..f0983cf42f --- /dev/null +++ b/test/integration/fixtures/hooks/multiple.hook.error.js @@ -0,0 +1,129 @@ +before(function () { + console.log('root before'); +}); +beforeEach(function () { + console.log('root before each'); +}); +describe('1', function () { + beforeEach(function () { + console.log('1 before each'); + }); + + describe('1.1', function () { + before(function () { + console.log('1.1 before'); + }); + beforeEach(function () { + console.log('1.1 before each'); + throw new Error('1.1 before each hook failed'); + }); + it('1.1 test 1', function () { + console.log('1.1 test 1'); + }); + it('1.1 test 2', function () { + console.log('1.1 test 2'); + }); + afterEach(function () { + console.log('1.1 after each'); + }); + after(function () { + console.log('1.1 after'); + throw new Error('1.1 after hook failed'); + }); + }); + + describe('1.2', function () { + before(function () { + console.log('1.2 before'); + }); + beforeEach(function () { + console.log('1.2 before each'); + }); + it('1.2 test 1', function () { + console.log('1.2 test 1'); + }); + it('1.2 test 2', function () { + console.log('1.2 test 2'); + }); + afterEach(function () { + console.log('1.2 after each'); + throw new Error('1.2 after each hook failed'); + }); + after(function () { + console.log('1.2 after'); + }); + }); + + afterEach(function () { + console.log('1 after each'); + }); + + after(function () { + console.log('1 after'); + }); +}); + +describe('2', function () { + beforeEach(function () { + console.log('2 before each'); + throw new Error('2 before each hook failed'); + }); + + describe('2.1', function () { + before(function () { + console.log('2.1 before'); + }); + beforeEach(function () { + console.log('2.1 before each'); + }); + it('2.1 test 1', function () { + console.log('2.1 test 1'); + }); + it('2.1 test 2', function () { + console.log('2.1 test 2'); + }); + afterEach(function () { + console.log('2.1 after each'); + }); + after(function () { + console.log('2.1 after'); + }); + }); + + describe('2.2', function () { + before(function () { + console.log('2.2 before'); + }); + beforeEach(function () { + console.log('2.2 before each'); + }); + it('2.2 test 1', function () { + console.log('2.2 test 1'); + }); + it('2.2 test 2', function () { + console.log('2.2 test 2'); + }); + afterEach(function () { + console.log('2.2 after each'); + }); + after(function () { + console.log('2.2 after'); + }); + }); + + afterEach(function () { + console.log('2 after each'); + throw new Error('2 after each hook failed'); + }); + + after(function () { + console.log('2 after'); + }); +}); + +after(function () { + console.log('root after'); +}); +afterEach(function () { + console.log('root after each'); +}); diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index 0e3329523e..a3727156ff 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var runMochaFunction = require('./helpers').runMochaFunction; +var runMocha = require('./helpers').runMocha; describe('hook error handling', function() { this.timeout(1000); @@ -7,294 +7,125 @@ describe('hook error handling', function() { var lines; describe('before hook error', function() { - before(run(function beforeHookError() { - describe('spec 1', function() { - describe('spec 1 nested', function() { - it('should not be called, because hook error was in a parent suite', function() { - console.log('test nested'); - }); - }); - before(function() { - console.log('before'); - throw new Error('before hook error'); - }); - after(function() { - console.log('after'); - }); - it('should not be called because of error in before hook', function() { - console.log('test'); - }); - }); - describe('spec 2', function() { - before(function() { - console.log('before 2'); - }); - after(function() { - console.log('after 2'); - }); - it('should be called, because hook error was in a sibling suite', function() { - console.log('test 2'); - }); - }); - })); - + before(run('hooks/before.hook.error.js')); it('should verify results', function() { assert.deepEqual( lines, - ['before', 'after', 'before 2', 'test 2', 'after 2'] + ['before', 'test 3'] ); }); }); describe('before each hook error', function() { - before(run(function beforeEachHookError() { - describe('spec 1', function() { - describe('spec 1 nested', function() { - it('should not be called, because hook error was in a parent suite', function() { - console.log('test nested'); - }); - }); - beforeEach(function() { - console.log('before'); - throw new Error('before each hook error'); - }); - afterEach(function() { - console.log('after'); - }); - it('should not be called because of error in before each hook', function() { - console.log('test'); - }); - }); - describe('spec 2', function() { - before(function() { - console.log('before 2'); - }); - after(function() { - console.log('after 2'); - }); - it('should be called, because hook error was in a sibling suite', function() { - console.log('test 2'); - }); - }); - })); + before(run('hooks/beforeEach.hook.error.js')); it('should verify results', function() { assert.deepEqual( lines, - ['before', 'after', 'before 2', 'test 2', 'after 2'] + ['before', 'test 3'] ); }); }); describe('after hook error', function() { - before(run(function afterHookError() { - describe('spec 1', function() { - describe('spec 1 nested', function() { - it('should be called, because hook error will happen after parent suite', function() { - console.log('test nested'); - }); - }); - before(function() { - console.log('before'); - }); - after(function() { - console.log('after'); - throw new Error('after hook error'); - }); - it('should be called because error is in after hook', function() { - console.log('test'); - }); - }); - describe('spec 2', function() { - before(function() { - console.log('before 2'); - }); - after(function() { - console.log('after 2'); - }); - it('should be called, because hook error was in a sibling suite', function() { - console.log('test 2'); - }); - }); - })); + before(run('hooks/after.hook.error.js')); it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test', 'test nested', 'after', 'before 2', 'test 2', 'after 2'] + ['test 1', 'test 2', 'after', 'test 3'] ); }); }); describe('after each hook error', function() { - before(run(function afterEachHookError() { - describe('spec 1', function() { - describe('spec 1 nested', function() { - it('should be called, because hook error will happen after parent suite', function() { - console.log('test nested'); - }); - }); - before(function() { - console.log('before'); - }); - after(function() { - console.log('after'); - throw new Error('after hook error'); - }); - it('should be called because error is in after hook', function() { - console.log('test'); - }); - }); - describe('spec 2', function() { - before(function() { - console.log('before 2'); - }); - after(function() { - console.log('after 2'); - }); - it('should be called, because hook error was in a sibling suite', function() { - console.log('test 2'); - }); - }); - })); + before(run('hooks/afterEach.hook.error.js')); it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test', 'test nested', 'after', 'before 2', 'test 2', 'after 2'] + ['test 1', 'after', 'test 3'] ); }); }); describe('multiple hook errors', function() { - before(run(function multipleHookErrors() { - before(function() { - console.log('root before'); - }); - beforeEach(function() { - console.log('root before each'); - }); - describe('1', function() { - beforeEach(function() { - console.log('1 before each'); - }); - - describe('1.1', function() { - before(function() { - console.log('1.1 before'); - }); - beforeEach(function() { - console.log('1.1 before each'); - throw new Error('1.1 before each hook failed'); - }); - it('1.1 test 1', function() { - console.log('1.1 test 1'); - }); - it('1.1 test 2', function() { - console.log('1.1 test 2'); - }); - afterEach(function() { - console.log('1.1 after each'); - }); - after(function() { - console.log('1.1 after'); - throw new Error('1.1 after hook failed'); - }); - }); - - describe('1.2', function() { - before(function() { - console.log('1.2 before'); - }); - beforeEach(function() { - console.log('1.2 before each'); - }); - it('1.2 test 1', function() { - console.log('1.2 test 1'); - }); - it('1.2 test 2', function() { - console.log('1.2 test 2'); - }); - afterEach(function() { - console.log('1.2 after each'); - throw new Error('1.2 after each hook failed'); - }); - after(function() { - console.log('1.2 after'); - }); - }); - - afterEach(function() { - console.log('1 after each'); - }); - - after(function() { - console.log('1 after'); - }); - }); - - describe('2', function() { - beforeEach(function() { - console.log('2 before each'); - throw new Error('2 before each hook failed'); - }); + before(run('hooks/multiple.hook.error.js')); + it('should verify results', function() { + assert.deepEqual( + lines, + [ + 'root before', + '1.1 before', + 'root before each', + '1 before each', + '1.1 before each', + '1.1 after each', + '1 after each', + 'root after each', + '1.1 after', + '1.2 before', + 'root before each', + '1 before each', + '1.2 before each', + '1.2 test 1', + '1.2 after each', + '1 after each', + 'root after each', + '1.2 after', + '1 after', + '2.1 before', + 'root before each', + '2 before each', + '2 after each', + 'root after each', + '2.1 after', + '2 after', + 'root after' + ] + ); + }); + }); - describe('2.1', function() { - before(function() { - console.log('2.1 before'); - }); - beforeEach(function() { - console.log('2.1 before each'); - }); - it('2.1 test 1', function() { - console.log('2.1 test 1'); - }); - it('2.1 test 2', function() { - console.log('2.1 test 2'); - }); - afterEach(function() { - console.log('2.1 after each'); - }); - after(function() { - console.log('2.1 after'); - }); - }); + describe('async - before hook error', function() { + before(run('hooks/before.hook.async.error.js')); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'test 3'] + ); + }); + }); - describe('2.2', function() { - before(function() { - console.log('2.2 before'); - }); - beforeEach(function() { - console.log('2.2 before each'); - }); - it('2.2 test 1', function() { - console.log('2.2 test 1'); - }); - it('2.2 test 2', function() { - console.log('2.2 test 2'); - }); - afterEach(function() { - console.log('2.2 after each'); - }); - after(function() { - console.log('2.2 after'); - }); - }); + describe('async - before each hook error', function() { + before(run('hooks/beforeEach.hook.async.error.js')); + it('should verify results', function() { + assert.deepEqual( + lines, + ['before', 'test 3'] + ); + }); + }); - afterEach(function() { - console.log('2 after each'); - throw new Error('2 after each hook failed'); - }); + describe('async - after hook error', function() { + before(run('hooks/after.hook.async.error.js')); + it('should verify results', function() { + assert.deepEqual( + lines, + ['test 1', 'test 2', 'after', 'test 3'] + ); + }); + }); - after(function() { - console.log('2 after'); - }); - }); + describe('async - after each hook error', function() { + before(run('hooks/afterEach.hook.async.error.js')); + it('should verify results', function() { + assert.deepEqual( + lines, + ['test 1', 'after', 'test 3'] + ); + }); + }); - after(function() { - console.log('root after'); - }); - afterEach(function() { - console.log('root after each'); - }); - })); + describe('async - multiple hook errors', function() { + before(run('hooks/multiple.hook.async.error.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -331,9 +162,9 @@ describe('hook error handling', function() { }); }); - function run(fn) { + function run(fnPath) { return function(done) { - runMochaFunction(fn, [], function(err, res) { + runMocha(fnPath, [], function(err, res) { assert.ifError(err); lines = res.output From 14adc4f4709147207784574d96b212b1be3bc2d2 Mon Sep 17 00:00:00 2001 From: Ryan Tablada Date: Mon, 3 Aug 2015 12:22:41 -0500 Subject: [PATCH 0324/1771] Fixes missing commas and file formats --- index.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/index.md b/index.md index 4acbba68a0..9f03cd79a6 100644 --- a/index.md +++ b/index.md @@ -89,7 +89,7 @@ $ $EDITOR test/test.js In your editor: ```js -var assert = require("assert") +var assert = require("assert"); describe('Array', function() { describe('#indexOf()', function () { it('should return -1 when the value is not present', function () { @@ -441,11 +441,11 @@ describe('a suite of tests', function() { it('should take less than 500ms', function(done){ setTimeout(done, 300); - }) + }); it('should take less than 500ms as well', function(done){ setTimeout(done, 200); - }) + }); }) ``` @@ -595,8 +595,8 @@ describe('app', function() { it('respond with an array of users', function() { // ... }); - }) -}) + }); +}); ``` ## Interfaces @@ -712,10 +712,10 @@ The `require` interface allows you to require the `describe` and friend words di *Note*: The `require` interface cannot be run via the `node` executable, and must be run via `mocha`. ```js -var testCase = require('mocha').describe -var pre = require('mocha').before -var assertions = require('mocha').it -var assert = require('assert') +var testCase = require('mocha').describe; +var pre = require('mocha').before; +var assertions = require('mocha').it; +var assert = require('assert'); testCase('Array', function() { pre(function() { @@ -816,7 +816,7 @@ The "doc" reporter outputs a hierarchical HTML body representation of your tests For example, suppose you have the following JavaScript: -``` +```js describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { @@ -1008,7 +1008,7 @@ $ make test-all Alter the reporter: -``` +```sh $ make test REPORTER=list ``` From 19ddfad7e1ea6b853b78669b355c4652340f453f Mon Sep 17 00:00:00 2001 From: Sune Simonsen Date: Wed, 5 Aug 2015 21:18:29 +0200 Subject: [PATCH 0325/1771] Added unexpected.js.org as an assertion library --- index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/index.md b/index.md index 4acbba68a0..70fe493661 100644 --- a/index.md +++ b/index.md @@ -118,6 +118,7 @@ Mocha allows you to use any assertion library you want, if it throws an error, i - [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions - [chai](http://chaijs.com/) expect(), assert() and should style assertions - [better-assert](https://github.com/visionmedia/better-assert) c-style self-documenting assert() +- [unexpected](http://unexpected.js.org) the extensible BDD assertion toolkit ## Synchronous Code From c66b34e7e1ee5b9b7054ecccc73f589ead2f8543 Mon Sep 17 00:00:00 2001 From: Pavel Zubkou Date: Tue, 11 Aug 2015 17:29:16 +0300 Subject: [PATCH 0326/1771] Set safe CSS for progress indicator which does not conflict with Bootstrap --- mocha.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mocha.css b/mocha.css index 3b82ae915c..759a6c8c47 100644 --- a/mocha.css +++ b/mocha.css @@ -261,6 +261,15 @@ body { #mocha-stats .progress { float: right; padding-top: 0; + + /** + * Set safe initial values, so mochas .progress does not inherit these + * properties from Bootstrap .progress (which causes .progress height to + * equal line height set in Bootstrap). + */ + height: auto; + box-shadow: none; + background-color: initial; } #mocha-stats em { From 71068dae0e3f1155d87a69dbef940ec001327f29 Mon Sep 17 00:00:00 2001 From: gigadude Date: Tue, 11 Aug 2015 14:55:05 -0700 Subject: [PATCH 0327/1771] Support --max-old-space-size node argument --- bin/mocha | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/mocha b/bin/mocha index 7d81333bc7..3d87c9c6e9 100755 --- a/bin/mocha +++ b/bin/mocha @@ -61,6 +61,7 @@ process.argv.slice(2).forEach(function(arg){ break; default: if (0 == arg.indexOf('--trace')) args.unshift(arg); + else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg); else args.push(arg); break; } From 283ad65b2bc2e2fd06b86ae29b5ceba04e77e728 Mon Sep 17 00:00:00 2001 From: Outsider Date: Sat, 15 Aug 2015 17:11:10 +0900 Subject: [PATCH 0328/1771] fix undefined `str` variable for html coverage Order for variables definition is wrong in 3f78f10ca, so, html coverage page print `` because str is undefined in `jade.compile(str, { filename: file });`. --- lib/reporters/html-cov.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/html-cov.js b/lib/reporters/html-cov.js index f45feb5d70..e3f2dd91e3 100644 --- a/lib/reporters/html-cov.js +++ b/lib/reporters/html-cov.js @@ -21,9 +21,9 @@ exports = module.exports = HTMLCov; function HTMLCov(runner) { var jade = require('jade'); var file = join(__dirname, '/templates/coverage.jade'); + var str = readFileSync(file, 'utf8'); var fn = jade.compile(str, { filename: file }); var self = this; - var str = readFileSync(file, 'utf8'); JSONCov.call(this, runner, false); From d70759f1730a7cecf8f786715a74065db5b6638b Mon Sep 17 00:00:00 2001 From: Outsider Date: Sun, 16 Aug 2015 20:44:41 +0900 Subject: [PATCH 0329/1771] upgrade jade to v1.11.0 Jade syntax isn't broken in new version, but update some syntax for being more explicitly. fix #1811 --- lib/reporters/templates/coverage.jade | 4 ++-- lib/reporters/templates/menu.jade | 6 +++--- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/reporters/templates/coverage.jade b/lib/reporters/templates/coverage.jade index edd59d8864..24b72c537b 100644 --- a/lib/reporters/templates/coverage.jade +++ b/lib/reporters/templates/coverage.jade @@ -17,7 +17,7 @@ html .misses= cov.misses #files - for file in cov.files + each file in cov.files .file h2(id=file.filename)= file.filename #stats(class=coverageClass(file.coverage)) @@ -33,7 +33,7 @@ html th Hits th Source tbody - for line, number in file.source + each line, number in file.source if line.coverage > 0 tr.hit td.line= number diff --git a/lib/reporters/templates/menu.jade b/lib/reporters/templates/menu.jade index c682e3f0ee..c7b4e4698e 100644 --- a/lib/reporters/templates/menu.jade +++ b/lib/reporters/templates/menu.jade @@ -1,12 +1,12 @@ #menu li a(href='#overview') overview - for file in cov.files + each file in cov.files li span.cov(class=coverageClass(file.coverage)) #{file.coverage | 0} a(href='##{file.filename}') - segments = file.filename.split('/') - basename = segments.pop() + - var segments = file.filename.split('/') + - var basename = segments.pop() if segments.length span.dirname= segments.join('/') + '/' span.basename= basename diff --git a/package.json b/package.json index d3ebaec6a0..9dfa57f028 100644 --- a/package.json +++ b/package.json @@ -280,7 +280,7 @@ "escape-string-regexp": "1.0.2", "glob": "3.2.3", "growl": "1.8.1", - "jade": "0.26.3", + "jade": "1.11.0", "lodash.create": "^3.1.1", "mkdirp": "0.5.0", "supports-color": "1.2.0" From 5054feeef901edd7c5a069bc2c54d97ef9e707a8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 23 Aug 2015 15:54:07 -0700 Subject: [PATCH 0330/1771] upgrade eslint to 1.2.1 w/ config & Makefile fixes --- .eslintrc | 5 ++--- Makefile | 2 +- package.json | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.eslintrc b/.eslintrc index a89b22b26a..57574b4fd1 100644 --- a/.eslintrc +++ b/.eslintrc @@ -20,7 +20,7 @@ rules: func-style: [2, declaration] guard-for-in: 2 # TODO: Change to error handle-callback-err: [2, ^(err|error)$] - indent: [2, 2] + indent: [2, 2, { SwitchCase: 1 }] key-spacing: [2, { beforeColon: false, afterColon: true }] max-len: [0, 80, 2] # TODO: Change to error max-params: [1, 4] @@ -83,7 +83,6 @@ rules: no-proto: 1 # TODO: Change to error no-redeclare: 2 no-regex-spaces: 2 - no-reserved-keys: 2 no-return-assign: 2 no-script-url: 2 no-self-compare: 2 @@ -120,7 +119,7 @@ rules: space-infix-ops: 2 space-return-throw-case: 2 space-unary-ops: [2, { words: true, nonwords: false }] - spaced-line-comment: 2 + spaced-comment: [2, always, { exceptions: ['!'] }] strict: [0, global] # TODO: Change to error use-isnan: 2 valid-jsdoc: [0, { requireReturn: false }] # TODO: Change to warning diff --git a/Makefile b/Makefile index 53cb5657a1..24bc89a2e0 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ lib-cov: @jscoverage lib $@ lint: - @$(ESLINT) --reset $(SRC) + @$(ESLINT) $(SRC) test: lint test-unit diff --git a/package.json b/package.json index 9dfa57f028..a645794ee6 100644 --- a/package.json +++ b/package.json @@ -289,7 +289,7 @@ "browser-stdout": "^1.2.0", "browserify": "10.2.4", "coffee-script": "~1.8.0", - "eslint": "~0.23.0", + "eslint": "^1.2.1", "should": "~4.0.0", "through2": "~0.6.5" }, From 242ee53a5d23337e3f0d7b3a6f0f05eea82058d6 Mon Sep 17 00:00:00 2001 From: Jason Lai Date: Tue, 6 Jan 2015 18:26:14 -0800 Subject: [PATCH 0331/1771] Allow --async-only to be satisfied by returning a promise This results in a slight change to the behavior of --async-only: instead of failing immediately, check to see if the test returned a promise (or otherwise failed) before complaining about not having a done callback. --- bin/_mocha | 2 +- lib/runnable.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 1129178b54..4ddbc08ff1 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -58,7 +58,7 @@ var images = { program .version(JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version) .usage('[debug] [options] [files]') - .option('-A, --async-only', "force all tests to take a callback (async)") + .option('-A, --async-only', "force all tests to take a callback (async) or return a promise") .option('-c, --colors', 'force enabling of colors') .option('-C, --no-colors', 'force disabling of colors') .option('-G, --growl', 'enable growl notification support') diff --git a/lib/runnable.js b/lib/runnable.js index d0c0f60732..a048d4a018 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -274,10 +274,6 @@ Runnable.prototype.run = function(fn) { return; } - if (this.asyncOnly) { - return done(new Error('--async-only option in use without declaring `done()`')); - } - // sync or promise-returning try { if (this.pending) { @@ -301,6 +297,10 @@ Runnable.prototype.run = function(fn) { done(reason || new Error('Promise rejected with no or falsy reason')); }); } else { + if (self.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()` or returning a promise')); + } + done(); } } From 92dfdd420ff2f611bae6582a25d79681b5271546 Mon Sep 17 00:00:00 2001 From: amsul Date: Fri, 17 Apr 2015 19:33:09 -0400 Subject: [PATCH 0332/1771] added allowUncaught option (#553) allows unhandled exceptions to propagate in the browser added tests for allowUncaught option global error handler prints to dom with allowUncaught --- lib/mocha.js | 43 ++++++++++++++++++++++++++++++++-------- lib/runnable.js | 42 +++++++++++++++++++++++++++------------ lib/runner.js | 36 +++++++++++++++++++++++---------- support/browser-entry.js | 2 +- test/runnable.js | 29 +++++++++++++++++++++++++++ test/runner.js | 15 ++++++++++++++ 6 files changed, 134 insertions(+), 33 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 1817ccf2c6..e3a2321e50 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -68,8 +68,8 @@ function image(name) { * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * - * @api public * @param {Object} options + * @api public */ function Mocha(options) { options = options || {}; @@ -141,6 +141,8 @@ Mocha.prototype.addFile = function(file) { /** * Set reporter to `reporter`, defaults to "spec". * + * @param {String|Function} reporter name or constructor + * @param {Object} reporterOptions optional options * @api public * @param {string|Function} reporter name or constructor * @param {Object} reporterOptions optional options @@ -243,6 +245,8 @@ Mocha.prototype._growl = function(runner, reporter) { /** * Add regexp to grep, if `re` is a string it is escaped. * + * @param {RegExp|String} re + * @return {Mocha} * @api public * @param {RegExp|string} re * @return {Mocha} @@ -255,8 +259,8 @@ Mocha.prototype.grep = function(re) { /** * Invert `.grep()` matches. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.invert = function() { this.options.invert = true; @@ -266,6 +270,8 @@ Mocha.prototype.invert = function() { /** * Ignore global leaks. * + * @param {Boolean} ignore + * @return {Mocha} * @api public * @param {boolean} ignore * @return {Mocha} @@ -278,8 +284,8 @@ Mocha.prototype.ignoreLeaks = function(ignore) { /** * Enable global leak checking. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.checkLeaks = function() { this.options.ignoreLeaks = false; @@ -289,8 +295,8 @@ Mocha.prototype.checkLeaks = function() { /** * Display long stack-trace on failing * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.fullTrace = function() { this.options.fullStackTrace = true; @@ -300,8 +306,8 @@ Mocha.prototype.fullTrace = function() { /** * Enable growl support. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.growl = function() { this.options.growl = true; @@ -311,6 +317,8 @@ Mocha.prototype.growl = function() { /** * Ignore `globals` array or string. * + * @param {Array|String} globals + * @return {Mocha} * @api public * @param {Array|string} globals * @return {Mocha} @@ -323,6 +331,8 @@ Mocha.prototype.globals = function(globals) { /** * Emit color output. * + * @param {Boolean} colors + * @return {Mocha} * @api public * @param {boolean} colors * @return {Mocha} @@ -337,6 +347,8 @@ Mocha.prototype.useColors = function(colors) { /** * Use inline diffs rather than +/-. * + * @param {Boolean} inlineDiffs + * @return {Mocha} * @api public * @param {boolean} inlineDiffs * @return {Mocha} @@ -349,6 +361,8 @@ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { /** * Set the timeout in milliseconds. * + * @param {Number} timeout + * @return {Mocha} * @api public * @param {number} timeout * @return {Mocha} @@ -361,6 +375,8 @@ Mocha.prototype.timeout = function(timeout) { /** * Set slowness threshold in milliseconds. * + * @param {Number} slow + * @return {Mocha} * @api public * @param {number} slow * @return {Mocha} @@ -373,6 +389,8 @@ Mocha.prototype.slow = function(slow) { /** * Enable timeouts. * + * @param {Boolean} enabled + * @return {Mocha} * @api public * @param {boolean} enabled * @return {Mocha} @@ -385,8 +403,8 @@ Mocha.prototype.enableTimeouts = function(enabled) { /** * Makes all tests async (accepting a callback) * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.asyncOnly = function() { this.options.asyncOnly = true; @@ -397,7 +415,6 @@ Mocha.prototype.asyncOnly = function() { * Disable syntax highlighting (in browser). * * @api public - * @returns {Mocha} */ Mocha.prototype.noHighlighting = function() { this.options.noHighlighting = true; @@ -405,9 +422,18 @@ Mocha.prototype.noHighlighting = function() { }; /** - * Delay root suite execution. + * Enable uncaught errors to propagate (in browser). * + * @return {Mocha} * @api public + */ +Mocha.prototype.allowUncaught = function() { + this.options.allowUncaught = true; + return this; +}; + +/** + * Delay root suite execution. * @returns {Mocha} */ Mocha.prototype.delay = function delay() { @@ -434,6 +460,7 @@ Mocha.prototype.run = function(fn) { runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; + runner.allowUncaught = options.allowUncaught; if (options.grep) { runner.grep(options.grep, options.invert); } diff --git a/lib/runnable.js b/lib/runnable.js index a048d4a018..01b84ccb5d 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -36,6 +36,8 @@ module.exports = Runnable; /** * Initialize a new `Runnable` with the given `title` and callback `fn`. * + * @param {String} title + * @param {Function} fn * @api private * @param {string} title * @param {Function} fn @@ -205,8 +207,8 @@ Runnable.prototype.globals = function(globals) { /** * Run the test and invoke `fn(err)`. * - * @api private * @param {Function} fn + * @api private */ Runnable.prototype.run = function(fn) { var self = this; @@ -255,25 +257,23 @@ Runnable.prototype.run = function(fn) { if (this.async) { this.resetTimeout(); + if (this.allowUncaught) { + return callFnAsync(this.fn); + } try { - this.fn.call(ctx, function(err) { - if (err instanceof Error || toString.call(err) === '[object Error]') { - return done(err); - } - if (err != null) { - if (Object.prototype.toString.call(err) === '[object Object]') { - return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); - } - return done(new Error('done() invoked with non-Error: ' + err)); - } - done(); - }); + callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); } return; } + if (this.allowUncaught) { + callFn(this.fn); + done(); + return; + } + // sync or promise-returning try { if (this.pending) { @@ -304,4 +304,20 @@ Runnable.prototype.run = function(fn) { done(); } } + + function callFnAsync(fn) { + fn.call(ctx, function(err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err) { + if (Object.prototype.toString.call(err) === '[object Object]') { + return done(new Error('done() invoked with non-Error: ' + + JSON.stringify(err))); + } + return done(new Error('done() invoked with non-Error: ' + err)); + } + done(); + }); + } }; diff --git a/lib/runner.js b/lib/runner.js index a63bb9ee82..968e4080a0 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -79,8 +79,8 @@ function Runner(suite, delay) { /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * - * @api private * @param {Function} fn + * @api private */ Runner.immediately = global.setImmediate || process.nextTick; @@ -96,6 +96,9 @@ Runner.prototype = create(EventEmitter.prototype, { * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining * @api public * @param {RegExp} re * @param {boolean} invert @@ -113,6 +116,8 @@ Runner.prototype.grep = function(re, invert) { * Returns the number of tests matching the grep search for the * given suite. * + * @param {Suite} suite + * @return {Number} * @api public * @param {Suite} suite * @return {number} @@ -137,8 +142,8 @@ Runner.prototype.grepTotal = function(suite) { /** * Return a list of global properties. * - * @api private * @return {Array} + * @api private */ Runner.prototype.globalProps = function() { var props = keys(global); @@ -157,6 +162,8 @@ Runner.prototype.globalProps = function() { /** * Allow the given `arr` of globals. * + * @param {Array} arr + * @return {Runner} for chaining * @api public * @param {Array} arr * @return {Runner} Runner instance. @@ -264,6 +271,7 @@ Runner.prototype.failHook = function(hook, err) { * @param {string} name * @param {Function} fn */ + Runner.prototype.hook = function(name, fn) { var suite = this.suite; var hooks = suite['_' + name]; @@ -349,9 +357,9 @@ Runner.prototype.hooks = function(name, suites, fn) { /** * Run hooks from the top level down. * - * @api private - * @param {string} name + * @param {String} name * @param {Function} fn + * @api private */ Runner.prototype.hookUp = function(name, fn) { var suites = [this.suite].concat(this.parents()).reverse(); @@ -361,9 +369,9 @@ Runner.prototype.hookUp = function(name, fn) { /** * Run hooks from the bottom up. * - * @api private - * @param {string} name + * @param {String} name * @param {Function} fn + * @api private */ Runner.prototype.hookDown = function(name, fn) { var suites = [this.suite].concat(this.parents()); @@ -374,8 +382,8 @@ Runner.prototype.hookDown = function(name, fn) { * Return an array of parent Suites from * closest to furthest. * - * @api private * @return {Array} + * @api private */ Runner.prototype.parents = function() { var suite = this.suite; @@ -389,8 +397,8 @@ Runner.prototype.parents = function() { /** * Run the current test and callback `fn(err)`. * - * @api private * @param {Function} fn + * @api private */ Runner.prototype.runTest = function(fn) { var self = this; @@ -400,6 +408,10 @@ Runner.prototype.runTest = function(fn) { test.asyncOnly = true; } + if (this.allowUncaught) { + test.allowUncaught = true; + return test.run(fn); + } try { test.on('error', function(err) { self.fail(test, err); @@ -627,8 +639,8 @@ Runner.prototype.runSuite = function(suite, fn) { /** * Handle uncaught exceptions. * - * @api private * @param {Error} err + * @api private */ Runner.prototype.uncaught = function(err) { if (err) { @@ -684,6 +696,8 @@ Runner.prototype.uncaught = function(err) { * Run the root suite and invoke `fn(failures)` * on completion. * + * @param {Function} fn + * @return {Runner} for chaining * @api public * @param {Function} fn * @return {Runner} Runner instance. @@ -789,11 +803,11 @@ function filterLeaks(ok, globals) { /** * Array of globals dependent on the environment. * - * @api private * @return {Array} + * @api private */ function extraGlobals() { - if (!process.browser) { + if (typeof process === 'object' && typeof process.version === 'string') { var nodeVersion = process.version.split('.').reduce(function(a, v) { return a << 8 | v; }); diff --git a/support/browser-entry.js b/support/browser-entry.js index c711ce3e3a..bd2c0aad2e 100644 --- a/support/browser-entry.js +++ b/support/browser-entry.js @@ -53,7 +53,7 @@ process.on = function(e, fn){ if ('uncaughtException' == e) { global.onerror = function(err, url, line){ fn(new Error(err + ' (' + url + ':' + line + ')')); - return true; + return !mocha.allowUncaught; }; uncaughtExceptionHandlers.push(fn); } diff --git a/test/runnable.js b/test/runnable.js index 2508a5fa25..6d66e31012 100644 --- a/test/runnable.js +++ b/test/runnable.js @@ -132,6 +132,20 @@ describe('Runnable(title, fn)', function(){ }) }) }) + + describe('when an exception is thrown and is allowed to remain uncaught', function(){ + it('throws an error when it is allowed', function(done) { + var test = new Runnable('foo', function(){ + throw new Error('fail'); + }); + test.allowUncaught = true; + function fail() { + test.run(function(err) {}); + } + fail.should.throw('fail'); + done(); + }) + }) }) describe('when timeouts are disabled', function() { @@ -239,6 +253,21 @@ describe('Runnable(title, fn)', function(){ }); }) + describe('when an exception is thrown and is allowed to remain uncaught', function(){ + it('throws an error when it is allowed', function(done) { + var test = new Runnable('foo', function(done){ + throw new Error('fail'); + process.nextTick(done); + }); + test.allowUncaught = true; + function fail() { + test.run(function(err) {}); + } + fail.should.throw('fail'); + done(); + }) + }) + describe('when an error is passed', function(){ it('should invoke the callback', function(done){ var calls = 0; diff --git a/test/runner.js b/test/runner.js index 1e023143a2..cbf6b49fbc 100644 --- a/test/runner.js +++ b/test/runner.js @@ -314,6 +314,21 @@ describe('Runner', function(){ }) }); + describe('allowUncaught', function() { + it('should allow unhandled errors to propagate through', function(done) { + var newRunner = new Runner(suite); + newRunner.allowUncaught = true; + newRunner.test = new Test('failing test', function() { + throw new Error('allow unhandled errors'); + }); + function fail() { + newRunner.runTest(); + } + fail.should.throw('allow unhandled errors'); + done(); + }); + }); + describe('stackTrace', function() { var stack = [ 'AssertionError: foo bar' , 'at EventEmitter. (/usr/local/dev/test.js:16:12)' From be1c1a42f959dfe02b0cd952ac05c1ca71b08fde Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 30 Aug 2015 21:31:53 -0700 Subject: [PATCH 0333/1771] rebuild mocha.js --- mocha.js | 355 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 237 insertions(+), 118 deletions(-) diff --git a/mocha.js b/mocha.js index 0dba2dd347..83e091b14b 100644 --- a/mocha.js +++ b/mocha.js @@ -5,7 +5,7 @@ module.exports = process.env.COV : require('./lib/mocha'); }).call(this,require('_process')) -},{"./lib-cov/mocha":undefined,"./lib/mocha":14,"_process":50}],2:[function(require,module,exports){ +},{"./lib-cov/mocha":undefined,"./lib/mocha":14,"_process":51}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -594,7 +594,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],9:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],9:[function(require,module,exports){ 'use strict'; /** @@ -836,7 +836,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],13:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],13:[function(require,module,exports){ /** * Module dependencies. */ @@ -943,7 +943,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":67}],14:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1015,8 +1015,8 @@ function image(name) { * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * - * @api public * @param {Object} options + * @api public */ function Mocha(options) { options = options || {}; @@ -1088,6 +1088,8 @@ Mocha.prototype.addFile = function(file) { /** * Set reporter to `reporter`, defaults to "spec". * + * @param {String|Function} reporter name or constructor + * @param {Object} reporterOptions optional options * @api public * @param {string|Function} reporter name or constructor * @param {Object} reporterOptions optional options @@ -1190,6 +1192,8 @@ Mocha.prototype._growl = function(runner, reporter) { /** * Add regexp to grep, if `re` is a string it is escaped. * + * @param {RegExp|String} re + * @return {Mocha} * @api public * @param {RegExp|string} re * @return {Mocha} @@ -1202,8 +1206,8 @@ Mocha.prototype.grep = function(re) { /** * Invert `.grep()` matches. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.invert = function() { this.options.invert = true; @@ -1213,6 +1217,8 @@ Mocha.prototype.invert = function() { /** * Ignore global leaks. * + * @param {Boolean} ignore + * @return {Mocha} * @api public * @param {boolean} ignore * @return {Mocha} @@ -1225,8 +1231,8 @@ Mocha.prototype.ignoreLeaks = function(ignore) { /** * Enable global leak checking. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.checkLeaks = function() { this.options.ignoreLeaks = false; @@ -1236,8 +1242,8 @@ Mocha.prototype.checkLeaks = function() { /** * Display long stack-trace on failing * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.fullTrace = function() { this.options.fullStackTrace = true; @@ -1247,8 +1253,8 @@ Mocha.prototype.fullTrace = function() { /** * Enable growl support. * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.growl = function() { this.options.growl = true; @@ -1258,6 +1264,8 @@ Mocha.prototype.growl = function() { /** * Ignore `globals` array or string. * + * @param {Array|String} globals + * @return {Mocha} * @api public * @param {Array|string} globals * @return {Mocha} @@ -1270,6 +1278,8 @@ Mocha.prototype.globals = function(globals) { /** * Emit color output. * + * @param {Boolean} colors + * @return {Mocha} * @api public * @param {boolean} colors * @return {Mocha} @@ -1284,6 +1294,8 @@ Mocha.prototype.useColors = function(colors) { /** * Use inline diffs rather than +/-. * + * @param {Boolean} inlineDiffs + * @return {Mocha} * @api public * @param {boolean} inlineDiffs * @return {Mocha} @@ -1296,6 +1308,8 @@ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { /** * Set the timeout in milliseconds. * + * @param {Number} timeout + * @return {Mocha} * @api public * @param {number} timeout * @return {Mocha} @@ -1308,6 +1322,8 @@ Mocha.prototype.timeout = function(timeout) { /** * Set slowness threshold in milliseconds. * + * @param {Number} slow + * @return {Mocha} * @api public * @param {number} slow * @return {Mocha} @@ -1320,6 +1336,8 @@ Mocha.prototype.slow = function(slow) { /** * Enable timeouts. * + * @param {Boolean} enabled + * @return {Mocha} * @api public * @param {boolean} enabled * @return {Mocha} @@ -1332,8 +1350,8 @@ Mocha.prototype.enableTimeouts = function(enabled) { /** * Makes all tests async (accepting a callback) * - * @api public * @return {Mocha} + * @api public */ Mocha.prototype.asyncOnly = function() { this.options.asyncOnly = true; @@ -1344,7 +1362,6 @@ Mocha.prototype.asyncOnly = function() { * Disable syntax highlighting (in browser). * * @api public - * @returns {Mocha} */ Mocha.prototype.noHighlighting = function() { this.options.noHighlighting = true; @@ -1352,9 +1369,18 @@ Mocha.prototype.noHighlighting = function() { }; /** - * Delay root suite execution. + * Enable uncaught errors to propagate (in browser). * + * @return {Mocha} * @api public + */ +Mocha.prototype.allowUncaught = function() { + this.options.allowUncaught = true; + return this; +}; + +/** + * Delay root suite execution. * @returns {Mocha} */ Mocha.prototype.delay = function delay() { @@ -1381,6 +1407,7 @@ Mocha.prototype.run = function(fn) { runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; runner.asyncOnly = options.asyncOnly; + runner.allowUncaught = options.allowUncaught; if (options.grep) { runner.grep(options.grep, options.invert); } @@ -1407,7 +1434,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":50,"escape-string-regexp":67,"growl":68,"path":41}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":51,"escape-string-regexp":68,"growl":69,"path":41}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2038,7 +2065,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":50,"diff":66,"supports-color":41,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":39,"_process":51,"diff":67,"supports-color":41,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2175,7 +2202,7 @@ Dot.prototype = create(Base.prototype, { }); }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],20:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],20:[function(require,module,exports){ (function (process,__dirname){ /** * Module dependencies. @@ -2200,9 +2227,9 @@ exports = module.exports = HTMLCov; function HTMLCov(runner) { var jade = require('jade'); var file = join(__dirname, '/templates/coverage.jade'); + var str = readFileSync(file, 'utf8'); var fn = jade.compile(str, { filename: file }); var self = this; - var str = readFileSync(file, 'utf8'); JSONCov.call(this, runner, false); @@ -2235,7 +2262,7 @@ function coverageClass(coveragePctg) { } }).call(this,require('_process'),"/lib/reporters") -},{"./json-cov":23,"_process":50,"fs":41,"jade":41,"path":41}],21:[function(require,module,exports){ +},{"./json-cov":23,"_process":51,"fs":41,"jade":41,"path":41}],21:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2565,7 +2592,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":67}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":68}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2740,7 +2767,7 @@ function clean(test) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":50}],24:[function(require,module,exports){ +},{"./base":17,"_process":51}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2803,7 +2830,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":50}],25:[function(require,module,exports){ +},{"./base":17,"_process":51}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2896,7 +2923,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":50}],26:[function(require,module,exports){ +},{"./base":17,"_process":51}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2995,7 +3022,7 @@ Landing.prototype = create(Base.prototype, { }); }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],27:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3063,7 +3090,7 @@ List.prototype = create(Base.prototype, { }); }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],28:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3164,7 +3191,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":50}],29:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3207,7 +3234,7 @@ Min.prototype = create(Base.prototype, { }); }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],30:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3475,7 +3502,7 @@ function write(string) { } }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],31:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3571,7 +3598,7 @@ Progress.prototype = create(Base.prototype, { }); }).call(this,require('_process')) -},{"./base":17,"_process":50,"lodash.create":70}],32:[function(require,module,exports){ +},{"./base":17,"_process":51,"lodash.create":70}],32:[function(require,module,exports){ /** * Module dependencies. */ @@ -3944,6 +3971,8 @@ module.exports = Runnable; /** * Initialize a new `Runnable` with the given `title` and callback `fn`. * + * @param {String} title + * @param {Function} fn * @api private * @param {string} title * @param {Function} fn @@ -4113,8 +4142,8 @@ Runnable.prototype.globals = function(globals) { /** * Run the test and invoke `fn(err)`. * - * @api private * @param {Function} fn + * @api private */ Runnable.prototype.run = function(fn) { var self = this; @@ -4163,27 +4192,21 @@ Runnable.prototype.run = function(fn) { if (this.async) { this.resetTimeout(); + if (this.allowUncaught) { + return callFnAsync(this.fn); + } try { - this.fn.call(ctx, function(err) { - if (err instanceof Error || toString.call(err) === '[object Error]') { - return done(err); - } - if (err != null) { - if (Object.prototype.toString.call(err) === '[object Object]') { - return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); - } - return done(new Error('done() invoked with non-Error: ' + err)); - } - done(); - }); + callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); } return; } - if (this.asyncOnly) { - return done(new Error('--async-only option in use without declaring `done()`')); + if (this.allowUncaught) { + callFn(this.fn); + done(); + return; } // sync or promise-returning @@ -4209,9 +4232,29 @@ Runnable.prototype.run = function(fn) { done(reason || new Error('Promise rejected with no or falsy reason')); }); } else { + if (self.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()` or returning a promise')); + } + done(); } } + + function callFnAsync(fn) { + fn.call(ctx, function(err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err) { + if (Object.prototype.toString.call(err) === '[object Object]') { + return done(new Error('done() invoked with non-Error: ' + + JSON.stringify(err))); + } + return done(new Error('done() invoked with non-Error: ' + err)); + } + done(); + }); + } }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) @@ -4290,15 +4333,16 @@ function Runner(suite, delay) { this.on('hook end', function(hook) { self.checkGlobals(hook); }); - this.grep(/.*/); + this._defaultGrep = /.*/; + this.grep(this._defaultGrep); this.globals(this.globalProps().concat(extraGlobals())); } /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * - * @api private * @param {Function} fn + * @api private */ Runner.immediately = global.setImmediate || process.nextTick; @@ -4314,6 +4358,9 @@ Runner.prototype = create(EventEmitter.prototype, { * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining * @api public * @param {RegExp} re * @param {boolean} invert @@ -4331,6 +4378,8 @@ Runner.prototype.grep = function(re, invert) { * Returns the number of tests matching the grep search for the * given suite. * + * @param {Suite} suite + * @return {Number} * @api public * @param {Suite} suite * @return {number} @@ -4355,8 +4404,8 @@ Runner.prototype.grepTotal = function(suite) { /** * Return a list of global properties. * - * @api private * @return {Array} + * @api private */ Runner.prototype.globalProps = function() { var props = keys(global); @@ -4375,6 +4424,8 @@ Runner.prototype.globalProps = function() { /** * Allow the given `arr` of globals. * + * @param {Array} arr + * @return {Runner} for chaining * @api public * @param {Array} arr * @return {Runner} Runner instance. @@ -4464,6 +4515,11 @@ Runner.prototype.fail = function(test, err) { * @param {Error} err */ Runner.prototype.failHook = function(hook, err) { + if (hook.ctx && hook.ctx.currentTest) { + hook.originalTitle = hook.originalTitle || hook.title; + hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"'; + } + this.fail(hook, err); if (this.suite.bail()) { this.emit('end'); @@ -4477,6 +4533,7 @@ Runner.prototype.failHook = function(hook, err) { * @param {string} name * @param {Function} fn */ + Runner.prototype.hook = function(name, fn) { var suite = this.suite; var hooks = suite['_' + name]; @@ -4562,9 +4619,9 @@ Runner.prototype.hooks = function(name, suites, fn) { /** * Run hooks from the top level down. * - * @api private - * @param {string} name + * @param {String} name * @param {Function} fn + * @api private */ Runner.prototype.hookUp = function(name, fn) { var suites = [this.suite].concat(this.parents()).reverse(); @@ -4574,9 +4631,9 @@ Runner.prototype.hookUp = function(name, fn) { /** * Run hooks from the bottom up. * - * @api private - * @param {string} name + * @param {String} name * @param {Function} fn + * @api private */ Runner.prototype.hookDown = function(name, fn) { var suites = [this.suite].concat(this.parents()); @@ -4587,8 +4644,8 @@ Runner.prototype.hookDown = function(name, fn) { * Return an array of parent Suites from * closest to furthest. * - * @api private * @return {Array} + * @api private */ Runner.prototype.parents = function() { var suite = this.suite; @@ -4602,8 +4659,8 @@ Runner.prototype.parents = function() { /** * Run the current test and callback `fn(err)`. * - * @api private * @param {Function} fn + * @api private */ Runner.prototype.runTest = function(fn) { var self = this; @@ -4613,6 +4670,10 @@ Runner.prototype.runTest = function(fn) { test.asyncOnly = true; } + if (this.allowUncaught) { + test.allowUncaught = true; + return test.run(fn); + } try { test.on('error', function(err) { self.fail(test, err); @@ -4689,7 +4750,20 @@ Runner.prototype.runTests = function(suite, fn) { match = !match; } if (!match) { - return next(); + // Run immediately only if we have defined a grep. When we + // define a grep — It can cause maximum callstack error if + // the grep is doing a large recursive loop by neglecting + // all tests. The run immediately function also comes with + // a performance cost. So we don't want to run immediately + // if we run the whole test suite, because running the whole + // test suite don't do any immediate recursive loops. Thus, + // allowing a JS runtime to breathe. + if (self._grep !== self._defaultGrep) { + Runner.immediately(next); + } else { + next(); + } + return; } // pending @@ -4738,6 +4812,7 @@ Runner.prototype.runTests = function(suite, fn) { } this.next = next; + this.hookErr = hookErr; next(); }; @@ -4752,6 +4827,7 @@ Runner.prototype.runSuite = function(suite, fn) { var i = 0; var self = this; var total = this.grepTotal(suite); + var afterAllHookCalled = false; debug('run suite %s', suite.fullTitle()); @@ -4782,17 +4858,38 @@ Runner.prototype.runSuite = function(suite, fn) { if (!curr) { return done(); } - self.runSuite(curr, next); + + // Avoid grep neglecting large number of tests causing a + // huge recursive loop and thus a maximum call stack error. + // See comment in `this.runTests()` for more information. + if (self._grep !== self._defaultGrep) { + Runner.immediately(function() { + self.runSuite(curr, next); + }); + } else { + self.runSuite(curr, next); + } } function done(errSuite) { self.suite = suite; - self.hook('afterAll', function() { - self.emit('suite end', suite); + self.nextSuite = next; + + if (afterAllHookCalled) { fn(errSuite); - }); + } else { + // mark that the afterAll block has been called once + // and so can be skipped if there is an error in it. + afterAllHookCalled = true; + self.hook('afterAll', function() { + self.emit('suite end', suite); + fn(errSuite); + }); + } } + this.nextSuite = next; + this.hook('beforeAll', function(err) { if (err) { return done(); @@ -4804,8 +4901,8 @@ Runner.prototype.runSuite = function(suite, fn) { /** * Handle uncaught exceptions. * - * @api private * @param {Error} err + * @api private */ Runner.prototype.uncaught = function(err) { if (err) { @@ -4838,7 +4935,22 @@ Runner.prototype.uncaught = function(err) { return; } - // bail on hooks + // recover from hooks + if (runnable.type === 'hook') { + var errSuite = this.suite; + // if hook failure is in afterEach block + if (runnable.fullTitle().indexOf('after each') > -1) { + return this.hookErr(err, errSuite, true); + } + // if hook failure is in beforeEach block + if (runnable.fullTitle().indexOf('before each') > -1) { + return this.hookErr(err, errSuite, false); + } + // if hook failure is in after or before blocks + return this.nextSuite(errSuite); + } + + // bail this.emit('end'); }; @@ -4846,6 +4958,8 @@ Runner.prototype.uncaught = function(err) { * Run the root suite and invoke `fn(failures)` * on completion. * + * @param {Function} fn + * @return {Runner} for chaining * @api public * @param {Function} fn * @return {Runner} Runner instance. @@ -4951,11 +5065,11 @@ function filterLeaks(ok, globals) { /** * Array of globals dependent on the environment. * - * @api private * @return {Array} + * @api private */ function extraGlobals() { - if (!process.browser) { + if (typeof process === 'object' && typeof process.version === 'string') { var nodeVersion = process.version.split('.').reduce(function(a, v) { return a << 8 | v; }); @@ -4971,7 +5085,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./utils":39,"_process":50,"debug":2,"events":3,"lodash.create":70}],37:[function(require,module,exports){ +},{"./pending":16,"./utils":39,"_process":51,"debug":2,"events":3,"lodash.create":70}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -6120,7 +6234,7 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":50,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41}],40:[function(require,module,exports){ +},{"_process":51,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41}],40:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -6140,11 +6254,16 @@ function BrowserStdout(opts) { BrowserStdout.prototype._write = function(chunks, encoding, cb) { var output = chunks.toString ? chunks.toString() : chunks - console.log(this.label+':', output) + if (this.label === false) { + console.log(output) + } else { + console.log(this.label+':', output) + } process.nextTick(cb) } + }).call(this,require('_process')) -},{"_process":50,"stream":62,"util":65}],41:[function(require,module,exports){ +},{"_process":51,"stream":63,"util":66}],41:[function(require,module,exports){ },{}],42:[function(require,module,exports){ arguments[4][41][0].apply(exports,arguments) @@ -8135,11 +8254,36 @@ function isUndefined(arg) { } },{}],48:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],49:[function(require,module,exports){ module.exports = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) == '[object Array]'; }; -},{}],49:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -8186,7 +8330,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],50:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -8278,10 +8422,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],51:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":52}],52:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":53}],53:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8374,7 +8518,7 @@ function forEach (xs, f) { } }).call(this,require('_process')) -},{"./_stream_readable":54,"./_stream_writable":56,"_process":50,"core-util-is":57,"inherits":69}],53:[function(require,module,exports){ +},{"./_stream_readable":55,"./_stream_writable":57,"_process":51,"core-util-is":58,"inherits":48}],54:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -8422,7 +8566,7 @@ PassThrough.prototype._transform = function(chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":55,"core-util-is":57,"inherits":69}],54:[function(require,module,exports){ +},{"./_stream_transform":56,"core-util-is":58,"inherits":48}],55:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -9377,7 +9521,7 @@ function indexOf (xs, x) { } }).call(this,require('_process')) -},{"./_stream_duplex":52,"_process":50,"buffer":43,"core-util-is":57,"events":47,"inherits":69,"isarray":48,"stream":62,"string_decoder/":63,"util":42}],55:[function(require,module,exports){ +},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"events":47,"inherits":48,"isarray":49,"stream":63,"string_decoder/":64,"util":42}],56:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -9588,7 +9732,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":52,"core-util-is":57,"inherits":69}],56:[function(require,module,exports){ +},{"./_stream_duplex":53,"core-util-is":58,"inherits":48}],57:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -10069,7 +10213,7 @@ function endWritable(stream, state, cb) { } }).call(this,require('_process')) -},{"./_stream_duplex":52,"_process":50,"buffer":43,"core-util-is":57,"inherits":69,"stream":62}],57:[function(require,module,exports){ +},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"inherits":48,"stream":63}],58:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -10179,10 +10323,10 @@ function objectToString(o) { return Object.prototype.toString.call(o); } }).call(this,require("buffer").Buffer) -},{"buffer":43}],58:[function(require,module,exports){ +},{"buffer":43}],59:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":53}],59:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":54}],60:[function(require,module,exports){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = require('stream'); exports.Readable = exports; @@ -10191,13 +10335,13 @@ exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); -},{"./lib/_stream_duplex.js":52,"./lib/_stream_passthrough.js":53,"./lib/_stream_readable.js":54,"./lib/_stream_transform.js":55,"./lib/_stream_writable.js":56,"stream":62}],60:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":53,"./lib/_stream_passthrough.js":54,"./lib/_stream_readable.js":55,"./lib/_stream_transform.js":56,"./lib/_stream_writable.js":57,"stream":63}],61:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":55}],61:[function(require,module,exports){ +},{"./lib/_stream_transform.js":56}],62:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":56}],62:[function(require,module,exports){ +},{"./lib/_stream_writable.js":57}],63:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -10326,7 +10470,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":47,"inherits":69,"readable-stream/duplex.js":51,"readable-stream/passthrough.js":58,"readable-stream/readable.js":59,"readable-stream/transform.js":60,"readable-stream/writable.js":61}],63:[function(require,module,exports){ +},{"events":47,"inherits":48,"readable-stream/duplex.js":52,"readable-stream/passthrough.js":59,"readable-stream/readable.js":60,"readable-stream/transform.js":61,"readable-stream/writable.js":62}],64:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -10549,14 +10693,14 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":43}],64:[function(require,module,exports){ +},{"buffer":43}],65:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],65:[function(require,module,exports){ +},{}],66:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -11146,7 +11290,7 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":64,"_process":50,"inherits":69}],66:[function(require,module,exports){ +},{"./support/isBuffer":65,"_process":51,"inherits":48}],67:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* @@ -11767,7 +11911,7 @@ function hasOwnProperty(obj, prop) { } }(this)); -},{}],67:[function(require,module,exports){ +},{}],68:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; @@ -11780,7 +11924,7 @@ module.exports = function (str) { return str.replace(matchOperatorsRe, '\\$&'); }; -},{}],68:[function(require,module,exports){ +},{}],69:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -12018,32 +12162,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":50,"child_process":41,"fs":41,"os":49,"path":41}],69:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],70:[function(require,module,exports){ +},{"_process":51,"child_process":41,"fs":41,"os":50,"path":41}],70:[function(require,module,exports){ /** * lodash 3.1.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -13025,6 +13144,12 @@ module.exports = isIterateeCall; },{}],79:[function(require,module,exports){ (function (process,global){ +/** + * Shim process.stdout. + */ + +process.stdout = require('browser-stdout')(); + var Mocha = require('../'); /** @@ -13074,7 +13199,7 @@ process.on = function(e, fn){ if ('uncaughtException' == e) { global.onerror = function(err, url, line){ fn(new Error(err + ' (' + url + ':' + line + ')')); - return true; + return !mocha.allowUncaught; }; uncaughtExceptionHandlers.push(fn); } @@ -13167,12 +13292,6 @@ mocha.run = function(fn){ }); }; -/** - * Shim process.stdout. - */ - -process.stdout = require('browser-stdout')(); - /** * Expose the process shim. * https://github.com/mochajs/mocha/pull/916 @@ -13188,4 +13307,4 @@ window.Mocha = Mocha; window.mocha = mocha; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../":1,"_process":50,"browser-stdout":40}]},{},[79]); +},{"../":1,"_process":51,"browser-stdout":40}]},{},[79]); From ee0a55b572d7da7dd8b7abc418d594602692bbed Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 30 Aug 2015 22:14:46 -0700 Subject: [PATCH 0334/1771] update HISTORY.md for v2.3.0 --- HISTORY.md | 138 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 117 insertions(+), 21 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 8f949b2093..c23cc39f7a 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,100 @@ +2.3.0 / 2015-08-30 +================== + + * [#553] - added --allowUncaught option ([@amsul]) + * [#1490] - Allow --async-only to be satisfied by returning a promise ([@jlai]) + * [#1829] - support --max-old-space-size ([@gigadude]) + * [#1811] - upgrade Jade dependency ([@outsideris]) + * [#1769] - Fix async hook error handling ([@ajaykodali]) + * [#1230] - More descriptive beforeEach/afterEach messages ([@duncanbeevers]) + * [#1787] - Scope loading behaviour instead of using early return ([@aryeguy]) + * [#1789] - Fix: html-runner crashing ([@sunesimonsen]) + * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho]) + * [#1230] - Decorate failed hook titles with test title ([@duncanbeevers]) + * [#1260] - Build using Browserify ([@ndhoule]) + * [#1728] - Don't use `__proto__` ([@ndhoule]) + * [#1781] - Fix hook error tests ([@glenjamin]) + * [#1754] - Allow boolean --reporter-options ([@papandreou]) + * [#1766] - Fix overly aggressive stack suppression ([@moll]) + * [#1752] - Avoid potential infinite loop ([@gsilk]) + * [#1761] - Fix problems running under PhantomJS ([@chromakode]) + * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai]) + * [#1774] - Support escaped spaces in CLI options ([@adamgruber]) + * [#1687] - Fix HTML reporter links with special chars ([@benvinegar]) + * [#1359] - Adopt code style and enforce it using ESLint ([@ndhoule] w/ assist from [@jbnicolai] & [@boneskull]) + * various refactors ([@jbnicolai]) + * [#1758] - Add cross-frame compatible Error checking ([@outdooricon]) + * [#1741] - Remove moot `version` property from bower.json ([@kkirsche]) + * [#1739] - Improve `HISTORY.md` ([@rstacruz]) + * [#1730] - Support more io.js flags ([@ryedog]) + * [#1349] - Allow HTML in HTML reporter errors ([@papandreou] / [@sunesimonsen]) + * [#1572] - Prevent default browser behavior for failure/pass links ([@jschilli]) + * [#1630] - Support underscored harmony flags ([@dominicbarnes]) + * [#1718] - Support more harmony flags ([@slyg]) + * [#1689] - Add stack to JSON-stream reporter ([@jonathandelgado]) + * [#1654] - Fix `ReferenceError` "location is not defined" ([@jakemmarsh]) + + [#553]: https://github.com/mochajs/mocha/issues/553 + [#1490]: https://github.com/mochajs/mocha/issues/1490 + [#1829]: https://github.com/mochajs/mocha/issues/1829 + [#1811]: https://github.com/mochajs/mocha/issues/1811 + [#1769]: https://github.com/mochajs/mocha/issues/1769 + [#1230]: https://github.com/mochajs/mocha/issues/1230 + [#1787]: https://github.com/mochajs/mocha/issues/1787 + [#1789]: https://github.com/mochajs/mocha/issues/1789 + [#1749]: https://github.com/mochajs/mocha/issues/1749 + [#1230]: https://github.com/mochajs/mocha/issues/1230 + [#1260]: https://github.com/mochajs/mocha/issues/1260 + [#1728]: https://github.com/mochajs/mocha/issues/1728 + [#1781]: https://github.com/mochajs/mocha/issues/1781 + [#1754]: https://github.com/mochajs/mocha/issues/1754 + [#1766]: https://github.com/mochajs/mocha/issues/1766 + [#1752]: https://github.com/mochajs/mocha/issues/1752 + [#1761]: https://github.com/mochajs/mocha/issues/1761 + [#1700]: https://github.com/mochajs/mocha/issues/1700 + [#1774]: https://github.com/mochajs/mocha/issues/1774 + [#1687]: https://github.com/mochajs/mocha/issues/1687 + [#1359]: https://github.com/mochajs/mocha/issues/1359 + [#1758]: https://github.com/mochajs/mocha/issues/1758 + [#1741]: https://github.com/mochajs/mocha/issues/1741 + [#1739]: https://github.com/mochajs/mocha/issues/1739 + [#1730]: https://github.com/mochajs/mocha/issues/1730 + [#1349]: https://github.com/mochajs/mocha/issues/1349 + [#1572]: https://github.com/mochajs/mocha/issues/1572 + [#1630]: https://github.com/mochajs/mocha/issues/1630 + [#1718]: https://github.com/mochajs/mocha/issues/1718 + [#1689]: https://github.com/mochajs/mocha/issues/1689 + [#1654]: https://github.com/mochajs/mocha/issues/1654 + [@adamgruber]: https://github.com/adamgruber + [@ajaykodali]: https://github.com/ajaykodali + [@amsul]: https://github.com/amsul + [@aryeguy]: https://github.com/aryeguy + [@benvinegar]: https://github.com/benvinegar + [@boneskull]: https://github.com/boneskull + [@chromakode]: https://github.com/chromakode + [@dominicbarnes]: https://github.com/dominicbarnes + [@duncanbeevers]: https://github.com/duncanbeevers + [@gigadude]: https://github.com/gigadude + [@glenjamin]: https://github.com/glenjamin + [@gsilk]: https://github.com/gsilk + [@jakemmarsh]: https://github.com/jakemmarsh + [@jbnicolai]: https://github.com/jbnicolai + [@jlai]: https://github.com/jlai + [@jonathandelgado]: https://github.com/jonathandelgado + [@jschilli]: https://github.com/jschilli + [@kkirsche]: https://github.com/kkirsche + [@moll]: https://github.com/moll + [@ndhoule]: https://github.com/ndhoule + [@outdooricon]: https://github.com/outdooricon + [@outsideris]: https://github.com/outsideris + [@papandreou]: https://github.com/papandreou + [@rstacruz]: https://github.com/rstacruz + [@ryedog]: https://github.com/ryedog + [@slyg]: https://github.com/slyg + [@sunesimonsen]: https://github.com/sunesimonsen + [@tinganho]: https://github.com/tinganho + 2.2.5 / 2015-05-14 ================== @@ -34,27 +130,27 @@ ================== * fix(reporter/base): string diff - issue #1241 - * fix(reporter/base): string diff - issue #1241 - * fix(reporter/base): don't show diffs for errors without expectation - * fix(reporter/base): don't assume error message is first line of stack - * improve: dry up reporter/base test - * fix(reporter/base): explicitly ignore showDiff #1614 - * Add iojs to travis build - * Pass `--allow-natives-syntax` flag to node. - * Support --harmony_classes flag for io.js - * Fix 1556: Update utils.clean to handle newlines in func declarations - * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers - * Fix 1585: make _mocha executable again - * chore(package.json): add a8m as a contributor - * Fixed broken link on html-cov reporter - * support --es_staging flag - * fix issue where menu overlaps content. - * update contributors in package.json - * Remove trailing whitespace from reporter output - * Remove contributors list from readme - * log third-party reporter errors - * [Fix] Exclude not own properties when looping on options - * fix: support node args in mocha.opts (close #1573) + * fix(reporter/base): string diff - issue #1241 + * fix(reporter/base): don't show diffs for errors without expectation + * fix(reporter/base): don't assume error message is first line of stack + * improve: dry up reporter/base test + * fix(reporter/base): explicitly ignore showDiff #1614 + * Add iojs to travis build + * Pass `--allow-natives-syntax` flag to node. + * Support --harmony_classes flag for io.js + * Fix 1556: Update utils.clean to handle newlines in func declarations + * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers + * Fix 1585: make _mocha executable again + * chore(package.json): add a8m as a contributor + * Fixed broken link on html-cov reporter + * support --es_staging flag + * fix issue where menu overlaps content. + * update contributors in package.json + * Remove trailing whitespace from reporter output + * Remove contributors list from readme + * log third-party reporter errors + * [Fix] Exclude not own properties when looping on options + * fix: support node args in mocha.opts (close #1573) * fix(reporter/base): string diff - issue #1241 2.2.1 / 2015-03-09 From ca7c516083ae04f8f5892f33d4425d1bac2683a9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 30 Aug 2015 22:41:46 -0700 Subject: [PATCH 0335/1771] Release v2.3.0 --- component.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/component.json b/component.json index 5da3daa25e..0406832346 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.5", + "version": "2.3.0", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ @@ -17,4 +17,4 @@ "styles": [ "mocha.css" ] -} \ No newline at end of file +} diff --git a/package.json b/package.json index a645794ee6..0ad3c894e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.2.5", + "version": "2.3.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 552813282d88a08a48902bc0f63460d10dc686cf Mon Sep 17 00:00:00 2001 From: Aaron Krause Date: Wed, 2 Sep 2015 00:02:55 -0700 Subject: [PATCH 0336/1771] Fix: Bail flag causes before() hooks to be run even after a failure --- lib/runner.js | 2 +- test/integration/fixtures/options/bail.js | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 968e4080a0..81caa7fa47 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -569,7 +569,7 @@ Runner.prototype.runSuite = function(suite, fn) { debug('run suite %s', suite.fullTitle()); - if (!total) { + if (!total || (self.failures && suite._bail)) { return fn(); } diff --git a/test/integration/fixtures/options/bail.js b/test/integration/fixtures/options/bail.js index bb8ad13da4..32d17e9aa8 100644 --- a/test/integration/fixtures/options/bail.js +++ b/test/integration/fixtures/options/bail.js @@ -11,13 +11,9 @@ describe('suite1', function() { }); describe('suite2', function() { - // TODO: When uncommented, the hook below is ran and throws an exception - // despite the previous failure with the bail flag. This is a bug. Uncomment - // once resolved - - // before(function(done) { - // throw new Error('this hook should not be displayed'); - // }); + before(function(done) { + throw new Error('this hook should not be displayed'); + }); it('should not display this error', function(done) { throw new Error('this should not be displayed'); From 5eda63f4879052081e0ff369f1c26e85a7cf9290 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 6 Sep 2015 20:26:06 -0700 Subject: [PATCH 0337/1771] fix package.json to use exact version of lodash; closes #1867 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ad3c894e8..f0ec585f67 100644 --- a/package.json +++ b/package.json @@ -281,7 +281,7 @@ "glob": "3.2.3", "growl": "1.8.1", "jade": "1.11.0", - "lodash.create": "^3.1.1", + "lodash.create": "3.1.1", "mkdirp": "0.5.0", "supports-color": "1.2.0" }, From 408b864d3b2112342f71630a6819353b0f2443bf Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 6 Sep 2015 20:20:14 -0700 Subject: [PATCH 0338/1771] update HISTORY.md --- HISTORY.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index c23cc39f7a..609b1fb135 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,12 @@ +2.3.1 / 2015-09-06 +================== + + * [#1867] - Fix compatibility with older versions of NPM ([@boneskull]) + * [#1812] - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows]) + + [#1867]: https://github.com/mochajs/mocha/issues/1867 + [#1812]: https://github.com/mochajs/mocha/issues/1812 + [aaroncrows]: https://github.com/aaroncrows 2.3.0 / 2015-08-30 ================== From 2515277e2887e507e9cdda1d7460eb9ec3ffb76a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 6 Sep 2015 20:21:47 -0700 Subject: [PATCH 0339/1771] update package.json & component.json for v2.3.1 --- component.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/component.json b/component.json index 0406832346..f74e315336 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.0", + "version": "2.3.1", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index f0ec585f67..3d7c9c74fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.0", + "version": "2.3.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From c7a8fedd08c13315c2befcb99699abeda1a9f3b0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 7 Sep 2015 10:26:35 -0700 Subject: [PATCH 0340/1771] remove lodash.create; closes #1868 --- lib/hook.js | 7 +- lib/reporters/dot.js | 7 +- lib/reporters/landing.js | 7 +- lib/reporters/list.js | 7 +- lib/reporters/min.js | 7 +- lib/reporters/nyan.js | 7 +- lib/reporters/progress.js | 7 +- lib/reporters/spec.js | 7 +- lib/reporters/xunit.js | 10 +- lib/runnable.js | 7 +- lib/runner.js | 22 +- lib/suite.js | 9 +- lib/test.js | 7 +- lib/utils.js | 2 + mocha.js | 1125 ++----------------------------------- package.json | 1 - 16 files changed, 94 insertions(+), 1145 deletions(-) diff --git a/lib/hook.js b/lib/hook.js index 429a60cb2b..0417e013cd 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -3,7 +3,7 @@ */ var Runnable = require('./runnable'); -var create = require('lodash.create'); +var inherits = require('./utils').inherits; /** * Expose `Hook`. @@ -26,10 +26,7 @@ function Hook(title, fn) { /** * Inherit from `Runnable.prototype`. */ - -Hook.prototype = create(Runnable.prototype, { - constructor: Hook -}); +inherits(Hook, Runnable); /** * Get or set the test `err`. diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index 2ecdb5e1be..e905dc6860 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; /** @@ -63,7 +63,4 @@ function Dot(runner) { /** * Inherit from `Base.prototype`. */ - -Dot.prototype = create(Base.prototype, { - constructor: Dot -}); +inherits(Dot, Base); diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index a29c24728c..b66b2000c1 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var cursor = Base.cursor; var color = Base.color; @@ -89,7 +89,4 @@ function Landing(runner) { /** * Inherit from `Base.prototype`. */ - -Landing.prototype = create(Base.prototype, { - constructor: Landing -}); +inherits(Landing, Base); diff --git a/lib/reporters/list.js b/lib/reporters/list.js index f9b3969676..0e5f910d1f 100644 --- a/lib/reporters/list.js +++ b/lib/reporters/list.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -58,7 +58,4 @@ function List(runner) { /** * Inherit from `Base.prototype`. */ - -List.prototype = create(Base.prototype, { - constructor: List -}); +inherits(List, Base); diff --git a/lib/reporters/min.js b/lib/reporters/min.js index f9c3a148c4..2b48212ca8 100644 --- a/lib/reporters/min.js +++ b/lib/reporters/min.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; /** * Expose `Min`. @@ -33,7 +33,4 @@ function Min(runner) { /** * Inherit from `Base.prototype`. */ - -Min.prototype = create(Base.prototype, { - constructor: Min -}); +inherits(Min, Base); diff --git a/lib/reporters/nyan.js b/lib/reporters/nyan.js index 2baa901031..ba1b0509d9 100644 --- a/lib/reporters/nyan.js +++ b/lib/reporters/nyan.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; /** * Expose `Dot`. @@ -62,10 +62,7 @@ function NyanCat(runner) { /** * Inherit from `Base.prototype`. */ - -NyanCat.prototype = create(Base.prototype, { - constructor: NyanCat -}); +inherits(NyanCat, Base); /** * Draw the nyan cat diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 2ea25bda94..5349ca8936 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -86,7 +86,4 @@ function Progress(runner, options) { /** * Inherit from `Base.prototype`. */ - -Progress.prototype = create(Base.prototype, { - constructor: Progress -}); +inherits(Progress, Base); diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index 9fbd805a3e..77a73c4f43 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -3,7 +3,7 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -80,7 +80,4 @@ function Spec(runner) { /** * Inherit from `Base.prototype`. */ - -Spec.prototype = create(Base.prototype, { - constructor: Spec -}); +inherits(Spec, Base); diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 70bfc755a0..0694681c05 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -3,9 +3,10 @@ */ var Base = require('./base'); -var create = require('lodash.create'); +var utils = require('../utils'); +var inherits = utils.inherits; var fs = require('fs'); -var escape = require('../utils').escape; +var escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -95,10 +96,7 @@ XUnit.prototype.done = function(failures, fn) { /** * Inherit from `Base.prototype`. */ - -XUnit.prototype = create(Base.prototype, { - constructor: XUnit -}); +inherits(XUnit, Base); /** * Write out the given line. diff --git a/lib/runnable.js b/lib/runnable.js index 01b84ccb5d..07501785a3 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -4,10 +4,10 @@ var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); -var create = require('lodash.create'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); var utils = require('./utils'); +var inherits = utils.inherits; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -57,10 +57,7 @@ function Runnable(title, fn) { /** * Inherit from `EventEmitter.prototype`. */ - -Runnable.prototype = create(EventEmitter.prototype, { - constructor: Runnable -}); +inherits(Runnable, EventEmitter); /** * Set & get timeout `ms`. diff --git a/lib/runner.js b/lib/runner.js index 81caa7fa47..67ecabe08f 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -4,15 +4,16 @@ var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); -var create = require('lodash.create'); +var utils = require('./utils'); +var inherits = utils.inherits; var debug = require('debug')('mocha:runner'); -var filter = require('./utils').filter; -var indexOf = require('./utils').indexOf; -var keys = require('./utils').keys; -var stackFilter = require('./utils').stackTraceFilter(); -var stringify = require('./utils').stringify; -var type = require('./utils').type; -var undefinedError = require('./utils').undefinedError; +var filter = utils.filter; +var indexOf = utils.indexOf; +var keys = utils.keys; +var stackFilter = utils.stackTraceFilter(); +var stringify = utils.stringify; +var type = utils.type; +var undefinedError = utils.undefinedError; /** * Non-enumerable globals. @@ -87,10 +88,7 @@ Runner.immediately = global.setImmediate || process.nextTick; /** * Inherit from `EventEmitter.prototype`. */ - -Runner.prototype = create(EventEmitter.prototype, { - constructor: Runner -}); +inherits(Runner, EventEmitter); /** * Run tests with full titles matching `re`. Updates runner.total diff --git a/lib/suite.js b/lib/suite.js index eb89fb346e..7834e284cc 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -4,10 +4,10 @@ var EventEmitter = require('events').EventEmitter; var Hook = require('./hook'); -var create = require('lodash.create'); +var utils = require('./utils'); +var inherits = utils.inherits; var debug = require('debug')('mocha:suite'); var milliseconds = require('./ms'); -var utils = require('./utils'); /** * Expose `Suite`. @@ -66,10 +66,7 @@ function Suite(title, parentContext) { /** * Inherit from `EventEmitter.prototype`. */ - -Suite.prototype = create(EventEmitter.prototype, { - constructor: Suite -}); +inherits(Suite, EventEmitter); /** * Return a clone of this `Suite`. diff --git a/lib/test.js b/lib/test.js index 057e772824..bb744e6f6b 100644 --- a/lib/test.js +++ b/lib/test.js @@ -3,7 +3,7 @@ */ var Runnable = require('./runnable'); -var create = require('lodash.create'); +var inherits = require('./utils').inherits; /** * Expose `Test`. @@ -27,7 +27,4 @@ function Test(title, fn) { /** * Inherit from `Runnable.prototype`. */ - -Test.prototype = create(Runnable.prototype, { - constructor: Test -}); +inherits(Test, Runnable); diff --git a/lib/utils.js b/lib/utils.js index e7b9eee9f5..aa7928b4b4 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -19,6 +19,8 @@ var watchFile = require('fs').watchFile; var ignore = ['node_modules', '.git']; +exports.inherits = require('util').inherits; + /** * Escape special characters in the given string of html. * diff --git a/mocha.js b/mocha.js index 83e091b14b..2fdbf16db8 100644 --- a/mocha.js +++ b/mocha.js @@ -437,7 +437,7 @@ Context.prototype.inspect = function() { */ var Runnable = require('./runnable'); -var create = require('lodash.create'); +var inherits = require('./utils').inherits; /** * Expose `Hook`. @@ -460,10 +460,7 @@ function Hook(title, fn) { /** * Inherit from `Runnable.prototype`. */ - -Hook.prototype = create(Runnable.prototype, { - constructor: Hook -}); +inherits(Hook, Runnable); /** * Get or set the test `err`. @@ -482,7 +479,7 @@ Hook.prototype.error = function(err) { this._error = err; }; -},{"./runnable":35,"lodash.create":70}],8:[function(require,module,exports){ +},{"./runnable":35,"./utils":39}],8:[function(require,module,exports){ /** * Module dependencies. */ @@ -2136,7 +2133,7 @@ function Doc(runner) { */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; /** @@ -2196,13 +2193,10 @@ function Dot(runner) { /** * Inherit from `Base.prototype`. */ - -Dot.prototype = create(Base.prototype, { - constructor: Dot -}); +inherits(Dot, Base); }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],20:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],20:[function(require,module,exports){ (function (process,__dirname){ /** * Module dependencies. @@ -2930,7 +2924,7 @@ function errorJSON(err) { */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var cursor = Base.cursor; var color = Base.color; @@ -3016,20 +3010,17 @@ function Landing(runner) { /** * Inherit from `Base.prototype`. */ - -Landing.prototype = create(Base.prototype, { - constructor: Landing -}); +inherits(Landing, Base); }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],27:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -3084,13 +3075,10 @@ function List(runner) { /** * Inherit from `Base.prototype`. */ - -List.prototype = create(Base.prototype, { - constructor: List -}); +inherits(List, Base); }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],28:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3198,7 +3186,7 @@ function Markdown(runner) { */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; /** * Expose `Min`. @@ -3228,20 +3216,17 @@ function Min(runner) { /** * Inherit from `Base.prototype`. */ - -Min.prototype = create(Base.prototype, { - constructor: Min -}); +inherits(Min, Base); }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],30:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; /** * Expose `Dot`. @@ -3300,10 +3285,7 @@ function NyanCat(runner) { /** * Inherit from `Base.prototype`. */ - -NyanCat.prototype = create(Base.prototype, { - constructor: NyanCat -}); +inherits(NyanCat, Base); /** * Draw the nyan cat @@ -3502,14 +3484,14 @@ function write(string) { } }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],31:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -3592,19 +3574,16 @@ function Progress(runner, options) { /** * Inherit from `Base.prototype`. */ - -Progress.prototype = create(Base.prototype, { - constructor: Progress -}); +inherits(Progress, Base); }).call(this,require('_process')) -},{"./base":17,"_process":51,"lodash.create":70}],32:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":51}],32:[function(require,module,exports){ /** * Module dependencies. */ var Base = require('./base'); -var create = require('lodash.create'); +var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; @@ -3681,12 +3660,9 @@ function Spec(runner) { /** * Inherit from `Base.prototype`. */ +inherits(Spec, Base); -Spec.prototype = create(Base.prototype, { - constructor: Spec -}); - -},{"./base":17,"lodash.create":70}],33:[function(require,module,exports){ +},{"../utils":39,"./base":17}],33:[function(require,module,exports){ /** * Module dependencies. */ @@ -3763,9 +3739,10 @@ function title(test) { */ var Base = require('./base'); -var create = require('lodash.create'); +var utils = require('../utils'); +var inherits = utils.inherits; var fs = require('fs'); -var escape = require('../utils').escape; +var escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -3855,10 +3832,7 @@ XUnit.prototype.done = function(failures, fn) { /** * Inherit from `Base.prototype`. */ - -XUnit.prototype = create(Base.prototype, { - constructor: XUnit -}); +inherits(XUnit, Base); /** * Write out the given line. @@ -3931,7 +3905,7 @@ function cdata(str) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":39,"./base":17,"fs":41,"lodash.create":70}],35:[function(require,module,exports){ +},{"../utils":39,"./base":17,"fs":41}],35:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -3939,10 +3913,10 @@ function cdata(str) { var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); -var create = require('lodash.create'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); var utils = require('./utils'); +var inherits = utils.inherits; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -3992,10 +3966,7 @@ function Runnable(title, fn) { /** * Inherit from `EventEmitter.prototype`. */ - -Runnable.prototype = create(EventEmitter.prototype, { - constructor: Runnable -}); +inherits(Runnable, EventEmitter); /** * Set & get timeout `ms`. @@ -4258,7 +4229,7 @@ Runnable.prototype.run = function(fn) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3,"lodash.create":70}],36:[function(require,module,exports){ +},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3}],36:[function(require,module,exports){ (function (process,global){ /** * Module dependencies. @@ -4266,15 +4237,16 @@ Runnable.prototype.run = function(fn) { var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); -var create = require('lodash.create'); +var utils = require('./utils'); +var inherits = utils.inherits; var debug = require('debug')('mocha:runner'); -var filter = require('./utils').filter; -var indexOf = require('./utils').indexOf; -var keys = require('./utils').keys; -var stackFilter = require('./utils').stackTraceFilter(); -var stringify = require('./utils').stringify; -var type = require('./utils').type; -var undefinedError = require('./utils').undefinedError; +var filter = utils.filter; +var indexOf = utils.indexOf; +var keys = utils.keys; +var stackFilter = utils.stackTraceFilter(); +var stringify = utils.stringify; +var type = utils.type; +var undefinedError = utils.undefinedError; /** * Non-enumerable globals. @@ -4349,10 +4321,7 @@ Runner.immediately = global.setImmediate || process.nextTick; /** * Inherit from `EventEmitter.prototype`. */ - -Runner.prototype = create(EventEmitter.prototype, { - constructor: Runner -}); +inherits(Runner, EventEmitter); /** * Run tests with full titles matching `re`. Updates runner.total @@ -4831,7 +4800,7 @@ Runner.prototype.runSuite = function(suite, fn) { debug('run suite %s', suite.fullTitle()); - if (!total) { + if (!total || (self.failures && suite._bail)) { return fn(); } @@ -5085,17 +5054,17 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./utils":39,"_process":51,"debug":2,"events":3,"lodash.create":70}],37:[function(require,module,exports){ +},{"./pending":16,"./utils":39,"_process":51,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ var EventEmitter = require('events').EventEmitter; var Hook = require('./hook'); -var create = require('lodash.create'); +var utils = require('./utils'); +var inherits = utils.inherits; var debug = require('debug')('mocha:suite'); var milliseconds = require('./ms'); -var utils = require('./utils'); /** * Expose `Suite`. @@ -5154,10 +5123,7 @@ function Suite(title, parentContext) { /** * Inherit from `EventEmitter.prototype`. */ - -Suite.prototype = create(EventEmitter.prototype, { - constructor: Suite -}); +inherits(Suite, EventEmitter); /** * Return a clone of this `Suite`. @@ -5455,13 +5421,13 @@ Suite.prototype.run = function run() { } }; -},{"./hook":7,"./ms":15,"./utils":39,"debug":2,"events":3,"lodash.create":70}],38:[function(require,module,exports){ +},{"./hook":7,"./ms":15,"./utils":39,"debug":2,"events":3}],38:[function(require,module,exports){ /** * Module dependencies. */ var Runnable = require('./runnable'); -var create = require('lodash.create'); +var inherits = require('./utils').inherits; /** * Expose `Test`. @@ -5485,12 +5451,9 @@ function Test(title, fn) { /** * Inherit from `Runnable.prototype`. */ +inherits(Test, Runnable); -Test.prototype = create(Runnable.prototype, { - constructor: Test -}); - -},{"./runnable":35,"lodash.create":70}],39:[function(require,module,exports){ +},{"./runnable":35,"./utils":39}],39:[function(require,module,exports){ (function (process,Buffer){ /* eslint-env browser */ @@ -5513,6 +5476,8 @@ var watchFile = require('fs').watchFile; var ignore = ['node_modules', '.git']; +exports.inherits = require('util').inherits; + /** * Escape special characters in the given string of html. * @@ -6234,7 +6199,7 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":51,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41}],40:[function(require,module,exports){ +},{"_process":51,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41,"util":66}],40:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -12163,986 +12128,6 @@ function growl(msg, options, fn) { }).call(this,require('_process')) },{"_process":51,"child_process":41,"fs":41,"os":50,"path":41}],70:[function(require,module,exports){ -/** - * lodash 3.1.1 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ -var baseAssign = require('lodash._baseassign'), - baseCreate = require('lodash._basecreate'), - isIterateeCall = require('lodash._isiterateecall'); - -/** - * Creates an object that inherits from the given `prototype` object. If a - * `properties` object is provided its own enumerable properties are assigned - * to the created object. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} prototype The object to inherit from. - * @param {Object} [properties] The properties to assign to the object. - * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. - * @returns {Object} Returns the new object. - * @example - * - * function Shape() { - * this.x = 0; - * this.y = 0; - * } - * - * function Circle() { - * Shape.call(this); - * } - * - * Circle.prototype = _.create(Shape.prototype, { - * 'constructor': Circle - * }); - * - * var circle = new Circle; - * circle instanceof Circle; - * // => true - * - * circle instanceof Shape; - * // => true - */ -function create(prototype, properties, guard) { - var result = baseCreate(prototype); - if (guard && isIterateeCall(prototype, properties, guard)) { - properties = undefined; - } - return properties ? baseAssign(result, properties) : result; -} - -module.exports = create; - -},{"lodash._baseassign":71,"lodash._basecreate":77,"lodash._isiterateecall":78}],71:[function(require,module,exports){ -/** - * lodash 3.2.0 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ -var baseCopy = require('lodash._basecopy'), - keys = require('lodash.keys'); - -/** - * The base implementation of `_.assign` without support for argument juggling, - * multiple sources, and `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssign(object, source) { - return source == null - ? object - : baseCopy(source, keys(source), object); -} - -module.exports = baseAssign; - -},{"lodash._basecopy":72,"lodash.keys":73}],72:[function(require,module,exports){ -/** - * lodash 3.0.1 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property names to copy. - * @param {Object} [object={}] The object to copy properties to. - * @returns {Object} Returns `object`. - */ -function baseCopy(source, props, object) { - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - object[key] = source[key]; - } - return object; -} - -module.exports = baseCopy; - -},{}],73:[function(require,module,exports){ -/** - * lodash 3.1.2 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ -var getNative = require('lodash._getnative'), - isArguments = require('lodash.isarguments'), - isArray = require('lodash.isarray'); - -/** Used to detect unsigned integer values. */ -var reIsUint = /^\d+$/; - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeKeys = getNative(Object, 'keys'); - -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} - -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); - -/** - * Checks if `value` is array-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - */ -function isArrayLike(value) { - return value != null && isLength(getLength(value)); -} - -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; - length = length == null ? MAX_SAFE_INTEGER : length; - return value > -1 && value % 1 == 0 && value < length; -} - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} - -/** - * A fallback implementation of `Object.keys` which creates an array of the - * own enumerable property names of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function shimKeys(object) { - var props = keysIn(object), - propsLength = props.length, - length = propsLength && object.length; - - var allowIndexes = !!length && isLength(length) && - (isArray(object) || isArguments(object)); - - var index = -1, - result = []; - - while (++index < propsLength) { - var key = props[index]; - if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { - result.push(key); - } - } - return result; -} - -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -/** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) - * for more details. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ -var keys = !nativeKeys ? shimKeys : function(object) { - var Ctor = object == null ? undefined : object.constructor; - if ((typeof Ctor == 'function' && Ctor.prototype === object) || - (typeof object != 'function' && isArrayLike(object))) { - return shimKeys(object); - } - return isObject(object) ? nativeKeys(object) : []; -}; - -/** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ -function keysIn(object) { - if (object == null) { - return []; - } - if (!isObject(object)) { - object = Object(object); - } - var length = object.length; - length = (length && isLength(length) && - (isArray(object) || isArguments(object)) && length) || 0; - - var Ctor = object.constructor, - index = -1, - isProto = typeof Ctor == 'function' && Ctor.prototype === object, - result = Array(length), - skipIndexes = length > 0; - - while (++index < length) { - result[index] = (index + ''); - } - for (var key in object) { - if (!(skipIndexes && isIndex(key, length)) && - !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { - result.push(key); - } - } - return result; -} - -module.exports = keys; - -},{"lodash._getnative":74,"lodash.isarguments":75,"lodash.isarray":76}],74:[function(require,module,exports){ -/** - * lodash 3.9.1 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** `Object#toString` result references. */ -var funcTag = '[object Function]'; - -/** Used to detect host constructors (Safari > 5). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; - -/** - * Checks if `value` is object-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var fnToString = Function.prototype.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); - -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = object == null ? undefined : object[key]; - return isNative(value) ? value : undefined; -} - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in older versions of Chrome and Safari which return 'function' for regexes - // and Safari 8 equivalents which return 'object' for typed array constructors. - return isObject(value) && objToString.call(value) == funcTag; -} - -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -/** - * Checks if `value` is a native function. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true - * - * _.isNative(_); - * // => false - */ -function isNative(value) { - if (value == null) { - return false; - } - if (isFunction(value)) { - return reIsNative.test(fnToString.call(value)); - } - return isObjectLike(value) && reIsHostCtor.test(value); -} - -module.exports = getNative; - -},{}],75:[function(require,module,exports){ -/** - * lodash 3.0.4 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** - * Checks if `value` is object-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** Native method references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable; - -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} - -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); - -/** - * Checks if `value` is array-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - */ -function isArrayLike(value) { - return value != null && isLength(getLength(value)); -} - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} - -/** - * Checks if `value` is classified as an `arguments` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ -function isArguments(value) { - return isObjectLike(value) && isArrayLike(value) && - hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); -} - -module.exports = isArguments; - -},{}],76:[function(require,module,exports){ -/** - * lodash 3.0.4 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** `Object#toString` result references. */ -var arrayTag = '[object Array]', - funcTag = '[object Function]'; - -/** Used to detect host constructors (Safari > 5). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; - -/** - * Checks if `value` is object-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} - -/** Used for native method references. */ -var objectProto = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var fnToString = Function.prototype.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; - -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); - -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeIsArray = getNative(Array, 'isArray'); - -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = object == null ? undefined : object[key]; - return isNative(value) ? value : undefined; -} - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} - -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(function() { return arguments; }()); - * // => false - */ -var isArray = nativeIsArray || function(value) { - return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; -}; - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in older versions of Chrome and Safari which return 'function' for regexes - // and Safari 8 equivalents which return 'object' for typed array constructors. - return isObject(value) && objToString.call(value) == funcTag; -} - -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -/** - * Checks if `value` is a native function. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true - * - * _.isNative(_); - * // => false - */ -function isNative(value) { - if (value == null) { - return false; - } - if (isFunction(value)) { - return reIsNative.test(fnToString.call(value)); - } - return isObjectLike(value) && reIsHostCtor.test(value); -} - -module.exports = isArray; - -},{}],77:[function(require,module,exports){ -/** - * lodash 3.0.3 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} prototype The object to inherit from. - * @returns {Object} Returns the new object. - */ -var baseCreate = (function() { - function object() {} - return function(prototype) { - if (isObject(prototype)) { - object.prototype = prototype; - var result = new object; - object.prototype = undefined; - } - return result || {}; - }; -}()); - -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -module.exports = baseCreate; - -},{}],78:[function(require,module,exports){ -/** - * lodash 3.0.9 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - -/** Used to detect unsigned integer values. */ -var reIsUint = /^\d+$/; - -/** - * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} - -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); - -/** - * Checks if `value` is array-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - */ -function isArrayLike(value) { - return value != null && isLength(getLength(value)); -} - -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; - length = length == null ? MAX_SAFE_INTEGER : length; - return value > -1 && value % 1 == 0 && value < length; -} - -/** - * Checks if the provided arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. - */ -function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if (type == 'number' - ? (isArrayLike(object) && isIndex(index, object.length)) - : (type == 'string' && index in object)) { - var other = object[index]; - return value === value ? (value === other) : (other !== other); - } - return false; -} - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} - -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -module.exports = isIterateeCall; - -},{}],79:[function(require,module,exports){ (function (process,global){ /** * Shim process.stdout. @@ -13307,4 +12292,4 @@ window.Mocha = Mocha; window.mocha = mocha; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../":1,"_process":51,"browser-stdout":40}]},{},[79]); +},{"../":1,"_process":51,"browser-stdout":40}]},{},[70]); diff --git a/package.json b/package.json index 3d7c9c74fc..fe09fe2e43 100644 --- a/package.json +++ b/package.json @@ -281,7 +281,6 @@ "glob": "3.2.3", "growl": "1.8.1", "jade": "1.11.0", - "lodash.create": "3.1.1", "mkdirp": "0.5.0", "supports-color": "1.2.0" }, From 4c4d4d96297e9bdd1c532717a7ad0b1d3946f3ee Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 7 Sep 2015 11:36:46 -0700 Subject: [PATCH 0341/1771] Release v2.3.2 --- HISTORY.md | 8 ++++++-- component.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 609b1fb135..41ffa80ad3 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,10 +1,14 @@ +2.3.2 / 2015-09-07 +================== + * [#1868] - Fix compatibility with older versions of NPM ([@boneskull]) + + [#1868]: https://github.com/mochajs/mocha/issues/1868 + 2.3.1 / 2015-09-06 ================== - * [#1867] - Fix compatibility with older versions of NPM ([@boneskull]) * [#1812] - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows]) - [#1867]: https://github.com/mochajs/mocha/issues/1867 [#1812]: https://github.com/mochajs/mocha/issues/1812 [aaroncrows]: https://github.com/aaroncrows diff --git a/component.json b/component.json index f74e315336..e0e42b8595 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.1", + "version": "2.3.2", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index fe09fe2e43..9c83d11030 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.1", + "version": "2.3.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 0565fac49e4153cdc65a6431553d1aae80eb7008 Mon Sep 17 00:00:00 2001 From: wsw Date: Tue, 8 Sep 2015 16:08:46 +0800 Subject: [PATCH 0342/1771] IE<=8 no [].reduce, so use 'utils.reduce' instead --- lib/runner.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index 67ecabe08f..c648a364c1 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -806,7 +806,8 @@ function filterLeaks(ok, globals) { */ function extraGlobals() { if (typeof process === 'object' && typeof process.version === 'string') { - var nodeVersion = process.version.split('.').reduce(function(a, v) { + var parts = process.version.split('.'); + var nodeVersion = utils.reduce(parts, function(a, v) { return a << 8 | v; }); From 9e456090c1f0a6a49d468dce58a2cf9cec9a1355 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 9 Sep 2015 11:12:12 -0700 Subject: [PATCH 0343/1771] Fix 1875: Markdown reporter exceeds maximum call stack size --- lib/reporters/markdown.js | 2 +- test/integration/fixtures/passing.js | 11 ++++++++++ test/integration/reporters.js | 31 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/integration/fixtures/passing.js create mode 100644 test/integration/reporters.js diff --git a/lib/reporters/markdown.js b/lib/reporters/markdown.js index ac054506b7..88b1f4db09 100644 --- a/lib/reporters/markdown.js +++ b/lib/reporters/markdown.js @@ -38,7 +38,7 @@ function Markdown(runner) { var key = SUITE_PREFIX + suite.title; obj = obj[key] = obj[key] || { suite: suite }; - suite.suites.forEach(function() { + suite.suites.forEach(function(suite) { mapTOC(suite, obj); }); diff --git a/test/integration/fixtures/passing.js b/test/integration/fixtures/passing.js new file mode 100644 index 0000000000..df91b3e501 --- /dev/null +++ b/test/integration/fixtures/passing.js @@ -0,0 +1,11 @@ +var assert = require('assert'); + +describe('suite', function() { + it('test1', function() { + assert(true); + }); + + it('test2', function() { + assert(true); + }); +}); diff --git a/test/integration/reporters.js b/test/integration/reporters.js new file mode 100644 index 0000000000..477e42f37a --- /dev/null +++ b/test/integration/reporters.js @@ -0,0 +1,31 @@ +var assert = require('assert'); +var run = require('./helpers').runMocha; + +describe('reporters', function() { + this.timeout(1000); + + describe('markdown', function() { + var res; + + before(function(done) { + run('passing.js', ['--reporter', 'markdown'], function(err, result) { + res = result; + done(err); + }); + }); + + it('does not exceed maximum callstack (issue: 1875)', function() { + assert(res.output.indexOf('RangeError') === -1, 'Threw RangeError'); + }); + + it('contains spec src', function() { + var src = [ + '```js', + 'assert(true);', + '```' + ].join('\n'); + + assert(res.output.indexOf(src) !== -1, 'No assert found'); + }); + }); +}); From e950ea6b3601717f3272eb9f7bc205a972400ca8 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 9 Sep 2015 12:29:29 -0700 Subject: [PATCH 0344/1771] Fix #1864: xunit missing output with --reporter-options output --- lib/reporters/xunit.js | 10 +++++----- test/integration/reporters.js | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 0694681c05..d9f58b9f05 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -77,6 +77,11 @@ function XUnit(runner, options) { }); } +/** + * Inherit from `Base.prototype`. + */ +inherits(XUnit, Base); + /** * Override done to close the stream (if it's a file). * @@ -93,11 +98,6 @@ XUnit.prototype.done = function(failures, fn) { } }; -/** - * Inherit from `Base.prototype`. - */ -inherits(XUnit, Base); - /** * Write out the given line. * diff --git a/test/integration/reporters.js b/test/integration/reporters.js index 477e42f37a..c29fcccaed 100644 --- a/test/integration/reporters.js +++ b/test/integration/reporters.js @@ -1,8 +1,12 @@ var assert = require('assert'); +var os = require('os'); +var fs = require('fs'); +var crypto = require('crypto'); +var path = require('path'); var run = require('./helpers').runMocha; describe('reporters', function() { - this.timeout(1000); + this.timeout(3000); describe('markdown', function() { var res; @@ -28,4 +32,29 @@ describe('reporters', function() { assert(res.output.indexOf(src) !== -1, 'No assert found'); }); }); + + describe('xunit', function() { + it('prints test cases with --reporter-options output (issue: 1864)', function(done) { + var randomStr = crypto.randomBytes(8).toString('hex'); + var tmpDir = os.tmpDir().replace(new RegExp(path.sep + '$'), ''); + var tmpFile = tmpDir + path.sep + 'test-issue-1864-' + randomStr + '.xml'; + + var args = ['--reporter=xunit', '--reporter-options', 'output=' + tmpFile]; + var expectedOutput = [ + '', + '', + '' + ].join('\n'); + + run('passing.js', args, function(err, result) { + if (err) return done(err); + + var xml = fs.readFileSync(tmpFile, 'utf8'); + fs.unlinkSync(tmpFile); + + assert(xml.indexOf(expectedOutput) !== -1, 'Did not output all xml'); + done(err); + }); + }); + }); }); From cbbf7ffd00895c8c0a05dc2c304c25c06a8dd5f3 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 9 Sep 2015 15:58:54 -0700 Subject: [PATCH 0345/1771] Stackfilter fix: Don't remove modules/components from stack trace in the browser --- lib/utils.js | 18 +++++++----------- test/utils.js | 14 +++++++------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index aa7928b4b4..0b970255c9 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -689,7 +689,7 @@ exports.getError = function(err) { * @description * When invoking this function you get a filter function that get the Error.stack as an input, * and return a prettify output. - * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). + * (i.e: strip Mocha and internal node functions from stack trace). * @returns {Function} */ exports.stackTraceFilter = function() { @@ -701,14 +701,10 @@ exports.stackTraceFilter = function() { : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); function isMochaInternal(line) { - return (~line.indexOf('node_modules' + slash + 'mocha')) - || (~line.indexOf('components' + slash + 'mochajs')) - || (~line.indexOf('components' + slash + 'mocha')); - } - - // node_modules, bower, componentJS - function isBrowserModule(line) { - return (~line.indexOf('node_modules')) || (~line.indexOf('components')); + return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) + || (~line.indexOf('components' + slash + 'mochajs' + slash)) + || (~line.indexOf('components' + slash + 'mocha' + slash)) + || (~line.indexOf(slash + 'mocha.js')); } function isNodeInternal(line) { @@ -724,11 +720,11 @@ exports.stackTraceFilter = function() { stack = stack.split('\n'); stack = exports.reduce(stack, function(list, line) { - if (is.node && (isMochaInternal(line) || isNodeInternal(line))) { + if (isMochaInternal(line)) { return list; } - if (is.browser && (isBrowserModule(line))) { + if (is.node && isNodeInternal(line)) { return list; } diff --git a/test/utils.js b/test/utils.js index 31b49893ca..efa6ca1166 100644 --- a/test/utils.js +++ b/test/utils.js @@ -101,7 +101,7 @@ describe('utils', function() { filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); }); - it('should ignore bower and components files', function() { + it('does not ignore other bower_components and components', function() { var stack = ['Error: failed' , 'at assert (index.html:11:26)' , 'at Context. (test.js:17:18)' @@ -126,18 +126,18 @@ describe('utils', function() { global.location = { href: 'localhost:3000/foo/bar/index.html' }; filter = utils.stackTraceFilter(); }); - it('should strip out bower and components too', function() { + it('does not strip out other bower_components and components', function() { var stack = ['Error: failed' , 'at assert (index.html:11:26)' , 'at Context. (test.js:17:18)' , 'at bower_components/should/should.js:4827:7' - , 'at next (localhost:3000/foo/bar/bower_components/should/should.js:4766:23)' + , 'at next (bower_components/should/should.js:4766:23)' , 'at components/should/5.0.0/should.js:4827:7' - , 'at next (localhost:3000/foo/bar/components/should/5.0.0/should.js:4766:23)' - , 'at Runner.require.register.Runner.runTest (localhost:3000/foo/bar/node_modules/mocha.js:4892:10)' + , 'at next (components/should/5.0.0/should.js:4766:23)' + , 'at Runner.require.register.Runner.runTest (node_modules/mocha.js:4892:10)' , 'at localhost:3000/foo/bar/node_modules/mocha.js:4970:12' - , 'at next (localhost:3000/foo/bar/node_modules/mocha.js:4817:14)']; - filter(stack.join('\n')).should.equal(stack.slice(0,3).join('\n')); + , 'at next (node_modules/mocha.js:4817:14)']; + filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); }); after(function() { From 8a100df9598c9570c0d6194321c7b23acf07857b Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 9 Sep 2015 16:09:03 -0700 Subject: [PATCH 0346/1771] Fix linter warning "Expected a conditional expression and instead saw an assignment" --- lib/runner.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index c648a364c1..39571316be 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -386,7 +386,8 @@ Runner.prototype.hookDown = function(name, fn) { Runner.prototype.parents = function() { var suite = this.suite; var suites = []; - while (suite = suite.parent) { + while (suite.parent) { + suite = suite.parent; suites.push(suite); } return suites; From d7e4605c69f2f0bccf0f18641f365aa3c8da3fa7 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 9 Sep 2015 17:02:26 -0700 Subject: [PATCH 0347/1771] Fix fragile xunit reporter spec --- test/integration/reporters.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/integration/reporters.js b/test/integration/reporters.js index c29fcccaed..19cf0bdd1e 100644 --- a/test/integration/reporters.js +++ b/test/integration/reporters.js @@ -41,10 +41,10 @@ describe('reporters', function() { var args = ['--reporter=xunit', '--reporter-options', 'output=' + tmpFile]; var expectedOutput = [ - '', - '', + ' Date: Thu, 10 Sep 2015 20:16:42 -0700 Subject: [PATCH 0348/1771] Support all harmony flags --- bin/_mocha | 11 ++--------- bin/mocha | 20 ++------------------ 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 4ddbc08ff1..4873dc741f 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -81,16 +81,9 @@ program .option('--compilers :,...', 'use the given module(s) to compile files', list, []) .option('--debug-brk', "enable node's debugger breaking on the first line") .option('--globals ', 'allow the given comma-delimited global [names]', list, []) - .option('--harmony', 'enable all harmony features (except typeof)') .option('--es_staging', 'enable all staged features') - .option('--harmony-collections', 'enable harmony collections (sets, maps, and weak maps)') - .option('--harmony-generators', 'enable harmony generators') - .option('--harmony-proxies', 'enable harmony proxies') - .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)') - .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)') - .option('--harmony_rest_parameters', 'enable "harmony rest parameters" (iojs)') - .option('--harmony_proxies', 'enable "harmony proxies" (iojs)') - .option('--harmony_classes', 'enable "harmony classes" (iojs)') + .option('--harmony', 'enable all harmony features (except typeof)') + .option('--harmony_', 'all node --harmony* flags are available') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') diff --git a/bin/mocha b/bin/mocha index 3d87c9c6e9..123929e8f1 100755 --- a/bin/mocha +++ b/bin/mocha @@ -34,24 +34,7 @@ process.argv.slice(2).forEach(function(arg){ args.unshift('--expose-gc'); break; case '--gc-global': - case '--harmony': case '--es_staging': - case '--harmony_arrays': - case '--harmony_array_includes': - case '--harmony_arrow_functions': - case '--harmony_classes': - case '--harmony-collections': - case '--harmony_collections': - case '--harmony-generators': - case '--harmony_generators': - case '--harmony_modules': - case '--harmony-proxies': - case '--harmony_proxies': - case '--harmony_regexps': - case '--harmony_shipping': - case '--harmony_sloppy': - case '--harmony_rest_parameters': - case '--harmony_unicode': case '--no-deprecation': case '--prof': case '--throw-deprecation': @@ -60,7 +43,8 @@ process.argv.slice(2).forEach(function(arg){ args.unshift(arg); break; default: - if (0 == arg.indexOf('--trace')) args.unshift(arg); + if (0 == arg.indexOf('--harmony')) args.unshift(arg); + else if (0 == arg.indexOf('--trace')) args.unshift(arg); else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg); else args.push(arg); break; From f22ab537be95dcf17b22e6cab11b3368445b9c3e Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Thu, 10 Sep 2015 22:11:32 -0700 Subject: [PATCH 0349/1771] Fix #1669: catch uncaught errors outside test suite execution --- lib/runner.js | 16 ++++++++++++++++ test/integration/fixtures/options/delay-fail.js | 5 +++++ test/integration/options.js | 14 ++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 test/integration/fixtures/options/delay-fail.js diff --git a/lib/runner.js b/lib/runner.js index 39571316be..8c2478ad5d 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -7,6 +7,7 @@ var Pending = require('./pending'); var utils = require('./utils'); var inherits = utils.inherits; var debug = require('debug')('mocha:runner'); +var Runnable = require('./runnable'); var filter = utils.filter; var indexOf = utils.indexOf; var keys = utils.keys; @@ -64,6 +65,7 @@ function Runner(suite, delay) { this._abort = false; this._delay = delay; this.suite = suite; + this.started = false; this.total = suite.total(); this.failures = 0; this.on('test end', function(test) { @@ -653,7 +655,20 @@ Runner.prototype.uncaught = function(err) { err.uncaught = true; var runnable = this.currentRunnable; + if (!runnable) { + runnable = new Runnable('Uncaught error outside test suite'); + runnable.parent = this.suite; + + if (this.started) { + this.fail(runnable, err); + } else { + // Can't recover from this failure + this.emit('start'); + this.fail(runnable, err); + this.emit('end'); + } + return; } @@ -712,6 +727,7 @@ Runner.prototype.run = function(fn) { } function start() { + self.started = true; self.emit('start'); self.runSuite(rootSuite, function() { debug('finished running'); diff --git a/test/integration/fixtures/options/delay-fail.js b/test/integration/fixtures/options/delay-fail.js new file mode 100644 index 0000000000..1475c918d4 --- /dev/null +++ b/test/integration/fixtures/options/delay-fail.js @@ -0,0 +1,5 @@ +setTimeout(function() { + throw new Error('oops'); + it('test', function() {}); + run(); +}, 100); diff --git a/test/integration/options.js b/test/integration/options.js index db3710913b..52eff4b451 100644 --- a/test/integration/options.js +++ b/test/integration/options.js @@ -96,6 +96,20 @@ describe('options', function() { done(); }); }); + + it('should throw an error if the test suite failed to run', function(done) { + run('options/delay-fail.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 1); + + assert.equal(res.failures[0].title, + 'Uncaught error outside test suite'); + assert.equal(res.code, 1); + done(); + }); + }); }); describe('--grep', function() { From fb3fe33fbb5d7819d5dc4df404dc926b1db033a5 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 12 Sep 2015 15:46:13 -0700 Subject: [PATCH 0350/1771] Fix eqeqeq linting errors from eslint 1.4.0 release --- lib/mocha.js | 2 +- lib/reporters/base.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index e3a2321e50..eb6c8d077f 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -85,7 +85,7 @@ function Mocha(options) { this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); - if (options.timeout != null) { + if (typeof options.timeout !== 'undefined' && options.timeout !== null) { this.timeout(options.timeout); } this.useColors(options.useColors); diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 6bac3e04a4..7939a20cf2 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -401,7 +401,7 @@ function unifiedDiff(err, escape) { return indent + line; } function notBlank(line) { - return line != null; + return typeof line !== 'undefined' && line !== null; } var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); From ea3b6524f66026321cf86aedbc0af3fc20b5faec Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 12 Sep 2015 15:25:44 -0700 Subject: [PATCH 0351/1771] Revert jade to support npm < v1.3.7 --- lib/reporters/templates/coverage.jade | 4 ++-- lib/reporters/templates/menu.jade | 6 +++--- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/reporters/templates/coverage.jade b/lib/reporters/templates/coverage.jade index 24b72c537b..edd59d8864 100644 --- a/lib/reporters/templates/coverage.jade +++ b/lib/reporters/templates/coverage.jade @@ -17,7 +17,7 @@ html .misses= cov.misses #files - each file in cov.files + for file in cov.files .file h2(id=file.filename)= file.filename #stats(class=coverageClass(file.coverage)) @@ -33,7 +33,7 @@ html th Hits th Source tbody - each line, number in file.source + for line, number in file.source if line.coverage > 0 tr.hit td.line= number diff --git a/lib/reporters/templates/menu.jade b/lib/reporters/templates/menu.jade index c7b4e4698e..c682e3f0ee 100644 --- a/lib/reporters/templates/menu.jade +++ b/lib/reporters/templates/menu.jade @@ -1,12 +1,12 @@ #menu li a(href='#overview') overview - each file in cov.files + for file in cov.files li span.cov(class=coverageClass(file.coverage)) #{file.coverage | 0} a(href='##{file.filename}') - - var segments = file.filename.split('/') - - var basename = segments.pop() + segments = file.filename.split('/') + basename = segments.pop() if segments.length span.dirname= segments.join('/') + '/' span.basename= basename diff --git a/package.json b/package.json index 9c83d11030..a12d561f30 100644 --- a/package.json +++ b/package.json @@ -280,7 +280,7 @@ "escape-string-regexp": "1.0.2", "glob": "3.2.3", "growl": "1.8.1", - "jade": "1.11.0", + "jade": "0.26.3", "mkdirp": "0.5.0", "supports-color": "1.2.0" }, From 31fb4bebd19ed6fd7e4f5417e6272e135c8c1874 Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Thu, 27 Aug 2015 11:20:12 -0700 Subject: [PATCH 0352/1771] Call the inspect() function if message is not set Unfortunately some frameworks throw error objects which do not have a `message` property but do have an `inspect()` function. This means Mocha reports a test failure, but prints the empty string instead of any useful information about the error message. For an example, see versions of the Waterline ORM before v0.10.19: https://github.com/balderdashy/waterline/commit/0965d132 If the `message` key is not set on an error object, attempt to print the same output as `console.log` in Node, by calling the object's `inspect()` function, if it exists. We could try to fallback to calling `util.inspect` on the `err` object and logging that, but I'm not sure the format would be appropriate. --- lib/reporters/base.js | 9 ++++++++- test/reporters/base.js | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 7939a20cf2..90526a7925 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -169,7 +169,14 @@ exports.list = function(failures) { // msg var msg; var err = test.err; - var message = err.message || ''; + var message; + if (err.message) { + message = err.message; + } else if (typeof err.inspect === 'function') { + message = err.inspect(); + } else { + message = ''; + } var stack = err.stack || message; var index = stack.indexOf(message); var actual = err.actual; diff --git a/test/reporters/base.js b/test/reporters/base.js index 527697971c..e33e26f918 100644 --- a/test/reporters/base.js +++ b/test/reporters/base.js @@ -140,7 +140,18 @@ describe('Base reporter', function () { Base.list([test]); var errOut = stdout.join('\n').trim(); - errOut.should.equal('1) test title:\n Error\n foo\n bar') + errOut.should.equal('1) test title:\n Error\n foo\n bar'); + }); + + it('should use the inspect() property if `message` is not set', function () { + var err = { + showDiff: false, + inspect: function() { return 'an error happened'; }, + }; + var test = makeTest(err); + Base.list([test]); + var errOut = stdout.join('\n').trim(); + errOut.should.equal('1) test title:\n an error happened'); }); it('should not modify stack if it does not contain message', function () { @@ -154,7 +165,7 @@ describe('Base reporter', function () { Base.list([test]); var errOut = stdout.join('\n').trim(); - errOut.should.equal('1) test title:\n Error\n foo\n bar') + errOut.should.equal('1) test title:\n Error\n foo\n bar'); }); }); From 0956c023e4530a527f376be4ae0724ea96713ab7 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 12 Sep 2015 16:07:49 -0700 Subject: [PATCH 0353/1771] Cast non-string return values from err.inspect() --- lib/reporters/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 90526a7925..bb107ba229 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -173,7 +173,7 @@ exports.list = function(failures) { if (err.message) { message = err.message; } else if (typeof err.inspect === 'function') { - message = err.inspect(); + message = err.inspect() + ''; } else { message = ''; } From 4747437b042427fdeb56848608e3f1ec3e4b3586 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sat, 12 Sep 2015 16:22:47 -0700 Subject: [PATCH 0354/1771] Remove redundant harmony flag --- bin/_mocha | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 4873dc741f..f8068835f6 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -82,8 +82,7 @@ program .option('--debug-brk', "enable node's debugger breaking on the first line") .option('--globals ', 'allow the given comma-delimited global [names]', list, []) .option('--es_staging', 'enable all staged features') - .option('--harmony', 'enable all harmony features (except typeof)') - .option('--harmony_', 'all node --harmony* flags are available') + .option('--harmony<_classes,_generators,...>', 'all node --harmony* flags are available') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') From 10e8604eae45ff3042569bee37c061843a553528 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Sun, 13 Sep 2015 14:08:30 -0700 Subject: [PATCH 0355/1771] Fix #1798: Correctly attribute mutiple done err with hooks --- lib/runner.js | 9 +- .../fixtures/multiple.done.before.js | 10 ++ .../fixtures/multiple.done.beforeEach.js | 14 +++ .../fixtures/multiple.done.specs.js | 10 ++ test/integration/multiple.done.js | 96 ++++++++++++++++--- 5 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 test/integration/fixtures/multiple.done.before.js create mode 100644 test/integration/fixtures/multiple.done.beforeEach.js create mode 100644 test/integration/fixtures/multiple.done.specs.js diff --git a/lib/runner.js b/lib/runner.js index 8c2478ad5d..d7656cda85 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -288,12 +288,13 @@ Runner.prototype.hook = function(name, fn) { self.emit('hook', hook); - hook.on('error', function(err) { - self.failHook(hook, err); - }); + if (!hook.listeners('error').length) { + hook.on('error', function(err) { + self.failHook(hook, err); + }); + } hook.run(function(err) { - hook.removeAllListeners('error'); var testError = hook.error(); if (testError) { self.fail(self.test, testError); diff --git a/test/integration/fixtures/multiple.done.before.js b/test/integration/fixtures/multiple.done.before.js new file mode 100644 index 0000000000..80d4adb61a --- /dev/null +++ b/test/integration/fixtures/multiple.done.before.js @@ -0,0 +1,10 @@ +describe('suite', function() { + before(function(done) { + setTimeout(done, 10); + setTimeout(done, 30); + }); + + it('test1', function(done) { + setTimeout(done, 50); + }); +}); diff --git a/test/integration/fixtures/multiple.done.beforeEach.js b/test/integration/fixtures/multiple.done.beforeEach.js new file mode 100644 index 0000000000..9b4724dea1 --- /dev/null +++ b/test/integration/fixtures/multiple.done.beforeEach.js @@ -0,0 +1,14 @@ +describe('suite', function() { + beforeEach(function(done) { + setTimeout(done, 10); + setTimeout(done, 20); + }); + + it('test1', function(done) { + setTimeout(done, 50); + }); + + it('test2', function(done) { + setTimeout(done, 50); + }); +}); diff --git a/test/integration/fixtures/multiple.done.specs.js b/test/integration/fixtures/multiple.done.specs.js new file mode 100644 index 0000000000..82197061f1 --- /dev/null +++ b/test/integration/fixtures/multiple.done.specs.js @@ -0,0 +1,10 @@ +describe('suite', function() { + it('test1', function(done) { + done(); + setTimeout(done, 10); + }); + + it('test2', function(done) { + setTimeout(done, 20); + }); +}); diff --git a/test/integration/multiple.done.js b/test/integration/multiple.done.js index 8f9a3cdbce..8bcedf6332 100644 --- a/test/integration/multiple.done.js +++ b/test/integration/multiple.done.js @@ -4,25 +4,95 @@ var args = []; describe('multiple calls to done()', function() { var res; - this.timeout(1000); - before(function(done) { - run('multiple.done.js', args, function(err, result) { - res = result; - done(err); + describe('from a spec', function() { + before(function(done) { + run('multiple.done.js', args, function(err, result) { + res = result; + done(err); + }); + }); + + it('results in failures', function() { + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + }); + + it('throws a descriptive error', function() { + assert.equal(res.failures[0].err.message, + 'done() called multiple times'); + }); + }); + + describe('with multiple specs', function() { + before(function(done) { + run('multiple.done.specs.js', args, function(err, result) { + res = result; + done(err); + }); + }); + + it('results in a failure', function() { + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + }); + + it('correctly attributes the error', function() { + assert.equal(res.failures[0].fullTitle, 'suite test1'); + assert.equal(res.failures[0].err.message, + 'done() called multiple times'); }); }); - it('results in failures', function() { - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 1); - assert.equal(res.code, 1); + describe('from a before hook', function() { + before(function(done) { + run('multiple.done.before.js', args, function(err, result) { + res = result; + done(err); + }); + }); + + it('results in a failure', function() { + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + }); + + it('correctly attributes the error', function() { + assert.equal(res.failures[0].fullTitle, 'suite "before all" hook'); + assert.equal(res.failures[0].err.message, + 'done() called multiple times'); + }); }); - it('throws a descriptive error', function() { - assert.equal(res.failures[0].err.message, - 'done() called multiple times'); + describe('from a beforeEach hook', function() { + before(function(done) { + run('multiple.done.beforeEach.js', args, function(err, result) { + res = result; + done(err); + }); + }); + + it('results in a failure', function() { + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 2); + assert.equal(res.code, 2); + }); + + it('correctly attributes the errors', function() { + assert.equal(res.failures.length, 2); + res.failures.forEach(function(failure) { + assert.equal(failure.fullTitle, 'suite "before each" hook'); + assert.equal(failure.err.message, + 'done() called multiple times'); + }); + }); }); }); From de273d6fbd2bbc258a8a4b31016a8d26e17457f3 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Sat, 19 Sep 2015 11:04:57 +0200 Subject: [PATCH 0356/1771] Remove trailing whitespace from HISTORY.md --- HISTORY.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 41ffa80ad3..05ece271ba 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -3,7 +3,7 @@ * [#1868] - Fix compatibility with older versions of NPM ([@boneskull]) [#1868]: https://github.com/mochajs/mocha/issues/1868 - + 2.3.1 / 2015-09-06 ================== @@ -23,7 +23,7 @@ * [#1230] - More descriptive beforeEach/afterEach messages ([@duncanbeevers]) * [#1787] - Scope loading behaviour instead of using early return ([@aryeguy]) * [#1789] - Fix: html-runner crashing ([@sunesimonsen]) - * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho]) + * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho]) * [#1230] - Decorate failed hook titles with test title ([@duncanbeevers]) * [#1260] - Build using Browserify ([@ndhoule]) * [#1728] - Don't use `__proto__` ([@ndhoule]) @@ -32,7 +32,7 @@ * [#1766] - Fix overly aggressive stack suppression ([@moll]) * [#1752] - Avoid potential infinite loop ([@gsilk]) * [#1761] - Fix problems running under PhantomJS ([@chromakode]) - * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai]) + * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai]) * [#1774] - Support escaped spaces in CLI options ([@adamgruber]) * [#1687] - Fix HTML reporter links with special chars ([@benvinegar]) * [#1359] - Adopt code style and enforce it using ESLint ([@ndhoule] w/ assist from [@jbnicolai] & [@boneskull]) From 0e902b7e00b1e4b49853d328064ca444c63400ef Mon Sep 17 00:00:00 2001 From: David da Silva Date: Sat, 19 Sep 2015 11:27:02 +0200 Subject: [PATCH 0357/1771] Update HISTORY.md for 2.3.3 --- HISTORY.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index 05ece271ba..dac7dd3eff 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,29 @@ +2.3.3 / 2015-09-19 +================== + + * [#1875] - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules]) + * [#1864] - Fix xunit missing output with --reporter-options output ([@danielstjules]) + * [#1846] - Support all harmony flags ([@danielstjules]) + * Fix fragile xunit reporter spec ([@danielstjules]) + * [#1669] - Fix catch uncaught errors outside test suite execution ([@danielstjules]) + * [#1868] - Revert jade to support npm < v1.3.7 ([@danielstjules]) + * [#1766] - Don't remove modules/components from stack trace in the browser ([@danielstjules]) + * [#1798] - Fix correctly attribute mutiple done err with hooks ([@danielstjules]) + * Fix use utils.reduce for IE8 compatibility ([@wsw0108]) + * Some linting errors fixed by [@danielstjules] + * Call the inspect() function if message is not set ([@kevinburke]) + +[#1875]: https://github.com/mochajs/mocha/issues/1875 +[#1864]: https://github.com/mochajs/mocha/issues/1864 +[#1846]: https://github.com/mochajs/mocha/issues/1846 +[#1669]: https://github.com/mochajs/mocha/issues/1669 +[#1868]: https://github.com/mochajs/mocha/issues/1868 +[#1766]: https://github.com/mochajs/mocha/issues/1766 +[#1798]: https://github.com/mochajs/mocha/issues/1798 +[@danielstjules]: https://github.com/danielstjules +[@wsw0108]: https://github.com/wsw0108 +[@kevinburke]: https://github.com/kevinburke + 2.3.2 / 2015-09-07 ================== * [#1868] - Fix compatibility with older versions of NPM ([@boneskull]) From 8ca09fda641f314f6507560addab6a544a2c3a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20da=20Silva=20Cont=C3=ADn?= Date: Mon, 21 Sep 2015 07:15:06 +0200 Subject: [PATCH 0358/1771] Fix node 0.8 blowing up upgrading npm 1 -> 3 Relevant: https://github.com/npm/npm/issues/9668 --- scripts/ensure-compatible-npm.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/ensure-compatible-npm.sh b/scripts/ensure-compatible-npm.sh index 00372f70ef..7105e3b327 100755 --- a/scripts/ensure-compatible-npm.sh +++ b/scripts/ensure-compatible-npm.sh @@ -5,6 +5,7 @@ set -o errexit npm install semver if node -e "process.exit(require('semver').lt(process.argv[1], '1.3.7') ? 0 : 1)" $(npm -v); then - npm install -g npm@'>= 1.3.7' + npm install -g npm@2 + npm install -g npm fi npm uninstall semver From 7b6d3789425db15c1895eb116c55ffd7d312362f Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 21 Sep 2015 07:23:38 +0200 Subject: [PATCH 0359/1771] bump package.json and component.json to 2.3.3 --- component.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/component.json b/component.json index e0e42b8595..f270a18596 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.2", + "version": "2.3.3", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ diff --git a/package.json b/package.json index a12d561f30..b316088fd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.2", + "version": "2.3.3", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From c4393c456839d6bf2cbb4abb1cd177010ee06458 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 21 Sep 2015 07:25:24 +0200 Subject: [PATCH 0360/1771] rebuild mocha.js for 2.3.3 --- mocha.js | 298 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 210 insertions(+), 88 deletions(-) diff --git a/mocha.js b/mocha.js index 2fdbf16db8..84c384bd83 100644 --- a/mocha.js +++ b/mocha.js @@ -1029,7 +1029,7 @@ function Mocha(options) { this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); - if (options.timeout != null) { + if (typeof options.timeout !== 'undefined' && options.timeout !== null) { this.timeout(options.timeout); } this.useColors(options.useColors); @@ -1751,7 +1751,14 @@ exports.list = function(failures) { // msg var msg; var err = test.err; - var message = err.message || ''; + var message; + if (err.message) { + message = err.message; + } else if (typeof err.inspect === 'function') { + message = err.inspect() + ''; + } else { + message = ''; + } var stack = err.stack || message; var index = stack.indexOf(message); var actual = err.actual; @@ -1983,7 +1990,7 @@ function unifiedDiff(err, escape) { return indent + line; } function notBlank(line) { - return line != null; + return typeof line !== 'undefined' && line !== null; } var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); @@ -3120,7 +3127,7 @@ function Markdown(runner) { var key = SUITE_PREFIX + suite.title; obj = obj[key] = obj[key] || { suite: suite }; - suite.suites.forEach(function() { + suite.suites.forEach(function(suite) { mapTOC(suite, obj); }); @@ -3813,6 +3820,11 @@ function XUnit(runner, options) { }); } +/** + * Inherit from `Base.prototype`. + */ +inherits(XUnit, Base); + /** * Override done to close the stream (if it's a file). * @@ -3829,11 +3841,6 @@ XUnit.prototype.done = function(failures, fn) { } }; -/** - * Inherit from `Base.prototype`. - */ -inherits(XUnit, Base); - /** * Write out the given line. * @@ -4240,6 +4247,7 @@ var Pending = require('./pending'); var utils = require('./utils'); var inherits = utils.inherits; var debug = require('debug')('mocha:runner'); +var Runnable = require('./runnable'); var filter = utils.filter; var indexOf = utils.indexOf; var keys = utils.keys; @@ -4297,6 +4305,7 @@ function Runner(suite, delay) { this._abort = false; this._delay = delay; this.suite = suite; + this.started = false; this.total = suite.total(); this.failures = 0; this.on('test end', function(test) { @@ -4519,12 +4528,13 @@ Runner.prototype.hook = function(name, fn) { self.emit('hook', hook); - hook.on('error', function(err) { - self.failHook(hook, err); - }); + if (!hook.listeners('error').length) { + hook.on('error', function(err) { + self.failHook(hook, err); + }); + } hook.run(function(err) { - hook.removeAllListeners('error'); var testError = hook.error(); if (testError) { self.fail(self.test, testError); @@ -4619,7 +4629,8 @@ Runner.prototype.hookDown = function(name, fn) { Runner.prototype.parents = function() { var suite = this.suite; var suites = []; - while (suite = suite.parent) { + while (suite.parent) { + suite = suite.parent; suites.push(suite); } return suites; @@ -4885,7 +4896,20 @@ Runner.prototype.uncaught = function(err) { err.uncaught = true; var runnable = this.currentRunnable; + if (!runnable) { + runnable = new Runnable('Uncaught error outside test suite'); + runnable.parent = this.suite; + + if (this.started) { + this.fail(runnable, err); + } else { + // Can't recover from this failure + this.emit('start'); + this.fail(runnable, err); + this.emit('end'); + } + return; } @@ -4944,6 +4968,7 @@ Runner.prototype.run = function(fn) { } function start() { + self.started = true; self.emit('start'); self.runSuite(rootSuite, function() { debug('finished running'); @@ -5039,7 +5064,8 @@ function filterLeaks(ok, globals) { */ function extraGlobals() { if (typeof process === 'object' && typeof process.version === 'string') { - var nodeVersion = process.version.split('.').reduce(function(a, v) { + var parts = process.version.split('.'); + var nodeVersion = utils.reduce(parts, function(a, v) { return a << 8 | v; }); @@ -5054,7 +5080,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./utils":39,"_process":51,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":35,"./utils":39,"_process":51,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -6146,7 +6172,7 @@ exports.getError = function(err) { * @description * When invoking this function you get a filter function that get the Error.stack as an input, * and return a prettify output. - * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace). + * (i.e: strip Mocha and internal node functions from stack trace). * @returns {Function} */ exports.stackTraceFilter = function() { @@ -6158,14 +6184,10 @@ exports.stackTraceFilter = function() { : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); function isMochaInternal(line) { - return (~line.indexOf('node_modules' + slash + 'mocha')) - || (~line.indexOf('components' + slash + 'mochajs')) - || (~line.indexOf('components' + slash + 'mocha')); - } - - // node_modules, bower, componentJS - function isBrowserModule(line) { - return (~line.indexOf('node_modules')) || (~line.indexOf('components')); + return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) + || (~line.indexOf('components' + slash + 'mochajs' + slash)) + || (~line.indexOf('components' + slash + 'mocha' + slash)) + || (~line.indexOf(slash + 'mocha.js')); } function isNodeInternal(line) { @@ -6181,11 +6203,11 @@ exports.stackTraceFilter = function() { stack = stack.split('\n'); stack = exports.reduce(stack, function(list, line) { - if (is.node && (isMochaInternal(line) || isNodeInternal(line))) { + if (isMochaInternal(line)) { return list; } - if (is.browser && (isBrowserModule(line))) { + if (is.node && isNodeInternal(line)) { return list; } @@ -6259,28 +6281,35 @@ var rootParent = {} * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * * Note: * - * - Implementation must support adding new properties to `Uint8Array` instances. - * Firefox 4-29 lacked support, fixed in Firefox 30+. - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will - * get the Object implementation, which is slower but will work correctly. + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = (function () { + function Bar () {} try { - var buf = new ArrayBuffer(0) - var arr = new Uint8Array(buf) + var arr = new Uint8Array(1) arr.foo = function () { return 42 } + arr.constructor = Bar return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } @@ -6358,8 +6387,13 @@ function fromObject (that, object) { throw new TypeError('must start with number, buffer, array or string') } - if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) { - return fromTypedArray(that, object) + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } } if (object.length) return fromArrayLike(that, object) @@ -6396,6 +6430,18 @@ function fromTypedArray (that, array) { return that } +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + function fromArrayLike (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) @@ -6513,8 +6559,6 @@ Buffer.concat = function concat (list, length) { if (list.length === 0) { return new Buffer(0) - } else if (list.length === 1) { - return list[0] } var i @@ -6689,13 +6733,13 @@ Buffer.prototype.indexOf = function indexOf (val, byteOffset) { throw new TypeError('val must be string, number or Buffer') } -// `get` will be removed in Node 0.13+ +// `get` is deprecated Buffer.prototype.get = function get (offset) { console.log('.get() is deprecated. Access using array indexes instead.') return this.readUInt8(offset) } -// `set` will be removed in Node 0.13+ +// `set` is deprecated Buffer.prototype.set = function set (v, offset) { console.log('.set() is deprecated. Access using array indexes instead.') return this.writeUInt8(v, offset) @@ -6836,20 +6880,99 @@ function base64Slice (buf, start, end) { } function utf8Slice (buf, start, end) { - var res = '' - var tmp = '' end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } - for (var i = start; i < end; i++) { - if (buf[i] <= 0x7F) { - res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) - tmp = '' - } else { - tmp += '%' + buf[i].toString(16) + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF } + + res.push(codePoint) + i += bytesPerSequence } - return res + decodeUtf8Char(tmp) + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res } function asciiSlice (buf, start, end) { @@ -7384,9 +7507,16 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) { } var len = end - start + var i - if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < len; i++) { + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { target[i + targetStart] = this[i + start] } } else { @@ -7462,7 +7592,7 @@ Buffer._augment = function _augment (arr) { // save reference to original Uint8Array set method before overwriting arr._set = arr.set - // deprecated, will be removed in node 0.13+ + // deprecated arr.get = BP.get arr.set = BP.set @@ -7518,7 +7648,7 @@ Buffer._augment = function _augment (arr) { return arr } -var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not @@ -7548,28 +7678,15 @@ function utf8ToBytes (string, units) { var length = string.length var leadSurrogate = null var bytes = [] - var i = 0 - for (; i < length; i++) { + for (var i = 0; i < length; i++) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead - if (leadSurrogate) { - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } else { - // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - leadSurrogate = null - } - } else { + if (!leadSurrogate) { // no lead yet - if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) @@ -7578,18 +7695,30 @@ function utf8ToBytes (string, units) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue - } else { - // valid lead - leadSurrogate = codePoint - continue } + + // valid lead + leadSurrogate = codePoint + + continue } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = null } + leadSurrogate = null + // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break @@ -7607,7 +7736,7 @@ function utf8ToBytes (string, units) { codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) - } else if (codePoint < 0x200000) { + } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, @@ -7660,14 +7789,6 @@ function blitBuffer (src, dst, offset, length) { return i } -function decodeUtf8Char (str) { - try { - return decodeURIComponent(str) - } catch (err) { - return String.fromCharCode(0xFFFD) // UTF 8 invalid char - } -} - },{"base64-js":44,"ieee754":45,"is-array":46}],44:[function(require,module,exports){ var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; @@ -8328,7 +8449,9 @@ function drainQueue() { currentQueue = queue; queue = []; while (++queueIndex < len) { - currentQueue[queueIndex].run(); + if (currentQueue) { + currentQueue[queueIndex].run(); + } } queueIndex = -1; len = queue.length; @@ -8380,7 +8503,6 @@ process.binding = function (name) { throw new Error('process.binding is not supported'); }; -// TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); From 63e668a8f75952691d22060ca99700f5af719758 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Tue, 29 Sep 2015 15:38:26 +0300 Subject: [PATCH 0361/1771] Fix typo in test/reporters/nyan.js peinding -> pending --- test/reporters/nyan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/reporters/nyan.js b/test/reporters/nyan.js index e574808d66..37c9b7c372 100644 --- a/test/reporters/nyan.js +++ b/test/reporters/nyan.js @@ -9,7 +9,7 @@ describe('nyan face', function () { nyanCat.face.call(nyanCat).should.equal('( x .x)'); }); - it('expected nyan face:(x .x) when "peinding" at least one and no failing', function () { + it('expected nyan face:(x .x) when "pending" at least one and no failing', function () { var nyanCat = new NyanCat({on: function(){}}); nyanCat.stats = { passes: 2, pending: 1, failures: 0 }; nyanCat.face.call(nyanCat).should.equal('( o .o)'); From f8294e63a995b9e46c866ca43c0afd7554534f83 Mon Sep 17 00:00:00 2001 From: nexdrew Date: Tue, 29 Sep 2015 09:48:46 -0400 Subject: [PATCH 0362/1771] remove duplication of mocha.opts on process.argv --- bin/mocha | 7 +------ test/integration/regression.js | 9 +++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/bin/mocha b/bin/mocha index 123929e8f1..031ef56bff 100755 --- a/bin/mocha +++ b/bin/mocha @@ -8,12 +8,7 @@ var spawn = require('child_process').spawn, path = require('path'), fs = require('fs'), - args = [path.join(__dirname, '_mocha')], - getOptions = require('./options'); - -// load mocha.opts into process.argv - -getOptions(); + args = [path.join(__dirname, '_mocha')]; process.argv.slice(2).forEach(function(arg){ var flag = arg.split('=')[0]; diff --git a/test/integration/regression.js b/test/integration/regression.js index 564e922110..5e2d863a64 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -1,4 +1,6 @@ var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); var run = require('./helpers').runMocha; describe('regressions', function() { @@ -21,4 +23,11 @@ describe('regressions', function() { done(); }); }); + + it('should not duplicate mocha.opts args in process.argv', function() { + var processArgv = process.argv.join(''); + var mochaOpts = fs.readFileSync(path.join(__dirname, '..', 'mocha.opts'), 'utf-8').split(/[\s]+/).join(''); + assert.notEqual(processArgv.indexOf(mochaOpts), -1, 'process.argv missing mocha.opts'); + assert.equal(processArgv.indexOf(mochaOpts), processArgv.lastIndexOf(mochaOpts), 'process.argv contains duplicated mocha.opts'); + }); }); From 19e90aa8ec41e027def9fd98f62a3b6aa435032e Mon Sep 17 00:00:00 2001 From: Hugo Giraudel Date: Wed, 14 Oct 2015 09:36:28 +0200 Subject: [PATCH 0363/1771] Changed some double quotes in single quotes to avoid mixing them both --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 5b995c9808..2684e32de8 100644 --- a/index.md +++ b/index.md @@ -89,7 +89,7 @@ $ $EDITOR test/test.js In your editor: ```js -var assert = require("assert"); +var assert = require('assert'); describe('Array', function() { describe('#indexOf()', function () { it('should return -1 when the value is not present', function () { From f35c3adc7e031fd63467438ed98219b5887d60cc Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 19 Oct 2015 14:08:57 -0700 Subject: [PATCH 0364/1771] remove recommendation for Node internal assert --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 2684e32de8..a16507438c 100644 --- a/index.md +++ b/index.md @@ -112,7 +112,7 @@ $ mocha ## Assertions -Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as [should.js](https://github.com/shouldjs/should.js), node's regular `assert` module, or others. The following is a list of known assertion libraries for node and/or the browser: +Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as: - [should.js](https://github.com/shouldjs/should.js) BDD style shown throughout these docs - [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions From 2ef3d1d648825d0243216a6c18a54e43c135da32 Mon Sep 17 00:00:00 2001 From: Matt Giles Date: Mon, 19 Oct 2015 15:06:36 -0700 Subject: [PATCH 0365/1771] Update --async-only docs --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 2684e32de8..b813dc78b8 100644 --- a/index.md +++ b/index.md @@ -480,7 +480,7 @@ Options: -h, --help output usage information -V, --version output the version number - -A, --async-only force all tests to take a callback (async) + -A, --async-only force all tests to take a callback (async) or return a promise -c, --colors force enabling of colors -C, --no-colors force disabling of colors -G, --growl enable growl notification support From 039a8a7edd6b21897b2c576d67c4769390c80b15 Mon Sep 17 00:00:00 2001 From: Joey Cozza Date: Mon, 2 Nov 2015 11:34:19 -0700 Subject: [PATCH 0366/1771] Update debug dependency to 2.2.0 debug@2.0.0 has a vulnerability in its dependency on ms@0.6.2. debug@2.2.0 has updated its ms dependency to a version without this vulnerability. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b316088fd0..12e72dc9d5 100644 --- a/package.json +++ b/package.json @@ -275,7 +275,7 @@ }, "dependencies": { "commander": "2.3.0", - "debug": "2.0.0", + "debug": "2.2.0", "diff": "1.4.0", "escape-string-regexp": "1.0.2", "glob": "3.2.3", From 5cc8bdd26c74fb91e7eea57e7c689b4e4890bc55 Mon Sep 17 00:00:00 2001 From: Travis Jeffery Date: Sun, 15 Nov 2015 15:27:11 -0500 Subject: [PATCH 0367/1771] Release 2.3.4 --- HISTORY.md | 8 +++ component.json | 4 +- mocha.js | 144 ++++++++++++++++++++++++++++++------------------- package.json | 4 +- 4 files changed, 100 insertions(+), 60 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index dac7dd3eff..5a9a363349 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,11 @@ + +2.3.4 / 2015-11-15 +================== + + * Update debug dependency to 2.2.0 + * remove duplication of mocha.opts on process.argv + * Fix typo in test/reporters/nyan.js + 2.3.3 / 2015-09-19 ================== diff --git a/component.json b/component.json index f270a18596..9c374af6ec 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.3", + "version": "2.3.4", "repo": "mochajs/mocha", "description": "simple, flexible, fun test framework", "keywords": [ @@ -17,4 +17,4 @@ "styles": [ "mocha.css" ] -} +} \ No newline at end of file diff --git a/mocha.js b/mocha.js index 84c384bd83..7c925f74c3 100644 --- a/mocha.js +++ b/mocha.js @@ -5,7 +5,7 @@ module.exports = process.env.COV : require('./lib/mocha'); }).call(this,require('_process')) -},{"./lib-cov/mocha":undefined,"./lib/mocha":14,"_process":51}],2:[function(require,module,exports){ +},{"./lib-cov/mocha":undefined,"./lib/mocha":14,"_process":52}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -591,7 +591,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],9:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":69}],9:[function(require,module,exports){ 'use strict'; /** @@ -833,7 +833,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],13:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":69}],13:[function(require,module,exports){ /** * Module dependencies. */ @@ -940,7 +940,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":68}],14:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":69}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1431,7 +1431,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":51,"escape-string-regexp":68,"growl":69,"path":41}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":52,"escape-string-regexp":69,"growl":70,"path":41}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2069,7 +2069,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":51,"diff":67,"supports-color":41,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":39,"_process":52,"diff":68,"supports-color":41,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2203,7 +2203,7 @@ function Dot(runner) { inherits(Dot, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],20:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],20:[function(require,module,exports){ (function (process,__dirname){ /** * Module dependencies. @@ -2263,7 +2263,7 @@ function coverageClass(coveragePctg) { } }).call(this,require('_process'),"/lib/reporters") -},{"./json-cov":23,"_process":51,"fs":41,"jade":41,"path":41}],21:[function(require,module,exports){ +},{"./json-cov":23,"_process":52,"fs":41,"jade":41,"path":41}],21:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2593,7 +2593,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":68}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":69}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2768,7 +2768,7 @@ function clean(test) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":51}],24:[function(require,module,exports){ +},{"./base":17,"_process":52}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2831,7 +2831,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":51}],25:[function(require,module,exports){ +},{"./base":17,"_process":52}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2924,7 +2924,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":51}],26:[function(require,module,exports){ +},{"./base":17,"_process":52}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3020,7 +3020,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],27:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3085,7 +3085,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],28:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3186,7 +3186,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],29:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3226,7 +3226,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],30:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3491,7 +3491,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],31:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3584,7 +3584,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],32:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":52}],32:[function(require,module,exports){ /** * Module dependencies. */ @@ -5080,7 +5080,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":35,"./utils":39,"_process":51,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":35,"./utils":39,"_process":52,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -6221,7 +6221,7 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":51,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41,"util":66}],40:[function(require,module,exports){ +},{"_process":52,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41,"util":67}],40:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -6250,17 +6250,19 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":51,"stream":63,"util":66}],41:[function(require,module,exports){ +},{"_process":52,"stream":64,"util":67}],41:[function(require,module,exports){ },{}],42:[function(require,module,exports){ arguments[4][41][0].apply(exports,arguments) },{"dup":41}],43:[function(require,module,exports){ +(function (global){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ +/* eslint-disable no-proto */ var base64 = require('base64-js') var ieee754 = require('ieee754') @@ -6300,7 +6302,11 @@ var rootParent = {} * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { function Bar () {} try { var arr = new Uint8Array(1) @@ -6313,7 +6319,7 @@ Buffer.TYPED_ARRAY_SUPPORT = (function () { } catch (e) { return false } -})() +} function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT @@ -6469,10 +6475,16 @@ function fromJsonObject (that, object) { return that } +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + function allocate (that, length) { if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that.length = length @@ -7261,7 +7273,7 @@ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } @@ -7278,7 +7290,7 @@ Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) @@ -7292,7 +7304,7 @@ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value + this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } @@ -7314,7 +7326,7 @@ Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) - this[offset] = value + this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } @@ -7329,7 +7341,7 @@ Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value + this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } @@ -7382,7 +7394,7 @@ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } @@ -7391,7 +7403,7 @@ Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) @@ -7405,7 +7417,7 @@ Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value + this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } @@ -7417,7 +7429,7 @@ Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) @@ -7436,7 +7448,7 @@ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value + this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } @@ -7789,6 +7801,7 @@ function blitBuffer (src, dst, offset, length) { return i } +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"base64-js":44,"ieee754":45,"is-array":46}],44:[function(require,module,exports){ var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; @@ -8365,11 +8378,30 @@ if (typeof Object.create === 'function') { } },{}],49:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],50:[function(require,module,exports){ module.exports = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) == '[object Array]'; }; -},{}],50:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -8416,7 +8448,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],51:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -8509,10 +8541,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],52:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":53}],53:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":54}],54:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8605,7 +8637,7 @@ function forEach (xs, f) { } }).call(this,require('_process')) -},{"./_stream_readable":55,"./_stream_writable":57,"_process":51,"core-util-is":58,"inherits":48}],54:[function(require,module,exports){ +},{"./_stream_readable":56,"./_stream_writable":58,"_process":52,"core-util-is":59,"inherits":48}],55:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -8653,7 +8685,7 @@ PassThrough.prototype._transform = function(chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":56,"core-util-is":58,"inherits":48}],55:[function(require,module,exports){ +},{"./_stream_transform":57,"core-util-is":59,"inherits":48}],56:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -9608,7 +9640,7 @@ function indexOf (xs, x) { } }).call(this,require('_process')) -},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"events":47,"inherits":48,"isarray":49,"stream":63,"string_decoder/":64,"util":42}],56:[function(require,module,exports){ +},{"./_stream_duplex":54,"_process":52,"buffer":43,"core-util-is":59,"events":47,"inherits":48,"isarray":50,"stream":64,"string_decoder/":65,"util":42}],57:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -9819,7 +9851,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":53,"core-util-is":58,"inherits":48}],57:[function(require,module,exports){ +},{"./_stream_duplex":54,"core-util-is":59,"inherits":48}],58:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -10300,7 +10332,7 @@ function endWritable(stream, state, cb) { } }).call(this,require('_process')) -},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"inherits":48,"stream":63}],58:[function(require,module,exports){ +},{"./_stream_duplex":54,"_process":52,"buffer":43,"core-util-is":59,"inherits":48,"stream":64}],59:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -10409,11 +10441,11 @@ exports.isBuffer = isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } -}).call(this,require("buffer").Buffer) -},{"buffer":43}],59:[function(require,module,exports){ +}).call(this,{"isBuffer":require("../../../../insert-module-globals/node_modules/is-buffer/index.js")}) +},{"../../../../insert-module-globals/node_modules/is-buffer/index.js":49}],60:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":54}],60:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":55}],61:[function(require,module,exports){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = require('stream'); exports.Readable = exports; @@ -10422,13 +10454,13 @@ exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); -},{"./lib/_stream_duplex.js":53,"./lib/_stream_passthrough.js":54,"./lib/_stream_readable.js":55,"./lib/_stream_transform.js":56,"./lib/_stream_writable.js":57,"stream":63}],61:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":54,"./lib/_stream_passthrough.js":55,"./lib/_stream_readable.js":56,"./lib/_stream_transform.js":57,"./lib/_stream_writable.js":58,"stream":64}],62:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":56}],62:[function(require,module,exports){ +},{"./lib/_stream_transform.js":57}],63:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":57}],63:[function(require,module,exports){ +},{"./lib/_stream_writable.js":58}],64:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -10557,7 +10589,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":47,"inherits":48,"readable-stream/duplex.js":52,"readable-stream/passthrough.js":59,"readable-stream/readable.js":60,"readable-stream/transform.js":61,"readable-stream/writable.js":62}],64:[function(require,module,exports){ +},{"events":47,"inherits":48,"readable-stream/duplex.js":53,"readable-stream/passthrough.js":60,"readable-stream/readable.js":61,"readable-stream/transform.js":62,"readable-stream/writable.js":63}],65:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -10780,14 +10812,14 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":43}],65:[function(require,module,exports){ +},{"buffer":43}],66:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],66:[function(require,module,exports){ +},{}],67:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -11377,7 +11409,7 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":65,"_process":51,"inherits":48}],67:[function(require,module,exports){ +},{"./support/isBuffer":66,"_process":52,"inherits":48}],68:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* @@ -11998,7 +12030,7 @@ function hasOwnProperty(obj, prop) { } }(this)); -},{}],68:[function(require,module,exports){ +},{}],69:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; @@ -12011,7 +12043,7 @@ module.exports = function (str) { return str.replace(matchOperatorsRe, '\\$&'); }; -},{}],69:[function(require,module,exports){ +},{}],70:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -12249,7 +12281,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":51,"child_process":41,"fs":41,"os":50,"path":41}],70:[function(require,module,exports){ +},{"_process":52,"child_process":41,"fs":41,"os":51,"path":41}],71:[function(require,module,exports){ (function (process,global){ /** * Shim process.stdout. @@ -12414,4 +12446,4 @@ window.Mocha = Mocha; window.mocha = mocha; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../":1,"_process":51,"browser-stdout":40}]},{},[70]); +},{"../":1,"_process":52,"browser-stdout":40}]},{},[71]); diff --git a/package.json b/package.json index 12e72dc9d5..c4fdddfffb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.3.3", + "version": "2.3.4", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -312,4 +312,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} +} \ No newline at end of file From 4af3866107cf9a4c43501537600aba267e8494ca Mon Sep 17 00:00:00 2001 From: Kris Rasmussen Date: Mon, 16 Nov 2015 16:07:46 -0800 Subject: [PATCH 0368/1771] Silence Bluebird js warnings --- lib/runnable.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/runnable.js b/lib/runnable.js index 07501785a3..2bc21248a1 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -289,6 +289,9 @@ Runnable.prototype.run = function(fn) { result .then(function() { done(); + // Return null so libraries like bluebird do not warn about + // subsequently constructed Promises. + return null; }, function(reason) { done(reason || new Error('Promise rejected with no or falsy reason')); From d596bbbfa130c68c15ae15eb9ccad50c17278fd8 Mon Sep 17 00:00:00 2001 From: "James G. Kim" Date: Fri, 20 Nov 2015 04:01:21 +0900 Subject: [PATCH 0369/1771] Fixes #1794 Moves Mocha interface allocation to after require option has been processed to allow for use of custom Mocha UI's. --- bin/_mocha | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index f8068835f6..bfab146e66 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -201,10 +201,6 @@ if (program.reporterOptions !== undefined) { mocha.reporter(program.reporter, reporterOptions); -// interface - -mocha.ui(program.ui); - // load reporter try { @@ -304,6 +300,10 @@ requires.forEach(function(mod) { require(mod); }); +// interface + +mocha.ui(program.ui); + //args var args = program.args; From 5a18d67e72567d48af26cbeec183f2e3bbda4730 Mon Sep 17 00:00:00 2001 From: Sorin Iclanzan Date: Mon, 23 Nov 2015 15:00:42 -0800 Subject: [PATCH 0370/1771] Simplify function call. --- lib/mocha.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index eb6c8d077f..a47e92dc27 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -209,14 +209,13 @@ Mocha.prototype.ui = function(name) { Mocha.prototype.loadFiles = function(fn) { var self = this; var suite = this.suite; - var pending = this.files.length; this.files.forEach(function(file) { file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); suite.emit('post-require', global, file, self); - --pending || (fn && fn()); }); + fn && fn(); }; /** From c51119b8d8c89e0105ea1d53eba0500eb508cfe2 Mon Sep 17 00:00:00 2001 From: Rob Raux Date: Wed, 11 Nov 2015 19:30:35 +0000 Subject: [PATCH 0371/1771] support --perf-basic-prof --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index f8068835f6..35ca281524 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -89,6 +89,7 @@ program .option('--no-exit', 'require a clean shutdown of the event loop: mocha will not call process.exit') .option('--no-timeouts', 'disables timeouts, given implicitly with --debug') .option('--opts ', 'specify opts path', 'test/mocha.opts') + .option('--perf-basic-prof', 'enable perf linux profiler (basic support)') .option('--prof', 'log statistical profiling information') .option('--recursive', 'include sub directories') .option('--reporters', 'display available reporters') diff --git a/bin/mocha b/bin/mocha index 031ef56bff..22db154df6 100755 --- a/bin/mocha +++ b/bin/mocha @@ -35,6 +35,7 @@ process.argv.slice(2).forEach(function(arg){ case '--throw-deprecation': case '--trace-deprecation': case '--allow-natives-syntax': + case '--perf-basic-prof': args.unshift(arg); break; default: From 119291449cd03a11cdeda9e37cf718a69a012896 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 1 Dec 2015 19:35:24 -0800 Subject: [PATCH 0372/1771] use chalk for base reporter colors; closes #1200 --- lib/reporters/base.js | 42 ++++++++++++++++++++++-------------------- package.json | 3 ++- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index bb107ba229..c74b071f36 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -7,6 +7,8 @@ var diff = require('diff'); var ms = require('../ms'); var utils = require('../utils'); var supportsColor = process.browser ? null : require('supports-color'); +var chalk = require('chalk'); +chalk.enabled = supportsColor; /** * Expose `Base`. @@ -50,25 +52,25 @@ exports.inlineDiffs = false; */ exports.colors = { - pass: 90, - fail: 31, - 'bright pass': 92, - 'bright fail': 91, - 'bright yellow': 93, - pending: 36, - suite: 0, - 'error title': 0, - 'error message': 31, - 'error stack': 90, - checkmark: 32, - fast: 90, - medium: 33, - slow: 31, - green: 32, - light: 90, - 'diff gutter': 90, - 'diff added': 32, - 'diff removed': 31 + pass: chalk.gray, + fail: chalk.red, + 'bright pass': chalk.green.bold, + 'bright fail': chalk.red.bold, + 'bright yellow': chalk.yellow.bold, + pending: chalk.cyan, + suite: chalk.white, + 'error title': chalk.gray, + 'error message': chalk.red, + 'error stack': chalk.white, + checkmark: chalk.green, + fast: chalk.gray, + medium: chalk.yellow, + slow: chalk.red, + green: chalk.green, + light: chalk.white.bold, + 'diff gutter': chalk.gray, + 'diff added': chalk.green, + 'diff removed': chalk.red }; /** @@ -103,7 +105,7 @@ var color = exports.color = function(type, str) { if (!exports.useColors) { return String(str); } - return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; + return '\u001b[' + exports.colors[type](str) + '\u001b[0m'; }; /** diff --git a/package.json b/package.json index c4fdddfffb..cf5152da56 100644 --- a/package.json +++ b/package.json @@ -274,6 +274,7 @@ "test": "make test-all" }, "dependencies": { + "chalk": "0.4.0", "commander": "2.3.0", "debug": "2.2.0", "diff": "1.4.0", @@ -312,4 +313,4 @@ "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" } ] -} \ No newline at end of file +} From a2a2e6c523b9900c738db79583240787d0054801 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Thu, 3 Dec 2015 19:45:49 +0300 Subject: [PATCH 0373/1771] propagate "file" property across suites and tests for "exports" interface --- lib/interfaces/exports.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/interfaces/exports.js b/lib/interfaces/exports.js index a64692ae5c..8fc45405ae 100644 --- a/lib/interfaces/exports.js +++ b/lib/interfaces/exports.js @@ -53,7 +53,7 @@ module.exports = function(suite) { } else { suite = Suite.create(suites[0], key); suites.unshift(suite); - visit(obj[key]); + visit(obj[key], file); suites.shift(); } } From 1cc21a9ca99330644d121087198dbcfed8be0e94 Mon Sep 17 00:00:00 2001 From: "Ian W. Remmel" Date: Thu, 3 Dec 2015 18:56:15 -0800 Subject: [PATCH 0374/1771] make sure the xunit output dir exists before trying to write to it Fixes #1994 --- lib/reporters/xunit.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index d9f58b9f05..cf3411e6c1 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -7,6 +7,7 @@ var utils = require('../utils'); var inherits = utils.inherits; var fs = require('fs'); var escape = utils.escape; +var mkdirp = require('mkdirp'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -40,10 +41,11 @@ function XUnit(runner, options) { var self = this; if (options.reporterOptions && options.reporterOptions.output) { - if (!fs.createWriteStream) { - throw new Error('file output not supported in browser'); - } - self.fileStream = fs.createWriteStream(options.reporterOptions.output); + if (! fs.createWriteStream) { + throw new Error('file output not supported in browser'); + } + mkdirp.sync(path.dirname(options.reporterOptions.output)); + self.fileStream = fs.createWriteStream(options.reporterOptions.output); } runner.on('pending', function(test) { From d09c035f7e6304b37fef2ebc9e1cd2783bf39562 Mon Sep 17 00:00:00 2001 From: "Ian W. Remmel" Date: Wed, 9 Dec 2015 09:20:48 -0800 Subject: [PATCH 0375/1771] fix lint errors --- lib/reporters/xunit.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index cf3411e6c1..7c16302c63 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -8,6 +8,7 @@ var inherits = utils.inherits; var fs = require('fs'); var escape = utils.escape; var mkdirp = require('mkdirp'); +var path = require('path'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -41,11 +42,11 @@ function XUnit(runner, options) { var self = this; if (options.reporterOptions && options.reporterOptions.output) { - if (! fs.createWriteStream) { - throw new Error('file output not supported in browser'); - } - mkdirp.sync(path.dirname(options.reporterOptions.output)); - self.fileStream = fs.createWriteStream(options.reporterOptions.output); + if (!fs.createWriteStream) { + throw new Error('file output not supported in browser'); + } + mkdirp.sync(path.dirname(options.reporterOptions.output)); + self.fileStream = fs.createWriteStream(options.reporterOptions.output); } runner.on('pending', function(test) { From 77ddbef14441786520717bda0010b2d14c68bc2c Mon Sep 17 00:00:00 2001 From: tmont Date: Wed, 9 Dec 2015 06:40:20 -0800 Subject: [PATCH 0376/1771] support for strict mode - fixes #1879 - fixes #1821 --- bin/_mocha | 2 ++ bin/mocha | 1 + 2 files changed, 3 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index f8068835f6..13c369f55c 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -95,6 +95,7 @@ program .option('--throw-deprecation', 'throw an exception anytime a deprecated function is used') .option('--trace', 'trace function calls') .option('--trace-deprecation', 'show stack traces on deprecations') + .option('--use_strict', 'enforce strict mode') .option('--watch-extensions ,...', 'additional extensions to monitor with --watch', list, []) .option('--delay', 'wait for async suite definition') @@ -207,6 +208,7 @@ mocha.ui(program.ui); // load reporter +var Reporter = null; try { Reporter = require('../lib/reporters/' + program.reporter); } catch (err) { diff --git a/bin/mocha b/bin/mocha index 031ef56bff..ebc517784d 100755 --- a/bin/mocha +++ b/bin/mocha @@ -34,6 +34,7 @@ process.argv.slice(2).forEach(function(arg){ case '--prof': case '--throw-deprecation': case '--trace-deprecation': + case '--use_strict': case '--allow-natives-syntax': args.unshift(arg); break; From c66bc8354bac5f9bc43de7575f4bfe3ecc470801 Mon Sep 17 00:00:00 2001 From: John Reeves Date: Mon, 14 Dec 2015 21:03:17 +0000 Subject: [PATCH 0377/1771] XUnit Reporter Writes to stdout, falls back to console.log Fixes #1674; provides support *much* needed for [mocha-phantomjs](https://github.com/nathanboktae/mocha-phantomjs) (see [#133](https://github.com/nathanboktae/mocha-phantomjs/issues/133), [#220](https://github.com/nathanboktae/mocha-phantomjs/issues/220), etc). Maintains support for running the XUnit reporter in a browser (unlike the previously reverted PR #1068). ping @alemangui, @nathanboktae Thanks all. --- lib/reporters/xunit.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 7c16302c63..a61e0bc7de 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -109,6 +109,8 @@ XUnit.prototype.done = function(failures, fn) { XUnit.prototype.write = function(line) { if (this.fileStream) { this.fileStream.write(line + '\n'); + } else if (typeof process === 'object' && typeof process.stdout === 'object') { + process.stdout.write(line + '\n'); } else { console.log(line); } From 5892b69ecfca26b016cb48b4671a194899588c03 Mon Sep 17 00:00:00 2001 From: Fagner Brack Date: Mon, 14 Dec 2015 20:03:28 -0200 Subject: [PATCH 0378/1771] Document the default execution of "*.coffee" files See https://github.com/mochajs/mocha/blob/221a3c049ed3a943ce36fd0a4ffe0e23acbb7cab/bin/_mocha#L155 --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index eb2a7b19d0..a6654bac5a 100644 --- a/index.md +++ b/index.md @@ -960,7 +960,7 @@ $ mocha --reporter list --growl ## The `test/` Directory -By default, `mocha` looks for the glob `./test/*.js`, so you may want to put your tests in `test/` folder. +By default, `mocha` looks for the glob `./test/*.js` and `./test/*.coffee`, so you may want to put your tests in `test/` folder. ## Editor Plugins From ae4fbca3e19049cd18d676e865c844fbc890e14c Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Thu, 26 Nov 2015 11:51:04 +0000 Subject: [PATCH 0379/1771] Fix HTML reporting display to show errors if done is called multiple times, or if an exception is thrown after done is called. --- lib/reporters/html.js | 5 ++++- test/browser/index.html | 1 + test/browser/multiple-done.js | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/browser/multiple-done.js diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 62643ecb3c..277075985d 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -129,7 +129,10 @@ function HTML(runner) { }); runner.on('fail', function(test) { - if (test.type === 'hook') { + // For type = 'test' its possible that the test failed due to multiple + // done() calls. So report the issue here. + if (test.type === 'hook' + || test.type === 'test') { runner.emit('test end', test); } }); diff --git a/test/browser/index.html b/test/browser/index.html index f10732dd4e..9200b977e5 100644 --- a/test/browser/index.html +++ b/test/browser/index.html @@ -14,6 +14,7 @@ + diff --git a/css/style.css b/css/style.css index 43dfb44b53..b0d8e8bb76 100644 --- a/css/style.css +++ b/css/style.css @@ -16,37 +16,12 @@ header { } h1 { - position: relative; - font-style: normal; - font-weight: 100; - text-transform: lowercase; - background-color: #8a6343; - color: white; - display: inline-block; - padding: 48px 30px; - font-size: 2em; + margin-left: -19px; opacity: 0; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - -o-border-radius: 100px; - border-radius: 100px; - -webkit-transition: opacity 1s, background-color 200ms; - -moz-transition: opacity 1s, background-color 200ms; - -o-transition: opacity 1s, background-color 200ms; - transition: opacity 1s, background-color 200ms; -} - -h1:hover { - background-color: #a07a5c; -} - -h1 a { - color: inherit; - font-weight: inherit; -} - -h1 a:hover { - text-decoration: none; + -webkit-transition: opacity 1s; + -moz-transition: opacity 1s; + -o-transition: opacity 1s; + transition: opacity 1s; } .onload h1 { @@ -72,9 +47,9 @@ h3 { color: #c29d7f; font-weight: 100; font-size: 30px; - margin-top: -110px; + margin-top: -155px; margin-left: 140px; - margin-bottom: 100px; + margin-bottom: 125px; letter-spacing: 2px; -webkit-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; -moz-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; @@ -88,7 +63,7 @@ h3 { .onload #tag { opacity: 1; - margin-left: 170px; + margin-left: 185px; } #content > p:first-child { @@ -172,7 +147,7 @@ img { max-width: 100%; } -img[src*="opencollective.com/mochajs"], img[src*=badges] { +img[src*="opencollective.com/mochajs"], img[src*=badges], img[src*=".svg"] { margin: 0; box-shadow: none; } diff --git a/index.md b/index.md index dcd4cc89ab..e9a52fa184 100644 --- a/index.md +++ b/index.md @@ -10,6 +10,79 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no [![OpenCollective](https://opencollective.com/mochajs/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/mochajs/sponsors/badge.svg)](#sponsors) + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mochajs#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Is your company using Mocha? Ask your manager to support us. Your company logo will show up here and on our [Github page](https://github.com/mochajs/mocha#sponsors). [[Become a sponsor](https://opencollective.com/mochajs#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Features - browser support @@ -71,8 +144,6 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no - [Examples](#examples) - [Testing Mocha](#testing-mocha) - [More Information](#more-information) -- [Backers](#backers) -- [Sponsors](#sponsors) @@ -1064,77 +1135,3 @@ $ make test REPORTER=list ## More Information In addition to chatting with us on [Gitter](https://gitter.im/mochajs/mocha), for additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki](https://github.com/mochajs/mocha/wiki) on GitHub. For discussions join the [Google Group](http://groups.google.com/group/mochajs). For a running example of Mocha, view [example/tests.html](example/tests.html). For the JavaScript API, view the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js#L51). - - - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mochajs#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Is your company using Mocha? Ask your manager to support us. Your company logo will show up here and on our [Github page](https://github.com/mochajs/mocha#sponsors). [[Become a sponsor](https://opencollective.com/mochajs#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 488fd6ff5451690955b7c7c6ba5594729635897c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 12 May 2016 22:04:43 -0700 Subject: [PATCH 0465/1771] remove reserved 'maintainers' field from package.json this field is [used internally](https://docs.npmjs.com/files/package.json#people-fields-author-contributors) by npm; its presence may cause confusion --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index af7a69fd5a..49b780cc18 100644 --- a/package.json +++ b/package.json @@ -257,11 +257,6 @@ "type": "git", "url": "git://github.com/mochajs/mocha.git" }, - "maintainers": [ - "travisjeffery ", - "jbnicolai ", - "boneskull " - ], "main": "./index", "bin": { "mocha": "./bin/mocha", From 3904da4c2e7f2c72bc64d9f44a39d848d6755526 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 12 May 2016 22:19:46 -0700 Subject: [PATCH 0466/1771] adds node 6 to CI matrix; closes #2239 (#2251) * update travis matrix for node 6; use trusty image * add test to trigger use of glob.sync() --- .travis.yml | 38 +++++++++++++++++++++++++------------- test/acceptance/utils.js | 11 +++++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 54b19eaac3..ffd19c6b50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,33 @@ +# in order to use 'trusty' dist, need this. +# see https://docs.travis-ci.com/user/trusty-ci-environment/ +sudo: required + +# trust dist provides a modern build chain (as opposed to 'precise' dist) +# which absolves us from having to install compilers and stuff +dist: trusty + language: node_js -env: - global: - - CXX=g++-4.8 + +node_js: + - '6' + - '5' + - '4' + - 'iojs' + - '0.12' + - '0.11' + - '0.10' + - '0.8' + before_install: -- ./scripts/ensure-compatible-npm.sh + # node 0.8 won't install our dev deps with an out-of-box npm; + # this upgrades it + - ./scripts/ensure-compatible-npm.sh + script: travis_retry npm test -node_js: -- '5' -- '4' -- 'iojs' -- '0.12' -- '0.11' -- '0.10' -- '0.8' -sudo: false + notifications: urls: + # for gitter - secure: "EmycFlk48bUvOQ07mxnbcn6T+n3G4wVWuXgrDsUUp6EhJ9866wQK9i+qVhqogWuSEQrGoVaS/vpc/NEYxDP30BD/+nqgvOhVhLVEgtziI85imyV/oUVpArdW3AUmuzCrx7rQCivygjpBmWV9ZcUT5Km4qp1iQhuumy2WbplxrZ4=" on_success: change on_failure: always diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index c67fd9fc33..2028d4870b 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -404,6 +404,17 @@ describe('lib/utils', function () { utils.lookupFiles('/tmp', ['js'], false).should.eql([]); }); + it('should accept a glob "path" value', function () { + utils.lookupFiles('/tmp/mocha-utils*', ['js'], false) + .should + .containEql('/tmp/mocha-utils-link.js') + .and + .containEql('/tmp/mocha-utils.js') + .and + .have + .lengthOf(2); + }); + afterEach(function () { ['/tmp/mocha-utils.js', '/tmp/mocha-utils-link.js', '/tmp/bob'].forEach(function (path) { try { From 5e1439d13b9097f6c33b25f6af4e25ffda09611a Mon Sep 17 00:00:00 2001 From: Sergio Santoro Date: Fri, 13 May 2016 12:25:41 +0200 Subject: [PATCH 0467/1771] Fix JSDoc (#2219) --- lib/browser/events.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/browser/events.js b/lib/browser/events.js index 314016910b..b4342f6202 100644 --- a/lib/browser/events.js +++ b/lib/browser/events.js @@ -5,7 +5,7 @@ exports.EventEmitter = EventEmitter; /** - * Object#hasOwnProperty reference. + * Object#toString reference. */ var objToString = Object.prototype.toString; @@ -14,7 +14,7 @@ var objToString = Object.prototype.toString; * * @api private * @param {*} val The value to test. - * @return {boolean} true if the value is a boolean, otherwise false. + * @return {boolean} true if the value is an array, otherwise false. */ function isArray(val) { return objToString.call(val) === '[object Array]'; From b76989ceb8ca38b4ad9a2df4892581d96e8c4ba8 Mon Sep 17 00:00:00 2001 From: Adrian Ludwig Date: Fri, 13 May 2016 20:21:06 +0200 Subject: [PATCH 0468/1771] Add --icu-data-dir flag for node (#2248) --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 9004ca763b..ad4ed40373 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -83,6 +83,7 @@ program .option('--globals ', 'allow the given comma-delimited global [names]', list, []) .option('--es_staging', 'enable all staged features') .option('--harmony<_classes,_generators,...>', 'all node --harmony* flags are available') + .option('--icu-data-dir', 'include ICU data') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') .option('--no-deprecation', 'silence deprecation warnings') diff --git a/bin/mocha b/bin/mocha index 3a392379d0..f6606e49b5 100755 --- a/bin/mocha +++ b/bin/mocha @@ -48,6 +48,7 @@ process.argv.slice(2).forEach(function(arg){ default: if (0 == arg.indexOf('--harmony')) args.unshift(arg); else if (0 == arg.indexOf('--trace')) args.unshift(arg); + else if (0 == arg.indexOf('--icu-data-dir')) args.unshift(arg); else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg); else args.push(arg); break; From fafd99164a9f0e1f070bb9a3189d0863ee847194 Mon Sep 17 00:00:00 2001 From: Anders Olsen Sandvik Date: Sun, 22 May 2016 13:13:07 +0200 Subject: [PATCH 0469/1771] Consistant formatting in examples It seems that in most examples the parenthesis are right after then function name without whitespace but in this example there is whitespace. --- index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index e9a52fa184..d033b52bb3 100644 --- a/index.md +++ b/index.md @@ -169,8 +169,8 @@ In your editor: ```js var assert = require('chai').assert; describe('Array', function() { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { assert.equal(-1, [1,2,3].indexOf(5)); assert.equal(-1, [1,2,3].indexOf(0)); }); From c04c1d73b30979d04d94398309ee47643ede0af4 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 23 May 2016 07:01:41 +0200 Subject: [PATCH 0470/1771] Make CI run browser tests (#2231) * Initial prep for browser tests in CI - :arrow_up: browserify@13.0.0 Some fixes that we didn't have were required. - :bug: Fix browser not being able to require describe/it `support/browser-entry.js` was removing the listener that is in charge of keeping `Mocha.describe/it/suite` etc up-to-date. That listener is now added everytime a `ui` is set up. - Correct isatty for browser * Travis + SauceLabs + Karma setup (first pass) - add sauce connect - prepare to use karma on saucelabs; fix potential windows problems - rewrite `scripts/ensure-compatible-npm.sh` in JS - detect travis node 0.8 env; just upgrade if found - symlink `mocha` to itself for `karma-mocha` - if explicit `--production` flag is present, skip this - don't know how to skip this part if `mocha` is a devDep of some other package - use phantomjs@1.9.19; don't try to install npm@3 - browser tests with karma & phantom - move `support/browser-entry.js` to `browser-entry.js` to keep paths sane - `karma.conf.js` loads data out of `.karma.conf.js` - we have a "main" browser suite - then we have suites for each interface - each suite is a single run of Karma - each suite is executed by the `Makefile` - build `./mocha.js` upon test execution for `karma-mocha` to use - bonus: 3rd-party browserification should theoretically now be possible as per the `./index.js` entry in `package.json`'s `browser` field - add dev deps for karma - test changes: - split `lookupFiles` test into its own file so we can ignore it in Karma - fix broken `test/acceptance/throw.js` for browser - fix `test/acceptance/utils.js`'s `type` tests for PhantomJS - try to reduce build matrix - fix missing targets - fix infinite loop in Makefile - downgrade phantomjs to 1.9.8 - remove some cruft from karma config; try to add sauce labs - try again w/ the saucelabs - typo - remove karma-source-map-support as it's a no-go on IE8 - Require up-to-date mocha.js for any browser tests - Make CI rebuild mocha.js. Make won't rebuild when just checked out by CI because timestamps on source and mocha.js are the same. We could use a script to set the timestamps to the commit time, but it still wouldn't work if mocha.js were committed along with other changes that hadn't been built into it. Which shouldn't happen anyway -- but then again, the point of CI is to see what commits change, it's usually going to need to rebuild mocha.js if it's working right, so it's not going to hurt much to rebuild it every time even on the few times it doesn't need to. * fix IE8 compatibility for browser tests - Avoid `Array.prototype.map` in test - Workaround for missing `Object.create` - Use a shim for `Date.prototype.toISOString` - Use simple number math instead of array indexing for interface tests - Use `expect` instead of `should` - Avoid builtin function in stringify test (A quick check revealed that stringify does not treat toString specially anyway, and IE8 ignores the toString assigned to the object, so use a different property name) - Use `karma-expect` for automatic browser tests - Remove `karma-should` * Travis + SauceLabs + Karma setup (second pass) - add note about exporting `global` in `browser-entry.js` - remove too-short timeout for "throw" unit tests (because SauceLabs) - revert modification to `isatty()` function of `lib/browser/tty.js` - switch reporter to `karma-spec-reporter` - use custom `karma-no-mocha` package - fixtures in `test/browser-fixtures/` - use single `karma.conf.js` --- .travis.yml | 37 +- CHANGELOG.md | 8 + Makefile | 50 +- support/browser-entry.js => browser-entry.js | 7 +- karma.conf.js | 97 + lib/mocha.js | 33 +- lib/utils.js | 10 +- mocha.js | 8967 +++++++++--------- package.json | 23 +- scripts/ensure-compatible-npm.sh | 13 - scripts/upgrade-npm.js | 21 + test/acceptance/context.js | 18 +- test/acceptance/http.js | 2 +- test/acceptance/interfaces/bdd.js | 36 +- test/acceptance/interfaces/exports.js | 12 +- test/acceptance/interfaces/qunit.js | 18 +- test/acceptance/interfaces/tdd.js | 33 +- test/acceptance/lookup-files.js | 56 + test/acceptance/misc/only/bdd.js | 6 +- test/acceptance/misc/only/tdd.js | 6 +- test/acceptance/require/require.js | 8 +- test/acceptance/root.js | 2 +- test/acceptance/test.coffee | 2 +- test/acceptance/throw.js | 37 +- test/acceptance/utils.js | 240 +- test/browser-fixtures/bdd.js | 4 + test/browser-fixtures/exports.js | 4 + test/browser-fixtures/qunit.js | 4 + test/browser-fixtures/tdd.js | 4 + test/fixture-expect.js | 1 + test/mocha.opts | 1 + 31 files changed, 5143 insertions(+), 4617 deletions(-) rename support/browser-entry.js => browser-entry.js (93%) create mode 100644 karma.conf.js delete mode 100755 scripts/ensure-compatible-npm.sh create mode 100644 scripts/upgrade-npm.js create mode 100644 test/acceptance/lookup-files.js create mode 100644 test/browser-fixtures/bdd.js create mode 100644 test/browser-fixtures/exports.js create mode 100644 test/browser-fixtures/qunit.js create mode 100644 test/browser-fixtures/tdd.js create mode 100644 test/fixture-expect.js diff --git a/.travis.yml b/.travis.yml index ffd19c6b50..9101c6ea02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,22 +8,37 @@ dist: trusty language: node_js -node_js: - - '6' - - '5' - - '4' - - 'iojs' - - '0.12' - - '0.11' - - '0.10' - - '0.8' +matrix: + include: + - node_js: '6' + env: TARGET="clean lint test-node test-browser" + - node_js: '5' + env: TARGET=test-node + - node_js: '4' + env: TARGET=test-node + - node_js: 'iojs' + env: TARGET=test-node + - node_js: '0.12' + env: TARGET=test-node + - node_js: '0.11' + env: TARGET=test-node + - node_js: '0.10' + env: TARGET=test-node + - node_js: '0.8' + env: TARGET=test-node before_install: # node 0.8 won't install our dev deps with an out-of-box npm; # this upgrades it - - ./scripts/ensure-compatible-npm.sh + - node ./scripts/upgrade-npm.js -script: travis_retry npm test +script: travis_retry make $TARGET + +addons: + sauce_connect: + username: mochajs + access_key: + secure: R0HXKtR6F2iDEnItv57BTRyL64XfyIlyyluPLK8G33O/InaQjT3KxGuxevz3nVYIqqnI1MPjYodXcQaqrBOLUVmA2vhBeMHB2OwGc9GAL+HBtB1fh+bQJelkl/XMcTTbC5LIZ6nZjmFnkmjqT3AmUhdDRISgieIFeVY4x48LfiU= notifications: urls: diff --git a/CHANGELOG.md b/CHANGELOG.md index 199deaf47b..a644e93a9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +Unreleased +================== + +* [#2079], [#2231] - Add browser to CI + +[#2079]: https://github.com/mochajs/mocha/issues/2079 +[#2231]: https://github.com/mochajs/mocha/pull/2231 + 2.4.5 / 2016-01-28 ================== diff --git a/Makefile b/Makefile index 28e6c87f6f..2288ae862e 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,18 @@ BROWSERIFY := node_modules/.bin/browserify ESLINT := node_modules/.bin/eslint +KARMA := node_modules/.bin/karma REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle SRC = $(shell find lib -name "*.js" -type f | sort) +TESTS = $(shell find test -name "*.js" -type f | sort) SUPPORT = $(wildcard support/*.js) all: mocha.js mocha.js: $(SRC) $(SUPPORT) - @$(BROWSERIFY) ./support/browser-entry \ + @printf "==> [Browser :: build]\n" + @$(BROWSERIFY) ./browser-entry \ --ignore 'fs' \ --ignore 'glob' \ --ignore 'jade' \ @@ -18,29 +21,53 @@ mocha.js: $(SRC) $(SUPPORT) --exclude './lib-cov/mocha' > $@ clean: + @printf "==> [Clean]\n" rm -f mocha.js rm -rf test-outputs - rm -fr lib-cov + rm -rf lib-cov rm -f coverage.html test-cov: lib-cov + @printf "==> [Test :: Coverage]\n" @COV=1 $(MAKE) test REPORTER=html-cov > coverage.html lib-cov: + @printf "==> [Coverage]\n" @rm -fr ./$@ @jscoverage lib $@ lint: + @printf "==> [Test :: Lint]\n" @$(ESLINT) $(SRC) -test: lint test-unit +test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only -test-all: lint test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only +test-browser: test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports + +test: lint test-node test-browser + +test-browser-unit: mocha.js + @printf "==> [Test :: Browser]\n" + @NODE_PATH=. $(KARMA) start + +test-browser-bdd: + @printf "==> [Test :: Browser :: BDD]\n" + @MOCHA_UI=bdd $(MAKE) test-browser-unit + +test-browser-qunit: + @printf "==> [Test :: Browser :: QUnit]\n" + @MOCHA_UI=qunit $(MAKE) test-browser-unit + +test-browser-tdd: + @printf "==> [Test :: Browser :: TDD]\n" + @MOCHA_UI=tdd $(MAKE) test-browser-unit test-jsapi: + @printf "==> [Test :: JS API]\n" @node test/jsapi test-unit: + @printf "==> [Test :: Unit]\n" @./bin/mocha \ --reporter $(REPORTER) \ test/acceptance/*.js \ @@ -48,11 +75,13 @@ test-unit: test/*.js test-integration: + @printf "==> [Test :: Integrations]\n" @./bin/mocha \ --reporter $(REPORTER) \ test/integration/*.js test-compilers: + @printf "==> [Test :: Compilers]\n" @./bin/mocha \ --reporter $(REPORTER) \ --compilers coffee:coffee-script/register,foo:./test/compiler/foo \ @@ -60,6 +89,7 @@ test-compilers: test/acceptance/test.foo test-requires: + @printf "==> [Test :: Requires]\n" @./bin/mocha \ --reporter $(REPORTER) \ --compilers coffee:coffee-script/register \ @@ -70,38 +100,45 @@ test-requires: test/acceptance/require/require.js test-bdd: + @printf "==> [Test :: BDD]\n" @./bin/mocha \ --reporter $(REPORTER) \ --ui bdd \ test/acceptance/interfaces/bdd test-tdd: + @printf "==> [Test :: TDD]\n" @./bin/mocha \ --reporter $(REPORTER) \ --ui tdd \ test/acceptance/interfaces/tdd test-qunit: + @printf "==> [Test :: QUnit]\n" @./bin/mocha \ --reporter $(REPORTER) \ --ui qunit \ test/acceptance/interfaces/qunit test-exports: + @printf "==> [Test :: Exports]\n" @./bin/mocha \ --reporter $(REPORTER) \ --ui exports \ test/acceptance/interfaces/exports test-glob: + @printf "==> [Test :: Glob]\n" @./test/acceptance/glob/glob.sh test-reporters: + @printf "==> [Test :: Reporters]\n" @./bin/mocha \ --reporter $(REPORTER) \ test/reporters/*.js test-only: + @printf "==> [Test :: Only]\n" @./bin/mocha \ --reporter $(REPORTER) \ --ui tdd \ @@ -123,11 +160,13 @@ test-only: test/acceptance/misc/only/qunit test-mocha: + @printf "==> [Test :: Mocha]\n" @./bin/mocha \ --reporter $(REPORTER) \ test/mocha non-tty: + @printf "==> [Test :: Non-TTY]\n" @./bin/mocha \ --reporter dot \ test/acceptance/interfaces/bdd 2>&1 > /tmp/dot.out @@ -150,6 +189,7 @@ non-tty: @cat /tmp/spec.out tm: + @printf "==> [TM]\n" @open editors/$(TM_BUNDLE) -.PHONY: test-cov test-jsapi test-compilers watch test test-all test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean +.PHONY: test-cov test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint diff --git a/support/browser-entry.js b/browser-entry.js similarity index 93% rename from support/browser-entry.js rename to browser-entry.js index 8fe9f7828f..27ea71f514 100644 --- a/support/browser-entry.js +++ b/browser-entry.js @@ -4,7 +4,7 @@ process.stdout = require('browser-stdout')(); -var Mocha = require('../'); +var Mocha = require('./lib/mocha'); /** * Create a Mocha instance. @@ -159,3 +159,8 @@ Mocha.process = process; global.Mocha = Mocha; global.mocha = mocha; + +// this allows test/acceptance/required-tokens.js to pass; thus, +// you can now do `const describe = require('mocha').describe` in a +// browser context (assuming browserification). should fix #880 +module.exports = global; diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000000..c1a9ffd7f1 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,97 @@ +'use strict'; + +module.exports = function(config) { + var cfg = { + frameworks: [ + 'browserify', + 'expect', + 'mocha' + ], + files: [ + 'test/browser-fixtures/bdd.js', + 'test/acceptance/*.js' + ], + exclude: [ + 'test/acceptance/http.js', + 'test/acceptance/fs.js', + 'test/acceptance/lookup-files.js', + 'test/acceptance/require/**/*.js', + 'test/acceptance/misc/**/*.js' + ], + preprocessors: { + 'test/**/*.js': ['browserify'] + }, + browserify: { + debug: true, + configure: function configure(b) { + b.ignore('glob') + .ignore('jade') + .ignore('supports-color') + .exclude('./lib-cov/mocha'); + } + }, + reporters: ['spec'], + colors: true, + browsers: ['PhantomJS'], + logLevel: config.LOG_INFO, + singleRun: true + }; + + // see https://github.com/saucelabs/karma-sauce-example + // TO RUN LOCALLY: + // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and + // SAUCE_ACCESS_KEY env vars. + if (process.env.CI) { + if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { + throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + + 'environment variables!'); + } + cfg.reporters.push('saucelabs'); + cfg.browsers.push('ie8'); + cfg.customLaunchers = { + ie8: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows XP', + version: '8.0' + } + }; + + cfg.sauceLabs = { + public: 'public' + }; + + if (process.env.TRAVIS) { + // correlate build/tunnel with Travis + cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + + ' (' + process.env.TRAVIS_BUILD_ID + ')'; + cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; + cfg.sauceLabs.startConnect = false; + } else { + // otherwise just make something up + cfg.sauceLabs.build = require('os').hostname() + ' (' + Date.now() + ')'; + } + + // for slow browser booting, ostensibly + cfg.captureTimeout = 120000; + } + + // the MOCHA_UI env var will determine if we're running interface-specific + // tets. since you can only load one at a time, each must be run separately. + // each has its own set of acceptance tests and a fixture. + // the "bdd" fixture is used by default. + var ui = process.env.MOCHA_UI; + if (ui) { + if (cfg.sauceLabs) { + cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests'; + } + cfg.files = [ + 'test/browser-fixtures/' + ui + '.js', + 'test/acceptance/interfaces/' + ui + '.js' + ]; + } else if (cfg.sauceLabs) { + cfg.sauceLabs.testName = 'Unit Tests'; + } + + config.set(cfg); +}; diff --git a/lib/mocha.js b/lib/mocha.js index fc493d2d25..46775ab55c 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -99,22 +99,6 @@ function Mocha(options) { if (options.slow) { this.slow(options.slow); } - - this.suite.on('pre-require', function(context) { - exports.afterEach = context.afterEach || context.teardown; - exports.after = context.after || context.suiteTeardown; - exports.beforeEach = context.beforeEach || context.setup; - exports.before = context.before || context.suiteSetup; - exports.describe = context.describe || context.suite; - exports.it = context.it || context.test; - exports.setup = context.setup || context.beforeEach; - exports.suiteSetup = context.suiteSetup || context.before; - exports.suiteTeardown = context.suiteTeardown || context.after; - exports.suite = context.suite || context.describe; - exports.teardown = context.teardown || context.afterEach; - exports.test = context.test || context.it; - exports.run = context.run; - }); } /** @@ -202,6 +186,23 @@ Mocha.prototype.ui = function(name) { } } this._ui = this._ui(this.suite); + + this.suite.on('pre-require', function(context) { + exports.afterEach = context.afterEach || context.teardown; + exports.after = context.after || context.suiteTeardown; + exports.beforeEach = context.beforeEach || context.setup; + exports.before = context.before || context.suiteSetup; + exports.describe = context.describe || context.suite; + exports.it = context.it || context.test; + exports.setup = context.setup || context.beforeEach; + exports.suiteSetup = context.suiteSetup || context.before; + exports.suiteTeardown = context.suiteTeardown || context.after; + exports.suite = context.suite || context.describe; + exports.teardown = context.teardown || context.afterEach; + exports.test = context.test || context.it; + exports.run = context.run; + }); + return this; }; diff --git a/lib/utils.js b/lib/utils.js index 1ec27085fd..e5d214021c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -12,6 +12,7 @@ var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; +var toISOString = require('to-iso-string'); /** * Ignored directories. @@ -479,9 +480,12 @@ function jsonStringify(object, spaces, depth) { : val.toString(); break; case 'date': - var sDate = isNaN(val.getTime()) // Invalid date - ? val.toString() - : val.toISOString(); + var sDate; + if (isNaN(val.getTime())) { // Invalid date + sDate = val.toString(); + } else { + sDate = val.toISOString ? val.toISOString() : toISOString(val); + } val = '[Date: ' + sDate + ']'; break; case 'buffer': diff --git a/mocha.js b/mocha.js index 19561978eb..9d98db7101 100644 --- a/mocha.js +++ b/mocha.js @@ -1,11 +1,171 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o

              %e%ems

              ', test.speed, test.title, test.duration, url); - } else if (test.pending) { + } else if (test.isPending()) { el = fragment('
            • %e

            • ', test.title); } else { el = fragment('
            • %e

            • ', test.title, self.testURL(test)); @@ -2508,7 +2669,7 @@ function HTML(runner) { // toggle code // TODO: defer - if (!test.pending) { + if (!test.isPending()) { var h2 = el.getElementsByTagName('h2')[0]; on(h2, 'click', function() { @@ -2644,7 +2805,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":68}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":47}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2820,7 +2981,7 @@ function clean(test) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":51}],24:[function(require,module,exports){ +},{"./base":17,"_process":57}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2884,7 +3045,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":51}],25:[function(require,module,exports){ +},{"./base":17,"_process":57}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2978,7 +3139,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":51}],26:[function(require,module,exports){ +},{"./base":17,"_process":57}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3074,7 +3235,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],27:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3139,7 +3300,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],28:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3240,7 +3401,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],29:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3280,7 +3441,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],30:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3545,7 +3706,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],31:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3638,7 +3799,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":51}],32:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57}],32:[function(require,module,exports){ /** * Module dependencies. */ @@ -3928,7 +4089,7 @@ XUnit.prototype.test = function(test) { if (test.state === 'failed') { var err = test.err; this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\n' + err.stack)))); - } else if (test.pending) { + } else if (test.isPending()) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { this.write(tag('testcase', attrs, true)); @@ -3971,7 +4132,7 @@ function cdata(str) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":39,"./base":17,"_process":51,"fs":41,"mkdirp":70,"path":41}],35:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":57,"fs":43,"mkdirp":54,"path":43}],35:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -4020,6 +4181,7 @@ module.exports = Runnable; function Runnable(title, fn) { this.title = title; this.fn = fn; + this.body = (fn || '').toString(); this.async = fn && fn.length; this.sync = !this.async; this._timeout = 2000; @@ -4029,6 +4191,7 @@ function Runnable(title, fn) { this._trace = new Error('done() called multiple times'); this._retries = -1; this._currentRetry = 0; + this.pending = false; } /** @@ -4099,12 +4262,21 @@ Runnable.prototype.enableTimeouts = function(enabled) { /** * Halt and mark as pending. * - * @api private + * @api public */ Runnable.prototype.skip = function() { throw new Pending(); }; +/** + * Check if this runnable or its parent suite is marked as pending. + * + * @api private + */ +Runnable.prototype.isPending = function() { + return this.pending || (this.parent && this.parent.isPending()); +}; + /** * Set number of retries. * @@ -4277,7 +4449,7 @@ Runnable.prototype.run = function(fn) { // sync or promise-returning try { - if (this.pending) { + if (this.isPending()) { done(); } else { callFn(this.fn); @@ -4838,12 +5010,7 @@ Runner.prototype.runTests = function(suite, fn) { return; } - function parentPending(suite) { - return suite.pending || (suite.parent && parentPending(suite.parent)); - } - - // pending - if (test.pending || parentPending(test.parent)) { + if (test.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); @@ -4852,7 +5019,7 @@ Runner.prototype.runTests = function(suite, fn) { // execute test and hook(s) self.emit('test', self.test = test); self.hookDown('beforeEach', function(err, errSuite) { - if (suite.pending) { + if (suite.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); @@ -5230,7 +5397,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":35,"./utils":39,"_process":51,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":35,"./utils":39,"_process":57,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -5261,9 +5428,6 @@ exports = module.exports = Suite; exports.create = function(parent, title) { var suite = new Suite(title, parent.ctx); suite.parent = parent; - if (parent.pending) { - suite.pending = true; - } title = suite.fullTitle(); parent.addSuite(suite); return suite; @@ -5409,6 +5573,15 @@ Suite.prototype.bail = function(bail) { return this; }; +/** + * Check if this suite or its parent suite is marked as pending. + * + * @api private + */ +Suite.prototype.isPending = function() { + return this.pending || (this.parent && this.parent.isPending()); +}; + /** * Run `fn(test[, done])` before running tests. * @@ -5418,7 +5591,7 @@ Suite.prototype.bail = function(bail) { * @return {Suite} for chaining */ Suite.prototype.beforeAll = function(title, fn) { - if (this.pending) { + if (this.isPending()) { return this; } if (typeof title === 'function') { @@ -5448,7 +5621,7 @@ Suite.prototype.beforeAll = function(title, fn) { * @return {Suite} for chaining */ Suite.prototype.afterAll = function(title, fn) { - if (this.pending) { + if (this.isPending()) { return this; } if (typeof title === 'function') { @@ -5478,7 +5651,7 @@ Suite.prototype.afterAll = function(title, fn) { * @return {Suite} for chaining */ Suite.prototype.beforeEach = function(title, fn) { - if (this.pending) { + if (this.isPending()) { return this; } if (typeof title === 'function') { @@ -5508,7 +5681,7 @@ Suite.prototype.beforeEach = function(title, fn) { * @return {Suite} for chaining */ Suite.prototype.afterEach = function(title, fn) { - if (this.pending) { + if (this.isPending()) { return this; } if (typeof title === 'function') { @@ -5646,7 +5819,6 @@ function Test(title, fn) { Runnable.call(this, title, fn); this.pending = !fn; this.type = 'test'; - this.body = (fn || '').toString(); } /** @@ -5684,6 +5856,7 @@ var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; +var toISOString = require('to-iso-string'); /** * Ignored directories. @@ -6126,7 +6299,7 @@ function jsonStringify(object, spaces, depth) { var space = spaces * depth; var str = isArray(object) ? '[' : '{'; var end = isArray(object) ? ']' : '}'; - var length = object.length || exports.keys(object).length; + var length = typeof object.length === 'number' ? object.length : exports.keys(object).length; // `.repeat()` polyfill function repeat(s, n) { return new Array(n).join(s); @@ -6144,15 +6317,19 @@ function jsonStringify(object, spaces, depth) { break; case 'boolean': case 'regexp': + case 'symbol': case 'number': val = val === 0 && (1 / val) === -Infinity // `-0` ? '-0' : val.toString(); break; case 'date': - var sDate = isNaN(val.getTime()) // Invalid date - ? val.toString() - : val.toISOString(); + var sDate; + if (isNaN(val.getTime())) { // Invalid date + sDate = val.toString(); + } else { + sDate = val.toISOString ? val.toISOString() : toISOString(val); + } val = '[Date: ' + sDate + ']'; break; case 'buffer': @@ -6170,7 +6347,7 @@ function jsonStringify(object, spaces, depth) { } for (var i in object) { - if (!object.hasOwnProperty(i)) { + if (!Object.prototype.hasOwnProperty.call(object, i)) { continue; // not my business } --length; @@ -6269,6 +6446,7 @@ exports.canonicalize = function(value, stack) { case 'number': case 'regexp': case 'boolean': + case 'symbol': canonicalizedObj = value; break; default: @@ -6403,7 +6581,11 @@ exports.stackTraceFilter = function() { } // Clean up cwd(absolute) - list.push(line.replace(cwd, '')); + if (/\(?.+:\d+:\d+\)?$/.test(line)) { + line = line.replace(cwd, ''); + } + + list.push(line); return list; }, []); @@ -6412,57 +6594,169 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":51,"buffer":43,"debug":2,"fs":41,"glob":41,"path":41,"util":66}],40:[function(require,module,exports){ -(function (process){ -var WritableStream = require('stream').Writable -var inherits = require('util').inherits - -module.exports = BrowserStdout +},{"_process":57,"buffer":44,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":70,"util":73}],40:[function(require,module,exports){ +'use strict' +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray -inherits(BrowserStdout, WritableStream) +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array -function BrowserStdout(opts) { - if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) +function init () { + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i + } - opts = opts || {} - WritableStream.call(this, opts) - this.label = (opts.label !== undefined) ? opts.label : 'stdout' + revLookup['-'.charCodeAt(0)] = 62 + revLookup['_'.charCodeAt(0)] = 63 } -BrowserStdout.prototype._write = function(chunks, encoding, cb) { - var output = chunks.toString ? chunks.toString() : chunks - if (this.label === false) { - console.log(output) - } else { - console.log(this.label+':', output) +init() + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') } - process.nextTick(cb) -} -}).call(this,require('_process')) -},{"_process":51,"stream":63,"util":66}],41:[function(require,module,exports){ + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -},{}],42:[function(require,module,exports){ -arguments[4][41][0].apply(exports,arguments) -},{"dup":41}],43:[function(require,module,exports){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],41:[function(require,module,exports){ + +},{}],42:[function(require,module,exports){ +(function (process){ +var WritableStream = require('stream').Writable +var inherits = require('util').inherits + +module.exports = BrowserStdout + + +inherits(BrowserStdout, WritableStream) + +function BrowserStdout(opts) { + if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) + + opts = opts || {} + WritableStream.call(this, opts) + this.label = (opts.label !== undefined) ? opts.label : 'stdout' +} + +BrowserStdout.prototype._write = function(chunks, encoding, cb) { + var output = chunks.toString ? chunks.toString() : chunks + if (this.label === false) { + console.log(output) + } else { + console.log(this.label+':', output) + } + process.nextTick(cb) +} + +}).call(this,require('_process')) +},{"_process":57,"stream":68,"util":73}],43:[function(require,module,exports){ +arguments[4][41][0].apply(exports,arguments) +},{"dup":41}],44:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT */ +/* eslint-disable no-proto */ + +'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') -var isArray = require('is-array') +var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var rootParent = {} /** * If `Buffer.TYPED_ARRAY_SUPPORT`: @@ -6480,9 +6774,6 @@ var rootParent = {} * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * - * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property - * on objects. - * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of @@ -6491,20 +6782,26 @@ var rootParent = {} * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { - function Bar () {} +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +/* + * Export kMaxLength after typed array support is determined. + */ +exports.kMaxLength = kMaxLength() + +function typedArraySupport () { try { var arr = new Uint8Array(1) arr.foo = function () { return 42 } - arr.constructor = Bar return arr.foo() === 42 && // typed array instances can be augmented - arr.constructor === Bar && // constructor can be set typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } -})() +} function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT @@ -6512,168 +6809,236 @@ function kMaxLength () { : 0x3fffffff } +function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length) + } + that.length = length + } + + return that +} + /** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. + * The `Uint8Array` prototype remains unmodified. */ -function Buffer (arg) { - if (!(this instanceof Buffer)) { - // Avoid going through an ArgumentsAdaptorTrampoline in the common case. - if (arguments.length > 1) return new Buffer(arg, arguments[1]) - return new Buffer(arg) - } - this.length = 0 - this.parent = undefined +function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } // Common case. if (typeof arg === 'number') { - return fromNumber(this, arg) + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) } + return from(this, arg, encodingOrOffset, length) +} - // Slightly less common case. - if (typeof arg === 'string') { - return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') - } +Buffer.poolSize = 8192 // not used by this implementation - // Unusual. - return fromObject(this, arg) +// TODO: Legacy, not needed anymore. Remove in next major version. +Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype + return arr } -function fromNumber (that, length) { - that = allocate(that, length < 0 ? 0 : checked(length) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < length; i++) { - that[i] = 0 - } +function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') } - return that -} -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } - // Assumption: byteLength() return value is always < kMaxLength. - var length = byteLength(string, encoding) | 0 - that = allocate(that, length) + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } - that.write(string, encoding) - return that + return fromObject(that, value) } -function fromObject (that, object) { - if (Buffer.isBuffer(object)) return fromBuffer(that, object) - - if (isArray(object)) return fromArray(that, object) +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) +} - if (object == null) { - throw new TypeError('must start with number, buffer, array or string') +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array + if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true + }) } +} - if (typeof ArrayBuffer !== 'undefined') { - if (object.buffer instanceof ArrayBuffer) { - return fromTypedArray(that, object) - } - if (object instanceof ArrayBuffer) { - return fromArrayBuffer(that, object) - } +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') } +} - if (object.length) return fromArrayLike(that, object) - - return fromJsonObject(that, object) +function alloc (that, size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) } -function fromBuffer (that, buffer) { - var length = checked(buffer.length) | 0 - that = allocate(that, length) - buffer.copy(that, 0, 0, length) - return that +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) } -function fromArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 +function allocUnsafe (that, size) { + assertSize(size) + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; i++) { + that[i] = 0 + } } return that } -// Duplicate of fromArray() to keep fromArray() monomorphic. -function fromTypedArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - // Truncating the elements is probably not what people expect from typed - // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior - // of the old Buffer constructor. - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) } -function fromArrayBuffer (that, array) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - array.byteLength - that = Buffer._augment(new Uint8Array(array)) - } else { - // Fallback: Return an object instance of the Buffer class - that = fromTypedArray(that, new Uint8Array(array)) +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') } + + var length = byteLength(string, encoding) | 0 + that = createBuffer(that, length) + + that.write(string, encoding) return that } function fromArrayLike (that, array) { var length = checked(array.length) | 0 - that = allocate(that, length) + that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } -// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. -// Returns a zero-length buffer for inputs that don't conform to the spec. -function fromJsonObject (that, object) { - var array - var length = 0 +function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength // this throws if `array` is not a valid ArrayBuffer - if (object.type === 'Buffer' && isArray(object.data)) { - array = object.data - length = checked(array.length) | 0 + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') } - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (length === undefined) { + array = new Uint8Array(array, byteOffset) + } else { + array = new Uint8Array(array, byteOffset, length) } - return that -} -function allocate (that, length) { if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance - that = Buffer._augment(new Uint8Array(length)) + that = array + that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class - that.length = length - that._isBuffer = true + that = fromArrayLike(that, array) + } + return that +} + +function fromObject (that, obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + that = createBuffer(that, len) + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len) + return that } - var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 - if (fromPool) that.parent = rootParent + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } - return that + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { @@ -6686,12 +7051,11 @@ function checked (length) { return length | 0 } -function SlowBuffer (subject, encoding) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) - - var buf = new Buffer(subject, encoding) - delete buf.parent - return buf +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { @@ -6708,17 +7072,12 @@ Buffer.compare = function compare (a, b) { var x = a.length var y = b.length - var i = 0 - var len = Math.min(x, y) - while (i < len) { - if (a[i] !== b[i]) break - - ++i - } - - if (i !== len) { - x = a[i] - y = b[i] + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } } if (x < y) return -1 @@ -6746,10 +7105,12 @@ Buffer.isEncoding = function isEncoding (encoding) { } Buffer.concat = function concat (list, length) { - if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } if (list.length === 0) { - return new Buffer(0) + return Buffer.alloc(0) } var i @@ -6760,18 +7121,30 @@ Buffer.concat = function concat (list, length) { } } - var buf = new Buffer(length) + var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length + var buf = list[i] + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length } - return buf + return buffer } function byteLength (string, encoding) { - if (typeof string !== 'string') string = '' + string + if (Buffer.isBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string + } var len = string.length if (len === 0) return 0 @@ -6788,6 +7161,7 @@ function byteLength (string, encoding) { return len case 'utf8': case 'utf-8': + case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': @@ -6807,20 +7181,42 @@ function byteLength (string, encoding) { } Buffer.byteLength = byteLength -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - function slowToString (encoding, start, end) { var loweredCase = false - start = start | 0 - end = end === undefined || end === Infinity ? this.length : end | 0 + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' while (true) { switch (encoding) { @@ -6854,6 +7250,39 @@ function slowToString (encoding, start, end) { } } +// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect +// Buffer instances. +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' @@ -6877,15 +7306,114 @@ Buffer.prototype.inspect = function inspect () { return '' } -Buffer.prototype.compare = function compare (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!Buffer.isBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +function arrayIndexOf (arr, val, byteOffset, encoding) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var foundIndex = -1 + for (var i = 0; byteOffset + i < arrLength; i++) { + if (read(arr, byteOffset + i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return (byteOffset + foundIndex) * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + return -1 } -Buffer.prototype.indexOf = function indexOf (val, byteOffset) { - if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff - else if (byteOffset < -0x80000000) byteOffset = -0x80000000 +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } byteOffset >>= 0 if (this.length === 0) return -1 @@ -6895,45 +7423,28 @@ Buffer.prototype.indexOf = function indexOf (val, byteOffset) { if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) if (typeof val === 'string') { - if (val.length === 0) return -1 // special case: looking for empty string always fails - return String.prototype.indexOf.call(this, val, byteOffset) + val = Buffer.from(val, encoding) } + if (Buffer.isBuffer(val)) { - return arrayIndexOf(this, val, byteOffset) + // special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(this, val, byteOffset, encoding) } if (typeof val === 'number') { if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { return Uint8Array.prototype.indexOf.call(this, val, byteOffset) } - return arrayIndexOf(this, [ val ], byteOffset) - } - - function arrayIndexOf (arr, val, byteOffset) { - var foundIndex = -1 - for (var i = 0; byteOffset + i < arr.length; i++) { - if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex - } else { - foundIndex = -1 - } - } - return -1 + return arrayIndexOf(this, [ val ], byteOffset, encoding) } throw new TypeError('val must be string, number or Buffer') } -// `get` is deprecated -Buffer.prototype.get = function get (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) -} - -// `set` is deprecated -Buffer.prototype.set = function set (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 } function hexWrite (buf, string, offset, length) { @@ -6957,7 +7468,7 @@ function hexWrite (buf, string, offset, length) { } for (var i = 0; i < length; i++) { var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) throw new Error('Invalid hex string') + if (isNaN(parsed)) return i buf[offset + i] = parsed } return i @@ -7006,17 +7517,16 @@ Buffer.prototype.write = function write (string, offset, length, encoding) { } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { - var swap = encoding - encoding = offset - offset = length | 0 - length = swap + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('attempt to write outside buffer bounds') + throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' @@ -7231,7 +7741,8 @@ Buffer.prototype.slice = function slice (start, end) { var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) + newBuf = this.subarray(start, end) + newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) @@ -7240,8 +7751,6 @@ Buffer.prototype.slice = function slice (start, end) { } } - if (newBuf.length) newBuf.parent = this.parent || this - return newBuf } @@ -7410,16 +7919,19 @@ Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { } function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } var mul = 1 var i = 0 @@ -7435,7 +7947,10 @@ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, value = +value offset = offset | 0 byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } var i = byteLength - 1 var mul = 1 @@ -7452,7 +7967,7 @@ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } @@ -7469,7 +7984,7 @@ Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) @@ -7483,7 +7998,7 @@ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value + this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } @@ -7505,7 +8020,7 @@ Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) - this[offset] = value + this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } @@ -7520,7 +8035,7 @@ Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value + this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } @@ -7538,9 +8053,12 @@ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, no var i = 0 var mul = 1 - var sub = value < 0 ? 1 : 0 + var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } @@ -7558,9 +8076,12 @@ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, no var i = byteLength - 1 var mul = 1 - var sub = value < 0 ? 1 : 0 + var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } @@ -7573,7 +8094,7 @@ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 - this[offset] = value + this[offset] = (value & 0xff) return offset + 1 } @@ -7582,7 +8103,7 @@ Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) @@ -7596,7 +8117,7 @@ Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) - this[offset + 1] = value + this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } @@ -7608,7 +8129,7 @@ Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value + this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) @@ -7627,7 +8148,7 @@ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) - this[offset + 3] = value + this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } @@ -7635,9 +8156,8 @@ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) } function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { @@ -7711,134 +8231,82 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) { target[i + targetStart] = this[i + start] } } else { - target._set(this.subarray(start, start + len), targetStart) + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ) } return len } -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function fill (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if (code < 256) { + val = code + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } - if (end < start) throw new RangeError('end < start') + if (end <= start) { + return this + } - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + if (!val) val = 0 var i - if (typeof value === 'number') { + if (typeof val === 'number') { for (i = start; i < end; i++) { - this[i] = value + this[i] = val } } else { - var bytes = utf8ToBytes(value.toString()) + var bytes = Buffer.isBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] + for (i = 0; i < end - start; i++) { + this[i + start] = bytes[i % len] } } return this } -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function toArrayBuffer () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - // HELPER FUNCTIONS // ================ -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function _augment (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array set method before overwriting - arr._set = arr.set - - // deprecated - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.indexOf = BP.indexOf - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { @@ -7902,7 +8370,7 @@ function utf8ToBytes (string, units) { } // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) @@ -7980,254 +8448,13 @@ function blitBuffer (src, dst, offset, length) { return i } -},{"base64-js":44,"ieee754":45,"is-array":46}],44:[function(require,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -;(function (exports) { - 'use strict'; - - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],45:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 +function isnan (val) { + return val !== val // eslint-disable-line no-self-compare } -},{}],46:[function(require,module,exports){ - -/** - * isArray - */ - -var isArray = Array.isArray; - -/** - * toString - */ - -var str = Object.prototype.toString; - -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ - -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; - -},{}],47:[function(require,module,exports){ +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":40,"ieee754":50,"isarray":53}],45:[function(require,module,exports){ +(function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -8249,603 +8476,729 @@ module.exports = isArray || function (val) { // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; -}; +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; - if (!this._events) - this._events = {}; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } - throw TypeError('Uncaught, unspecified "error" event.'); - } - } +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; - handler = this._events[type]; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; - if (isUndefined(handler)) - return false; +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - handler.apply(this, args); - } - } else if (isObject(handler)) { - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; - return true; -}; +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; -EventEmitter.prototype.addListener = function(type, listener) { - var m; +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; - if (!isFunction(listener)) - throw TypeError('listener must be a function'); +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - if (!this._events) - this._events = {}; +exports.isBuffer = Buffer.isBuffer; - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); +function objectToString(o) { + return Object.prototype.toString.call(o); +} - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){ +/* See LICENSE file for terms of use */ - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - var m; - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +(function(global, undefined) { + var objectPrototypeToString = Object.prototype.toString; + + /*istanbul ignore next*/ + function map(arr, mapper, that) { + if (Array.prototype.map) { + return Array.prototype.map.call(arr, mapper, that); } - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); + var other = new Array(arr.length); + + for (var i = 0, n = arr.length; i < n; i++) { + other[i] = mapper.call(that, arr[i], i, arr); + } + return other; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); } } + return ret; } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); - return this; -}; + return n; + } -EventEmitter.prototype.on = EventEmitter.prototype.addListener; + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. + function canonicalize(obj, stack, replacementStack) { + stack = stack || []; + replacementStack = replacementStack || []; -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); + var i; - var fired = false; + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } - function g() { - this.removeListener(type, g); + var canonicalizedObj; - if (!fired) { - fired = true; - listener.apply(this, arguments); + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + key; + for (key in obj) { + sortedKeys.push(key); + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + key = sortedKeys[i]; + canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; } + return canonicalizedObj; } - g.listener = listener; - this.on(type, g); - - return this; -}; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); + function buildValues(components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; - if (!this._events || !this._events[type]) - return this; + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = map(value, function(value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); - list = this._events[type]; - length = list.length; - position = -1; + component.value = value.join(''); + } else { + component.value = newString.slice(newPos, newPos + component.count).join(''); + } + newPos += component.count; - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = oldString.slice(oldPos, oldPos + component.count).join(''); + oldPos += component.count; - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } } } - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } + return components; + } - if (this._events.removeListener) - this.emit('removeListener', type, listener); + function Diff(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; } + Diff.prototype = { + diff: function(oldString, newString, callback) { + var self = this; - return this; -}; + function done(value) { + if (callback) { + setTimeout(function() { callback(undefined, value); }, 0); + return true; + } else { + return value; + } + } -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return done([{ value: newString }]); + } + if (!newString) { + return done([{ value: oldString, removed: true }]); + } + if (!oldString) { + return done([{ value: newString, added: true }]); + } - if (!this._events) - return this; + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{value: newString.join('')}]); + } - listeners = this._events[type]; + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } - return this; -}; + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; -}; + oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); -EventEmitter.listenerCount = function(emitter, type) { - var ret; - if (!emitter._events || !emitter._events[type]) - ret = 0; - else if (isFunction(emitter._events[type])) - ret = 1; - else - ret = emitter._events[type].length; - return ret; -}; + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } -function isFunction(arg) { - return typeof arg === 'function'; -} + editLength++; + } -function isNumber(arg) { - return typeof arg === 'number'; -} + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function() { + // This should not happen, but we want to be safe. + /*istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} + if (!execEditLength()) { + exec(); + } + }, 0); + }()); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, -function isUndefined(arg) { - return arg === void 0; -} + pushComponent: function(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, -},{}],48:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} -},{}],49:[function(require,module,exports){ -module.exports = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]'; -}; + if (commonCount) { + basePath.components.push({count: commonCount}); + } -},{}],50:[function(require,module,exports){ -exports.endianness = function () { return 'LE' }; + basePath.newPos = newPos; + return oldPos; + }, -exports.hostname = function () { - if (typeof location !== 'undefined') { - return location.hostname + equals: function(left, right) { + var reWhitespace = /\S/; + return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); + }, + tokenize: function(value) { + return value.split(''); } - else return ''; -}; + }; -exports.loadavg = function () { return [] }; + var CharDiff = new Diff(); -exports.uptime = function () { return 0 }; + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; -exports.freemem = function () { - return Number.MAX_VALUE; -}; + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; -exports.totalmem = function () { - return Number.MAX_VALUE; -}; + var LineDiff = new Diff(); -exports.cpus = function () { return [] }; + var TrimmedLineDiff = new Diff(); + TrimmedLineDiff.ignoreTrim = true; -exports.type = function () { return 'Browser' }; + LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { + var retLines = [], + lines = value.split(/^/m); + for (var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1], + lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; -exports.release = function () { - if (typeof navigator !== 'undefined') { - return navigator.appVersion; + // Merge lines that may contain windows new lines + if (line === '\n' && lastLineLastChar === '\r') { + retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; + } else { + if (this.ignoreTrim) { + line = line.trim(); + // add a newline unless this is the last line. + if (i < lines.length - 1) { + line += '\n'; + } + } + retLines.push(line); + } } - return ''; -}; - -exports.networkInterfaces -= exports.getNetworkInterfaces -= function () { return {} }; -exports.arch = function () { return 'javascript' }; + return retLines; + }; -exports.platform = function () { return 'browser' }; + var PatchDiff = new Diff(); + PatchDiff.tokenize = function(value) { + var ret = [], + linesAndNewlines = value.split(/(\n|\r\n)/); -exports.tmpdir = exports.tmpDir = function () { - return '/tmp'; -}; - -exports.EOL = '\n'; - -},{}],51:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); } - var timeout = setTimeout(cleanUpNextTick); - draining = true; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - clearTimeout(timeout); -} + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); + if (i % 2) { + ret[ret.length - 1] += line; + } else { + ret.push(line); + } } -}; + return ret; + }; -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; + var SentenceDiff = new Diff(); + SentenceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); + }; -function noop() {} + var JsonDiff = new Diff(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + JsonDiff.useLongestToken = true; + JsonDiff.tokenize = LineDiff.tokenize; + JsonDiff.equals = function(left, right) { + return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; + var JsDiff = { + Diff: Diff, -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; + diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, + diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, + diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, + diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, + diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; + diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, -},{}],52:[function(require,module,exports){ -module.exports = require("./lib/_stream_duplex.js") + diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, + diffJson: function(oldObj, newObj, callback) { + return JsonDiff.diff( + typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), + typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), + callback + ); + }, -},{"./lib/_stream_duplex.js":53}],53:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + ret.push('==================================================================='); + ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); -module.exports = Duplex; + var diff = PatchDiff.diff(oldStr, newStr); + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; -} -/**/ + // Formats a given set of lines for printing as context lines in a patch + function contextLines(lines) { + return map(lines, function(entry) { return ' ' + entry; }); + } + // Outputs the no newline at end of file warning if needed + function eofNL(curRange, i, current) { + var last = diff[diff.length - 2], + isLast = i === diff.length - 2, + isLastOfType = i === diff.length - 3 && current.added !== last.added; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ + // Figure out if this is the last line for the given file and missing NL + if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; -util.inherits(Duplex, Readable); + if (current.added || current.removed) { + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; -forEach(objectKeys(Writable.prototype), function(method) { - if (!Duplex.prototype[method]) - Duplex.prototype[method] = Writable.prototype[method]; -}); + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } -function Duplex(options) { - if (!(this instanceof Duplex)) - return new Duplex(options); + // Output our changes + curRange.push.apply(curRange, map(lines, function(entry) { + return (current.added ? '+' : '-') + entry; + })); + eofNL(curRange, i, current); - Readable.call(this, options); - Writable.call(this, options); + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length - 2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } - if (options && options.readable === false) - this.readable = false; + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } - if (options && options.writable === false) - this.writable = false; + return ret.join('\n') + '\n'; + }, - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) - this.allowHalfOpen = false; + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); + }, - this.once('end', onend); -} + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'), + hunks = [], + i = 0, + remEOFNL = false, + addEOFNL = false; -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) - return; + // Skip to the first change hunk + while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { + i++; + } - // no more data can be written. - // But allow more writes to happen in this tick. - process.nextTick(this.end.bind(this)); -} + // Parse the unified diff + for (; i < diffstr.length; i++) { + if (diffstr[i][0] === '@') { + var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + hunks.unshift({ + start: chnukHeader[3], + oldlength: +chnukHeader[2], + removed: [], + newlength: chnukHeader[4], + added: [] + }); + } else if (diffstr[i][0] === '+') { + hunks[0].added.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '-') { + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === ' ') { + hunks[0].added.push(diffstr[i].substr(1)); + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '\\') { + if (diffstr[i - 1][0] === '+') { + remEOFNL = true; + } else if (diffstr[i - 1][0] === '-') { + addEOFNL = true; + } + } + } -function forEach (xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} + // Apply the diff to the input + var lines = oldStr.split('\n'); + for (i = hunks.length - 1; i >= 0; i--) { + var hunk = hunks[i]; + // Sanity check the input string. Bail if we don't match. + for (var j = 0; j < hunk.oldlength; j++) { + if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { + return false; + } + } + Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); + } -}).call(this,require('_process')) -},{"./_stream_readable":55,"./_stream_writable":57,"_process":51,"core-util-is":58,"inherits":48}],54:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + // Handle EOFNL insertion/removal + if (remEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + } + } else if (addEOFNL) { + lines.push(''); + } + return lines.join('\n'); + }, -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. + convertChangesToXML: function(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } -module.exports = PassThrough; + ret.push(escapeHTML(change.value)); -var Transform = require('./_stream_transform'); + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes) { + var ret = [], + change, + operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } -util.inherits(PassThrough, Transform); + ret.push([operation, change.value]); + } + return ret; + }, -function PassThrough(options) { - if (!(this instanceof PassThrough)) - return new PassThrough(options); + canonicalize: canonicalize + }; - Transform.call(this, options); -} + /*istanbul ignore next */ + /*global module */ + if (typeof module !== 'undefined' && module.exports) { + module.exports = JsDiff; + } else if (typeof define === 'function' && define.amd) { + /*global define */ + define([], function() { return JsDiff; }); + } else if (typeof global.JsDiff === 'undefined') { + global.JsDiff = JsDiff; + } +}(this)); -PassThrough.prototype._transform = function(chunk, encoding, cb) { - cb(null, chunk); +},{}],47:[function(require,module,exports){ +'use strict'; + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRe, '\\$&'); }; -},{"./_stream_transform":56,"core-util-is":58,"inherits":48}],55:[function(require,module,exports){ -(function (process){ +},{}],48:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -8867,3844 +9220,3784 @@ PassThrough.prototype._transform = function(chunk, encoding, cb) { // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -module.exports = Readable; - -/**/ -var isArray = require('isarray'); -/**/ - +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; -/**/ -var Buffer = require('buffer').Buffer; -/**/ +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; -Readable.ReadableState = ReadableState; +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; -var EE = require('events').EventEmitter; +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; -/**/ -if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { - return emitter.listeners(type).length; +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; }; -/**/ -var Stream = require('stream'); +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ + if (!this._events) + this._events = {}; -var StringDecoder; + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + handler = this._events[type]; -/**/ -var debug = require('util'); -if (debug && debug.debuglog) { - debug = debug.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ + if (isUndefined(handler)) + return false; + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } -util.inherits(Readable, Stream); + return true; +}; -function ReadableState(options, stream) { - var Duplex = require('./_stream_duplex'); +EventEmitter.prototype.addListener = function(type, listener) { + var m; - options = options || {}; + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = options.objectMode ? 16 : 16 * 1024; - this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + if (!this._events) + this._events = {}; - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); - this.buffer = []; - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + return this; +}; - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - if (stream instanceof Duplex) - this.objectMode = this.objectMode || !!options.readableObjectMode; +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; + var fired = false; - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; + function g() { + this.removeListener(type, g); - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } - // if true, a maybeReadMore has been scheduled - this.readingMore = false; + g.listener = listener; + this.on(type, g); - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} + return this; +}; -function Readable(options) { - var Duplex = require('./_stream_duplex'); +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; - if (!(this instanceof Readable)) - return new Readable(options); + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - this._readableState = new ReadableState(options, this); + if (!this._events || !this._events[type]) + return this; - // legacy - this.readable = true; + list = this._events[type]; + length = list.length; + position = -1; - Stream.call(this); -} + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function(chunk, encoding) { - var state = this._readableState; + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } - if (util.isString(chunk) && !state.objectMode) { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = new Buffer(chunk, encoding); - encoding = ''; + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); } - } - return readableAddChunk(this, state, chunk, encoding, false); -}; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function(chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); + return this; }; -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (util.isNullOrUndefined(chunk)) { - state.reading = false; - if (!state.ended) - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var e = new Error('stream.unshift() after end event'); - stream.emit('error', e); - } else { - if (state.decoder && !addToFront && !encoding) - chunk = state.decoder.write(chunk); +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; - if (!addToFront) - state.reading = false; + if (!this._events) + return this; - // if we want the data now, just emit it. - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) - state.buffer.unshift(chunk); - else - state.buffer.push(chunk); - - if (state.needReadable) - emitReadable(stream); - } + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } - maybeReadMore(stream, state); + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); } - } else if (!addToFront) { - state.reading = false; + this.removeAllListeners('removeListener'); + this._events = {}; + return this; } - return needMoreData(state); -} - - + listeners = this._events[type]; -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && - (state.needReadable || - state.length < state.highWaterMark || - state.length === 0); -} + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; -// backwards compatibility. -Readable.prototype.setEncoding = function(enc) { - if (!StringDecoder) - StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; return this; }; -// Don't raise the hwm > 128MB -var MAX_HWM = 0x800000; -function roundUpToNextPowerOf2(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 - n--; - for (var p = 1; p < 32; p <<= 1) n |= n >> p; - n++; - } - return n; -} - -function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) - return 0; +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; - if (state.objectMode) - return n === 0 ? 0 : 1; +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; - if (isNaN(n) || util.isNull(n)) { - // only flow one buffer at a time - if (state.flowing && state.buffer.length) - return state.buffer[0].length; - else - return state.length; + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; } + return 0; +}; - if (n <= 0) - return 0; +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; - // If we're asking for more than the target buffer level, - // then raise the water mark. Bump up to the next highest - // power of 2, to prevent increasing it excessively in tiny - // amounts. - if (n > state.highWaterMark) - state.highWaterMark = roundUpToNextPowerOf2(n); - - // don't have that much. return null, unless we've ended. - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else - return state.length; - } - - return n; +function isFunction(arg) { + return typeof arg === 'function'; } -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function(n) { - debug('read', n); - var state = this._readableState; - var nOrig = n; - - if (!util.isNumber(n) || n > 0) - state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && - state.needReadable && - (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) - endReadable(this); - else - emitReadable(this); - return null; - } +function isNumber(arg) { + return typeof arg === 'number'; +} - n = howMuchToRead(n, state); +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) - endReadable(this); - return null; - } +function isUndefined(arg) { + return arg === void 0; +} - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. +},{}],49:[function(require,module,exports){ +(function (process){ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); +/** + * Module dependencies. + */ - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; - if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) - state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; } +} - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (doRead && !state.reading) - n = howMuchToRead(nOrig, state); - - var ret; - if (n > 0) - ret = fromList(n, state); - else - ret = null; +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , icon: '-appIcon' + , sound: '-sound' + , url: '-open' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + if (which('growl')) { + cmd = { + type: "Linux-Growl" + , pkg: "growl" + , msg: '-m' + , title: '-title' + , subtitle: '-subtitle' + , host: { + cmd: '-H' + , hostname: '192.168.33.1' + } + }; + } else { + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + } + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , url: '/cu:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} - if (util.isNull(ret)) { - state.needReadable = true; - n = 0; - } +/** + * Expose `growl`. + */ - state.length -= n; +exports = module.exports = growl; - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (state.length === 0 && !state.ended) - state.needReadable = true; +/** + * Node-growl version. + */ - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended && state.length === 0) - endReadable(this); +exports.version = '1.4.1' - if (!util.isNull(ret)) - this.emit('data', ret); +/** + * Send growl notification _msg_ with _options_. + * + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public + */ - return ret; -}; +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; -function chunkInvalid(state, chunk) { - var er = null; - if (!util.isBuffer(chunk) && - !util.isString(chunk) && - !util.isNullOrUndefined(chunk) && - !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + if (options.exec) { + cmd = { + type: "Custom" + , pkg: options.exec + , range: [] + }; } - return er; -} - -function onEofChunk(stream, state) { - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) - process.nextTick(function() { - emitReadable_(stream); - }); - else - emitReadable_(stream); + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, quote(image)) + break; + case 'Darwin-NotificationCenter': + args.push(cmd.icon, quote(image)); + break; + case 'Linux': + args.push(cmd.icon, quote(image)); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} + // sticky + if (options.sticky) args.push(cmd.sticky); -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - process.nextTick(function() { - maybeReadMore_(stream, state); - }); + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } } -} -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && - state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break; - else - len = state.length; + //sound + if(options.sound && cmd.type === 'Darwin-NotificationCenter'){ + args.push(cmd.sound, options.sound) } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function(n) { - this.emit('error', new Error('not implemented')); -}; -Readable.prototype.pipe = function(dest, pipeOpts) { - var src = this; - var state = this._readableState; + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } - switch (state.pipesCount) { - case 0: - state.pipes = dest; + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); break; - case 1: - state.pipes = [state.pipes, dest]; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + var stringifiedMsg = quote(msg); + var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n'); + args.push(escapedMsg); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.subtitle)); + } + if (options.url) { + args.push(cmd.url); + args.push(quote(options.url)); + } break; - default: - state.pipes.push(dest); + case 'Linux-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); + if (cmd.host) { + args.push(cmd.host.cmd, cmd.host.hostname) + } + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + } else { + args.push(quote(msg).replace(/\\n/g, '\n')); + } + break; + case 'Windows': + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(cmd.title + quote(options.title)); + if (options.url) args.push(cmd.url + quote(options.url)); + break; + case 'Custom': + args[0] = (function(origCommand) { + var message = options.title + ? options.title + ': ' + msg + : msg; + var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message)); + if (command === origCommand) args.push(quote(message)); + return command; + })(args[0]); break; } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && - dest !== process.stdout && - dest !== process.stderr; + // execute + exec(args.join(' '), fn); +}; - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) - process.nextTick(endFn); - else - src.once('end', endFn); +}).call(this,require('_process')) +},{"_process":57,"child_process":43,"fs":43,"os":55,"path":43}],50:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - debug('onunpipe'); - if (readable === src) { - cleanup(); - } - } + i += d - function onend() { - debug('onend'); - dest.end(); + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - src.removeListener('data', ondata); + value = Math.abs(value) - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && - (!dest._writableState || dest._writableState.needDrain)) - ondrain(); - } + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - var ret = dest.write(chunk); - if (false === ret) { - debug('false write response, pause', - src._readableState.awaitDrain); - src._readableState.awaitDrain++; - src.pause(); + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 } } - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EE.listenerCount(dest, 'error') === 0) - dest.emit('error', er); - } - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. - if (!dest._events || !dest._events.error) - dest.on('error', onerror); - else if (isArray(dest._events.error)) - dest._events.error.unshift(onerror); - else - dest._events.error = [onerror, dest._events.error]; + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + buffer[offset + i - d] |= s * 128 +} - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); +},{}],51:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor } - dest.once('finish', onfinish); +} - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } +},{}],52:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ - // tell the dest that it's being piped to - dest.emit('pipe', src); +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } +},{}],53:[function(require,module,exports){ +var toString = {}.toString; - return dest; +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; }; -function pipeOnDrain(src) { - return function() { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) - state.awaitDrain--; - if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) { - state.flowing = true; - flow(src); +},{}],54:[function(require,module,exports){ +(function (process){ +var path = require('path'); +var fs = require('fs'); +var _0777 = parseInt('0777', 8); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; } - }; + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); } +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; -Readable.prototype.unpipe = function(dest) { - var state = this._readableState; + p = path.resolve(p); - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) - return this; + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) - return this; + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } - if (!dest) - dest = state.pipes; + return made; +}; - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) - dest.emit('unpipe', this); - return this; - } +}).call(this,require('_process')) +},{"_process":57,"fs":43,"path":43}],55:[function(require,module,exports){ +exports.endianness = function () { return 'LE' }; - // slow case. multiple pipe destinations. +exports.hostname = function () { + if (typeof location !== 'undefined') { + return location.hostname + } + else return ''; +}; - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; +exports.loadavg = function () { return [] }; - for (var i = 0; i < len; i++) - dests[i].emit('unpipe', this); - return this; - } +exports.uptime = function () { return 0 }; - // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) - return this; +exports.freemem = function () { + return Number.MAX_VALUE; +}; - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) - state.pipes = state.pipes[0]; +exports.totalmem = function () { + return Number.MAX_VALUE; +}; - dest.emit('unpipe', this); +exports.cpus = function () { return [] }; - return this; +exports.type = function () { return 'Browser' }; + +exports.release = function () { + if (typeof navigator !== 'undefined') { + return navigator.appVersion; + } + return ''; }; -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function(ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); +exports.networkInterfaces += exports.getNetworkInterfaces += function () { return {} }; - // If listening to data, and it has not explicitly been paused, - // then call resume to start the flow of data on the next tick. - if (ev === 'data' && false !== this._readableState.flowing) { - this.resume(); - } +exports.arch = function () { return 'javascript' }; - if (ev === 'readable' && this.readable) { - var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; - state.emittedReadable = false; - state.needReadable = true; - if (!state.reading) { - var self = this; - process.nextTick(function() { - debug('readable nexttick read 0'); - self.read(0); - }); - } else if (state.length) { - emitReadable(this, state); - } - } - } +exports.platform = function () { return 'browser' }; - return res; +exports.tmpdir = exports.tmpDir = function () { + return '/tmp'; }; -Readable.prototype.addListener = Readable.prototype.on; -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function() { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - if (!state.reading) { - debug('resume read 0'); - this.read(0); - } - resume(this, state); - } - return this; -}; +exports.EOL = '\n'; -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - process.nextTick(function() { - resume_(stream, state); +},{}],56:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); }); } } -function resume_(stream, state) { - state.resumeScheduled = false; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) - stream.read(0); -} +}).call(this,require('_process')) +},{"_process":57}],57:[function(require,module,exports){ +// shim for using process in browser -Readable.prototype.pause = function() { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - if (state.flowing) { - do { - var chunk = stream.read(); - } while (null !== chunk && state.flowing); - } +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } } -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function(stream) { - var state = this._readableState; - var paused = false; +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; - var self = this; - stream.on('end', function() { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) - self.push(chunk); + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} - self.push(null); - }); +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; - stream.on('data', function(chunk) { - debug('wrapped data'); - if (state.decoder) - chunk = state.decoder.write(chunk); - if (!chunk || !state.objectMode && !chunk.length) - return; +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); +function noop() {} - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { - this[i] = function(method) { return function() { - return stream[method].apply(stream, arguments); - }}(i); - } - } +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; - // proxy certain important events. - var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function(ev) { - stream.on(ev, self.emit.bind(self, ev)); - }); +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function(n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; - return self; +},{}],58:[function(require,module,exports){ +module.exports = require("./lib/_stream_duplex.js") + +},{"./lib/_stream_duplex.js":59}],59:[function(require,module,exports){ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; }; +/**/ +module.exports = Duplex; +/**/ +var processNextTick = require('process-nextick-args'); +/**/ -// exposed for testing purposes only. -Readable._fromList = fromList; +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; - var ret; +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); - // nothing in the list, definitely empty. - if (list.length === 0) - return null; +util.inherits(Duplex, Readable); - if (length === 0) - ret = null; - else if (objectMode) - ret = list.shift(); - else if (!n || n >= length) { - // read it all, truncate the array. - if (stringMode) - ret = list.join(''); - else - ret = Buffer.concat(list, length); - list.length = 0; - } else { - // read just some of it. - if (n < list[0].length) { - // just take a part of the first list item. - // slice is the same for buffers and strings. - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - // first list is a perfect match - ret = list.shift(); - } else { - // complex case. - // we have enough to cover it, but it spans past the first buffer. - if (stringMode) - ret = ''; - else - ret = new Buffer(n); +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); - if (stringMode) - ret += buf.slice(0, cpy); - else - buf.copy(ret, c, 0, cpy); + Readable.call(this, options); + Writable.call(this, options); - if (cpy < buf.length) - list[0] = buf.slice(cpy); - else - list.shift(); + if (options && options.readable === false) this.readable = false; - c += cpy; - } - } - } + if (options && options.writable === false) this.writable = false; - return ret; + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); } -function endReadable(stream) { - var state = stream._readableState; +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) - throw new Error('endReadable called on non-empty stream'); + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} - if (!state.endEmitted) { - state.ended = true; - process.nextTick(function() { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } - }); - } +function onEndNT(self) { + self.end(); } -function forEach (xs, f) { +function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } +},{"./_stream_readable":61,"./_stream_writable":63,"core-util-is":45,"inherits":51,"process-nextick-args":56}],60:[function(require,module,exports){ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. -function indexOf (xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} +'use strict'; -}).call(this,require('_process')) -},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"events":47,"inherits":48,"isarray":49,"stream":63,"string_decoder/":64,"util":42}],56:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. +module.exports = PassThrough; - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); +var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ -util.inherits(Transform, Duplex); - - -function TransformState(options, stream) { - this.afterTransform = function(er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) - return stream.emit('error', new Error('no writecb in Transform class')); - - ts.writechunk = null; - ts.writecb = null; - - if (!util.isNullOrUndefined(data)) - stream.push(data); - - if (cb) - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} - - -function Transform(options) { - if (!(this instanceof Transform)) - return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(options, this); - - // when the writable side finishes, then flush out anything remaining. - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; +util.inherits(PassThrough, Transform); - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); - this.once('prefinish', function() { - if (util.isFunction(this._flush)) - this._flush(function(er) { - done(stream, er); - }); - else - done(stream); - }); + Transform.call(this, options); } -Transform.prototype.push = function(chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function(chunk, encoding, cb) { - throw new Error('not implemented'); -}; - -Transform.prototype._write = function(chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || - rs.needReadable || - rs.length < rs.highWaterMark) - this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function(n) { - var ts = this._transformState; - - if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); }; +},{"./_stream_transform":62,"core-util-is":45,"inherits":51}],61:[function(require,module,exports){ +(function (process){ +'use strict'; +module.exports = Readable; -function done(stream, er) { - if (er) - return stream.emit('error', er); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) - throw new Error('calling transform done when ws.length != 0'); - - if (ts.transforming) - throw new Error('calling transform done when still transforming'); +/**/ +var processNextTick = require('process-nextick-args'); +/**/ - return stream.push(null); -} +/**/ +var isArray = require('isarray'); +/**/ -},{"./_stream_duplex":53,"core-util-is":58,"inherits":48}],57:[function(require,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. +/**/ +var Buffer = require('buffer').Buffer; +/**/ -// A bit simpler than readable streams. -// Implement an async ._write(chunk, cb), and it'll handle all -// the drain event emission and buffering. +Readable.ReadableState = ReadableState; -module.exports = Writable; +var EE = require('events'); /**/ -var Buffer = require('buffer').Buffer; +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; /**/ -Writable.WritableState = WritableState; +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ +var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ -var Stream = require('stream'); +/**/ +var debugUtil = require('util'); +var debug = undefined; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ -util.inherits(Writable, Stream); +var StringDecoder; -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; -} +util.inherits(Readable, Stream); -function WritableState(options, stream) { - var Duplex = require('./_stream_duplex'); +var Duplex; +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); options = options || {}; - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = options.objectMode ? 16 : 16 * 1024; - this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; - if (stream instanceof Duplex) - this.objectMode = this.objectMode || !!options.writableObjectMode; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. - this.highWaterMark = ~~this.highWaterMark; + this.highWaterMark = ~ ~this.highWaterMark; - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; this.ended = false; - // when 'finish' is emitted - this.finished = false; + this.endEmitted = false; + this.reading = false; - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; - // a flag to see when we're in the middle of a write. - this.writing = false; + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function(er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.buffer = []; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; + // if true, a maybeReadMore has been scheduled + this.readingMore = false; - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } } -function Writable(options) { - var Duplex = require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) - return new Writable(options); - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; +var Duplex; +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); - Stream.call(this); -} + if (!(this instanceof Readable)) return new Readable(options); -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function() { - this.emit('error', new Error('Cannot pipe. Not readable.')); -}; + this._readableState = new ReadableState(options, this); + // legacy + this.readable = true; -function writeAfterEnd(stream, state, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); -} + if (options && typeof options.read === 'function') this._read = options.read; -// If we get something that is not a buffer, string, null, or undefined, -// and we're not in objectMode, then that's an error. -// Otherwise stream chunks are all considered to be of length=1, and the -// watermarks determine how many objects to keep in the buffer, rather than -// how many bytes or characters. -function validChunk(stream, state, chunk, cb) { - var valid = true; - if (!util.isBuffer(chunk) && - !util.isString(chunk) && - !util.isNullOrUndefined(chunk) && - !state.objectMode) { - var er = new TypeError('Invalid non-string/buffer chunk'); - stream.emit('error', er); - process.nextTick(function() { - cb(er); - }); - valid = false; - } - return valid; + Stream.call(this); } -Writable.prototype.write = function(chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - - if (util.isFunction(encoding)) { - cb = encoding; - encoding = null; - } - - if (util.isBuffer(chunk)) - encoding = 'buffer'; - else if (!encoding) - encoding = state.defaultEncoding; - - if (!util.isFunction(cb)) - cb = function() {}; +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; - if (state.ended) - writeAfterEnd(this, state, cb); - else if (validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, chunk, encoding, cb); + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } } - return ret; + return readableAddChunk(this, state, chunk, encoding, false); }; -Writable.prototype.cork = function() { - var state = this._writableState; - - state.corked++; +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); }; -Writable.prototype.uncork = function() { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && - !state.corked && - !state.finished && - !state.bufferProcessing && - state.buffer.length) - clearBuffer(this, state); - } +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; }; -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && - state.decodeStrings !== false && - util.isString(chunk)) { - chunk = new Buffer(chunk, encoding); - } - return chunk; -} +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); - if (util.isBuffer(chunk)) - encoding = 'buffer'; - var len = state.objectMode ? 1 : chunk.length; + if (!addToFront) state.reading = false; - state.length += len; + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) - state.needDrain = true; + if (state.needReadable) emitReadable(stream); + } + } - if (state.writing || state.corked) - state.buffer.push(new WriteReq(chunk, encoding, cb)); - else - doWrite(stream, state, false, len, chunk, encoding, cb); + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } - return ret; + return needMoreData(state); } -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) - stream._writev(chunk, state.onwrite); - else - stream._write(chunk, encoding, state.onwrite); - state.sync = false; +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } -function onwriteError(stream, state, sync, er, cb) { - if (sync) - process.nextTick(function() { - state.pendingcb--; - cb(er); - }); - else { - state.pendingcb--; - cb(er); - } +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; - stream._writableState.errorEmitted = true; - stream.emit('error', er); +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; } -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) return 0; -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; + if (state.objectMode) return n === 0 ? 0 : 1; - onwriteStateUpdate(state); + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; + } - if (er) - onwriteError(stream, state, sync, er, cb); - else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(stream, state); + if (n <= 0) return 0; - if (!finished && - !state.corked && - !state.bufferProcessing && - state.buffer.length) { - clearBuffer(stream, state); - } + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (sync) { - process.nextTick(function() { - afterWrite(stream, state, finished, cb); - }); + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; } else { - afterWrite(stream, state, finished, cb); + return state.length; } } -} -function afterWrite(stream, state, finished, cb) { - if (!finished) - onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); + return n; } -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; + if (typeof n !== 'number' || n > 0) state.emittedReadable = false; -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } - if (stream._writev && state.buffer.length > 1) { - // Fast case, write everything using _writev() - var cbs = []; - for (var c = 0; c < state.buffer.length; c++) - cbs.push(state.buffer[c].callback); + n = howMuchToRead(n, state); - // count the one we are adding, as well. - // TODO(isaacs) clean this up - state.pendingcb++; - doWrite(stream, state, true, state.length, state.buffer, '', function(err) { - for (var i = 0; i < cbs.length; i++) { - state.pendingcb--; - cbs[i](err); - } - }); + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } - // Clear buffer - state.buffer = []; - } else { - // Slow case, write chunks one-by-one - for (var c = 0; c < state.buffer.length; c++) { - var entry = state.buffer[c]; - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - c++; - break; - } - } + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); - if (c < state.buffer.length) - state.buffer = state.buffer.slice(c); - else - state.buffer.length = 0; + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); } - state.bufferProcessing = false; -} - -Writable.prototype._write = function(chunk, encoding, cb) { - cb(new Error('not implemented')); + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } -}; + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } -Writable.prototype._writev = null; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) n = howMuchToRead(nOrig, state); -Writable.prototype.end = function(chunk, encoding, cb) { - var state = this._writableState; + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; - if (util.isFunction(chunk)) { - cb = chunk; - chunk = null; - encoding = null; - } else if (util.isFunction(encoding)) { - cb = encoding; - encoding = null; + if (ret === null) { + state.needReadable = true; + n = 0; } - if (!util.isNullOrUndefined(chunk)) - this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } + state.length -= n; - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) - endWritable(this, state, cb); -}; + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) state.needReadable = true; + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) endReadable(this); -function needFinish(stream, state) { - return (state.ending && - state.length === 0 && - !state.finished && - !state.writing); -} + if (ret !== null) this.emit('data', ret); -function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit('prefinish'); - } -} + return ret; +}; -function finishMaybe(stream, state) { - var need = needFinish(stream, state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit('finish'); - } else - prefinish(stream, state); +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); } - return need; + return er; } -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) - process.nextTick(cb); - else - stream.once('finish', cb); +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } } state.ended = true; -} - -}).call(this,require('_process')) -},{"./_stream_duplex":53,"_process":51,"buffer":43,"core-util-is":58,"inherits":48,"stream":63}],58:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); } -exports.isArray = isArray; -function isBoolean(arg) { - return typeof arg === 'boolean'; +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } } -exports.isBoolean = isBoolean; -function isNull(arg) { - return arg === null; +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); } -exports.isNull = isNull; -function isNullOrUndefined(arg) { - return arg == null; +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); + } } -exports.isNullOrUndefined = isNullOrUndefined; -function isNumber(arg) { - return typeof arg === 'number'; +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; } -exports.isNumber = isNumber; -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; + function onend() { + debug('onend'); + dest.end(); + } -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); -function isBuffer(arg) { - return Buffer.isBuffer(arg); -} -exports.isBuffer = isBuffer; + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); -function objectToString(o) { - return Object.prototype.toString.call(o); -} -}).call(this,require("buffer").Buffer) -},{"buffer":43}],59:[function(require,module,exports){ -module.exports = require("./lib/_stream_passthrough.js") + cleanedUp = true; -},{"./lib/_stream_passthrough.js":54}],60:[function(require,module,exports){ -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = require('stream'); -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } -},{"./lib/_stream_duplex.js":53,"./lib/_stream_passthrough.js":54,"./lib/_stream_readable.js":55,"./lib/_stream_transform.js":56,"./lib/_stream_writable.js":57,"stream":63}],61:[function(require,module,exports){ -module.exports = require("./lib/_stream_transform.js") + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + } + src.pause(); + } + } -},{"./lib/_stream_transform.js":56}],62:[function(require,module,exports){ -module.exports = require("./lib/_stream_writable.js") + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; -},{"./lib/_stream_writable.js":57}],63:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); -module.exports = Stream; + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } -var EE = require('events').EventEmitter; -var inherits = require('inherits'); + // tell the dest that it's being piped to + dest.emit('pipe', src); -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; + return dest; +}; +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; -function Stream() { - EE.call(this); -} + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; -Stream.prototype.pipe = function(dest, options) { - var source = this; + if (!dest) dest = state.pipes; - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; } - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } + // slow case. multiple pipe destinations. - dest.on('drain', ondrain); + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; } - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; - dest.end(); - } + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this); - function onclose() { - if (didOnEnd) return; - didOnEnd = true; + return this; +}; - if (typeof dest.destroy === 'function') dest.destroy(); +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); } - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. + if (ev === 'readable' && !this._readableState.endEmitted) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); + } } } - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; - source.removeListener('end', onend); - source.removeListener('close', onclose); +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} - source.removeListener('error', onerror); - dest.removeListener('error', onerror); +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} - dest.removeListener('close', cleanup); +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); } - source.on('end', cleanup); - source.on('close', cleanup); + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} - dest.on('close', cleanup); +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; - dest.emit('pipe', source); +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } +} - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; -},{"events":47,"inherits":48,"readable-stream/duplex.js":52,"readable-stream/passthrough.js":59,"readable-stream/readable.js":60,"readable-stream/transform.js":61,"readable-stream/writable.js":62}],64:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } -var Buffer = require('buffer').Buffer; + self.push(null); + }); -var isBufferEncoding = Buffer.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - } + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -var StringDecoder = exports.StringDecoder = function(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } } - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; }; +// exposed for testing purposes only. +Readable._fromList = fromList; -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; + // nothing in the list, definitely empty. + if (list.length === 0) return null; - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } + if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) ret = '';else ret = new Buffer(n); - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; + if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; + c += cpy; + } } - break; } - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); + return ret; +} - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } +function endReadable(stream) { + var state = stream._readableState; - charStr += buffer.toString(this.encoding, 0, end); + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('endReadable called on non-empty stream'); - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); } +} - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} - // See http://en.wikipedia.org/wiki/UTF-8#Description +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,require('_process')) +},{"./_stream_duplex":59,"_process":57,"buffer":44,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":56,"string_decoder/":69,"util":41}],62:[function(require,module,exports){ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } +'use strict'; - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; +module.exports = Transform; -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); +var Duplex = require('./_stream_duplex'); - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ - return res; -}; +util.inherits(Transform, Duplex); -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; } -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; -},{"buffer":43}],65:[function(require,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } } -},{}],66:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; } - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); }; +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('not implemented'); +}; -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } +}; - if (process.noDeprecation === true) { - return fn; - } +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; } - - return deprecated; }; +function done(stream, er) { + if (er) return stream.emit('error', er); -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + if (ws.length) throw new Error('calling transform done when ws.length != 0'); -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); + if (ts.transforming) throw new Error('calling transform done when still transforming'); + + return stream.push(null); } -exports.inspect = inspect; +},{"./_stream_duplex":59,"core-util-is":45,"inherits":51}],63:[function(require,module,exports){ +(function (process){ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. +'use strict'; -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; +module.exports = Writable; -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; +/**/ +var processNextTick = require('process-nextick-args'); +/**/ +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; +/**/ +var Buffer = require('buffer').Buffer; +/**/ - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} +Writable.WritableState = WritableState; +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ -function stylizeNoColor(str, styleType) { - return str; -} +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ -function arrayToHash(array) { - var hash = {}; +var Buffer = require('buffer').Buffer; - array.forEach(function(val, idx) { - hash[val] = true; - }); +util.inherits(Writable, Stream); - return hash; +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; } +var Duplex; +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } + options = options || {}; - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; - var base = '', array = false, braces = ['{', '}']; + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } + // a flag to see when we're in the middle of a write. + this.writing = false; - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } + // when true all writes will be buffered until .uncork() call + this.corked = 0; - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; - ctx.seen.push(value); + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } + // the amount that is being written when _write is called. + this.writelen = 0; - ctx.seen.pop(); + this.bufferedRequest = null; + this.lastBufferedRequest = null; - return reduceToSingleString(output, base, braces); + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // create the two objects needed to store the corked requests + // they are not a linked list, as no new elements are inserted in there + this.corkedRequestsFree = new CorkedRequest(this); + this.corkedRequestsFree.next = new CorkedRequest(this); } +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); +var Duplex; +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); + + Stream.call(this); } +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); } +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + processNextTick(cb, er); + valid = false; } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; + return valid; } +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } + + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); } - return name + ': ' + str; -} + return ret; +}; +Writable.prototype.cork = function () { + var state = this._writableState; -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); + state.corked++; +}; - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } +}; - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; } +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; + state.length += len; -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } -function isNumber(arg) { - return typeof arg === 'number'; + return ret; } -exports.isNumber = isNumber; -function isString(arg) { - return typeof arg === 'string'; +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; } -exports.isString = isString; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); -function isUndefined(arg) { - return arg === void 0; + stream._writableState.errorEmitted = true; + stream.emit('error', er); } -exports.isUndefined = isUndefined; -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; } -exports.isRegExp = isRegExp; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + onwriteStateUpdate(state); -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } } -exports.isError = isError; -function isFunction(arg) { - return typeof arg === 'function'; +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); } -exports.isFunction = isFunction; -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } } -exports.isPrimitive = isPrimitive; -exports.isBuffer = require('./support/isBuffer'); +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; -function objectToString(o) { - return Object.prototype.toString.call(o); -} + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; + if (entry === null) state.lastBufferedRequest = null; + } -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; } - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); }; +Writable.prototype._writev = null; -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":65,"_process":51,"inherits":48}],67:[function(require,module,exports){ -/* See LICENSE file for terms of use */ + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); -/* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ -(function(global, undefined) { - var objectPrototypeToString = Object.prototype.toString; + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } - /*istanbul ignore next*/ - function map(arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); - } + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; - var other = new Array(arr.length); +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} - for (var i = 0, n = arr.length; i < n; i++) { - other[i] = mapper.call(that, arr[i], i, arr); - } - return other; - } - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); } - function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); } - return ret; } - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, '&'); - n = n.replace(//g, '>'); - n = n.replace(/"/g, '"'); + return need; +} - return n; +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) processNextTick(cb);else stream.once('finish', cb); } + state.ended = true; + stream.writable = false; +} - // This function handles the presence of circular references by bailing out when encountering an - // object that is already on the "stack" of items being processed. - function canonicalize(obj, stack, replacementStack) { - stack = stack || []; - replacementStack = replacementStack || []; +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; - var i; + this.next = null; + this.entry = null; - for (i = 0; i < stack.length; i += 1) { - if (stack[i] === obj) { - return replacementStack[i]; - } + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; } - - var canonicalizedObj; - - if ('[object Array]' === objectPrototypeToString.call(obj)) { - stack.push(obj); - canonicalizedObj = new Array(obj.length); - replacementStack.push(canonicalizedObj); - for (i = 0; i < obj.length; i += 1) { - canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); - } else if (typeof obj === 'object' && obj !== null) { - stack.push(obj); - canonicalizedObj = {}; - replacementStack.push(canonicalizedObj); - var sortedKeys = [], - key; - for (key in obj) { - sortedKeys.push(key); - } - sortedKeys.sort(); - for (i = 0; i < sortedKeys.length; i += 1) { - key = sortedKeys[i]; - canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; } else { - canonicalizedObj = obj; + state.corkedRequestsFree = _this; } - return canonicalizedObj; - } + }; +} +}).call(this,require('_process')) +},{"./_stream_duplex":59,"_process":57,"buffer":44,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":56,"util-deprecate":71}],64:[function(require,module,exports){ +module.exports = require("./lib/_stream_passthrough.js") - function buildValues(components, newString, oldString, useLongestToken) { - var componentPos = 0, - componentLen = components.length, - newPos = 0, - oldPos = 0; +},{"./lib/_stream_passthrough.js":60}],65:[function(require,module,exports){ +(function (process){ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); - for (; componentPos < componentLen; componentPos++) { - var component = components[componentPos]; - if (!component.removed) { - if (!component.added && useLongestToken) { - var value = newString.slice(newPos, newPos + component.count); - value = map(value, function(value, i) { - var oldValue = oldString[oldPos + i]; - return oldValue.length > value.length ? oldValue : value; - }); +if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; +} - component.value = value.join(''); - } else { - component.value = newString.slice(newPos, newPos + component.count).join(''); - } - newPos += component.count; +}).call(this,require('_process')) +},{"./lib/_stream_duplex.js":59,"./lib/_stream_passthrough.js":60,"./lib/_stream_readable.js":61,"./lib/_stream_transform.js":62,"./lib/_stream_writable.js":63,"_process":57}],66:[function(require,module,exports){ +module.exports = require("./lib/_stream_transform.js") - // Common case - if (!component.added) { - oldPos += component.count; - } - } else { - component.value = oldString.slice(oldPos, oldPos + component.count).join(''); - oldPos += component.count; +},{"./lib/_stream_transform.js":62}],67:[function(require,module,exports){ +module.exports = require("./lib/_stream_writable.js") - // Reverse add and remove so removes are output first to match common convention - // The diffing algorithm is tied to add then remove output and this is the simplest - // route to get the desired output with minimal overhead. - if (componentPos && components[componentPos - 1].added) { - var tmp = components[componentPos - 1]; - components[componentPos - 1] = components[componentPos]; - components[componentPos] = tmp; - } - } - } +},{"./lib/_stream_writable.js":63}],68:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - return components; - } +module.exports = Stream; - function Diff(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - } - Diff.prototype = { - diff: function(oldString, newString, callback) { - var self = this; +var EE = require('events').EventEmitter; +var inherits = require('inherits'); - function done(value) { - if (callback) { - setTimeout(function() { callback(undefined, value); }, 0); - return true; - } else { - return value; - } - } +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString === oldString) { - return done([{ value: newString }]); - } - if (!newString) { - return done([{ value: oldString, removed: true }]); - } - if (!oldString) { - return done([{ value: newString, added: true }]); - } +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); - var newLen = newString.length, oldLen = oldString.length; - var editLength = 1; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - // Identity per the equality and tokenizer - return done([{value: newString.join('')}]); - } +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. - // Main worker method. checks all permutations of a given edit length for acceptance. - function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { - var basePath; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath - 1] = undefined; - } +function Stream() { + EE.call(this); +} - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - // If this path is a terminal then prune - bestPath[diagonalPath] = undefined; - continue; - } +Stream.prototype.pipe = function(dest, options) { + var source = this; - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); - } else { - basePath = addPath; // No need to clone, we've pulled it from the list - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); - } + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } - oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + source.on('data', ondata); - // If we have hit the end of both strings, then we are done - if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); - } else { - // Otherwise track this path as a potential candidate and continue. - bestPath[diagonalPath] = basePath; - } - } + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } - editLength++; - } + dest.on('drain', ondrain); - // Performs the length of edit iteration. Is a bit fugly as this has to support the - // sync and async mode which is never fun. Loops over execEditLength until a value - // is produced. - if (callback) { - (function exec() { - setTimeout(function() { - // This should not happen, but we want to be safe. - /*istanbul ignore next */ - if (editLength > maxEditLength) { - return callback(); - } + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } - if (!execEditLength()) { - exec(); - } - }, 0); - }()); - } else { - while (editLength <= maxEditLength) { - var ret = execEditLength(); - if (ret) { - return ret; - } - } - } - }, + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; - pushComponent: function(components, added, removed) { - var last = components[components.length - 1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; - } else { - components.push({count: 1, added: added, removed: removed }); - } - }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, + dest.end(); + } - commonCount = 0; - while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { - newPos++; - oldPos++; - commonCount++; - } - if (commonCount) { - basePath.components.push({count: commonCount}); - } + function onclose() { + if (didOnEnd) return; + didOnEnd = true; - basePath.newPos = newPos; - return oldPos; - }, + if (typeof dest.destroy === 'function') dest.destroy(); + } - equals: function(left, right) { - var reWhitespace = /\S/; - return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); - }, - tokenize: function(value) { - return value.split(''); + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. } - }; + } - var CharDiff = new Diff(); + source.on('error', onerror); + dest.on('error', onerror); - var WordDiff = new Diff(true); - var WordWithSpaceDiff = new Diff(); - WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); - var CssDiff = new Diff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; + source.removeListener('end', onend); + source.removeListener('close', onclose); - var LineDiff = new Diff(); + source.removeListener('error', onerror); + dest.removeListener('error', onerror); - var TrimmedLineDiff = new Diff(); - TrimmedLineDiff.ignoreTrim = true; + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); - LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { - var retLines = [], - lines = value.split(/^/m); - for (var i = 0; i < lines.length; i++) { - var line = lines[i], - lastLine = lines[i - 1], - lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; + dest.removeListener('close', cleanup); + } - // Merge lines that may contain windows new lines - if (line === '\n' && lastLineLastChar === '\r') { - retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; - } else { - if (this.ignoreTrim) { - line = line.trim(); - // add a newline unless this is the last line. - if (i < lines.length - 1) { - line += '\n'; - } - } - retLines.push(line); - } - } + source.on('end', cleanup); + source.on('close', cleanup); - return retLines; - }; + dest.on('close', cleanup); - var PatchDiff = new Diff(); - PatchDiff.tokenize = function(value) { - var ret = [], - linesAndNewlines = value.split(/(\n|\r\n)/); + dest.emit('pipe', source); - // Ignore the final empty token that occurs if the string ends with a new line - if (!linesAndNewlines[linesAndNewlines.length - 1]) { - linesAndNewlines.pop(); - } + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; - // Merge the content and line separators into single tokens - for (var i = 0; i < linesAndNewlines.length; i++) { - var line = linesAndNewlines[i]; +},{"events":48,"inherits":51,"readable-stream/duplex.js":58,"readable-stream/passthrough.js":64,"readable-stream/readable.js":65,"readable-stream/transform.js":66,"readable-stream/writable.js":67}],69:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - if (i % 2) { - ret[ret.length - 1] += line; - } else { - ret.push(line); - } - } - return ret; - }; +var Buffer = require('buffer').Buffer; - var SentenceDiff = new Diff(); - SentenceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); - }; +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } - var JsonDiff = new Diff(); - // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a - // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: - JsonDiff.useLongestToken = true; - JsonDiff.tokenize = LineDiff.tokenize; - JsonDiff.equals = function(left, right) { - return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); - }; - var JsDiff = { - Diff: Diff, +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} - diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, - diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, - diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, - diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, - diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } - diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; - diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, - diffJson: function(oldObj, newObj, callback) { - return JsonDiff.diff( - typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), - typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), - callback - ); - }, - createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; - if (oldFileName == newFileName) { - ret.push('Index: ' + oldFileName); - } - ret.push('==================================================================='); - ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); - ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; - var diff = PatchDiff.diff(oldStr, newStr); - diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } - // Formats a given set of lines for printing as context lines in a patch - function contextLines(lines) { - return map(lines, function(entry) { return ' ' + entry; }); - } + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); - // Outputs the no newline at end of file warning if needed - function eofNL(curRange, i, current) { - var last = diff[diff.length - 2], - isLast = i === diff.length - 2, - isLastOfType = i === diff.length - 3 && current.added !== last.added; + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - // Figure out if this is the last line for the given file and missing NL - if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } - if (current.added || current.removed) { - // If we have previous context, start with that - if (!oldRangeStart) { - var prev = diff[i - 1]; - oldRangeStart = oldLine; - newRangeStart = newLine; + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } - // Output our changes - curRange.push.apply(curRange, map(lines, function(entry) { - return (current.added ? '+' : '-') + entry; - })); - eofNL(curRange, i, current); + charStr += buffer.toString(this.encoding, 0, end); - // Track the updated file position - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - // Identical context lines. Track line changes - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length - 2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) - + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) - + ' @@'); - ret.push.apply(ret, curRange); - ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); - if (lines.length <= 4) { - eofNL(ret, i, current); - } + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } - oldRangeStart = 0; - newRangeStart = 0; - curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - } + // or just emit the charStr + return charStr; +}; - return ret.join('\n') + '\n'; - }, +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); - }, + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; - applyPatch: function(oldStr, uniDiff) { - var diffstr = uniDiff.split('\n'), - hunks = [], - i = 0, - remEOFNL = false, - addEOFNL = false; + // See http://en.wikipedia.org/wiki/UTF-8#Description - // Skip to the first change hunk - while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { - i++; - } + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } - // Parse the unified diff - for (; i < diffstr.length; i++) { - if (diffstr[i][0] === '@') { - var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); - hunks.unshift({ - start: chnukHeader[3], - oldlength: +chnukHeader[2], - removed: [], - newlength: chnukHeader[4], - added: [] - }); - } else if (diffstr[i][0] === '+') { - hunks[0].added.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '-') { - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === ' ') { - hunks[0].added.push(diffstr[i].substr(1)); - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '\\') { - if (diffstr[i - 1][0] === '+') { - remEOFNL = true; - } else if (diffstr[i - 1][0] === '-') { - addEOFNL = true; - } - } - } + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } - // Apply the diff to the input - var lines = oldStr.split('\n'); - for (i = hunks.length - 1; i >= 0; i--) { - var hunk = hunks[i]; - // Sanity check the input string. Bail if we don't match. - for (var j = 0; j < hunk.oldlength; j++) { - if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { - return false; - } - } - Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); - } + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; - // Handle EOFNL insertion/removal - if (remEOFNL) { - while (!lines[lines.length - 1]) { - lines.pop(); - } - } else if (addEOFNL) { - lines.push(''); +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} + +},{"buffer":44}],70:[function(require,module,exports){ + +/** + * Expose `toIsoString`. + */ + +module.exports = toIsoString; + + +/** + * Turn a `date` into an ISO string. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + * + * @param {Date} date + * @return {String} + */ + +function toIsoString (date) { + return date.getUTCFullYear() + + '-' + pad(date.getUTCMonth() + 1) + + '-' + pad(date.getUTCDate()) + + 'T' + pad(date.getUTCHours()) + + ':' + pad(date.getUTCMinutes()) + + ':' + pad(date.getUTCSeconds()) + + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) + + 'Z'; +} + + +/** + * Pad a `number` with a ten's place zero. + * + * @param {Number} number + * @return {String} + */ + +function pad (number) { + var n = number.toString(); + return n.length === 1 ? '0' + n : n; +} +},{}],71:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); } - return lines.join('\n'); - }, + warned = true; + } + return fn.apply(this, arguments); + } - convertChangesToXML: function(changes) { - var ret = []; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } + return deprecated; +} - ret.push(escapeHTML(change.value)); +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],72:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],73:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); } - return ret.join(''); - }, + warned = true; + } + return fn.apply(this, arguments); + } - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - convertChangesToDMP: function(changes) { - var ret = [], - change, - operation; - for (var i = 0; i < changes.length; i++) { - change = changes[i]; - if (change.added) { - operation = 1; - } else if (change.removed) { - operation = -1; - } else { - operation = 0; - } + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; - ret.push([operation, change.value]); - } - return ret; - }, - canonicalize: canonicalize - }; +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; - /*istanbul ignore next */ - /*global module */ - if (typeof module !== 'undefined' && module.exports) { - module.exports = JsDiff; - } else if (typeof define === 'function' && define.amd) { - /*global define */ - define([], function() { return JsDiff; }); - } else if (typeof global.JsDiff === 'undefined') { - global.JsDiff = JsDiff; + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; } -}(this)); - -},{}],68:[function(require,module,exports){ -'use strict'; - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +} -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - return str.replace(matchOperatorsRe, '\\$&'); -}; +function stylizeNoColor(str, styleType) { + return str; +} -},{}],69:[function(require,module,exports){ -(function (process){ -// Growl - Copyright TJ Holowaychuk (MIT Licensed) -/** - * Module dependencies. - */ +function arrayToHash(array) { + var hash = {}; -var exec = require('child_process').exec - , fs = require('fs') - , path = require('path') - , exists = fs.existsSync || path.existsSync - , os = require('os') - , quote = JSON.stringify - , cmd; + array.forEach(function(val, idx) { + hash[val] = true; + }); -function which(name) { - var paths = process.env.PATH.split(':'); - var loc; - - for (var i = 0, len = paths.length; i < len; ++i) { - loc = path.join(paths[i], name); - if (exists(loc)) return loc; - } + return hash; } -switch(os.type()) { - case 'Darwin': - if (which('terminal-notifier')) { - cmd = { - type: "Darwin-NotificationCenter" - , pkg: "terminal-notifier" - , msg: '-message' - , title: '-title' - , subtitle: '-subtitle' - , priority: { - cmd: '-execute' - , range: [] - } - }; - } else { - cmd = { - type: "Darwin-Growl" - , pkg: "growlnotify" - , msg: '-m' - , sticky: '--sticky' - , priority: { - cmd: '--priority' - , range: [ - -2 - , -1 - , 0 - , 1 - , 2 - , "Very Low" - , "Moderate" - , "Normal" - , "High" - , "Emergency" - ] - } - }; + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); } - break; - case 'Linux': - cmd = { - type: "Linux" - , pkg: "notify-send" - , msg: '' - , sticky: '-t 0' - , icon: '-i' - , priority: { - cmd: '-u' - , range: [ - "low" - , "normal" - , "critical" - ] - } - }; - break; - case 'Windows_NT': - cmd = { - type: "Windows" - , pkg: "growlnotify" - , msg: '' - , sticky: '/s:true' - , title: '/t:' - , icon: '/i:' - , priority: { - cmd: '/p:' - , range: [ - -2 - , -1 - , 0 - , 1 - , 2 - ] - } - }; - break; -} + return ret; + } -/** - * Expose `growl`. - */ + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } -exports = module.exports = growl; + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); -/** - * Node-growl version. - */ + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } -exports.version = '1.4.1' + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } -/** - * Send growl notification _msg_ with _options_. - * - * Options: - * - * - title Notification title - * - sticky Make the notification stick (defaults to false) - * - priority Specify an int or named key (default is 0) - * - name Application name (defaults to growlnotify) - * - image - * - path to an icon sets --iconpath - * - path to an image sets --image - * - capitalized word sets --appIcon - * - filename uses extname as --icon - * - otherwise treated as --icon - * - * Examples: - * - * growl('New email') - * growl('5 new emails', { title: 'Thunderbird' }) - * growl('Email sent', function(){ - * // ... notification sent - * }) - * - * @param {string} msg - * @param {object} options - * @param {function} fn - * @api public - */ + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } -function growl(msg, options, fn) { - var image - , args - , options = options || {} - , fn = fn || function(){}; + var base = '', array = false, braces = ['{', '}']; - // noop - if (!cmd) return fn(new Error('growl not supported on this platform')); - args = [cmd.pkg]; + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } - // image - if (image = options.image) { - switch(cmd.type) { - case 'Darwin-Growl': - var flag, ext = path.extname(image).substr(1) - flag = flag || ext == 'icns' && 'iconpath' - flag = flag || /^[A-Z]/.test(image) && 'appIcon' - flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' - flag = flag || ext && (image = ext) && 'icon' - flag = flag || 'icon' - args.push('--' + flag, quote(image)) - break; - case 'Linux': - args.push(cmd.icon, quote(image)); - // libnotify defaults to sticky, set a hint for transient notifications - if (!options.sticky) args.push('--hint=int:transient:1'); - break; - case 'Windows': - args.push(cmd.icon + quote(image)); - break; - } + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; } - // sticky - if (options.sticky) args.push(cmd.sticky); + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } - // priority - if (options.priority) { - var priority = options.priority + ''; - var checkindexOf = cmd.priority.range.indexOf(priority); - if (~cmd.priority.range.indexOf(priority)) { - args.push(cmd.priority, options.priority); - } + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); } - // name - if (options.name && cmd.type === "Darwin-Growl") { - args.push('--name', options.name); + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); } - switch(cmd.type) { - case 'Darwin-Growl': - args.push(cmd.msg); - args.push(quote(msg)); - if (options.title) args.push(quote(options.title)); - break; - case 'Darwin-NotificationCenter': - args.push(cmd.msg); - args.push(quote(msg)); - if (options.title) { - args.push(cmd.title); - args.push(quote(options.title)); - } - if (options.subtitle) { - args.push(cmd.subtitle); - args.push(quote(options.subtitle)); - } - break; - case 'Darwin-Growl': - args.push(cmd.msg); - args.push(quote(msg)); - if (options.title) args.push(quote(options.title)); - break; - case 'Linux': - if (options.title) { - args.push(quote(options.title)); - args.push(cmd.msg); - args.push(quote(msg)); - } else { - args.push(quote(msg)); - } - break; - case 'Windows': - args.push(quote(msg)); - if (options.title) args.push(cmd.title + quote(options.title)); - break; + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; } - // execute - exec(args.join(' '), fn); -}; + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } -}).call(this,require('_process')) -},{"_process":51,"child_process":41,"fs":41,"os":50,"path":41}],70:[function(require,module,exports){ -(function (process){ -var path = require('path'); -var fs = require('fs'); -var _0777 = parseInt('0777', 8); + ctx.seen.push(value); -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } -function mkdirP (p, opts, f, made) { - if (typeof opts === 'function') { - f = opts; - opts = {}; - } - else if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; - } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - p = path.resolve(p); - - xfs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), opts, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, opts, cb, made); - }); - break; + ctx.seen.pop(); - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - xfs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - } - }); + return reduceToSingleString(output, base, braces); } -mkdirP.sync = function sync (p, opts, made) { - if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); } - if (!made) made = null; + }); + return output; +} - p = path.resolve(p); - try { - xfs.mkdirSync(p, mode); - made = made || p; +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), opts, made); - sync(p, opts, made); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = xfs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); } + } + + return name + ': ' + str; +} - return made; -}; -}).call(this,require('_process')) -},{"_process":51,"fs":41,"path":41}],71:[function(require,module,exports){ -(function (process,global){ -/** - * Shim process.stdout. - */ +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); -process.stdout = require('browser-stdout')(); + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } -var Mocha = require('../'); + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} -/** - * Create a Mocha instance. - * - * @return {undefined} - */ -var mocha = new Mocha({ reporter: 'html' }); +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; -var Date = global.Date; -var setTimeout = global.setTimeout; -var setInterval = global.setInterval; -var clearTimeout = global.clearTimeout; -var clearInterval = global.clearInterval; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -var uncaughtExceptionHandlers = []; +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; -var originalOnerrorHandler = global.onerror; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; -/** - * Remove uncaughtException listener. - * Revert to original onerror handler if previously defined. - */ +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; -process.removeListener = function(e, fn){ - if ('uncaughtException' == e) { - if (originalOnerrorHandler) { - global.onerror = originalOnerrorHandler; - } else { - global.onerror = function() {}; - } - var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn); - if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); } - } -}; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; -/** - * Implements uncaughtException listener. - */ +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -process.on = function(e, fn){ - if ('uncaughtException' == e) { - global.onerror = function(err, url, line){ - fn(new Error(err + ' (' + url + ':' + line + ')')); - return !mocha.allowUncaught; - }; - uncaughtExceptionHandlers.push(fn); - } -}; +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; -// The BDD UI is registered by default, but no UI will be functional in the -// browser without an explicit call to the overridden `mocha.ui` (see below). -// Ensure that this default UI does not expose its methods to the global scope. -mocha.suite.removeAllListeners('pre-require'); +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; -var immediateQueue = [] - , immediateTimeout; +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -function timeslice() { - var immediateStart = new Date().getTime(); - while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { - immediateQueue.shift()(); - } - if (immediateQueue.length) { - immediateTimeout = setTimeout(timeslice, 0); - } else { - immediateTimeout = null; - } +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); } +exports.isError = isError; -/** - * High-performance override of Runner.immediately. - */ +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; -Mocha.Runner.immediately = function(callback) { - immediateQueue.push(callback); - if (!immediateTimeout) { - immediateTimeout = setTimeout(timeslice, 0); - } -}; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; -/** - * Function to allow assertion libraries to throw errors directly into mocha. - * This is useful when running tests in a browser because window.onerror will - * only receive the 'message' attribute of the Error. - */ -mocha.throwError = function(err) { - Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) { - fn(err); - }); - throw err; -}; +exports.isBuffer = require('./support/isBuffer'); -/** - * Override ui to ensure that the ui functions are initialized. - * Normally this would happen in Mocha.prototype.loadFiles. - */ +function objectToString(o) { + return Object.prototype.toString.call(o); +} -mocha.ui = function(ui){ - Mocha.prototype.ui.call(this, ui); - this.suite.emit('pre-require', global, null, this); - return this; -}; -/** - * Setup mocha with the given setting options. - */ +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} -mocha.setup = function(opts){ - if ('string' == typeof opts) opts = { ui: opts }; - for (var opt in opts) this[opt](opts[opt]); - return this; -}; -/** - * Run mocha, returning the Runner. - */ +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; -mocha.run = function(fn){ - var options = mocha.options; - mocha.globals('location'); +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} - var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(new RegExp(query.grep)); - if (query.fgrep) mocha.grep(query.fgrep); - if (query.invert) mocha.invert(); - return Mocha.prototype.run.call(mocha, function(err){ - // The DOM Document is not available in Web Workers. - var document = global.document; - if (document && document.getElementById('mocha') && options.noHighlighting !== true) { - Mocha.utils.highlightTags('code'); - } - if (fn) fn(err); - }); +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; + /** - * Expose the process shim. - * https://github.com/mochajs/mocha/pull/916 + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. */ +exports.inherits = require('inherits'); -Mocha.process = process; +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; -/** - * Expose mocha. - */ + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; -global.Mocha = Mocha; -global.mocha = mocha; +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../":1,"_process":51,"browser-stdout":40}]},{},[71]); +},{"./support/isBuffer":72,"_process":57,"inherits":51}]},{},[1]); diff --git a/package.json b/package.json index 49b780cc18..b88346af6a 100644 --- a/package.json +++ b/package.json @@ -250,7 +250,8 @@ "Jordan Sexton ", "Jussi Virtanen ", "Katie Gengler ", - "Kazuhito Hokamura " + "Kazuhito Hokamura ", + "Scott Santucci " ], "license": "MIT", "repository": { @@ -266,7 +267,7 @@ "node": ">= 0.8.x" }, "scripts": { - "test": "make test-all" + "test": "make test" }, "dependencies": { "commander": "2.3.0", @@ -281,11 +282,22 @@ }, "devDependencies": { "browser-stdout": "^1.2.0", - "browserify": "10.2.4", + "browserify": "^13.0.0", "coffee-script": "~1.8.0", "eslint": "^1.2.1", + "expect.js": "^0.3.1", + "karma": "^0.13.22", + "karma-browserify": "^5.0.5", + "karma-expect": "^1.1.2", + "karma-no-mocha": "^2.0.0", + "karma-phantomjs-launcher": "^0.2.3", + "karma-sauce-launcher": "^1.0.0", + "karma-spec-reporter": "0.0.26", + "phantomjs": "1.9.8", "should": "~8.0.0", - "through2": "~0.6.5" + "through2": "~0.6.5", + "to-iso-string": "0.0.2", + "watchify": "^3.7.0" }, "files": [ "bin", @@ -299,7 +311,8 @@ "browser": { "debug": "./lib/browser/debug.js", "events": "./lib/browser/events.js", - "tty": "./lib/browser/tty.js" + "tty": "./lib/browser/tty.js", + "./index.js": "./browser-entry.js" }, "licenses": [ { diff --git a/scripts/ensure-compatible-npm.sh b/scripts/ensure-compatible-npm.sh deleted file mode 100755 index 9ae26c1ac0..0000000000 --- a/scripts/ensure-compatible-npm.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env sh - -set -o nounset -set -o errexit - -npm install semver -if node -e "process.exit(require('semver').lt(process.argv[1], '1.3.7') ? 0 : 1)" $(npm -v); then - # make sure dependencies install with provided npm version - npm install --production - npm install -g npm@2 - npm install -g npm -fi -npm uninstall semver diff --git a/scripts/upgrade-npm.js b/scripts/upgrade-npm.js new file mode 100644 index 0000000000..2e8be81e0a --- /dev/null +++ b/scripts/upgrade-npm.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node + +/** + * This upgrades npm on Travis when using Node.js 0.8x + */ + +if (process.env.TRAVIS_NODE_VERSION === '0.8') { + var exec = require('child_process').exec; + // ensure *dependencies* can be installed using provided npm + exec('npm install --production', function (err) { + if (err) { + throw new Error(err); + } + exec('npm install --global npm@2', function (err) { + if (err) { + throw new Error(err); + } + console.log('Upgraded to npm@2'); + }); + }); +} diff --git a/test/acceptance/context.js b/test/acceptance/context.js index 47c2db7083..69dea139c9 100644 --- a/test/acceptance/context.js +++ b/test/acceptance/context.js @@ -9,18 +9,18 @@ describe('Context', function(){ }) it('should work', function(){ - this.calls.should.eql(['before', 'before two']); + expect(this.calls).to.eql(['before', 'before two']); this.calls.push('test'); }) after(function(){ - this.calls.should.eql(['before', 'before two', 'test']); + expect(this.calls).to.eql(['before', 'before two', 'test']); this.calls.push('after two'); }) }) after(function(){ - this.calls.should.eql(['before', 'before two', 'test', 'after two']); + expect(this.calls).to.eql(['before', 'before two', 'test', 'after two']); }) }) @@ -36,7 +36,7 @@ describe('Context Siblings', function(){ }) it('should work', function(){ - this.hiddenFromSibling.should.eql('This should be hidden') + expect(this.hiddenFromSibling).to.eql('This should be hidden') }) }) @@ -46,27 +46,27 @@ describe('Context Siblings', function(){ }) it('should not have value set within a sibling describe', function(){ - 'This should be hidden'.should.not.eql(this.hiddenFromSibling); + expect('This should be hidden').not.to.eql(this.hiddenFromSibling); this.visibleFromTestSibling = 'Visible from test sibling'; }) it('should allow test siblings to modify shared context', function(){ - 'Visible from test sibling'.should.eql(this.visibleFromTestSibling); + expect('Visible from test sibling').to.eql(this.visibleFromTestSibling); }) it('should have reset this.calls before describe', function(){ - this.calls.should.eql(['before', 'before sibling']); + expect(this.calls).to.eql(['before', 'before sibling']); }) }) after(function(){ - this.calls.should.eql(['before', 'before sibling']); + expect(this.calls).to.eql(['before', 'before sibling']); }) }) describe('timeout()', function(){ it('should return the timeout', function(){ - this.timeout().should.equal(200); + expect(this.timeout()).to.equal(200); }); }); diff --git a/test/acceptance/http.js b/test/acceptance/http.js index 1dfa9146a4..43b8588508 100644 --- a/test/acceptance/http.js +++ b/test/acceptance/http.js @@ -9,7 +9,7 @@ server.listen(8888); describe('http', function(){ it('should provide an example', function(done){ http.get({ path: '/', port: 8888 }, function(res){ - res.should.have.property('statusCode', 200); + expect(res).to.have.property('statusCode', 200); done(); }) }) diff --git a/test/acceptance/interfaces/bdd.js b/test/acceptance/interfaces/bdd.js index bea1db2295..ba444c8f7f 100644 --- a/test/acceptance/interfaces/bdd.js +++ b/test/acceptance/interfaces/bdd.js @@ -1,34 +1,32 @@ -describe('Array', function(){ - describe('#indexOf()', function(){ - it('should return -1 when the value is not present', function(){ - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); +describe('integer primitives', function(){ + describe('arithmetic', function(){ + it('should add', function(){ + expect(1 + 1).to.equal(2); + expect(2 + 2).to.equal(4); }) - it('should return the correct index when the value is present', function(){ - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); + it('should subtract', function(){ + expect(1 - 1).to.equal(0); + expect(2 - 1).to.equal(1); }) }) }) -describe('Array', function(){ - describe('#pop()', function(){ - it('should remove and return the last value', function(){ - var arr = [1,2,3]; - arr.pop().should.equal(3); - arr.should.eql([1,2]); +describe('integer primitives', function(){ + describe('arithmetic is not', function(){ + it('should add', function(){ + expect(1 + 1).not.to.equal(3); + expect(2 + 2).not.to.equal(5); }) }) }) -context('Array', function(){ +context('test suite', function(){ beforeEach(function(){ - this.arr = [1,2,3]; + this.number = 5; }) - specify('has a length property', function(){ - this.arr.length.should.equal(3); + specify('share a property', function(){ + expect(this.number).to.equal(5); }) }) diff --git a/test/acceptance/interfaces/exports.js b/test/acceptance/interfaces/exports.js index 38093d50ea..08db71200b 100644 --- a/test/acceptance/interfaces/exports.js +++ b/test/acceptance/interfaces/exports.js @@ -7,7 +7,7 @@ exports.Array = { after: function(){ calls.push('after'); - calls.should.eql([ + expect(calls).to.eql([ 'before' , 'before each' , 'one' @@ -29,15 +29,15 @@ exports.Array = { 'should return -1 when the value is not present': function(){ calls.push('one'); - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); + expect([1,2,3].indexOf(5)).to.equal(-1); + expect([1,2,3].indexOf(0)).to.equal(-1); }, 'should return the correct index when the value is present': function(){ calls.push('two'); - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); + expect([1,2,3].indexOf(1)).to.equal(0); + expect([1,2,3].indexOf(2)).to.equal(1); + expect([1,2,3].indexOf(3)).to.equal(2); } } }; diff --git a/test/acceptance/interfaces/qunit.js b/test/acceptance/interfaces/qunit.js index 48aa21d602..d452e769c5 100644 --- a/test/acceptance/interfaces/qunit.js +++ b/test/acceptance/interfaces/qunit.js @@ -2,18 +2,18 @@ function ok(expr, msg) { if (!expr) throw new Error(msg); } -suite('Array'); +suite('integer primitives'); -test('#length', function(){ - var arr = [1,2,3]; - ok(arr.length == 3); +test('should add', function(){ + var number = 2 + 2; + ok(number == 4); }); -test('#indexOf()', function(){ - var arr = [1,2,3]; - ok(arr.indexOf(1) == 0); - ok(arr.indexOf(2) == 1); - ok(arr.indexOf(3) == 2); +test('should decrement', function(){ + var number = 3; + ok(--number == 2); + ok(--number == 1); + ok(--number == 0); }); suite('String'); diff --git a/test/acceptance/interfaces/tdd.js b/test/acceptance/interfaces/tdd.js index 1c6885ed42..7ad079e36d 100644 --- a/test/acceptance/interfaces/tdd.js +++ b/test/acceptance/interfaces/tdd.js @@ -1,40 +1,39 @@ -suite('Array', function(){ - suite('#indexOf()', function(){ - var initialValue = 32; +suite('integer primitives', function(){ + suite('arithmetic', function(){ + var initialValue = 41; suiteSetup(function(done){ - initialValue.should.eql(32); - initialValue = 42; + expect(initialValue).to.eql(41); + initialValue += 1; done(); }); - test('should return -1 when the value is not present', function(){ - initialValue.should.eql(42); - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); + test('should add', function(){ + expect(initialValue).to.eql(42); + expect(1 + 1).to.equal(2); + expect(2 + 2).to.equal(4); }); - test('should return the correct index when the value is present', function(){ - initialValue.should.eql(42); - [1,2,3].indexOf(1).should.equal(0); - [1,2,3].indexOf(2).should.equal(1); - [1,2,3].indexOf(3).should.equal(2); + test('should subtract', function(){ + expect(initialValue).to.eql(42); + expect(1 - 1).to.equal(0); + expect(2 - 1).to.equal(1); }); test.skip('should skip this test', function(){ var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); suite.skip('should skip this suite', function(){ test('should skip this test', function(){ var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); }); suiteTeardown(function(done){ - initialValue.should.eql(42); + expect(initialValue).to.eql(42); done(); }); }); diff --git a/test/acceptance/lookup-files.js b/test/acceptance/lookup-files.js new file mode 100644 index 0000000000..504d23aab1 --- /dev/null +++ b/test/acceptance/lookup-files.js @@ -0,0 +1,56 @@ +var utils = require('../../lib/utils'); + +describe('lookupFiles', function() { + var fs = require('fs'), path = require('path'), existsSync = fs.existsSync || + path.existsSync; + + beforeEach(function() { + fs.writeFileSync('/tmp/mocha-utils.js', 'yippy skippy ying yang yow'); + fs.symlinkSync('/tmp/mocha-utils.js', '/tmp/mocha-utils-link.js'); + }); + + it('should not choke on symlinks', function() { + expect(utils.lookupFiles('/tmp', ['js'], false)) + .to + .contain('/tmp/mocha-utils-link.js') + .and + .contain('/tmp/mocha-utils.js') + .and + .have + .length(2); + expect(existsSync('/tmp/mocha-utils-link.js')) + .to + .be(true); + fs.renameSync('/tmp/mocha-utils.js', '/tmp/bob'); + expect(existsSync('/tmp/mocha-utils-link.js')) + .to + .be(false); + expect(utils.lookupFiles('/tmp', ['js'], false)) + .to + .eql([]); + }); + + it('should accept a glob "path" value', function() { + expect(utils.lookupFiles('/tmp/mocha-utils*', ['js'], false)) + .to + .contain('/tmp/mocha-utils-link.js') + .and + .contain('/tmp/mocha-utils.js') + .and + .have + .length(2); + }); + + afterEach(function() { + [ + '/tmp/mocha-utils.js', + '/tmp/mocha-utils-link.js', + '/tmp/bob' + ].forEach(function(path) { + try { + fs.unlinkSync(path); + } catch (ignored) { + } + }); + }); +}); diff --git a/test/acceptance/misc/only/bdd.js b/test/acceptance/misc/only/bdd.js index ff14dcdfe3..bb05ad9792 100644 --- a/test/acceptance/misc/only/bdd.js +++ b/test/acceptance/misc/only/bdd.js @@ -1,14 +1,14 @@ describe('should only run .only test in this bdd suite', function() { it('should not run this test', function() { var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); it.only('should run this test', function() { var zero = 0; - zero.should.equal(0, 'this .only test should run'); + expect(zero).to.equal(0, 'this .only test should run'); }); it('should run this test, not (includes the title of the .only test)', function() { var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); }); diff --git a/test/acceptance/misc/only/tdd.js b/test/acceptance/misc/only/tdd.js index cb6429a3d6..306d06a9f9 100644 --- a/test/acceptance/misc/only/tdd.js +++ b/test/acceptance/misc/only/tdd.js @@ -1,14 +1,14 @@ suite('should only run .only test in this tdd suite', function() { test('should not run this test', function() { var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); test.only('should run this test', function() { var zero = 0; - zero.should.equal(0, 'this .only test should run'); + expect(zero).to.equal(0, 'this .only test should run'); }); test('should run this test, not (includes the title of the .only test)', function() { var zero = 0; - zero.should.equal(1, 'this test should have been skipped'); + expect(zero).to.equal(1, 'this test should have been skipped'); }); }); diff --git a/test/acceptance/require/require.js b/test/acceptance/require/require.js index 20f3e6d6ef..22570e62ff 100644 --- a/test/acceptance/require/require.js +++ b/test/acceptance/require/require.js @@ -1,9 +1,9 @@ describe('require test', function(){ it('should require args in order', function(){ var req = global.required; - req.indexOf('a.js').should.equal(0); - req.indexOf('b.coffee').should.equal(1); - req.indexOf('c.js').should.equal(2); - req.indexOf('d.coffee').should.equal(3); + expect(req.indexOf('a.js')).to.equal(0); + expect(req.indexOf('b.coffee')).to.equal(1); + expect(req.indexOf('c.js')).to.equal(2); + expect(req.indexOf('d.coffee')).to.equal(3); }) }); diff --git a/test/acceptance/root.js b/test/acceptance/root.js index 17738302da..037e6a328a 100644 --- a/test/acceptance/root.js +++ b/test/acceptance/root.js @@ -6,6 +6,6 @@ before(function(){ describe('root', function(){ it('should be a valid suite', function(){ - calls.should.eql(['before']); + expect(calls).to.eql(['before']); }) }) diff --git a/test/acceptance/test.coffee b/test/acceptance/test.coffee index 8260940a1e..b8e309f515 100644 --- a/test/acceptance/test.coffee +++ b/test/acceptance/test.coffee @@ -3,4 +3,4 @@ obj = foo: 'bar' describe 'coffeescript', -> it 'should work', -> - obj.should.eql foo: 'bar' + expect(obj).to.eql foo: 'bar' diff --git a/test/acceptance/throw.js b/test/acceptance/throw.js index ac74f22c4a..1016a19efe 100644 --- a/test/acceptance/throw.js +++ b/test/acceptance/throw.js @@ -1,7 +1,6 @@ -var mocha = require('../../') - , Suite = mocha.Suite - , Runner = mocha.Runner - , Test = mocha.Test; +var Suite = require('../../lib/suite'); +var Test = require('../../lib/test'); +var Runner = require('../../lib/runner'); describe('a test that throws', function () { var suite, runner; @@ -10,9 +9,7 @@ describe('a test that throws', function () { suite = new Suite(null, 'root'); runner = new Runner(suite); }) - - this.timeout(50); - + describe('undefined', function (){ it('should not pass if throwing sync and test is sync', function(done) { var test = new Test('im sync and throw undefined sync', function(){ @@ -21,8 +18,8 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); @@ -36,8 +33,8 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); @@ -53,8 +50,8 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); @@ -69,8 +66,8 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); @@ -84,8 +81,8 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); @@ -101,11 +98,11 @@ describe('a test that throws', function () { suite.addTest(test); runner = new Runner(suite); runner.on('end', function(){ - runner.failures.should.equal(1); - test.state.should.equal('failed'); + expect(runner.failures).to.equal(1); + expect(test.state).to.equal('failed'); done(); }); runner.run(); }) }) -}) \ No newline at end of file +}) diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index 2028d4870b..366d2d8579 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -1,4 +1,5 @@ var utils = require('../../lib/utils'); +var toISOString = require('to-iso-string'); describe('lib/utils', function () { describe('clean', function () { @@ -8,7 +9,7 @@ describe('lib/utils', function () { , " var a = 1;" , "}" ].join("\n"); - utils.clean(fn).should.equal("var a = 1;"); + expect(utils.clean(fn)).to.equal("var a = 1;"); }); it("should format a multi line test indented with spaces", function () { @@ -18,7 +19,7 @@ describe('lib/utils', function () { , " var b = 2;" // this one has more spaces , " var c = 3; }" ].join("\n"); - utils.clean(fn).should.equal("var a = 1;\n var b = 2;\nvar c = 3;"); + expect(utils.clean(fn)).to.equal("var a = 1;\n var b = 2;\nvar c = 3;"); }); it("should format a multi line test indented with tabs", function () { @@ -29,7 +30,7 @@ describe('lib/utils', function () { , "\t}" , "}" ].join("\n"); - utils.clean(fn).should.equal("if (true) {\n\tvar a = 1;\n}"); + expect(utils.clean(fn)).to.equal("if (true) {\n\tvar a = 1;\n}"); }); it("should format functions saved in windows style - spaces", function () { @@ -40,7 +41,7 @@ describe('lib/utils', function () { , " } while (false);" , ' }' ].join("\r\n"); - utils.clean(fn).should.equal('do {\n "nothing";\n} while (false);'); + expect(utils.clean(fn)).to.equal('do {\n "nothing";\n} while (false);'); }); it("should format functions saved in windows style - tabs", function () { @@ -53,7 +54,7 @@ describe('lib/utils', function () { , "\t}" , "}" ].join("\r\n"); - utils.clean(fn).should.equal("if (false) {\n\tvar json = {\n\t\tone : 1\n\t};\n}"); + expect(utils.clean(fn)).to.equal("if (false) {\n\tvar json = {\n\t\tone : 1\n\t};\n}"); }); it("should format es6 arrow functions", function () { @@ -62,12 +63,12 @@ describe('lib/utils', function () { " var a = 1;", "}" ].join("\n"); - utils.clean(fn).should.equal("var a = 1;"); + expect(utils.clean(fn)).to.equal("var a = 1;"); }); it("should format es6 arrow functions with implicit return", function () { var fn = "() => foo()"; - utils.clean(fn).should.equal("foo()"); + expect(utils.clean(fn)).to.equal("foo()"); }); }); @@ -76,40 +77,48 @@ describe('lib/utils', function () { var stringify = utils.stringify; it('should return Buffer with .toJSON representation', function() { - stringify(new Buffer([0x01])).should.equal('[\n 1\n]'); - stringify(new Buffer([0x01, 0x02])).should.equal('[\n 1\n 2\n]'); + expect(stringify(new Buffer([0x01]))).to.equal('[\n 1\n]'); + expect(stringify(new Buffer([0x01, 0x02]))).to.equal('[\n 1\n 2\n]'); - stringify(new Buffer('ABCD')).should.equal('[\n 65\n 66\n 67\n 68\n]'); + expect(stringify(new Buffer('ABCD'))).to.equal('[\n 65\n 66\n 67\n 68\n]'); }); it('should return Date object with .toISOString() + string prefix', function() { - stringify(new Date(0)).should.equal('[Date: ' + new Date(0).toISOString() + ']'); + expect(stringify(new Date(0))).to.equal('[Date: ' + shimToISOString(new Date(0)) + ']'); var date = new Date(); // now - stringify(date).should.equal('[Date: ' + date.toISOString() + ']'); + expect(stringify(date)).to.equal('[Date: ' + shimToISOString(date) + ']'); + + function shimToISOString(date) { + if (date.toISOString) { + return date.toISOString(); + } else { + return toISOString(date); + } + } }); it('should return invalid Date object with .toString() + string prefix', function() { - stringify(new Date('')).should.equal('[Date: ' + new Date('').toString() + ']'); + expect(stringify(new Date(''))).to.equal('[Date: ' + new Date('').toString() + ']'); }); describe('#Number', function() { it('should show the handle -0 situations', function() { - stringify(-0).should.eql('-0'); - stringify(0).should.eql('0'); - stringify('-0').should.eql('"-0"'); + expect(stringify(-0)).to.eql('-0'); + expect(stringify(0)).to.eql('0'); + expect(stringify('-0')).to.eql('"-0"'); }); it('should work well with `NaN` and `Infinity`', function() { - stringify(NaN).should.equal('NaN'); - stringify(Infinity).should.equal('Infinity'); - stringify(-Infinity).should.equal('-Infinity'); + expect(stringify(NaN)).to.equal('NaN'); + expect(stringify(Infinity)).to.equal('Infinity'); + expect(stringify(-Infinity)).to.equal('-Infinity'); }); it('floats and ints', function() { - stringify(1).should.equal('1'); - stringify(1.2).should.equal('1.2'); - stringify(1e9).should.equal('1000000000'); + expect(stringify(1)).to.equal('1'); + expect(stringify(1.2)).to.equal('1.2'); + expect(stringify(1e9)).to.equal('1000000000'); }); }); @@ -184,7 +193,7 @@ describe('lib/utils', function () { , ' "undef": [undefined]' , ' "zero": -0' , '}'].join('\n'); - stringify(expected).should.equal(actual); + expect(stringify(expected)).to.equal(actual); }); }); @@ -192,28 +201,28 @@ describe('lib/utils', function () { var travis = { name: 'travis', age: 24 }; var travis2 = { age: 24, name: 'travis' }; - stringify(travis).should.equal(stringify(travis2)); + expect(stringify(travis)).to.equal(stringify(travis2)); }); it('should handle circular structures in objects', function(){ var travis = { name: 'travis' }; travis.whoami = travis; - stringify(travis).should.equal('{\n "name": "travis"\n "whoami": [Circular]\n}'); + expect(stringify(travis)).to.equal('{\n "name": "travis"\n "whoami": [Circular]\n}'); }); it('should handle circular structures in arrays', function(){ var travis = ['travis']; travis.push(travis); - stringify(travis).should.equal('[\n "travis"\n [Circular]\n]'); + expect(stringify(travis)).to.equal('[\n "travis"\n [Circular]\n]'); }); it('should handle circular structures in functions', function(){ var travis = function () {}; travis.fn = travis; - stringify(travis).should.equal('{\n "fn": [Circular]\n}'); + expect(stringify(travis)).to.equal('{\n "fn": [Circular]\n}'); }); @@ -222,46 +231,44 @@ describe('lib/utils', function () { regExpObj = { regexp: regexp }, regexpString = '/(?:)/'; - stringify(regExpObj).should.equal('{\n "regexp": ' + regexpString + '\n}'); - stringify(regexp).should.equal(regexpString); + expect(stringify(regExpObj)).to.equal('{\n "regexp": ' + regexpString + '\n}'); + expect(stringify(regexp)).to.equal(regexpString); var number = 1, numberObj = { number: number }, numberString = '1'; - stringify(numberObj).should.equal('{\n "number": ' + number + '\n}'); - stringify(number).should.equal(numberString); + expect(stringify(numberObj)).to.equal('{\n "number": ' + number + '\n}'); + expect(stringify(number)).to.equal(numberString); var boolean = false, booleanObj = { boolean: boolean }, booleanString = 'false'; - stringify(booleanObj).should.equal('{\n "boolean": ' + boolean + '\n}'); - stringify(boolean).should.equal(booleanString); + expect(stringify(booleanObj)).to.equal('{\n "boolean": ' + boolean + '\n}'); + expect(stringify(boolean)).to.equal(booleanString); var string = 'sneepy', stringObj = { string: string }; - stringify(stringObj).should.equal('{\n "string": "' + string + '"\n}'); - stringify(string).should.equal(JSON.stringify(string)); + expect(stringify(stringObj)).to.equal('{\n "string": "' + string + '"\n}'); + expect(stringify(string)).to.equal(JSON.stringify(string)); var nullValue = null, nullObj = { 'null': null }, nullString = '[null]'; - stringify(nullObj).should.equal('{\n "null": [null]\n}'); - stringify(nullValue).should.equal(nullString); + expect(stringify(nullObj)).to.equal('{\n "null": [null]\n}'); + expect(stringify(nullValue)).to.equal(nullString); }); it('should handle arrays', function () { var array = ['dave', 'dave', 'dave', 'dave'], arrayObj = {array: array}, - arrayString = array.map(function () { - return ' "dave"'; - }).join('\n'); + arrayString = ' "dave"\n "dave"\n "dave"\n "dave"' - stringify(arrayObj).should.equal('{\n "array": [\n' + arrayString + '\n ]\n}'); - stringify(array).should.equal('[' + arrayString.replace(/\s+/g, '\n ') + '\n]'); + expect(stringify(arrayObj)).to.equal('{\n "array": [\n' + arrayString + '\n ]\n}'); + expect(stringify(array)).to.equal('[' + arrayString.replace(/\s+/g, '\n ') + '\n]'); }); it('should handle functions', function () { @@ -269,159 +276,126 @@ describe('lib/utils', function () { fnObj = {fn: fn}, fnString = '[Function]'; - stringify(fnObj).should.equal('{\n "fn": ' + fnString + '\n}'); - stringify(fn).should.equal('[Function]'); + expect(stringify(fnObj)).to.equal('{\n "fn": ' + fnString + '\n}'); + expect(stringify(fn)).to.equal('[Function]'); }); it('should handle empty objects', function () { - stringify({}).should.equal('{}'); - stringify({foo: {}}).should.equal('{\n "foo": {}\n}'); + expect(stringify({})).to.equal('{}'); + expect(stringify({foo: {}})).to.equal('{\n "foo": {}\n}'); }); it('should handle empty arrays', function () { - stringify([]).should.equal('[]'); - stringify({foo: []}).should.equal('{\n "foo": []\n}'); + expect(stringify([])).to.equal('[]'); + expect(stringify({foo: []})).to.equal('{\n "foo": []\n}'); }); it('should handle non-empty arrays', function () { - stringify(['a', 'b', 'c']).should.equal('[\n "a"\n "b"\n "c"\n]') + expect(stringify(['a', 'b', 'c'])).to.equal('[\n "a"\n "b"\n "c"\n]') }); it('should handle empty functions (with no properties)', function () { - stringify(function(){}).should.equal('[Function]'); - stringify({foo: function() {}}).should.equal('{\n "foo": [Function]\n}'); - stringify({foo: function() {}, bar: 'baz'}).should.equal('{\n "bar": "baz"\n "foo": [Function]\n}'); + expect(stringify(function(){})).to.equal('[Function]'); + expect(stringify({foo: function() {}})).to.equal('{\n "foo": [Function]\n}'); + expect(stringify({foo: function() {}, bar: 'baz'})).to.equal('{\n "bar": "baz"\n "foo": [Function]\n}'); }); it('should handle functions w/ properties', function () { var fn = function(){}; fn.bar = 'baz'; - stringify(fn).should.equal('{\n "bar": "baz"\n}'); - stringify({foo: fn}).should.equal('{\n "foo": {\n "bar": "baz"\n }\n}'); + expect(stringify(fn)).to.equal('{\n "bar": "baz"\n}'); + expect(stringify({foo: fn})).to.equal('{\n "foo": {\n "bar": "baz"\n }\n}'); }); it('should handle undefined values', function () { - stringify({foo: undefined}).should.equal('{\n "foo": [undefined]\n}'); - stringify({foo: 'bar', baz: undefined}).should.equal('{\n "baz": [undefined]\n "foo": "bar"\n}'); - stringify().should.equal('[undefined]'); + expect(stringify({foo: undefined})).to.equal('{\n "foo": [undefined]\n}'); + expect(stringify({foo: 'bar', baz: undefined})).to.equal('{\n "baz": [undefined]\n "foo": "bar"\n}'); + expect(stringify()).to.equal('[undefined]'); }); it('should recurse', function () { - stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}}).should.equal('{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}'); + expect(stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}})).to.equal('{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}'); }); it('might get confusing', function () { - stringify(null).should.equal('[null]'); + expect(stringify(null)).to.equal('[null]'); }); it('should not freak out if it sees a primitive twice', function () { - stringify({foo: null, bar: null}).should.equal('{\n "bar": [null]\n "foo": [null]\n}'); - stringify({foo: 1, bar: 1}).should.equal('{\n "bar": 1\n "foo": 1\n}'); + expect(stringify({foo: null, bar: null})).to.equal('{\n "bar": [null]\n "foo": [null]\n}'); + expect(stringify({foo: 1, bar: 1})).to.equal('{\n "bar": 1\n "foo": 1\n}'); }); it('should stringify dates', function () { var date = new Date(0); - stringify(date).should.equal('[Date: 1970-01-01T00:00:00.000Z]'); - stringify({date: date}).should.equal('{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}'); + expect(stringify(date)).to.equal('[Date: 1970-01-01T00:00:00.000Z]'); + expect(stringify({date: date})).to.equal('{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}'); }); it('should handle object without an Object prototype', function () { - var a = Object.create(null); + var a; + if (Object.create) { + a = Object.create(null); + } else { + a = {}; + } a.foo = 1; - stringify(a).should.equal('{\n "foo": 1\n}'); + expect(stringify(a)).to.equal('{\n "foo": 1\n}'); }); // In old version node.js, Symbol is not available by default. if (typeof global.Symbol === 'function') { it('should handle Symbol', function () { var symbol = Symbol('value'); - stringify(symbol).should.equal('Symbol(value)'); - stringify({symbol: symbol}).should.equal('{\n "symbol": Symbol(value)\n}') + expect(stringify(symbol)).to.equal('Symbol(value)'); + expect(stringify({symbol: symbol})).to.equal('{\n "symbol": Symbol(value)\n}') }); } it('should handle length properties that cannot be coerced to a number', function () { - stringify({length: {toString: 0}}).should.equal('{\n "length": {\n "toString": 0\n }\n}'); + expect(stringify({length: {nonBuiltinProperty: 0}})).to.equal('{\n "length": {\n "nonBuiltinProperty": 0\n }\n}'); + expect(stringify({length: "a string where length should be"})).to.equal('{\n "length": "a string where length should be"\n}'); }); }); describe('type', function () { var type = utils.type; - it('should recognize various types', function () { - type({}).should.equal('object'); - type([]).should.equal('array'); - type(1).should.equal('number'); - type(Infinity).should.equal('number'); - type(null).should.equal('null'); - type(undefined).should.equal('undefined'); - type(new Date()).should.equal('date'); - type(/foo/).should.equal('regexp'); - type('type').should.equal('string'); - type(global).should.equal('global'); - type(true).should.equal('boolean'); - }); - - describe('when toString on null or undefined stringifies window', function () { - var toString = Object.prototype.toString; + var toString = Object.prototype.toString; - beforeEach(function () { - // some JS engines such as PhantomJS 1.x exhibit this behavior - Object.prototype.toString = function () { + beforeEach(function() { + // some JS engines such as PhantomJS 1.x exhibit this behavior + Object.prototype.toString = function() { + if (this === global) { return '[object DOMWindow]'; - }; - }); - - it('should recognize null and undefined', function () { - type(null).should.equal('null'); - type(undefined).should.equal('undefined'); - }); - - afterEach(function () { - Object.prototype.toString = toString; - }); - }); - }); - - describe('lookupFiles', function () { - var fs = require('fs'), - path = require('path'), - existsSync = fs.existsSync || path.existsSync; - - beforeEach(function () { - fs.writeFileSync('/tmp/mocha-utils.js', 'yippy skippy ying yang yow'); - fs.symlinkSync('/tmp/mocha-utils.js', '/tmp/mocha-utils-link.js'); + } + return toString.call(this); + }; }); - it('should not choke on symlinks', function () { - utils.lookupFiles('/tmp', ['js'], false) - .should.containEql('/tmp/mocha-utils-link.js') - .and.containEql('/tmp/mocha-utils.js') - .and.have.lengthOf(2); - existsSync('/tmp/mocha-utils-link.js').should.be.true(); - fs.renameSync('/tmp/mocha-utils.js', '/tmp/bob'); - existsSync('/tmp/mocha-utils-link.js').should.be.false(); - utils.lookupFiles('/tmp', ['js'], false).should.eql([]); + it('should recognize various types', function () { + expect(type({})).to.equal('object'); + expect(type([])).to.equal('array'); + expect(type(1)).to.equal('number'); + expect(type(Infinity)).to.equal('number'); + expect(type(null)).to.equal('null'); + expect(type(undefined)).to.equal('undefined'); + expect(type(new Date())).to.equal('date'); + expect(type(/foo/)).to.equal('regexp'); + expect(type('type')).to.equal('string'); + expect(type(global)).to.equal('domwindow'); + expect(type(true)).to.equal('boolean'); }); - it('should accept a glob "path" value', function () { - utils.lookupFiles('/tmp/mocha-utils*', ['js'], false) - .should - .containEql('/tmp/mocha-utils-link.js') - .and - .containEql('/tmp/mocha-utils.js') - .and - .have - .lengthOf(2); + describe('when toString on null or undefined stringifies window', function () { + it('should recognize null and undefined', function () { + expect(type(null)).to.equal('null'); + expect(type(undefined)).to.equal('undefined'); + }); }); afterEach(function () { - ['/tmp/mocha-utils.js', '/tmp/mocha-utils-link.js', '/tmp/bob'].forEach(function (path) { - try { - fs.unlinkSync(path); - } - catch (ignored) {} - }); + Object.prototype.toString = toString; }); }); }); diff --git a/test/browser-fixtures/bdd.js b/test/browser-fixtures/bdd.js new file mode 100644 index 0000000000..72b4a8a47c --- /dev/null +++ b/test/browser-fixtures/bdd.js @@ -0,0 +1,4 @@ +/* eslint-env browser */ + +window.mocha.timeout(200) + .ui('bdd'); diff --git a/test/browser-fixtures/exports.js b/test/browser-fixtures/exports.js new file mode 100644 index 0000000000..32c26a12ff --- /dev/null +++ b/test/browser-fixtures/exports.js @@ -0,0 +1,4 @@ +/* eslint-env browser */ + +window.mocha.timeout(200) + .ui('exports'); diff --git a/test/browser-fixtures/qunit.js b/test/browser-fixtures/qunit.js new file mode 100644 index 0000000000..8804d0b994 --- /dev/null +++ b/test/browser-fixtures/qunit.js @@ -0,0 +1,4 @@ +/* eslint-env browser */ + +window.mocha.timeout(200) + .ui('qunit'); diff --git a/test/browser-fixtures/tdd.js b/test/browser-fixtures/tdd.js new file mode 100644 index 0000000000..997a47dc18 --- /dev/null +++ b/test/browser-fixtures/tdd.js @@ -0,0 +1,4 @@ +/* eslint-env browser */ + +window.mocha.timeout(200) + .ui('tdd'); diff --git a/test/fixture-expect.js b/test/fixture-expect.js new file mode 100644 index 0000000000..cacc78425a --- /dev/null +++ b/test/fixture-expect.js @@ -0,0 +1 @@ +global.expect = require("expect.js") diff --git a/test/mocha.opts b/test/mocha.opts index 3c2f2cbd02..cd797e2ae0 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,4 +1,5 @@ --require should +--require ./test/fixture-expect.js --reporter dot --ui bdd --globals okGlobalA,okGlobalB From 0b1e9b3675e895b58f18669d7dda0f4a7b9be73f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 22 May 2016 22:21:34 -0700 Subject: [PATCH 0471/1771] add more unit tests for various browsers --- karma.conf.js | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index c1a9ffd7f1..00152bc65d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -47,16 +47,41 @@ module.exports = function(config) { + 'environment variables!'); } cfg.reporters.push('saucelabs'); - cfg.browsers.push('ie8'); cfg.customLaunchers = { ie8: { base: 'SauceLabs', browserName: 'internet explorer', - platform: 'Windows XP', + platform: 'Windows 7', version: '8.0' + }, + chrome: { + base: 'SauceLabs', + browserName: 'chrome', + platform: 'Windows 8', + version: 'latest' + }, + edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge', + platform: 'Windows 10', + version: 'latest' + }, + firefox: { + base: 'SauceLabs', + browserName: 'firefox', + platform: 'Windows 8.1', + version: 'latest' + }, + safari: { + base: 'SauceLabs', + browserName: 'safari', + platform: 'OS X 10.11', + version: 'latest' } }; + cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers)); + cfg.sauceLabs = { public: 'public' }; From 0dde0fadbbb308e88a8859eefc4c9e9ea9254b9e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 22 May 2016 22:56:56 -0700 Subject: [PATCH 0472/1771] don't run SauceLabs tests on PRs --- karma.conf.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index 00152bc65d..4db4ac4d24 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -41,7 +41,8 @@ module.exports = function(config) { // TO RUN LOCALLY: // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and // SAUCE_ACCESS_KEY env vars. - if (process.env.CI) { + // also, we can't run SauceLabs tests on PRs from forks. + if (process.env.CI && !process.env.TRAVIS_PULL_REQUEST) { if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + 'environment variables!'); From f8a3d86b3fbf62347a1509541d89a16f0b068092 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 22 May 2016 23:08:32 -0700 Subject: [PATCH 0473/1771] trying to fix travis + sauce check for PRs and forks --- karma.conf.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 4db4ac4d24..406c5b7ca2 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -42,7 +42,7 @@ module.exports = function(config) { // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and // SAUCE_ACCESS_KEY env vars. // also, we can't run SauceLabs tests on PRs from forks. - if (process.env.CI && !process.env.TRAVIS_PULL_REQUEST) { + if (process.env.CI) { if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + 'environment variables!'); @@ -88,11 +88,14 @@ module.exports = function(config) { }; if (process.env.TRAVIS) { - // correlate build/tunnel with Travis - cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER - + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - cfg.sauceLabs.startConnect = false; + if (process.env.TRAVIS_REPO_SLUG === 'mochajs/mocha' + && process.env.TRAVIS_PULL_REQUEST === 'false') { + // correlate build/tunnel with Travis + cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + + ' (' + process.env.TRAVIS_BUILD_ID + ')'; + cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; + cfg.sauceLabs.startConnect = false; + } } else { // otherwise just make something up cfg.sauceLabs.build = require('os').hostname() + ' (' + Date.now() + ')'; From 9e8cbaa348dfc0812e19d247dfb364e51a4f7867 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 22 May 2016 23:28:25 -0700 Subject: [PATCH 0474/1771] try different strategy for avoiding insecure sauce connect --- .travis.yml | 6 --- karma.conf.js | 105 ++++++++++++++++++++++++++------------------------ 2 files changed, 55 insertions(+), 56 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9101c6ea02..2aee750bb8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,12 +34,6 @@ before_install: script: travis_retry make $TARGET -addons: - sauce_connect: - username: mochajs - access_key: - secure: R0HXKtR6F2iDEnItv57BTRyL64XfyIlyyluPLK8G33O/InaQjT3KxGuxevz3nVYIqqnI1MPjYodXcQaqrBOLUVmA2vhBeMHB2OwGc9GAL+HBtB1fh+bQJelkl/XMcTTbC5LIZ6nZjmFnkmjqT3AmUhdDRISgieIFeVY4x48LfiU= - notifications: urls: # for gitter diff --git a/karma.conf.js b/karma.conf.js index 406c5b7ca2..3a001e3e97 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,5 +1,50 @@ 'use strict'; +function addSauceTests(cfg) { + cfg.reporters.push('saucelabs'); + cfg.customLaunchers = { + ie8: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 7', + version: '8.0' + }, + chrome: { + base: 'SauceLabs', + browserName: 'chrome', + platform: 'Windows 8', + version: 'latest' + }, + edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge', + platform: 'Windows 10', + version: 'latest' + }, + firefox: { + base: 'SauceLabs', + browserName: 'firefox', + platform: 'Windows 8.1', + version: 'latest' + }, + safari: { + base: 'SauceLabs', + browserName: 'safari', + platform: 'OS X 10.11', + version: 'latest' + } + }; + + cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers)); + + cfg.sauceLabs = { + public: 'public' + }; + + // for slow browser booting, ostensibly + cfg.captureTimeout = 120000; +} + module.exports = function(config) { var cfg = { frameworks: [ @@ -41,68 +86,28 @@ module.exports = function(config) { // TO RUN LOCALLY: // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and // SAUCE_ACCESS_KEY env vars. - // also, we can't run SauceLabs tests on PRs from forks. if (process.env.CI) { - if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { - throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' - + 'environment variables!'); - } - cfg.reporters.push('saucelabs'); - cfg.customLaunchers = { - ie8: { - base: 'SauceLabs', - browserName: 'internet explorer', - platform: 'Windows 7', - version: '8.0' - }, - chrome: { - base: 'SauceLabs', - browserName: 'chrome', - platform: 'Windows 8', - version: 'latest' - }, - edge: { - base: 'SauceLabs', - browserName: 'MicrosoftEdge', - platform: 'Windows 10', - version: 'latest' - }, - firefox: { - base: 'SauceLabs', - browserName: 'firefox', - platform: 'Windows 8.1', - version: 'latest' - }, - safari: { - base: 'SauceLabs', - browserName: 'safari', - platform: 'OS X 10.11', - version: 'latest' - } - }; - - cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers)); - - cfg.sauceLabs = { - public: 'public' - }; - + // we can't run SauceLabs tests on PRs from forks on Travis cuz security. if (process.env.TRAVIS) { if (process.env.TRAVIS_REPO_SLUG === 'mochajs/mocha' && process.env.TRAVIS_PULL_REQUEST === 'false') { + addSauceTests(cfg); // correlate build/tunnel with Travis cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - cfg.sauceLabs.startConnect = false; + cfg.sauceLabs.startConnect = true; } } else { - // otherwise just make something up + if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { + throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + + 'environment variables!'); + } + + // remember, this is for a local run. + addSauceTests(cfg); cfg.sauceLabs.build = require('os').hostname() + ' (' + Date.now() + ')'; } - - // for slow browser booting, ostensibly - cfg.captureTimeout = 120000; } // the MOCHA_UI env var will determine if we're running interface-specific From 524862b6002882861e1f6ec53664545e89bc53e5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 00:06:20 -0700 Subject: [PATCH 0475/1771] full browserification support; closes #880 (#2271) --- package.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b88346af6a..88b1d8e8da 100644 --- a/package.json +++ b/package.json @@ -258,7 +258,6 @@ "type": "git", "url": "git://github.com/mochajs/mocha.git" }, - "main": "./index", "bin": { "mocha": "./bin/mocha", "_mocha": "./bin/_mocha" @@ -312,7 +311,12 @@ "debug": "./lib/browser/debug.js", "events": "./lib/browser/events.js", "tty": "./lib/browser/tty.js", - "./index.js": "./browser-entry.js" + "./index.js": "./browser-entry.js", + "jade": false, + "fs": false, + "glob": false, + "path": false, + "supports-color": false }, "licenses": [ { From 9bfbc9e4bad46f4710c8538ba6ec8c6ec47ede98 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 00:19:40 -0700 Subject: [PATCH 0476/1771] update CHANGELOG.md, contributors, .mailmap --- .mailmap | 1 + CHANGELOG.md | 87 ++++++++++++++++++++++++++-- package.json | 157 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 185 insertions(+), 60 deletions(-) diff --git a/.mailmap b/.mailmap index 93ad1bff98..528a26775e 100644 --- a/.mailmap +++ b/.mailmap @@ -4,6 +4,7 @@ Travis Jeffery Dr. Travis Jeffery Christopher Hiller David da Silva Contín David da Silva David da Silva Contín David da Silva +David da Silva Contín Ariel Mashraki Ariel Mashraki Ariel Mashraki Ariel Mashraki Forbes Lindesay Forbes Lindesay diff --git a/CHANGELOG.md b/CHANGELOG.md index a644e93a9a..52b0ee204e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,87 @@ -Unreleased -================== - -* [#2079], [#2231] - Add browser to CI - +# 2.5.0 / 2016-05-23 + +> This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases). +> +> ### Browser Tests in CI +> +> We now run unit tests against PhantomJS v1.x and an assortment of browsers on [SauceLabs](https://saucelabs.com), including: +> - Internet Explorer v8.0 +> - Chrome (latest) +> - Firefox (latest) +> - Safari (latest) +> - Microsoft Edge (latest) +> +> To accomplish this, we now run Mocha's unit tests (and a handful of integration tests) via [Karma](https://npmjs.com/package/karma) and a modified [karma-mocha](https://npmjs.com/package/karma-mocha). Along the way, we had to solve issue [#880] (apologies to @mderijcke and @sukima who had PRs addressing this), as well as replace most usages of [should](https://npmjs.com/package/should) with [expect.js](https://npmjs.com/package/expect.js) for IE8. +> +> Going forward, when sending PRs, your code will *only* run against PhantomJS v1.x (and not hit SauceLabs) [because security](https://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests). +> +> ### Node.js 6.x +> Node.js 6.x "just worked" before, but now it's in the CI matrix, so it's "officially" supported. Mocha *still retains support* for Node.js 0.8.x. +> +> ### "Minor" Release +> You'll see mostly bug fixes below, but also a couple features--as such, it's a "minor" release. +> +> ### TYVM +> +> Thanks to everyone who contributed, and our fabulous [sponsors and backers](https://opencollective.com/mochajs)! + +- [#2079] - Add browser checks to CI; update [browserify](https://npmjs.com/package/browserify) to v13.0.0 ([@dasilvacontin], [@ScottFreeCode], [@boneskull] via c04c1d7, 0b1e9b3, 0dde0fa, f8a3d86, 9e8cbaa) +- [#880] - Make Mocha browserifyable ([@boneskull] via 524862b) +- [#2121] - Update [glob](https://npmjs.com/package/glob) to v3.2.11 ([@astorije] via 7920fc4) +- [#2126] - Fix dupe error messages in stack trace filter ([@Turbo87] via 4301caa) +- [#2109] - Fix certain diffs when objects cannot be coerced into primitives ([@joshlory] via 61fbb7f) +- [#1827] - Fix TWBS/`mocha.css` collisions ([@irnc] via 0543798) +- [#1760], [#1936] - Fix `this.skip()` in HTML reporter ([@mislav] via cb4248b) +- [#2115] - Fix exceptions thrown from hooks in HTML reporter ([@danielstjules] via e290bc0) +- [#2089] - Handle Symbol values in `util.stringify()` ([@ryym] via ea61d05) +- [#2097] - Fix diff for objects overriding `Object.prototype.hasOwnProperty` ([@mantoni] via b20fdfe) +- [#2101] - Properly handle non-string "messages" thrown from assertion libraries ([@jkimbo] via 9c41051) +- [#2124] - Update [growl](https://npmjs.com/package/growl) ([@benjamine] via 9ae6a85) +- [#2162], [#2205] - JSDoc fixes ([@OlegTsyba] via 8031f20, [@ScottFreeCode] via f83b1d9) +- [#2132] - Remove Growl-related cruft ([@julienw] via 00d6469) +- [#2172] - Add [OpenCollective](https://opencollective.com) badge, sponsors & backers ([@xdamman], [@boneskull] via caee94f) +- [#1841] - Add new logo, banner assets ([@dasilvacontin] via 00fd0e1) +- [#2214] - Update `README.md` header ([@dasilvacontin] via c0f9be2) +- [#2236] - Better checks for Node.js v0.8 compatibility in CI ([@dasilvacontin] via ba5637d) +- [#2239] - Add Node.js v6.x to CI matrix ([@boneskull] via 3904da4) + +[#880]: https://github.com/mochajs/mocha/issues/880 +[#1841]: https://github.com/mochajs/mocha/pull/1841 +[#2239]: https://github.com/mochajs/mocha/issues/2239 +[#2153]: https://github.com/mochajs/mocha/pull/2153 +[#2214]: https://github.com/mochajs/mocha/pull/2214 +[#2236]: https://github.com/mochajs/mocha/pull/2236 [#2079]: https://github.com/mochajs/mocha/issues/2079 [#2231]: https://github.com/mochajs/mocha/pull/2231 +[#2089]: https://github.com/mochajs/mocha/issues/2089 +[#2097]: https://github.com/mochajs/mocha/pull/2097 +[#1760]: https://github.com/mochajs/mocha/issues/1760 +[#1936]: https://github.com/mochajs/mocha/issues/1936 +[#2115]: https://github.com/mochajs/mocha/pull/2115 +[#1827]: https://github.com/mochajs/mocha/pull/1827 +[#2101]: https://github.com/mochajs/mocha/pull/2101 +[#2124]: https://github.com/mochajs/mocha/pull/2124 +[#2109]: https://github.com/mochajs/mocha/issues/2109 +[#2162]: https://github.com/mochajs/mocha/pull/2162 +[#2132]: https://github.com/mochajs/mocha/issues/2132 +[#2126]: https://github.com/mochajs/mocha/issues/2126 +[#2121]: https://github.com/mochajs/mocha/issues/2121 +[#2205]: https://github.com/mochajs/mocha/pull/2205 +[#2172]: https://github.com/mochajs/mocha/pull/2172 +[@xdamman]: https://github.com/xdamman +[@Turbo87]: https://github.com/Turbo87 +[@OlegTsyba]: https://github.com/OlegTsyba +[@ryym]: https://github.com/ryym +[@mantoni]: https://github.com/mantoni +[@mislav]: https://github.com/mislav +[@irnc]: https://github.com/irnc +[@jkimbo]: https://github.com/jkimbo +[@benjamine]: https://github.com/benjamine +[@joshlory]: https://github.com/joshlory +[@julienw]: https://github.com/julienw +[@ScottFreeCode]: https://github.com/ScottFreeCode +[@astorije]: https://github.com/astorije +[@dasilvacontin]: https://github.com/dasilvacontin 2.4.5 / 2016-01-28 ================== diff --git a/package.json b/package.json index 88b1d8e8da..222a2895c9 100644 --- a/package.json +++ b/package.json @@ -11,95 +11,115 @@ ], "author": "TJ Holowaychuk ", "contributors": [ + "TJ Holowaychuk ", "Travis Jeffery ", "Christopher Hiller ", + "Daniel St. Jules ", "Joshua Appelman ", - "Guillermo Rauch ", "David da Silva Contín ", - "Daniel St. Jules ", + "Guillermo Rauch ", "Ariel Mashraki ", "Attila Domokos ", "John Firebaugh ", - "Nathan Rajlich ", "Jo Liss ", + "Nathan Rajlich ", + "Nathan Houle ", "Mike Pennisi ", - "Brendan Nee ", "James Carr ", - "Ryunosuke SATO ", + "Brendan Nee ", + "Glen Mailer ", + "Mislav Marohnić ", "Aaron Heckmann ", + "Ryunosuke SATO ", "Jonathan Ong ", + "Joshua Krall ", + "Maximilian Antoni ", + "hokaccha ", + "Domenic Denicola ", "Forbes Lindesay ", "Raynos ", "Xavier Antoviaque ", - "hokaccha ", - "Joshua Krall ", - "Domenic Denicola ", - "Glen Mailer ", + "Andreas Lind Petersen ", + "Ben Lindsey ", "Mathieu Desvé ", - "Cory Thomas ", "Fredrik Enestad ", + "Rico Sta. Cruz ", + "Paul Miller ", "Ben Bradley ", - "Sindre Sorhus ", - "Jesse Dailey ", - "Ben Lindsey ", - "Maximilian Antoni ", - "Merrick Christensen ", + "fool2fish ", + "Cory Thomas ", + "Sune Simonsen ", "Michael Demmer ", "Tyson Tate ", + "eiji.ienaga ", "Valentin Agachi ", + "Sindre Sorhus ", + "Merrick Christensen ", "Wil Moore III ", - "Benjie Gillam ", "Nathan Bowser ", - "eiji.ienaga ", - "fool2fish ", - "Paul Miller ", - "Andreas Lind Petersen ", - "Timo Tijhof ", - "Nathan Alderson ", + "Jesse Dailey ", + "Benjie Gillam ", + "Vlad Magdalin ", + "David Henderson ", + "Long Ho ", + "Adam Gruber ", + "Sean Lang ", + "Shawn Krisman ", + "Simon Gaeremynck ", + "John Reeves ", + "Soel ", + "Buck Doyle ", + "Max Goodman ", + "Jonas Westerlund ", + "Michael Riley ", "Ian Storm Taylor ", + "Timo Tijhof ", + "Ian W. Remmel ", + "Tobias Bieniek ", "Arian Stolwijk ", - "Rico Sta. Cruz ", - "domenic ", - "Jacob Wejendorp ", + "Nathan Alderson ", + "Brian Beck ", + "Dominique Quatravaux ", + "Xavier Damman ", + "Benjamin Eidelman ", + "Outsider ", "fcrisci ", - "Simon Gaeremynck ", - "James Nylen ", - "Shawn Krisman ", - "Sean Lang ", - "David Henderson ", - "jsdevel ", - "Alexander Early ", + "FARKAS Máté ", "Parker Moore ", "Paul Armstrong ", - "monowerker ", - "Konstantin Käfer ", + "jsdevel ", "Justin DuJardin ", "Juzer Ali ", - "Dominique Quatravaux ", + "Jacob Wejendorp ", + "monowerker ", + "Alexander Early ", "Quang Van ", "Quanlong He ", - "Vlad Magdalin ", - "Brian Beck ", - "Jonas Westerlund ", - "Michael Riley ", - "Buck Doyle ", - "FARKAS Máté ", - "Sune Simonsen ", + "James Nylen ", + "Konstantin Käfer ", + "Jordan Sexton ", + "Josh Lory ", + "Julien Wajsberg ", + "Jussi Virtanen ", + "Jérémie Astori ", + "Katie Gengler ", "Keith Cirkel ", "Kent C. Dodds ", + "Kevin Burke ", "Kevin Conway ", "Kevin Kirsche ", "Kirill Korolyov ", "Koen Punt ", + "Kris Rasmussen ", "Kyle Mitchell ", "Laszlo Bacsi ", "Liam Newman ", "Linus Unnebäck ", - "László Bácsi ", "Maciej Małecki ", "Mal Graty ", "Marc Kuo ", "Marcello Bastea-Forte ", + "Mark Banner ", "Martin Marko ", "Matija Marohnić ", "Matt Robenolt ", @@ -115,16 +135,19 @@ "Nick Fitzgerald ", "Nicolo Taddei ", "Noshir Patel ", + "OlegTsyba ", "Panu Horsmalahti ", + "Pavel Zubkou ", "Pete Hawkins ", - "Pete Hawkins ", "Phil Sung ", + "Prayag Verma ", "R56 ", - "Raynos <=>", "Refael Ackermann ", "Richard Dingwall ", "Richard Knop ", + "Rob Raux ", "Rob Wu ", + "Robert Rossmann ", "Romain Prieto ", "Roman Neuhauser ", "Roman Shtylman ", @@ -132,21 +155,30 @@ "Russell Munson ", "Rustem Mustafin ", "Ryan Hubbard ", + "Ryan Shaw ", "Salehen Shovon Rahman ", "Sam Mussell ", "Sasha Koss ", + "ScottFreeCode ", "Seiya Konno ", + "Sergey Simonchik ", + "Sergio Santoro ", "Shaine Hatch ", "Simon Goumaz ", + "Sorin Iclanzan ", "Standa Opichal ", "Stephen Mathieson ", "Steve Mason ", "Stewart Taylor ", + "Stone ", "Tapiwa Kelvin ", "Teddy Zeenny ", + "Thedark1337 ", "Tim Ehat ", + "Tingan Ho ", "Todd Agulnick ", "Tom Coquereau ", + "Tom Hughes ", "Vadim Nikitin ", "Victor Costan ", "Will Langstroth ", @@ -155,30 +187,38 @@ "Zsolt Takács ", "abrkn ", "airportyh ", + "amsul ", "badunk ", "claudyus ", - "dasilvacontin ", "fengmk2 ", "gaye ", + "gigadude ", "grasGendarme ", "klaemo ", "lakmeer ", "lodr ", "mrShturman ", + "nexdrew ", "nishigori ", "omardelarosa ", "qiuzuhui ", + "ryym ", "samuel goldszmidt ", "sebv ", "slyg ", "startswithaj ", "tgautier@yahoo.com ", + "tmont ", "traleig1 ", "vlad ", + "wsw ", "yuitest ", + "Aaron Hamid ", "zhiyelee ", + "Aaron Krause ", "Adam Crabtree ", - "Adam Gruber ", + "Adrian Ludwig ", + "Ajay Kodali ", "Andreas Brekken ", "Andrew Nesbitt ", "Andrey Popp <8mayday@gmail.com>", @@ -188,7 +228,10 @@ "Atsuya Takagi ", "Austin Birch ", "Ben Noordhuis ", + "Ben Vinegar ", + "Benoit Larroque ", "Benoît Zugmeyer ", + "Berker Peksag ", "Bjørge Næss ", "Brian Lalor ", "Brian M. Carlson ", @@ -196,6 +239,7 @@ "Bryan Donovan ", "C. Scott Ananian ", "Casey Foster ", + "Charles Lowell ", "Chris Buckley ", "ChrisWren ", "Connor Dunn ", @@ -209,17 +253,20 @@ "Dmitry Shirokov ", "Dominic Barnes ", "Douglas Christopher Wilson ", + "Duncan Beevers ", "Fede Ramirez ", "Fedor Indutny ", "Florian Margaine ", "Frederico Silva ", "Fredrik Lindin ", - "Gareth Aye ", + "Gabriel Silk ", "Gareth Murphy ", "Gavin Mogan ", "Giovanni Bassi ", "Glen Huang ", "Greg Perkins ", + "Guy Arye ", + "Gyandeep Singh ", "Harish ", "Harry Brundage ", "Herman Junge ", @@ -230,28 +277,28 @@ "Jaakko Salonen ", "Jake Craige ", "Jake Marsh ", - "Jakub Nešetřil ", + "Jakub Nešetřil ", "James Bowes ", + "James G. Kim ", "James Lal ", "Jan Kopriva ", "Jason Barry ", + "Jason Lai ", "Javier Aranda ", "Jean Ponchon ", "Jeff Kunkle ", "Jeff Schilling ", "Jeremy Martin ", "Jimmy Cuadra ", + "Joao Moreno ", + "Joey Cozza ", "John Doty ", "Johnathon Sanders ", "Jonas Dohse ", "Jonathan Creamer ", "Jonathan Delgado ", - "Jonathan Park ", - "Jordan Sexton ", - "Jussi Virtanen ", - "Katie Gengler ", - "Kazuhito Hokamura ", - "Scott Santucci " + "Jonathan Kim ", + "Jonathan Park " ], "license": "MIT", "repository": { From 443697fd1eae20fb3c92cbd16a4ac9edd2a35e17 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 00:20:31 -0700 Subject: [PATCH 0477/1771] rebuild mocha.js --- mocha.js | 320 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 229 insertions(+), 91 deletions(-) diff --git a/mocha.js b/mocha.js index 9d98db7101..bcb7ab1e14 100644 --- a/mocha.js +++ b/mocha.js @@ -162,10 +162,13 @@ Mocha.process = process; global.Mocha = Mocha; global.mocha = mocha; +// this allows test/acceptance/required-tokens.js to pass; thus, +// you can now do `const describe = require('mocha').describe` in a +// browser context (assuming browserification). should fix #880 module.exports = global; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/mocha":14,"_process":57,"browser-stdout":42}],2:[function(require,module,exports){ +},{"./lib/mocha":14,"_process":58,"browser-stdout":42}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -488,7 +491,7 @@ Progress.prototype.draw = function(ctx) { },{}],5:[function(require,module,exports){ (function (global){ exports.isatty = function isatty() { - return false; + return true; }; exports.getWindowSize = function getWindowSize() { @@ -773,7 +776,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":47}],9:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],9:[function(require,module,exports){ 'use strict'; /** @@ -1025,7 +1028,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":47}],13:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],13:[function(require,module,exports){ /** * Module dependencies. */ @@ -1133,7 +1136,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":47}],14:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1640,7 +1643,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":57,"escape-string-regexp":47,"growl":49,"path":43}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":58,"escape-string-regexp":48,"growl":50,"path":43}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2278,7 +2281,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":57,"diff":46,"supports-color":43,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":39,"_process":58,"diff":47,"supports-color":43,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2412,7 +2415,7 @@ function Dot(runner) { inherits(Dot, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],20:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],20:[function(require,module,exports){ (function (process,__dirname){ /** * Module dependencies. @@ -2472,7 +2475,7 @@ function coverageClass(coveragePctg) { } }).call(this,require('_process'),"/lib/reporters") -},{"./json-cov":23,"_process":57,"fs":43,"jade":43,"path":43}],21:[function(require,module,exports){ +},{"./json-cov":23,"_process":58,"fs":43,"jade":43,"path":43}],21:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2805,7 +2808,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":47}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":48}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2981,7 +2984,7 @@ function clean(test) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":57}],24:[function(require,module,exports){ +},{"./base":17,"_process":58}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3045,7 +3048,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":57}],25:[function(require,module,exports){ +},{"./base":17,"_process":58}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3139,7 +3142,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":57}],26:[function(require,module,exports){ +},{"./base":17,"_process":58}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3235,7 +3238,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],27:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3300,7 +3303,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],28:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3401,7 +3404,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],29:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3441,7 +3444,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],30:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3706,7 +3709,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],31:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3799,7 +3802,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":57}],32:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58}],32:[function(require,module,exports){ /** * Module dependencies. */ @@ -4132,7 +4135,7 @@ function cdata(str) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":39,"./base":17,"_process":57,"fs":43,"mkdirp":54,"path":43}],35:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":58,"fs":43,"mkdirp":55,"path":43}],35:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -5397,7 +5400,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":35,"./utils":39,"_process":57,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":35,"./utils":39,"_process":58,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -6594,7 +6597,7 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":57,"buffer":44,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":70,"util":73}],40:[function(require,module,exports){ +},{"_process":58,"buffer":45,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":71,"util":74}],40:[function(require,module,exports){ 'use strict' exports.toByteArray = toByteArray @@ -6736,10 +6739,122 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":57,"stream":68,"util":73}],43:[function(require,module,exports){ +},{"_process":58,"stream":69,"util":74}],43:[function(require,module,exports){ arguments[4][41][0].apply(exports,arguments) },{"dup":41}],44:[function(require,module,exports){ (function (global){ +'use strict'; + +var buffer = require('buffer'); +var Buffer = buffer.Buffer; +var SlowBuffer = buffer.SlowBuffer; +var MAX_LEN = buffer.kMaxLength || 2147483647; +exports.alloc = function alloc(size, fill, encoding) { + if (typeof Buffer.alloc === 'function') { + return Buffer.alloc(size, fill, encoding); + } + if (typeof encoding === 'number') { + throw new TypeError('encoding must not be number'); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + var enc = encoding; + var _fill = fill; + if (_fill === undefined) { + enc = undefined; + _fill = 0; + } + var buf = new Buffer(size); + if (typeof _fill === 'string') { + var fillBuf = new Buffer(_fill, enc); + var flen = fillBuf.length; + var i = -1; + while (++i < size) { + buf[i] = fillBuf[i % flen]; + } + } else { + buf.fill(_fill); + } + return buf; +} +exports.allocUnsafe = function allocUnsafe(size) { + if (typeof Buffer.allocUnsafe === 'function') { + return Buffer.allocUnsafe(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + return new Buffer(size); +} +exports.from = function from(value, encodingOrOffset, length) { + if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { + return Buffer.from(value, encodingOrOffset, length); + } + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number'); + } + if (typeof value === 'string') { + return new Buffer(value, encodingOrOffset); + } + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + var offset = encodingOrOffset; + if (arguments.length === 1) { + return new Buffer(value); + } + if (typeof offset === 'undefined') { + offset = 0; + } + var len = length; + if (typeof len === 'undefined') { + len = value.byteLength - offset; + } + if (offset >= value.byteLength) { + throw new RangeError('\'offset\' is out of bounds'); + } + if (len > value.byteLength - offset) { + throw new RangeError('\'length\' is out of bounds'); + } + return new Buffer(value.slice(offset, offset + len)); + } + if (Buffer.isBuffer(value)) { + var out = new Buffer(value.length); + value.copy(out, 0, 0, value.length); + return out; + } + if (value) { + if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { + return new Buffer(value); + } + if (value.type === 'Buffer' && Array.isArray(value.data)) { + return new Buffer(value.data); + } + } + + throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); +} +exports.allocUnsafeSlow = function allocUnsafeSlow(size) { + if (typeof Buffer.allocUnsafeSlow === 'function') { + return Buffer.allocUnsafeSlow(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size >= MAX_LEN) { + throw new RangeError('size is too large'); + } + return new SlowBuffer(size); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"buffer":45}],45:[function(require,module,exports){ +(function (global){ /*! * The buffer module from node.js, for the browser. * @@ -8453,7 +8568,7 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":40,"ieee754":50,"isarray":53}],45:[function(require,module,exports){ +},{"base64-js":40,"ieee754":51,"isarray":54}],46:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8564,7 +8679,7 @@ function objectToString(o) { } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){ +},{"../../is-buffer/index.js":53}],47:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* @@ -9185,7 +9300,7 @@ function objectToString(o) { } }(this)); -},{}],47:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; @@ -9198,7 +9313,7 @@ module.exports = function (str) { return str.replace(matchOperatorsRe, '\\$&'); }; -},{}],48:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -9498,7 +9613,7 @@ function isUndefined(arg) { return arg === void 0; } -},{}],49:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -9792,7 +9907,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":57,"child_process":43,"fs":43,"os":55,"path":43}],50:[function(require,module,exports){ +},{"_process":58,"child_process":43,"fs":43,"os":56,"path":43}],51:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 @@ -9878,7 +9993,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],51:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -9903,7 +10018,7 @@ if (typeof Object.create === 'function') { } } -},{}],52:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ /** * Determine if an object is Buffer * @@ -9922,14 +10037,14 @@ module.exports = function (obj) { )) } -},{}],53:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; -},{}],54:[function(require,module,exports){ +},{}],55:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); @@ -10031,7 +10146,7 @@ mkdirP.sync = function sync (p, opts, made) { }; }).call(this,require('_process')) -},{"_process":57,"fs":43,"path":43}],55:[function(require,module,exports){ +},{"_process":58,"fs":43,"path":43}],56:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -10078,7 +10193,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],56:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ (function (process){ 'use strict'; @@ -10125,7 +10240,7 @@ function nextTick(fn, arg1, arg2, arg3) { } }).call(this,require('_process')) -},{"_process":57}],57:[function(require,module,exports){ +},{"_process":58}],58:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -10221,10 +10336,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],58:[function(require,module,exports){ +},{}],59:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":59}],59:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":60}],60:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -10300,7 +10415,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":61,"./_stream_writable":63,"core-util-is":45,"inherits":51,"process-nextick-args":56}],60:[function(require,module,exports){ +},{"./_stream_readable":62,"./_stream_writable":64,"core-util-is":46,"inherits":52,"process-nextick-args":57}],61:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -10327,7 +10442,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":62,"core-util-is":45,"inherits":51}],61:[function(require,module,exports){ +},{"./_stream_transform":63,"core-util-is":46,"inherits":52}],62:[function(require,module,exports){ (function (process){ 'use strict'; @@ -10341,15 +10456,11 @@ var processNextTick = require('process-nextick-args'); var isArray = require('isarray'); /**/ -/**/ -var Buffer = require('buffer').Buffer; -/**/ - Readable.ReadableState = ReadableState; -var EE = require('events'); - /**/ +var EE = require('events').EventEmitter; + var EElistenerCount = function (emitter, type) { return emitter.listeners(type).length; }; @@ -10367,6 +10478,9 @@ var Stream; /**/ var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ /**/ var util = require('core-util-is'); @@ -10375,7 +10489,7 @@ util.inherits = require('inherits'); /**/ var debugUtil = require('util'); -var debug = undefined; +var debug = void 0; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { @@ -10387,6 +10501,19 @@ var StringDecoder; util.inherits(Readable, Stream); +var hasPrependListener = typeof EE.prototype.prependListener === 'function'; + +function prependListener(emitter, event, fn) { + if (hasPrependListener) return emitter.prependListener(event, fn); + + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. This is here + // only because this code needs to continue to work with older versions + // of Node.js that do not include the prependListener() method. The goal + // is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); @@ -10480,7 +10607,7 @@ Readable.prototype.push = function (chunk, encoding) { if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { - chunk = new Buffer(chunk, encoding); + chunk = bufferShim.from(chunk, encoding); encoding = ''; } } @@ -10510,8 +10637,8 @@ function readableAddChunk(stream, state, chunk, encoding, addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { - var e = new Error('stream.unshift() after end event'); - stream.emit('error', e); + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); } else { var skipAdd; if (state.decoder && !addToFront && !encoding) { @@ -10864,7 +10991,8 @@ Readable.prototype.pipe = function (dest, pipeOpts) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. - if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; } @@ -10880,9 +11008,9 @@ Readable.prototype.pipe = function (dest, pipeOpts) { dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. - if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. function onclose() { @@ -11156,16 +11284,16 @@ function fromList(n, state) { } else { // complex case. // we have enough to cover it, but it spans past the first buffer. - if (stringMode) ret = '';else ret = new Buffer(n); + if (stringMode) ret = '';else ret = bufferShim.allocUnsafe(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); + var _buf = list[0]; + var cpy = Math.min(n - c, _buf.length); - if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); + if (stringMode) ret += _buf.slice(0, cpy);else _buf.copy(ret, c, 0, cpy); - if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); + if (cpy < _buf.length) list[0] = _buf.slice(cpy);else list.shift(); c += cpy; } @@ -11180,7 +11308,7 @@ function endReadable(stream) { // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. - if (state.length > 0) throw new Error('endReadable called on non-empty stream'); + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); if (!state.endEmitted) { state.ended = true; @@ -11210,7 +11338,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":59,"_process":57,"buffer":44,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":56,"string_decoder/":69,"util":41}],62:[function(require,module,exports){ +},{"./_stream_duplex":60,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":46,"events":49,"inherits":52,"isarray":54,"process-nextick-args":57,"string_decoder/":70,"util":41}],63:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -11347,7 +11475,7 @@ Transform.prototype.push = function (chunk, encoding) { // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('not implemented'); + throw new Error('Not implemented'); }; Transform.prototype._write = function (chunk, encoding, cb) { @@ -11385,13 +11513,13 @@ function done(stream, er) { var ws = stream._writableState; var ts = stream._transformState; - if (ws.length) throw new Error('calling transform done when ws.length != 0'); + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - if (ts.transforming) throw new Error('calling transform done when still transforming'); + if (ts.transforming) throw new Error('Calling transform done when still transforming'); return stream.push(null); } -},{"./_stream_duplex":59,"core-util-is":45,"inherits":51}],63:[function(require,module,exports){ +},{"./_stream_duplex":60,"core-util-is":46,"inherits":52}],64:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -11409,10 +11537,6 @@ var processNextTick = require('process-nextick-args'); var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; /**/ -/**/ -var Buffer = require('buffer').Buffer; -/**/ - Writable.WritableState = WritableState; /**/ @@ -11438,6 +11562,9 @@ var Stream; /**/ var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ util.inherits(Writable, Stream); @@ -11541,10 +11668,9 @@ function WritableState(options, stream) { // count buffered requests this.bufferedRequestCount = 0; - // create the two objects needed to store the corked requests - // they are not a linked list, as no new elements are inserted in there + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two this.corkedRequestsFree = new CorkedRequest(this); - this.corkedRequestsFree.next = new CorkedRequest(this); } WritableState.prototype.getBuffer = function writableStateGetBuffer() { @@ -11591,7 +11717,7 @@ function Writable(options) { // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe. Not readable.')); + this.emit('error', new Error('Cannot pipe, not readable')); }; function writeAfterEnd(stream, cb) { @@ -11608,9 +11734,16 @@ function writeAfterEnd(stream, cb) { // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; - - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - var er = new TypeError('Invalid non-string/buffer chunk'); + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { stream.emit('error', er); processNextTick(cb, er); valid = false; @@ -11660,11 +11793,12 @@ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); this._writableState.defaultEncoding = encoding; + return this; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = new Buffer(chunk, encoding); + chunk = bufferShim.from(chunk, encoding); } return chunk; } @@ -11787,12 +11921,16 @@ function clearBuffer(stream, state) { doWrite(stream, state, true, state.length, buffer, '', holder.finish); - // doWrite is always async, defer these to save a bit of time + // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; - state.corkedRequestsFree = holder.next; - holder.next = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } } else { // Slow case, write chunks one-by-one while (entry) { @@ -11910,10 +12048,10 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":59,"_process":57,"buffer":44,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":56,"util-deprecate":71}],64:[function(require,module,exports){ +},{"./_stream_duplex":60,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":46,"events":49,"inherits":52,"process-nextick-args":57,"util-deprecate":72}],65:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":60}],65:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":61}],66:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -11933,13 +12071,13 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":59,"./lib/_stream_passthrough.js":60,"./lib/_stream_readable.js":61,"./lib/_stream_transform.js":62,"./lib/_stream_writable.js":63,"_process":57}],66:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":60,"./lib/_stream_passthrough.js":61,"./lib/_stream_readable.js":62,"./lib/_stream_transform.js":63,"./lib/_stream_writable.js":64,"_process":58}],67:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":62}],67:[function(require,module,exports){ +},{"./lib/_stream_transform.js":63}],68:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":63}],68:[function(require,module,exports){ +},{"./lib/_stream_writable.js":64}],69:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -12068,7 +12206,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":48,"inherits":51,"readable-stream/duplex.js":58,"readable-stream/passthrough.js":64,"readable-stream/readable.js":65,"readable-stream/transform.js":66,"readable-stream/writable.js":67}],69:[function(require,module,exports){ +},{"events":49,"inherits":52,"readable-stream/duplex.js":59,"readable-stream/passthrough.js":65,"readable-stream/readable.js":66,"readable-stream/transform.js":67,"readable-stream/writable.js":68}],70:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -12291,7 +12429,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":44}],70:[function(require,module,exports){ +},{"buffer":45}],71:[function(require,module,exports){ /** * Expose `toIsoString`. @@ -12332,7 +12470,7 @@ function pad (number) { var n = number.toString(); return n.length === 1 ? '0' + n : n; } -},{}],71:[function(require,module,exports){ +},{}],72:[function(require,module,exports){ (function (global){ /** @@ -12403,14 +12541,14 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],72:[function(require,module,exports){ +},{}],73:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],73:[function(require,module,exports){ +},{}],74:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -13000,4 +13138,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":72,"_process":57,"inherits":51}]},{},[1]); +},{"./support/isBuffer":73,"_process":58,"inherits":52}]},{},[1]); From 30e917b6582a7f2320e283d089cb215a8f8ff4a6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 00:39:11 -0700 Subject: [PATCH 0478/1771] Release v2.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 222a2895c9..47ddfcbdbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.4.5", + "version": "2.5.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From bd9450b9e5522cb8d89abc926a754752dc697b39 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 01:38:01 -0700 Subject: [PATCH 0479/1771] to-iso-string must be a dependency --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 47ddfcbdbd..440dff8a2f 100644 --- a/package.json +++ b/package.json @@ -324,7 +324,8 @@ "growl": "1.9.2", "jade": "0.26.3", "mkdirp": "0.5.1", - "supports-color": "1.2.0" + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" }, "devDependencies": { "browser-stdout": "^1.2.0", @@ -342,7 +343,6 @@ "phantomjs": "1.9.8", "should": "~8.0.0", "through2": "~0.6.5", - "to-iso-string": "0.0.2", "watchify": "^3.7.0" }, "files": [ From 3ef083ef0ccdc95286fc0395847df3ca075806d3 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 01:47:58 -0700 Subject: [PATCH 0480/1771] update CHANGELOG.md [ci skip] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b0ee204e..81d9b89990 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 2.5.1 / 2016-05-23 + +- Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull] via bd9450b) + +Thanks @entertainyou, @SimenB, @just-paja for the heads-up. + # 2.5.0 / 2016-05-23 > This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases). From 015b809c27109d175f0e51af1b58b0c0310261b2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 23 May 2016 01:51:33 -0700 Subject: [PATCH 0481/1771] Release v2.5.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 440dff8a2f..0f794c4981 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.5.0", + "version": "2.5.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 49b5ff1508dd8c0a84e6b2c20e49c50f8b6a1578 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Mon, 23 May 2016 20:25:51 +0100 Subject: [PATCH 0482/1771] Avoid double and triple xUnit XML escaping (#2178) --- lib/reporters/xunit.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 875d592876..1cfd8f4f51 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -130,7 +130,7 @@ XUnit.prototype.test = function(test) { if (test.state === 'failed') { var err = test.err; - this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\n' + err.stack)))); + this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack)))); } else if (test.isPending()) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { @@ -164,11 +164,3 @@ function tag(name, attrs, close, content) { } return tag; } - -/** - * Return cdata escaped CDATA `str`. - */ - -function cdata(str) { - return ''; -} From 25f9378e85acb6e01ae2f53446b8b040341a39de Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 24 May 2016 10:29:54 +0200 Subject: [PATCH 0483/1771] Add .envrc to .gitignore Useful in case you use direnv to load environment variables for SauceLabs - I personally recommend it. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 66cc70dc37..e36f109724 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ lib/browser/diff.js *.patch *.diff npm-debug.log* +.envrc From 7c134ea139ff07c3e87cd472482227e7dfd9fca6 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 24 May 2016 10:56:21 +0200 Subject: [PATCH 0484/1771] Update CHANGELOG.md for v2.5.2 [ci skip] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d9b89990..cfd2187184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 2.5.2 / 2016-05-24 + +- [#2178] - Avoid double and triple xUnit XML escaping ([@graingert] via 49b5ff1) + +[@graingert]: https://github.com/graingert +[#2178]: https://github.com/mochajs/mocha/pull/2178 + # 2.5.1 / 2016-05-23 - Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull] via bd9450b) From c094f2075cfcfc580496505a670d418a3c4bbe50 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 24 May 2016 11:09:45 +0200 Subject: [PATCH 0485/1771] Rebuild mocha.js --- mocha.js | 346 +++++++++++++++++++++++++++---------------------------- 1 file changed, 170 insertions(+), 176 deletions(-) diff --git a/mocha.js b/mocha.js index bcb7ab1e14..d2fceb8b90 100644 --- a/mocha.js +++ b/mocha.js @@ -776,7 +776,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],9:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],9:[function(require,module,exports){ 'use strict'; /** @@ -1028,7 +1028,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],13:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],13:[function(require,module,exports){ /** * Module dependencies. */ @@ -1136,7 +1136,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":48}],14:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1643,7 +1643,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":58,"escape-string-regexp":48,"growl":50,"path":43}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":58,"escape-string-regexp":49,"growl":51,"path":43}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2281,7 +2281,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":58,"diff":47,"supports-color":43,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":39,"_process":58,"diff":48,"supports-color":43,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2808,7 +2808,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":48}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":49}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -4091,7 +4091,7 @@ XUnit.prototype.test = function(test) { if (test.state === 'failed') { var err = test.err; - this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\n' + err.stack)))); + this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack)))); } else if (test.isPending()) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { @@ -4126,14 +4126,6 @@ function tag(name, attrs, close, content) { return tag; } -/** - * Return cdata escaped CDATA `str`. - */ - -function cdata(str) { - return ''; -} - }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../utils":39,"./base":17,"_process":58,"fs":43,"mkdirp":55,"path":43}],35:[function(require,module,exports){ (function (global){ @@ -6597,7 +6589,7 @@ exports.stackTraceFilter = function() { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":58,"buffer":45,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":71,"util":74}],40:[function(require,module,exports){ +},{"_process":58,"buffer":45,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":72,"util":75}],40:[function(require,module,exports){ 'use strict' exports.toByteArray = toByteArray @@ -6739,7 +6731,7 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":58,"stream":69,"util":74}],43:[function(require,module,exports){ +},{"_process":58,"stream":59,"util":75}],43:[function(require,module,exports){ arguments[4][41][0].apply(exports,arguments) },{"dup":41}],44:[function(require,module,exports){ (function (global){ @@ -8568,7 +8560,14 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":40,"ieee754":51,"isarray":54}],46:[function(require,module,exports){ +},{"base64-js":40,"ieee754":52,"isarray":46}],46:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],47:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8679,7 +8678,7 @@ function objectToString(o) { } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":53}],47:[function(require,module,exports){ +},{"../../is-buffer/index.js":54}],48:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* @@ -9300,7 +9299,7 @@ function objectToString(o) { } }(this)); -},{}],48:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; @@ -9313,7 +9312,7 @@ module.exports = function (str) { return str.replace(matchOperatorsRe, '\\$&'); }; -},{}],49:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -9613,7 +9612,7 @@ function isUndefined(arg) { return arg === void 0; } -},{}],50:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -9907,7 +9906,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":58,"child_process":43,"fs":43,"os":56,"path":43}],51:[function(require,module,exports){ +},{"_process":58,"child_process":43,"fs":43,"os":56,"path":43}],52:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 @@ -9993,7 +9992,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],52:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -10018,7 +10017,7 @@ if (typeof Object.create === 'function') { } } -},{}],53:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ /** * Determine if an object is Buffer * @@ -10037,13 +10036,6 @@ module.exports = function (obj) { )) } -},{}],54:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - },{}],55:[function(require,module,exports){ (function (process){ var path = require('path'); @@ -10337,9 +10329,140 @@ process.chdir = function (dir) { process.umask = function() { return 0; }; },{}],59:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":50,"inherits":53,"readable-stream/duplex.js":61,"readable-stream/passthrough.js":67,"readable-stream/readable.js":68,"readable-stream/transform.js":69,"readable-stream/writable.js":70}],60:[function(require,module,exports){ +arguments[4][46][0].apply(exports,arguments) +},{"dup":46}],61:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":60}],60:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":62}],62:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -10415,7 +10538,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":62,"./_stream_writable":64,"core-util-is":46,"inherits":52,"process-nextick-args":57}],61:[function(require,module,exports){ +},{"./_stream_readable":64,"./_stream_writable":66,"core-util-is":47,"inherits":53,"process-nextick-args":57}],63:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -10442,7 +10565,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":63,"core-util-is":46,"inherits":52}],62:[function(require,module,exports){ +},{"./_stream_transform":65,"core-util-is":47,"inherits":53}],64:[function(require,module,exports){ (function (process){ 'use strict'; @@ -11338,7 +11461,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":60,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":46,"events":49,"inherits":52,"isarray":54,"process-nextick-args":57,"string_decoder/":70,"util":41}],63:[function(require,module,exports){ +},{"./_stream_duplex":62,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":47,"events":50,"inherits":53,"isarray":60,"process-nextick-args":57,"string_decoder/":71,"util":41}],65:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -11519,7 +11642,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":60,"core-util-is":46,"inherits":52}],64:[function(require,module,exports){ +},{"./_stream_duplex":62,"core-util-is":47,"inherits":53}],66:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -12048,10 +12171,10 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":60,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":46,"events":49,"inherits":52,"process-nextick-args":57,"util-deprecate":72}],65:[function(require,module,exports){ +},{"./_stream_duplex":62,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":47,"events":50,"inherits":53,"process-nextick-args":57,"util-deprecate":73}],67:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":61}],66:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":63}],68:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -12071,142 +12194,13 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":60,"./lib/_stream_passthrough.js":61,"./lib/_stream_readable.js":62,"./lib/_stream_transform.js":63,"./lib/_stream_writable.js":64,"_process":58}],67:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":62,"./lib/_stream_passthrough.js":63,"./lib/_stream_readable.js":64,"./lib/_stream_transform.js":65,"./lib/_stream_writable.js":66,"_process":58}],69:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":63}],68:[function(require,module,exports){ +},{"./lib/_stream_transform.js":65}],70:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":64}],69:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":49,"inherits":52,"readable-stream/duplex.js":59,"readable-stream/passthrough.js":65,"readable-stream/readable.js":66,"readable-stream/transform.js":67,"readable-stream/writable.js":68}],70:[function(require,module,exports){ +},{"./lib/_stream_writable.js":66}],71:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -12429,7 +12423,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":45}],71:[function(require,module,exports){ +},{"buffer":45}],72:[function(require,module,exports){ /** * Expose `toIsoString`. @@ -12470,7 +12464,7 @@ function pad (number) { var n = number.toString(); return n.length === 1 ? '0' + n : n; } -},{}],72:[function(require,module,exports){ +},{}],73:[function(require,module,exports){ (function (global){ /** @@ -12541,14 +12535,14 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],73:[function(require,module,exports){ +},{}],74:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],74:[function(require,module,exports){ +},{}],75:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -13138,4 +13132,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":73,"_process":58,"inherits":52}]},{},[1]); +},{"./support/isBuffer":74,"_process":58,"inherits":53}]},{},[1]); From fdbbe40eaf6fe51a62878ebcaccd785a34e3b4f4 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 24 May 2016 11:25:57 +0200 Subject: [PATCH 0486/1771] Release v2.5.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f794c4981..1d9456f3c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.5.1", + "version": "2.5.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 08cb423036407caa867d52b52ee959cec8e47cf0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 24 May 2016 22:32:55 -0700 Subject: [PATCH 0487/1771] avoid BitBucket rate-limiting when installing PhantomJS --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2aee750bb8..38e9c622e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,10 +8,13 @@ dist: trusty language: node_js +env: + global: PHANTOMJS_CDNURL='https://cnpmjs.org/downloads' + matrix: include: - node_js: '6' - env: TARGET="clean lint test-node test-browser" + env: TARGET='clean lint test-node test-browser' - node_js: '5' env: TARGET=test-node - node_js: '4' From 6d240630a58d86db40da5090225c675df50787c5 Mon Sep 17 00:00:00 2001 From: "Daniel St. Jules" Date: Wed, 25 May 2016 00:57:23 -0700 Subject: [PATCH 0488/1771] Fix HTML reporter regression causing duplicate error output (#2112) Fixes #2083. --- lib/reporters/html.js | 146 +++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 67 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 95fc1e9f73..81f7c464ff 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -128,88 +128,82 @@ function HTML(runner) { stack.shift(); }); - runner.on('fail', function(test) { - // For type = 'test' its possible that the test failed due to multiple - // done() calls. So report the issue here. - if (test.type === 'hook' - || test.type === 'test') { - runner.emit('test end', test); - } + runner.on('pass', function(test) { + var url = self.testURL(test); + var markup = '
            • %e%ems ' + + '

            • '; + var el = fragment(markup, test.speed, test.title, test.duration, url); + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); }); - runner.on('test end', function(test) { - // TODO: add to stats - var percent = stats.tests / this.total * 100 | 0; - if (progress) { - progress.update(percent).draw(ctx); + runner.on('fail', function(test) { + var el = fragment('
            • %e

            • ', + test.title, self.testURL(test)); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if (message === '[object Error]') { + message = test.err.message; } - // update stats - var ms = new Date() - stats.start; - text(passes, stats.passes); - text(failures, stats.failures); - text(duration, (ms / 1000).toFixed(2)); - - // test - var el; - if (test.state === 'passed') { - var url = self.testURL(test); - el = fragment('
            • %e%ems

            • ', test.speed, test.title, test.duration, url); - } else if (test.isPending()) { - el = fragment('
            • %e

            • ', test.title); - } else { - el = fragment('
            • %e

            • ', test.title, self.testURL(test)); - var stackString; // Note: Includes leading newline - var message = test.err.toString(); - - // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we - // check for the result of the stringifying. - if (message === '[object Error]') { - message = test.err.message; - } - - if (test.err.stack) { - var indexOfMessage = test.err.stack.indexOf(test.err.message); - if (indexOfMessage === -1) { - stackString = test.err.stack; - } else { - stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); - } - } else if (test.err.sourceURL && test.err.line !== undefined) { - // Safari doesn't give you a stack. Let's at least provide a source line. - stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; - } - - stackString = stackString || ''; - - if (test.err.htmlMessage && stackString) { - el.appendChild(fragment('
              %s\n
              %e
              ', test.err.htmlMessage, stackString)); - } else if (test.err.htmlMessage) { - el.appendChild(fragment('
              %s
              ', test.err.htmlMessage)); + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; } else { - el.appendChild(fragment('
              %e%e
              ', message, stackString)); + stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; } - // toggle code - // TODO: defer - if (!test.isPending()) { - var h2 = el.getElementsByTagName('h2')[0]; + stackString = stackString || ''; - on(h2, 'click', function() { - pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; - }); - - var pre = fragment('
              %e
              ', utils.clean(test.body)); - el.appendChild(pre); - pre.style.display = 'none'; + if (test.err.htmlMessage && stackString) { + el.appendChild(fragment('
              %s\n
              %e
              ', + test.err.htmlMessage, stackString)); + } else if (test.err.htmlMessage) { + el.appendChild(fragment('
              %s
              ', test.err.htmlMessage)); + } else { + el.appendChild(fragment('
              %e%e
              ', message, stackString)); } + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on('pending', function(test) { + var el = fragment('
            • %e

            • ', test.title); + appendToStack(el); + updateStats(); + }); + + function appendToStack(el) { // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. if (stack[0]) { stack[0].appendChild(el); } - }); + } + + function updateStats() { + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) { + progress.update(percent).draw(ctx); + } + + // update stats + var ms = new Date() - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + } } /** @@ -247,6 +241,24 @@ HTML.prototype.testURL = function(test) { return makeUrl(test.fullTitle()); }; +/** + * Adds code toggle functionality for the provided test's list element. + * + * @param {HTMLLIElement} el + * @param {string} contents + */ +HTML.prototype.addCodeToggle = function(el, contents) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function() { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; + }); + + var pre = fragment('
              %e
              ', utils.clean(contents)); + el.appendChild(pre); + pre.style.display = 'none'; +}; + /** * Display error `msg`. * From 9e93efc410e66a3c09bbf81c15fe6380bc5c4e2e Mon Sep 17 00:00:00 2001 From: jimenglish81 Date: Wed, 25 May 2016 09:15:23 +0100 Subject: [PATCH 0489/1771] Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation (#2119) --- lib/reporters/html.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 81f7c464ff..5167d18bfc 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -80,7 +80,8 @@ function HTML(runner) { } // pass toggle - on(passesLink, 'click', function() { + on(passesLink, 'click', function(evt) { + evt.preventDefault(); unhide(); var name = (/pass/).test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; @@ -90,7 +91,8 @@ function HTML(runner) { }); // failure toggle - on(failuresLink, 'click', function() { + on(failuresLink, 'click', function(evt) { + evt.preventDefault(); unhide(); var name = (/fail/).test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; From 7496c142ffb299677373d49233e1d767948b1338 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Wed, 25 May 2016 10:37:36 +0200 Subject: [PATCH 0490/1771] Update CHANGELOG.md for v2.5.3 [ci skip] --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfd2187184..2997f18253 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 2.5.3 / 2016-05-25 + +- [#2112] - Fix HTML reporter regression causing duplicate error output ([@danielstjules] via 6d24063) +- [#2119] - Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation ([@jimenglish81] via 9e93efc) + +[@danielstjules]: https://github.com/danielstjules +[@jimenglish81]: https://github.com/jimenglish81 +[#2112]: https://github.com/mochajs/mocha/pull/2112 +[#2119]: https://github.com/mochajs/mocha/pull/2119 + # 2.5.2 / 2016-05-24 - [#2178] - Avoid double and triple xUnit XML escaping ([@graingert] via 49b5ff1) From 52dcc3ffa85464b035ef637d1adea88ac4883872 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Wed, 25 May 2016 10:38:26 +0200 Subject: [PATCH 0491/1771] Rebuild mocha.js --- mocha.js | 152 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 83 insertions(+), 69 deletions(-) diff --git a/mocha.js b/mocha.js index d2fceb8b90..af90adac66 100644 --- a/mocha.js +++ b/mocha.js @@ -2559,7 +2559,8 @@ function HTML(runner) { } // pass toggle - on(passesLink, 'click', function() { + on(passesLink, 'click', function(evt) { + evt.preventDefault(); unhide(); var name = (/pass/).test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; @@ -2569,7 +2570,8 @@ function HTML(runner) { }); // failure toggle - on(failuresLink, 'click', function() { + on(failuresLink, 'click', function(evt) { + evt.preventDefault(); unhide(); var name = (/fail/).test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; @@ -2607,88 +2609,82 @@ function HTML(runner) { stack.shift(); }); - runner.on('fail', function(test) { - // For type = 'test' its possible that the test failed due to multiple - // done() calls. So report the issue here. - if (test.type === 'hook' - || test.type === 'test') { - runner.emit('test end', test); - } + runner.on('pass', function(test) { + var url = self.testURL(test); + var markup = '
            • %e%ems ' + + '

            • '; + var el = fragment(markup, test.speed, test.title, test.duration, url); + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); }); - runner.on('test end', function(test) { - // TODO: add to stats - var percent = stats.tests / this.total * 100 | 0; - if (progress) { - progress.update(percent).draw(ctx); - } - - // update stats - var ms = new Date() - stats.start; - text(passes, stats.passes); - text(failures, stats.failures); - text(duration, (ms / 1000).toFixed(2)); - - // test - var el; - if (test.state === 'passed') { - var url = self.testURL(test); - el = fragment('
            • %e%ems

            • ', test.speed, test.title, test.duration, url); - } else if (test.isPending()) { - el = fragment('
            • %e

            • ', test.title); - } else { - el = fragment('
            • %e

            • ', test.title, self.testURL(test)); - var stackString; // Note: Includes leading newline - var message = test.err.toString(); - - // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we - // check for the result of the stringifying. - if (message === '[object Error]') { - message = test.err.message; - } - - if (test.err.stack) { - var indexOfMessage = test.err.stack.indexOf(test.err.message); - if (indexOfMessage === -1) { - stackString = test.err.stack; - } else { - stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); - } - } else if (test.err.sourceURL && test.err.line !== undefined) { - // Safari doesn't give you a stack. Let's at least provide a source line. - stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; - } + runner.on('fail', function(test) { + var el = fragment('
            • %e

            • ', + test.title, self.testURL(test)); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); - stackString = stackString || ''; + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if (message === '[object Error]') { + message = test.err.message; + } - if (test.err.htmlMessage && stackString) { - el.appendChild(fragment('
              %s\n
              %e
              ', test.err.htmlMessage, stackString)); - } else if (test.err.htmlMessage) { - el.appendChild(fragment('
              %s
              ', test.err.htmlMessage)); + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; } else { - el.appendChild(fragment('
              %e%e
              ', message, stackString)); + stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; } - // toggle code - // TODO: defer - if (!test.isPending()) { - var h2 = el.getElementsByTagName('h2')[0]; + stackString = stackString || ''; - on(h2, 'click', function() { - pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; - }); - - var pre = fragment('
              %e
              ', utils.clean(test.body)); - el.appendChild(pre); - pre.style.display = 'none'; + if (test.err.htmlMessage && stackString) { + el.appendChild(fragment('
              %s\n
              %e
              ', + test.err.htmlMessage, stackString)); + } else if (test.err.htmlMessage) { + el.appendChild(fragment('
              %s
              ', test.err.htmlMessage)); + } else { + el.appendChild(fragment('
              %e%e
              ', message, stackString)); } + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on('pending', function(test) { + var el = fragment('
            • %e

            • ', test.title); + appendToStack(el); + updateStats(); + }); + + function appendToStack(el) { // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. if (stack[0]) { stack[0].appendChild(el); } - }); + } + + function updateStats() { + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) { + progress.update(percent).draw(ctx); + } + + // update stats + var ms = new Date() - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + } } /** @@ -2726,6 +2722,24 @@ HTML.prototype.testURL = function(test) { return makeUrl(test.fullTitle()); }; +/** + * Adds code toggle functionality for the provided test's list element. + * + * @param {HTMLLIElement} el + * @param {string} contents + */ +HTML.prototype.addCodeToggle = function(el, contents) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function() { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; + }); + + var pre = fragment('
              %e
              ', utils.clean(contents)); + el.appendChild(pre); + pre.style.display = 'none'; +}; + /** * Display error `msg`. * From e939d8e4379a622e28064ca3a75f3e1bda7e225b Mon Sep 17 00:00:00 2001 From: David da Silva Date: Wed, 25 May 2016 10:43:52 +0200 Subject: [PATCH 0492/1771] Release v2.5.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d9456f3c5..0aed134ac8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.5.2", + "version": "2.5.3", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 2c9966c950f5960c80b48d55a783b752a7e12a36 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Sun, 29 May 2016 20:18:04 +0200 Subject: [PATCH 0493/1771] Add failing test: after hook not run if beforeEach skipped test Related to #2286. --- test/integration/fixtures/regression/issue-2286.js | 5 +++++ test/integration/regression.js | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 test/integration/fixtures/regression/issue-2286.js diff --git a/test/integration/fixtures/regression/issue-2286.js b/test/integration/fixtures/regression/issue-2286.js new file mode 100644 index 0000000000..e912d93815 --- /dev/null +++ b/test/integration/fixtures/regression/issue-2286.js @@ -0,0 +1,5 @@ +describe('suite', function () { + beforeEach(function () { this.skip() }) + after(function () { console.log('after in suite') }) + it('test', function () {}) +}) diff --git a/test/integration/regression.js b/test/integration/regression.js index f20f601ea1..2edec801a3 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -50,4 +50,18 @@ describe('regressions', function() { done(); }); }) + + it('issue-2286: after doesn\'t execute if test was skipped in beforeEach', function(done) { + var args = []; + run('regression/issue-2286.js', args, function(err, res) { + var occurences = function(str) { + var pattern = new RegExp(str, 'g'); + return (res.output.match(pattern) || []).length; + }; + + assert(!err); + assert.equal(occurences('after in suite'), 1); + done(); + }); + }) }); From 22dbad7c8d4e6619119558497d7b91f240a8fb79 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 30 May 2016 00:35:55 +0200 Subject: [PATCH 0494/1771] wip Fix suite being marked as pending when beforeEach skips --- lib/runner.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index ba4d7df97c..f4e30c72a2 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -302,7 +302,8 @@ Runner.prototype.hook = function(name, fn) { } if (err) { if (err instanceof Pending) { - suite.pending = true; + self.test.pending = true; + console.log(self.test); } else { self.failHook(hook, err); @@ -516,7 +517,7 @@ Runner.prototype.runTests = function(suite, fn) { // execute test and hook(s) self.emit('test', self.test = test); self.hookDown('beforeEach', function(err, errSuite) { - if (suite.isPending()) { + if (test.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); From 6d602003bbc36a9d964443cca8030360e619664c Mon Sep 17 00:00:00 2001 From: ScottFreeCode Date: Fri, 15 Apr 2016 00:44:08 -0400 Subject: [PATCH 0495/1771] Correct regex for function source cleaning - Treat tabs etc. as spaces. - Match function name for removal. - Match only non-`)` inside the function parameter list for removal instead of `.`; prevents matching through later in the first line e.g. `function(){ if ([condition]) { ...`. - Match 0 or more spaces before } on the end for removal rather than 1 or more. - Make the closing } optional for arrow functions with a single-statement body just like the opening {. - Add tests for these cases. --- lib/utils.js | 4 ++-- test/utils.js | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index e5d214021c..35e59c09c5 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -264,8 +264,8 @@ exports.slug = function(str) { exports.clean = function(str) { str = str .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') - .replace(/^function *\(.*\)\s*\{|\(.*\) *=> *\{?/, '') - .replace(/\s+\}$/, ''); + // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content + .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3'); var spaces = str.match(/^\n?( *)/)[1].length; var tabs = str.match(/^\n?(\t*)/)[1].length; diff --git a/test/utils.js b/test/utils.js index 6cebc5ab68..881e5342a9 100644 --- a/test/utils.js +++ b/test/utils.js @@ -19,6 +19,30 @@ describe('utils', function() { it('should remove tab character indentation from the function body', function() { clean('\t//line1\n\t\t//line2').should.equal('//line1\n\t//line2'); }); + + it('should handle functions with tabs in their declarations', function() { + clean('function\t(\t)\t{\n//code\n}').should.equal('//code'); + }); + + it('should handle named functions without space after name', function() { + clean('function withName() {\n//code\n}').should.equal('//code'); + }); + + it('should handle named functions with space after name', function() { + clean('function withName () {\n//code\n}').should.equal('//code'); + }); + + it('should handle functions with no space between the end and the closing brace', function() { + clean('function() {/*code*/}').should.equal('/*code*/'); + }); + + it('should handle functions with parentheses in the same line', function() { + clean('function() { if (true) { /* code */ } }').should.equal('if (true) { /* code */ }'); + }); + + it('should handle empty functions', function() { + clean('function() {}').should.equal(''); + }); }); describe('.isBuffer()', function() { From 966ab86017d469332e62aa501d1c8776ed47ef9d Mon Sep 17 00:00:00 2001 From: Avi Vahl Date: Wed, 8 Jun 2016 14:54:29 +0300 Subject: [PATCH 0496/1771] Fix % always 0 in HTML reporter updateStats() accesses this.total, but this === the global object (window) if not specified explicitly. Also added a missing update when all tests end. --- lib/reporters/html.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 5167d18bfc..e498328145 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -125,6 +125,7 @@ function HTML(runner) { runner.on('suite end', function(suite) { if (suite.root) { + updateStats.call(this); return; } stack.shift(); @@ -137,7 +138,7 @@ function HTML(runner) { var el = fragment(markup, test.speed, test.title, test.duration, url); self.addCodeToggle(el, test.body); appendToStack(el); - updateStats(); + updateStats.call(this); }); runner.on('fail', function(test) { @@ -177,13 +178,13 @@ function HTML(runner) { self.addCodeToggle(el, test.body); appendToStack(el); - updateStats(); + updateStats.call(this); }); runner.on('pending', function(test) { var el = fragment('
            • %e

            • ', test.title); appendToStack(el); - updateStats(); + updateStats.call(this); }); function appendToStack(el) { From 4f2e4549cc0407135f1fa96a7f7ae862e1d7e5c0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 9 Jun 2016 16:19:38 -0700 Subject: [PATCH 0497/1771] update pending logic to closely mimic previous behavior --- lib/runner.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index f4e30c72a2..86bd4dc4af 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -302,8 +302,13 @@ Runner.prototype.hook = function(name, fn) { } if (err) { if (err instanceof Pending) { - self.test.pending = true; - console.log(self.test); + if (name === 'beforeEach' || name === 'afterEach') { + self.test.pending = true; + } else { + suite.tests.forEach(function(test) { + test.pending = true; + }); + } } else { self.failHook(hook, err); @@ -844,8 +849,8 @@ function filterLeaks(ok, globals) { } // in firefox - // if runner runs in an iframe, this iframe's window.getInterface method not init at first - // it is assigned in some seconds + // if runner runs in an iframe, this iframe's window.getInterface method + // not init at first it is assigned in some seconds if (global.navigator && (/^getInterface/).test(key)) { return false; } From d2ba7a9676c88d06709f383a6243d46977758bd1 Mon Sep 17 00:00:00 2001 From: ScottFreeCode Date: Fri, 10 Jun 2016 19:10:11 -0400 Subject: [PATCH 0498/1771] Clarify nature of meta test This should make it possible to understand when just looking at the fixture. --- test/integration/fixtures/regression/issue-2286.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/fixtures/regression/issue-2286.js b/test/integration/fixtures/regression/issue-2286.js index e912d93815..8a3c1ac4dd 100644 --- a/test/integration/fixtures/regression/issue-2286.js +++ b/test/integration/fixtures/regression/issue-2286.js @@ -1,5 +1,5 @@ -describe('suite', function () { - beforeEach(function () { this.skip() }) - after(function () { console.log('after in suite') }) - it('test', function () {}) +describe('testception for issue 2286 meta test', function () { + beforeEach('skips tests', function () { this.skip() }) + after('should run', function () { console.log('after in suite') }) + it('skipped by beforeEach', function () {}) }) From d165c82fa94df2fa417362a7f7be6a857d12cd4b Mon Sep 17 00:00:00 2001 From: ScottFreeCode Date: Fri, 10 Jun 2016 19:21:42 -0400 Subject: [PATCH 0499/1771] Nested suites for meta test --- .../fixtures/regression/issue-2286.js | 5 ---- test/integration/regression.js | 24 +++++++++---------- 2 files changed, 11 insertions(+), 18 deletions(-) delete mode 100644 test/integration/fixtures/regression/issue-2286.js diff --git a/test/integration/fixtures/regression/issue-2286.js b/test/integration/fixtures/regression/issue-2286.js deleted file mode 100644 index 8a3c1ac4dd..0000000000 --- a/test/integration/fixtures/regression/issue-2286.js +++ /dev/null @@ -1,5 +0,0 @@ -describe('testception for issue 2286 meta test', function () { - beforeEach('skips tests', function () { this.skip() }) - after('should run', function () { console.log('after in suite') }) - it('skipped by beforeEach', function () {}) -}) diff --git a/test/integration/regression.js b/test/integration/regression.js index 2edec801a3..b8c64b84e7 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -1,4 +1,4 @@ -var assert = require('assert'); +var assert = require('assert'); var fs = require('fs'); var path = require('path'); var run = require('./helpers').runMocha; @@ -51,17 +51,15 @@ describe('regressions', function() { }); }) - it('issue-2286: after doesn\'t execute if test was skipped in beforeEach', function(done) { - var args = []; - run('regression/issue-2286.js', args, function(err, res) { - var occurences = function(str) { - var pattern = new RegExp(str, 'g'); - return (res.output.match(pattern) || []).length; - }; - - assert(!err); - assert.equal(occurences('after in suite'), 1); - done(); + describe('issue-2286: after doesn\'t execute if test was skipped in beforeEach', function () { + var afterWasRun = false; + describe('suite with skipped test for meta test', function () { + beforeEach(function () { this.skip(); }); + after(function () { afterWasRun = true; }); + it('should be pending', function () {}); + }) + after('meta test', function () { + afterWasRun.should.be.ok(); }); - }) + }); }); From 85ffb51cfb0957a485b75d5c1198ecb9e4f33b86 Mon Sep 17 00:00:00 2001 From: Avi Vahl Date: Sun, 12 Jun 2016 00:51:57 +0300 Subject: [PATCH 0500/1771] Alternative method to achieve a cleaner syntax. --- lib/reporters/html.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index e498328145..51ba1ca722 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -125,7 +125,7 @@ function HTML(runner) { runner.on('suite end', function(suite) { if (suite.root) { - updateStats.call(this); + updateStats(); return; } stack.shift(); @@ -138,7 +138,7 @@ function HTML(runner) { var el = fragment(markup, test.speed, test.title, test.duration, url); self.addCodeToggle(el, test.body); appendToStack(el); - updateStats.call(this); + updateStats(); }); runner.on('fail', function(test) { @@ -178,13 +178,13 @@ function HTML(runner) { self.addCodeToggle(el, test.body); appendToStack(el); - updateStats.call(this); + updateStats(); }); runner.on('pending', function(test) { var el = fragment('
            • %e

            • ', test.title); appendToStack(el); - updateStats.call(this); + updateStats(); }); function appendToStack(el) { @@ -196,7 +196,7 @@ function HTML(runner) { function updateStats() { // TODO: add to stats - var percent = stats.tests / this.total * 100 | 0; + var percent = stats.tests / runner.total * 100 | 0; if (progress) { progress.update(percent).draw(ctx); } From 3b5818444c06a127cacc529bb04c1e3d50854bcb Mon Sep 17 00:00:00 2001 From: Jason Leyba Date: Sun, 12 Jun 2016 13:58:42 -0700 Subject: [PATCH 0501/1771] Fix a small typo in the doc reporter that causes mocha to crash when a test fails. --- lib/reporters/doc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js index 01f3fdc9d9..9f5c3f8a37 100644 --- a/lib/reporters/doc.js +++ b/lib/reporters/doc.js @@ -55,7 +55,7 @@ function Doc(runner) { runner.on('fail', function(test, err) { console.log('%s
              %s
              ', indent(), utils.escape(test.title)); - var code = utils.escape(utils.clean(test.fn.body)); + var code = utils.escape(utils.clean(test.body)); console.log('%s
              %s
              ', indent(), code); console.log('%s
              %s
              ', indent(), utils.escape(err)); }); From 200da81965db2e5c28d40691c91f0ff2b492454a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 13 Jun 2016 16:55:02 -0700 Subject: [PATCH 0502/1771] try to fix Gitter/Travis integration --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 38e9c622e5..7398ff5fa3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,6 @@ script: travis_retry make $TARGET notifications: urls: # for gitter - - secure: "EmycFlk48bUvOQ07mxnbcn6T+n3G4wVWuXgrDsUUp6EhJ9866wQK9i+qVhqogWuSEQrGoVaS/vpc/NEYxDP30BD/+nqgvOhVhLVEgtziI85imyV/oUVpArdW3AUmuzCrx7rQCivygjpBmWV9ZcUT5Km4qp1iQhuumy2WbplxrZ4=" + - secure: "dSItHgvzzd9hQUUdeGo6juPiLFj03ODuoZ/eC3Q3B8F6pRs6hkgCVfATa9++m/buasdWp2OCf6unWVDdcE5MNxVqXjNmr5VEaiV3WjcT254pDDs1VVV9IlaiMjtKu6NQsaHT5oJGdFYQUdiwtUK2rL7+cdYMqndb99SLkIeXtqA=" on_success: change on_failure: always From 4cfab1c78bc1bdd729b8dae6eec97bd9df729984 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 13 Jun 2016 17:06:28 -0700 Subject: [PATCH 0503/1771] try to fix Gitter/Travis integration, take 2 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7398ff5fa3..29f9bff62d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,6 @@ script: travis_retry make $TARGET notifications: urls: # for gitter - - secure: "dSItHgvzzd9hQUUdeGo6juPiLFj03ODuoZ/eC3Q3B8F6pRs6hkgCVfATa9++m/buasdWp2OCf6unWVDdcE5MNxVqXjNmr5VEaiV3WjcT254pDDs1VVV9IlaiMjtKu6NQsaHT5oJGdFYQUdiwtUK2rL7+cdYMqndb99SLkIeXtqA=" + - secure: "nSYqkR0NKB/vB3PsPS+7+U2ZGhP+NbqFncPPZxsGb0TeRvuRL62BemEZGs5+VsajutCN8Dn/yXSIWkYZ6ivZt8xSQ9vk2OnboBMPH/e8P9t+6BBUyIb4ztJuHbsUyx1POYFyukT2TiqRuEGvUUACeXH0OIrWNPt254DipDhe2P0=" on_success: change on_failure: always From 229310645e9bcf7ea8fd8aa7e60ce23ebe856c10 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 22 Jun 2016 06:52:36 -0700 Subject: [PATCH 0504/1771] Ensure browser-entry.js gets published Closes #2323 (#2324). --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 0aed134ac8..cefaeb8a88 100644 --- a/package.json +++ b/package.json @@ -352,6 +352,7 @@ "index.js", "mocha.css", "mocha.js", + "browser-entry.js", "LICENSE" ], "browser": { From c8ef39e0b54a9246ec165f9c90dbdc3ba5e733d0 Mon Sep 17 00:00:00 2001 From: silentcloud Date: Fri, 24 Jun 2016 17:48:55 +0800 Subject: [PATCH 0505/1771] fix custom comiler file (absolute path) support in windows system --- bin/_mocha | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index ad4ed40373..d0857ac5e1 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -295,9 +295,9 @@ if (program.retries) mocha.suite.retries(program.retries); var extensions = ['js']; program.compilers.forEach(function(c) { - var compiler = c.split(':') - , ext = compiler[0] - , mod = compiler[1]; + var compiler = c.match(/([a-z.]+):(([A-Z]:)?\S*)+/) + , ext = compiler[1] + , mod = compiler[2]; if (mod[0] == '.') mod = join(process.cwd(), mod); require(mod); From da5d021eecd3b9cc2da9ed98768a329fe0e3037d Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Sat, 25 Jun 2016 10:51:01 +0300 Subject: [PATCH 0506/1771] Add info about timeouts in hooks. --- index.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/index.md b/index.md index e9a52fa184..13ae8d0025 100644 --- a/index.md +++ b/index.md @@ -569,6 +569,19 @@ it('should take less than 500ms', function(done){ }); ``` +### Hook-level + +Hook-level timeouts may also be applied, or the use of `this.timeout(0)` to disable timeout for a hook: + +```js +describe('a suite of tests', function() { + beforeEach(function(done) { + this.timeout(3000); // A very long evironment setup. + setTimeout(done, 2500); + }); +}); +``` + ## Diffs Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff: From 92bf5279c128c39f1f65d45f9339d65859c35591 Mon Sep 17 00:00:00 2001 From: silentcloud Date: Tue, 28 Jun 2016 09:44:09 +0800 Subject: [PATCH 0507/1771] replace regular expression with slice --- bin/_mocha | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index d0857ac5e1..559e91fdfb 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -295,9 +295,9 @@ if (program.retries) mocha.suite.retries(program.retries); var extensions = ['js']; program.compilers.forEach(function(c) { - var compiler = c.match(/([a-z.]+):(([A-Z]:)?\S*)+/) - , ext = compiler[1] - , mod = compiler[2]; + var idx = c.indexOf(':') + , ext = c.slice(0, idx) + , mod = c.slice(idx + 1); if (mod[0] == '.') mod = join(process.cwd(), mod); require(mod); From 55efba470ac8e7d9e509e54e4d15fc18cabc3d7e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 27 Jun 2016 22:49:52 -0700 Subject: [PATCH 0508/1771] ensures slow() called w/o args does not blast value; closes #2311 --- lib/runnable.js | 2 +- test/runnable.js | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/runnable.js b/lib/runnable.js index 64de4e9a20..bba47d9542 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -96,7 +96,7 @@ Runnable.prototype.timeout = function(ms) { * @return {Runnable|number} ms or Runnable instance. */ Runnable.prototype.slow = function(ms) { - if (!arguments.length) { + if (typeof ms === 'undefined') { return this._slow; } if (typeof ms === 'string') { diff --git a/test/runnable.js b/test/runnable.js index af34d06474..a3d88adda2 100644 --- a/test/runnable.js +++ b/test/runnable.js @@ -49,12 +49,27 @@ describe('Runnable(title, fn)', function(){ }); }); - describe('#slow(ms)', function(){ - it('should set the slow threshold', function(){ - var run = new Runnable; - run.slow(100) + describe('#slow(ms)', function() { + var run; + + beforeEach(function() { + run = new Runnable(); + }); + + it('should set the slow threshold', function() { + run.slow(100); run.slow().should.equal(100); - }) + }); + + it('should not set the slow threshold if the parameter is not passed', function() { + run.slow(); + run.slow().should.equal(75); + }); + + it('should not set the slow threshold if the parameter is undefined', function() { + run.slow(undefined); + run.slow().should.equal(75); + }); }) describe('.title', function(){ From aa8ff21a2f23549679faa55a654a684fca0c8d68 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 28 Jun 2016 08:20:56 -0700 Subject: [PATCH 0509/1771] Allow skip() in async test context Closes #2334. PR #2335. --- lib/runnable.js | 4 ++ .../fixtures/pending/skip.async.before.js | 16 +++++++ .../fixtures/pending/skip.async.beforeEach.js | 16 +++++++ .../fixtures/pending/skip.async.spec.js | 12 ++++++ test/integration/pending.js | 43 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 test/integration/fixtures/pending/skip.async.before.js create mode 100644 test/integration/fixtures/pending/skip.async.beforeEach.js create mode 100644 test/integration/fixtures/pending/skip.async.spec.js diff --git a/lib/runnable.js b/lib/runnable.js index bba47d9542..4bc2be2448 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -298,6 +298,10 @@ Runnable.prototype.run = function(fn) { return callFnAsync(this.fn); } try { + // allows skip() to be used in an explicit async context + this.skip = function() { + done(new Pending()); + }; callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); diff --git a/test/integration/fixtures/pending/skip.async.before.js b/test/integration/fixtures/pending/skip.async.before.js new file mode 100644 index 0000000000..114db36d88 --- /dev/null +++ b/test/integration/fixtures/pending/skip.async.before.js @@ -0,0 +1,16 @@ +describe('skip in before', function() { + before(function(done) { + var self = this; + setTimeout(function() { + self.skip(); + }, 50); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); +}); diff --git a/test/integration/fixtures/pending/skip.async.beforeEach.js b/test/integration/fixtures/pending/skip.async.beforeEach.js new file mode 100644 index 0000000000..b8db22b94a --- /dev/null +++ b/test/integration/fixtures/pending/skip.async.beforeEach.js @@ -0,0 +1,16 @@ +describe('skip in beforeEach', function() { + beforeEach(function(done) { + var self = this; + setTimeout(function() { + self.skip(); + }, 50); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); + + it('should never run this test', function() { + throw new Error('never thrown'); + }); +}); diff --git a/test/integration/fixtures/pending/skip.async.spec.js b/test/integration/fixtures/pending/skip.async.spec.js new file mode 100644 index 0000000000..6096c59d2a --- /dev/null +++ b/test/integration/fixtures/pending/skip.async.spec.js @@ -0,0 +1,12 @@ +describe('skip in test', function() { + it('should skip async', function(done) { + var self = this; + setTimeout(function() { + self.skip(); + }, 50); + }); + + it('should run other tests in the suite', function() { + // Do nothing + }); +}); diff --git a/test/integration/pending.js b/test/integration/pending.js index 01ebbdf6eb..529ed80b43 100644 --- a/test/integration/pending.js +++ b/test/integration/pending.js @@ -60,4 +60,47 @@ describe('pending', function() { }); }); }); + + describe('asynchronous skip()', function() { + this.timeout(1000); + + describe('in spec', function() { + it('should immediately skip the spec and run all others', function(done) { + run('pending/skip.async.spec.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 1); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('in before', function() { + it('should skip all suite specs', function(done) { + run('pending/skip.async.before.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 2); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + + describe('in beforeEach', function() { + it('should skip all suite specs', function(done) { + run('pending/skip.sync.beforeEach.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 2); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + }); + }); }); From 96d9e06669262c395d74a12c2f15490535829507 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 28 Jun 2016 21:37:55 -0700 Subject: [PATCH 0510/1771] upgrade karma; closes #2338 (#2339) - reorg `karma.conf.js` a little - ensure local SauceLabs tests run --- karma.conf.js | 94 ++++++++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 3a001e3e97..66d3f9786b 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,50 +1,5 @@ 'use strict'; -function addSauceTests(cfg) { - cfg.reporters.push('saucelabs'); - cfg.customLaunchers = { - ie8: { - base: 'SauceLabs', - browserName: 'internet explorer', - platform: 'Windows 7', - version: '8.0' - }, - chrome: { - base: 'SauceLabs', - browserName: 'chrome', - platform: 'Windows 8', - version: 'latest' - }, - edge: { - base: 'SauceLabs', - browserName: 'MicrosoftEdge', - platform: 'Windows 10', - version: 'latest' - }, - firefox: { - base: 'SauceLabs', - browserName: 'firefox', - platform: 'Windows 8.1', - version: 'latest' - }, - safari: { - base: 'SauceLabs', - browserName: 'safari', - platform: 'OS X 10.11', - version: 'latest' - } - }; - - cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers)); - - cfg.sauceLabs = { - public: 'public' - }; - - // for slow browser booting, ostensibly - cfg.captureTimeout = 120000; -} - module.exports = function(config) { var cfg = { frameworks: [ @@ -96,7 +51,6 @@ module.exports = function(config) { cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - cfg.sauceLabs.startConnect = true; } } else { if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { @@ -129,3 +83,51 @@ module.exports = function(config) { config.set(cfg); }; + +function addSauceTests(cfg) { + cfg.reporters.push('saucelabs'); + + cfg.customLaunchers = { + ie8: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 7', + version: '8.0' + }, + chrome: { + base: 'SauceLabs', + browserName: 'chrome', + platform: 'Windows 8', + version: 'latest' + }, + edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge', + platform: 'Windows 10', + version: 'latest' + }, + firefox: { + base: 'SauceLabs', + browserName: 'firefox', + platform: 'Windows 8.1', + version: 'latest' + }, + safari: { + base: 'SauceLabs', + browserName: 'safari', + platform: 'OS X 10.11', + version: 'latest' + } + }; + + cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers)); + + cfg.sauceLabs = { + public: 'public', + startConnect: true + }; + + // for slow browser booting, ostensibly + cfg.captureTimeout = 120000; + cfg.browserNoActivityTimeout = 20000; +} diff --git a/package.json b/package.json index cefaeb8a88..abf2558000 100644 --- a/package.json +++ b/package.json @@ -333,7 +333,7 @@ "coffee-script": "~1.8.0", "eslint": "^1.2.1", "expect.js": "^0.3.1", - "karma": "^0.13.22", + "karma": "^1.1.0", "karma-browserify": "^5.0.5", "karma-expect": "^1.1.2", "karma-no-mocha": "^2.0.0", From 8fe36a36c41aa22ceaa98fd86958d89c2b67fae5 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Sat, 21 May 2016 17:36:38 -0700 Subject: [PATCH 0511/1771] Support test suite on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on work by Tyler Waters in #1814. This commit contains the following changes: - Add quotation marks to Makefile variables for programs. The variables use POSIX-style paths, which cannot be used on Windows to launch a program except when quoted. Using double quotation marks instead of single since the latter is not available on Windows - Use os-tmpdir module to get an acceptable directory for temporary usage instead of relying on the POSIX /tmp - Use process.execPath as an authoritative path for Node.js executable - Detect whether symbolic links are supported on the platform before testing. On Windows, creating symlinks can fail since it needs additional user permissions - Fix hook tests. The tests parse output of the "dot" reporter to separate output of individual tests. The "dot" reporter uses "·" symbol (U+2024 ONE DOT LEADER) under POSIX environments and "." symbol (U+002E FULL STOP) under Windows, which means that having "." in the echoed message makes it ambiguous to be parsed in Windows. To fix this issue, two separate changes are necessary: - Use a dynamically created regular expression to split the tests based on the specific dot character used on the platform - Replace "." with "-" in echoed messages in fixtures for hook tests to avoid ambiguity with the character output by the reporter Changes from #1814 include: - Rebasing - Use process.execPath as an authoritative path for Node.js executable - Avoid external dependencies for child_process.spawn() - Detect whether symbol links are supported on the platform before testing. On Windows, creating symlinks can fail since it needs additional user permissions Fixes #1813. --- Makefile | 6 +- mocha.js | 20 +++-- package.json | 1 + test/acceptance/fs.js | 6 +- test/acceptance/lookup-files.js | 75 ++++++++++++------ test/color.js | 5 +- .../hooks/multiple.hook.async.error.js | 78 +++++++++---------- .../fixtures/hooks/multiple.hook.error.js | 78 +++++++++---------- test/integration/helpers.js | 11 ++- test/integration/hook.err.js | 47 +++++------ test/integration/hooks.js | 3 +- test/integration/retries.js | 4 +- 12 files changed, 190 insertions(+), 144 deletions(-) diff --git a/Makefile b/Makefile index 2288ae862e..92daf92a18 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -BROWSERIFY := node_modules/.bin/browserify -ESLINT := node_modules/.bin/eslint -KARMA := node_modules/.bin/karma +BROWSERIFY := "node_modules/.bin/browserify" +ESLINT := "node_modules/.bin/eslint" +KARMA := "node_modules/.bin/karma" REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle diff --git a/mocha.js b/mocha.js index af90adac66..df54445862 100644 --- a/mocha.js +++ b/mocha.js @@ -2474,7 +2474,7 @@ function coverageClass(coveragePctg) { return 'terrible'; } -}).call(this,require('_process'),"/lib/reporters") +}).call(this,require('_process'),"/lib\\reporters") },{"./json-cov":23,"_process":58,"fs":43,"jade":43,"path":43}],21:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -4814,7 +4814,13 @@ Runner.prototype.hook = function(name, fn) { } if (err) { if (err instanceof Pending) { - suite.pending = true; + if (name === 'beforeEach' || name === 'afterEach') { + self.test.pending = true; + } else { + suite.tests.forEach(function(test) { + test.pending = true; + }); + } } else { self.failHook(hook, err); @@ -5028,7 +5034,7 @@ Runner.prototype.runTests = function(suite, fn) { // execute test and hook(s) self.emit('test', self.test = test); self.hookDown('beforeEach', function(err, errSuite) { - if (suite.isPending()) { + if (test.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); @@ -5355,8 +5361,8 @@ function filterLeaks(ok, globals) { } // in firefox - // if runner runs in an iframe, this iframe's window.getInterface method not init at first - // it is assigned in some seconds + // if runner runs in an iframe, this iframe's window.getInterface method + // not init at first it is assigned in some seconds if (global.navigator && (/^getInterface/).test(key)) { return false; } @@ -6117,8 +6123,8 @@ exports.slug = function(str) { exports.clean = function(str) { str = str .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') - .replace(/^function *\(.*\)\s*\{|\(.*\) *=> *\{?/, '') - .replace(/\s+\}$/, ''); + // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content + .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3'); var spaces = str.match(/^\n?( *)/)[1].length; var tabs = str.match(/^\n?(\t*)/)[1].length; diff --git a/package.json b/package.json index abf2558000..3840adf7f5 100644 --- a/package.json +++ b/package.json @@ -324,6 +324,7 @@ "growl": "1.9.2", "jade": "0.26.3", "mkdirp": "0.5.1", + "os-tmpdir": "1.0.1", "supports-color": "1.2.0", "to-iso-string": "0.0.2" }, diff --git a/test/acceptance/fs.js b/test/acceptance/fs.js index cdd32166d5..f4c92ea727 100644 --- a/test/acceptance/fs.js +++ b/test/acceptance/fs.js @@ -1,16 +1,18 @@ var fs = require('fs'); +var path = require('path'); +var tmpFile = path.join.bind(path, require('os-tmpdir')()); describe('fs.readFile()', function(){ describe('when the file exists', function(){ it('should succeed', function(done){ - fs.writeFile('/tmp/mocha', 'wahoo', done) + fs.writeFile(tmpFile('mocha'), 'wahoo', done) }) }) describe('when the file does not exist', function(){ it('should fail', function(done){ // uncomment - // fs.readFile('/tmp/does-not-exist', done); + // fs.readFile(tmpFile('does-not-exist'), done); done(); }) }) diff --git a/test/acceptance/lookup-files.js b/test/acceptance/lookup-files.js index 504d23aab1..7b84d93171 100644 --- a/test/acceptance/lookup-files.js +++ b/test/acceptance/lookup-files.js @@ -1,56 +1,83 @@ var utils = require('../../lib/utils'); describe('lookupFiles', function() { - var fs = require('fs'), path = require('path'), existsSync = fs.existsSync || - path.existsSync; + var fs = require('fs'), + path = require('path'), + existsSync = fs.existsSync || path.existsSync, + tmpDir = require('os-tmpdir')(), + tmpFile = path.join.bind(path, tmpDir), + symlinkSupported = false; + + fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); + try { + fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js')); + symlinkSupported = true; + } catch (ignored) { + } + + cleanup(); beforeEach(function() { - fs.writeFileSync('/tmp/mocha-utils.js', 'yippy skippy ying yang yow'); - fs.symlinkSync('/tmp/mocha-utils.js', '/tmp/mocha-utils-link.js'); + fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); + if (symlinkSupported) { + fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js')); + } }); - it('should not choke on symlinks', function() { - expect(utils.lookupFiles('/tmp', ['js'], false)) + (symlinkSupported ? it : it.skip)('should not choke on symlinks', function() { + expect(utils.lookupFiles(tmpDir, ['js'], false)) .to - .contain('/tmp/mocha-utils-link.js') + .contain(tmpFile('mocha-utils-link.js')) .and - .contain('/tmp/mocha-utils.js') + .contain(tmpFile('mocha-utils.js')) .and .have .length(2); - expect(existsSync('/tmp/mocha-utils-link.js')) + expect(existsSync(tmpFile('mocha-utils-link.js'))) .to .be(true); - fs.renameSync('/tmp/mocha-utils.js', '/tmp/bob'); - expect(existsSync('/tmp/mocha-utils-link.js')) + fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob')); + expect(existsSync(tmpFile('mocha-utils-link.js'))) .to .be(false); - expect(utils.lookupFiles('/tmp', ['js'], false)) + expect(utils.lookupFiles(tmpDir, ['js'], false)) .to .eql([]); }); it('should accept a glob "path" value', function() { - expect(utils.lookupFiles('/tmp/mocha-utils*', ['js'], false)) + var res = utils.lookupFiles(tmpFile('mocha-utils*'), ['js'], false) + .map(path.normalize.bind(path)); + + var expectedLength = 0; + var ex = expect(res) .to - .contain('/tmp/mocha-utils-link.js') - .and - .contain('/tmp/mocha-utils.js') - .and + .contain(tmpFile('mocha-utils.js')); + expectedLength++; + + if (symlinkSupported) { + ex = ex.and + .contain(tmpFile('mocha-utils-link.js')); + expectedLength++; + } + + ex.and .have - .length(2); + .length(expectedLength); }); - afterEach(function() { + afterEach(cleanup); + + function cleanup() { [ - '/tmp/mocha-utils.js', - '/tmp/mocha-utils-link.js', - '/tmp/bob' + 'mocha-utils.js', + 'mocha-utils-link.js', + 'bob' ].forEach(function(path) { try { - fs.unlinkSync(path); + fs.unlinkSync(tmpFile(path)); } catch (ignored) { } }); - }); + } }); diff --git a/test/color.js b/test/color.js index 8c7167b0fa..3913c0099c 100644 --- a/test/color.js +++ b/test/color.js @@ -1,12 +1,13 @@ var assert = require('assert'); var child_process = require('child_process'); +var path = require('path'); describe('Mocha', function() { this.timeout(1000); it('should not output colors to pipe', function(cb) { - var command = 'bin/mocha --grep missing-test'; - child_process.exec(command, function(err, stdout, stderr) { + var command = [path.join('bin', 'mocha'), '--grep', 'missing-test']; + child_process.execFile(process.execPath, command, function(err, stdout, stderr) { if (err) return cb(err); assert(stdout.indexOf('[90m') === -1); diff --git a/test/integration/fixtures/hooks/multiple.hook.async.error.js b/test/integration/fixtures/hooks/multiple.hook.async.error.js index c5474ad99b..93ace7ff0d 100644 --- a/test/integration/fixtures/hooks/multiple.hook.async.error.js +++ b/test/integration/fixtures/hooks/multiple.hook.async.error.js @@ -9,54 +9,54 @@ describe('1', function () { console.log('1 before each'); }); - describe('1.1', function () { + describe('1-1', function () { before(function () { - console.log('1.1 before'); + console.log('1-1 before'); }); beforeEach(function (done) { - console.log('1.1 before each'); + console.log('1-1 before each'); process.nextTick(function () { - throw new Error('1.1 before each hook failed'); + throw new Error('1-1 before each hook failed'); }); }); - it('1.1 test 1', function () { - console.log('1.1 test 1'); + it('1-1 test 1', function () { + console.log('1-1 test 1'); }); - it('1.1 test 2', function () { - console.log('1.1 test 2'); + it('1-1 test 2', function () { + console.log('1-1 test 2'); }); afterEach(function () { - console.log('1.1 after each'); + console.log('1-1 after each'); }); after(function (done) { - console.log('1.1 after'); + console.log('1-1 after'); process.nextTick(function () { - throw new Error('1.1 after hook failed'); + throw new Error('1-1 after hook failed'); }); }); }); - describe('1.2', function () { + describe('1-2', function () { before(function () { - console.log('1.2 before'); + console.log('1-2 before'); }); beforeEach(function () { - console.log('1.2 before each'); + console.log('1-2 before each'); }); - it('1.2 test 1', function () { - console.log('1.2 test 1'); + it('1-2 test 1', function () { + console.log('1-2 test 1'); }); - it('1.2 test 2', function () { - console.log('1.2 test 2'); + it('1-2 test 2', function () { + console.log('1-2 test 2'); }); afterEach(function (done) { - console.log('1.2 after each'); + console.log('1-2 after each'); process.nextTick(function () { - throw new Error('1.2 after each hook failed'); + throw new Error('1-2 after each hook failed'); }); }); after(function () { - console.log('1.2 after'); + console.log('1-2 after'); }); }); @@ -77,45 +77,45 @@ describe('2', function () { }); }); - describe('2.1', function () { + describe('2-1', function () { before(function () { - console.log('2.1 before'); + console.log('2-1 before'); }); beforeEach(function () { - console.log('2.1 before each'); + console.log('2-1 before each'); }); - it('2.1 test 1', function () { - console.log('2.1 test 1'); + it('2-1 test 1', function () { + console.log('2-1 test 1'); }); - it('2.1 test 2', function () { - console.log('2.1 test 2'); + it('2-1 test 2', function () { + console.log('2-1 test 2'); }); afterEach(function () { - console.log('2.1 after each'); + console.log('2-1 after each'); }); after(function () { - console.log('2.1 after'); + console.log('2-1 after'); }); }); - describe('2.2', function () { + describe('2-2', function () { before(function () { - console.log('2.2 before'); + console.log('2-2 before'); }); beforeEach(function () { - console.log('2.2 before each'); + console.log('2-2 before each'); }); - it('2.2 test 1', function () { - console.log('2.2 test 1'); + it('2-2 test 1', function () { + console.log('2-2 test 1'); }); - it('2.2 test 2', function () { - console.log('2.2 test 2'); + it('2-2 test 2', function () { + console.log('2-2 test 2'); }); afterEach(function () { - console.log('2.2 after each'); + console.log('2-2 after each'); }); after(function () { - console.log('2.2 after'); + console.log('2-2 after'); }); }); diff --git a/test/integration/fixtures/hooks/multiple.hook.error.js b/test/integration/fixtures/hooks/multiple.hook.error.js index f0983cf42f..53d167b1cf 100644 --- a/test/integration/fixtures/hooks/multiple.hook.error.js +++ b/test/integration/fixtures/hooks/multiple.hook.error.js @@ -9,48 +9,48 @@ describe('1', function () { console.log('1 before each'); }); - describe('1.1', function () { + describe('1-1', function () { before(function () { - console.log('1.1 before'); + console.log('1-1 before'); }); beforeEach(function () { - console.log('1.1 before each'); - throw new Error('1.1 before each hook failed'); + console.log('1-1 before each'); + throw new Error('1-1 before each hook failed'); }); - it('1.1 test 1', function () { - console.log('1.1 test 1'); + it('1-1 test 1', function () { + console.log('1-1 test 1'); }); - it('1.1 test 2', function () { - console.log('1.1 test 2'); + it('1-1 test 2', function () { + console.log('1-1 test 2'); }); afterEach(function () { - console.log('1.1 after each'); + console.log('1-1 after each'); }); after(function () { - console.log('1.1 after'); - throw new Error('1.1 after hook failed'); + console.log('1-1 after'); + throw new Error('1-1 after hook failed'); }); }); - describe('1.2', function () { + describe('1-2', function () { before(function () { - console.log('1.2 before'); + console.log('1-2 before'); }); beforeEach(function () { - console.log('1.2 before each'); + console.log('1-2 before each'); }); - it('1.2 test 1', function () { - console.log('1.2 test 1'); + it('1-2 test 1', function () { + console.log('1-2 test 1'); }); - it('1.2 test 2', function () { - console.log('1.2 test 2'); + it('1-2 test 2', function () { + console.log('1-2 test 2'); }); afterEach(function () { - console.log('1.2 after each'); - throw new Error('1.2 after each hook failed'); + console.log('1-2 after each'); + throw new Error('1-2 after each hook failed'); }); after(function () { - console.log('1.2 after'); + console.log('1-2 after'); }); }); @@ -69,45 +69,45 @@ describe('2', function () { throw new Error('2 before each hook failed'); }); - describe('2.1', function () { + describe('2-1', function () { before(function () { - console.log('2.1 before'); + console.log('2-1 before'); }); beforeEach(function () { - console.log('2.1 before each'); + console.log('2-1 before each'); }); - it('2.1 test 1', function () { - console.log('2.1 test 1'); + it('2-1 test 1', function () { + console.log('2-1 test 1'); }); - it('2.1 test 2', function () { - console.log('2.1 test 2'); + it('2-1 test 2', function () { + console.log('2-1 test 2'); }); afterEach(function () { - console.log('2.1 after each'); + console.log('2-1 after each'); }); after(function () { - console.log('2.1 after'); + console.log('2-1 after'); }); }); - describe('2.2', function () { + describe('2-2', function () { before(function () { - console.log('2.2 before'); + console.log('2-2 before'); }); beforeEach(function () { - console.log('2.2 before each'); + console.log('2-2 before each'); }); - it('2.2 test 1', function () { - console.log('2.2 test 1'); + it('2-2 test 1', function () { + console.log('2-2 test 1'); }); - it('2.2 test 2', function () { - console.log('2.2 test 2'); + it('2-2 test 2', function () { + console.log('2-2 test 2'); }); afterEach(function () { - console.log('2.2 after each'); + console.log('2-2 after each'); }); after(function () { - console.log('2.2 after'); + console.log('2-2 after'); }); }); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index d63756c0a1..2720eb3bda 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -1,6 +1,7 @@ var spawn = require('child_process').spawn; var path = require('path'); var fs = require('fs'); +var baseReporter = require('../../lib/reporters/base'); module.exports = { /** @@ -142,14 +143,20 @@ module.exports = { return diffs.map(function(diff) { return diff.slice(1, -3).join('\n'); }); - } + }, + + /** + * regular expression used for splitting lines based on new line / dot symbol. + */ + splitRegExp: new RegExp('[\\n' + baseReporter.symbols.dot + ']+') }; function invokeMocha(args, fn) { var output, mocha, listener; output = ''; - mocha = spawn('./bin/mocha', args); + args = [path.join('bin', 'mocha')].concat(args); + mocha = spawn(process.execPath, args); listener = function(data) { output += data; diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index ca1a8fe1bb..cf3d7c7c7b 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -1,5 +1,6 @@ var assert = require('assert'); var runMocha = require('./helpers').runMocha; +var splitRegExp = require('./helpers').splitRegExp; describe('hook error handling', function() { this.timeout(1000); @@ -63,30 +64,30 @@ describe('hook error handling', function() { lines, [ 'root before', - '1.1 before', + '1-1 before', 'root before each', '1 before each', - '1.1 before each', - '1.1 after each', + '1-1 before each', + '1-1 after each', '1 after each', 'root after each', - '1.1 after', - '1.2 before', + '1-1 after', + '1-2 before', 'root before each', '1 before each', - '1.2 before each', - '1.2 test 1', - '1.2 after each', + '1-2 before each', + '1-2 test 1', + '1-2 after each', '1 after each', 'root after each', - '1.2 after', + '1-2 after', '1 after', - '2.1 before', + '2-1 before', 'root before each', '2 before each', '2 after each', 'root after each', - '2.1 after', + '2-1 after', '2 after', 'root after' ] @@ -151,30 +152,30 @@ describe('hook error handling', function() { lines, [ 'root before', - '1.1 before', + '1-1 before', 'root before each', '1 before each', - '1.1 before each', - '1.1 after each', + '1-1 before each', + '1-1 after each', '1 after each', 'root after each', - '1.1 after', - '1.2 before', + '1-1 after', + '1-2 before', 'root before each', '1 before each', - '1.2 before each', - '1.2 test 1', - '1.2 after each', + '1-2 before each', + '1-2 test 1', + '1-2 after each', '1 after each', 'root after each', - '1.2 after', + '1-2 after', '1 after', - '2.1 before', + '2-1 before', 'root before each', '2 before each', '2 after each', 'root after each', - '2.1 after', + '2-1 after', '2 after', 'root after' ] @@ -188,7 +189,7 @@ describe('hook error handling', function() { assert.ifError(err); lines = res.output - .split(/[\n․]+/) + .split(splitRegExp) .map(function(line) { return line.trim(); }) diff --git a/test/integration/hooks.js b/test/integration/hooks.js index 4236c7f82d..127af18965 100644 --- a/test/integration/hooks.js +++ b/test/integration/hooks.js @@ -1,5 +1,6 @@ var assert = require('assert'); var run = require('./helpers').runMocha; +var splitRegExp = require('./helpers').splitRegExp; var args = []; describe('hooks', function() { @@ -11,7 +12,7 @@ describe('hooks', function() { assert(!err); - lines = res.output.split(/[\n․]+/).map(function(line) { + lines = res.output.split(splitRegExp).map(function(line) { return line.trim(); }).filter(function(line) { return line.length; diff --git a/test/integration/retries.js b/test/integration/retries.js index 68a8bca3e2..756cc9dd9b 100644 --- a/test/integration/retries.js +++ b/test/integration/retries.js @@ -11,7 +11,7 @@ describe('retries', function() { assert(!err); - lines = res.output.split(/[\n․]+/).map(function(line) { + lines = res.output.split(helpers.splitRegExp).map(function(line) { return line.trim(); }).filter(function(line) { return line.length; @@ -76,7 +76,7 @@ describe('retries', function() { assert(!err); - lines = res.output.split(/[\n․]+/).map(function(line) { + lines = res.output.split(helpers.splitRegExp).map(function(line) { return line.trim(); }).filter(function(line) { return line.length; From 78f36fcfd9f54c655e7621a6ae6741454ccaae39 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 25 Jun 2016 23:33:47 -0700 Subject: [PATCH 0512/1771] run tests on appveyor; closes #1813 --- appveyor.yml | 26 +++++++++++++++++++ karma.conf.js | 2 +- test/integration/diffs.js | 2 +- .../fixtures/regression/issue-1991.js | 2 +- test/integration/hook.err.js | 2 +- test/integration/hooks.js | 2 +- test/integration/multiple.done.js | 2 +- test/integration/pending.js | 4 +-- test/integration/regression.js | 2 +- test/integration/timeout.js | 2 +- test/integration/uncaught.js | 2 +- 11 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..539b8b073d --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,26 @@ +environment: + matrix: + - nodejs_version: '6' + - nodejs_version: '4' + - nodejs_version: '0.12' + - nodejs_version: '0.10' +install: + - ps: Install-Product node $env:nodejs_version + - set CI=true + - set PATH=%APPDATA%\npm;c:\MinGW\bin;%PATH% + - set PHANTOMJS_CDNURL=https://cnpmjs.org/downloads + - npm install + - copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe +matrix: + fast_finish: true +build: off +version: '{build}' +shallow_clone: true +clone_depth: 1 +test_script: + - node --version + - npm --version + - npm test +skip_commits: + message: /\[ci\s+skip\]/ + diff --git a/karma.conf.js b/karma.conf.js index 66d3f9786b..853a5c5025 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -41,7 +41,7 @@ module.exports = function(config) { // TO RUN LOCALLY: // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and // SAUCE_ACCESS_KEY env vars. - if (process.env.CI) { + if (process.env.CI && !process.env.APPVEYOR) { // we can't run SauceLabs tests on PRs from forks on Travis cuz security. if (process.env.TRAVIS) { if (process.env.TRAVIS_REPO_SLUG === 'mochajs/mocha' diff --git a/test/integration/diffs.js b/test/integration/diffs.js index d8aebba964..25d9ae6d7f 100644 --- a/test/integration/diffs.js +++ b/test/integration/diffs.js @@ -15,7 +15,7 @@ function getExpectedOutput() { describe('diffs', function() { var diffs, expected; - this.timeout(1000); + this.timeout(2000); before(function(done) { run('diffs/diffs.js', ['-C'], function(err, res) { diff --git a/test/integration/fixtures/regression/issue-1991.js b/test/integration/fixtures/regression/issue-1991.js index 96860332a2..ee08a1d043 100644 --- a/test/integration/fixtures/regression/issue-1991.js +++ b/test/integration/fixtures/regression/issue-1991.js @@ -39,7 +39,7 @@ for (var i = 0; i < numOfTests; i += 1) { it('access a variable via a closure', function () { // slow performance on older node.js versions - this.timeout(1000); + this.timeout(2000); closureVar = new MemoryLeak(); }); diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index cf3d7c7c7b..f874b8f3b6 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -3,7 +3,7 @@ var runMocha = require('./helpers').runMocha; var splitRegExp = require('./helpers').splitRegExp; describe('hook error handling', function() { - this.timeout(1000); + this.timeout(2000); var lines; diff --git a/test/integration/hooks.js b/test/integration/hooks.js index 127af18965..1795856072 100644 --- a/test/integration/hooks.js +++ b/test/integration/hooks.js @@ -4,7 +4,7 @@ var splitRegExp = require('./helpers').splitRegExp; var args = []; describe('hooks', function() { - this.timeout(1000); + this.timeout(2000); it('are ran in correct order', function(done) { run('cascade.js', args, function(err, res) { diff --git a/test/integration/multiple.done.js b/test/integration/multiple.done.js index 8bcedf6332..d9d9645f32 100644 --- a/test/integration/multiple.done.js +++ b/test/integration/multiple.done.js @@ -4,7 +4,7 @@ var args = []; describe('multiple calls to done()', function() { var res; - this.timeout(1000); + this.timeout(2000); describe('from a spec', function() { before(function(done) { diff --git a/test/integration/pending.js b/test/integration/pending.js index 529ed80b43..36331ed6b0 100644 --- a/test/integration/pending.js +++ b/test/integration/pending.js @@ -4,7 +4,7 @@ var args = []; describe('pending', function() { describe('pending specs', function() { - this.timeout(1000); + this.timeout(2000); it('should be created by omitting a function', function(done) { run('pending/spec.js', args, function(err, res) { @@ -19,7 +19,7 @@ describe('pending', function() { }); describe('synchronous skip()', function() { - this.timeout(1000); + this.timeout(2000); describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { diff --git a/test/integration/regression.js b/test/integration/regression.js index b8c64b84e7..6e6606a5ff 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -4,7 +4,7 @@ var path = require('path'); var run = require('./helpers').runMocha; describe('regressions', function() { - this.timeout(1000); + this.timeout(2000); it('issue-1327: should run all 3 specs exactly once', function(done) { var args = []; diff --git a/test/integration/timeout.js b/test/integration/timeout.js index 9f0985c09d..c8321c0b66 100644 --- a/test/integration/timeout.js +++ b/test/integration/timeout.js @@ -3,7 +3,7 @@ var run = require('./helpers').runMochaJSON; var args = []; describe('this.timeout()', function() { - this.timeout(1000); + this.timeout(2000); it('is respected by sync and async suites', function(done) { run('timeout.js', args, function(err, res) { diff --git a/test/integration/uncaught.js b/test/integration/uncaught.js index cddc52b1ea..2ca186e471 100644 --- a/test/integration/uncaught.js +++ b/test/integration/uncaught.js @@ -3,7 +3,7 @@ var run = require('./helpers').runMochaJSON; var args = []; describe('uncaught exceptions', function() { - this.timeout(1000); + this.timeout(2000); it('handles uncaught exceptions from hooks', function(done) { run('uncaught.hook.js', args, function(err, res) { From 468f1106091fa3faaa2ed0efb0b57227a23c7ed6 Mon Sep 17 00:00:00 2001 From: Scott Santucci Date: Fri, 1 Jul 2016 02:21:33 -0400 Subject: [PATCH 0513/1771] Get interface name list from collection (#2343) Get interface name list from collection; closes #2317 --- bin/_mocha | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index ad4ed40373..970e12aeee 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -11,6 +11,7 @@ var program = require('commander'), exists = fs.existsSync || path.existsSync, Mocha = require('../'), utils = Mocha.utils, + interfaceNames = Object.keys(Mocha.interfaces), join = path.join, cwd = process.cwd(), getOptions = require('./options'), @@ -74,7 +75,7 @@ program .option('-r, --require ', 'require the given module') .option('-s, --slow ', '"slow" test threshold in milliseconds [75]') .option('-t, --timeout ', 'set test-case timeout in milliseconds [2000]') - .option('-u, --ui ', 'specify user-interface (bdd|tdd|exports)', 'bdd') + .option('-u, --ui ', 'specify user-interface (' + interfaceNames.join('|') + ')', 'bdd') .option('-w, --watch', 'watch files for changes') .option('--check-leaks', 'check for global variable leaks') .option('--full-trace', 'display the full stack trace') @@ -156,10 +157,9 @@ program.on('reporters', function(){ program.on('interfaces', function(){ console.log(''); - console.log(' bdd'); - console.log(' tdd'); - console.log(' qunit'); - console.log(' exports'); + interfaceNames.forEach(function(interfaceName) { + console.log(' ' + interfaceName); + }); console.log(''); process.exit(); }); From e4f7a9d2bdf717be95b3880cdd88979a47050891 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 30 Jun 2016 23:46:27 -0700 Subject: [PATCH 0514/1771] FORGOT ONE --- test/integration/pending.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/pending.js b/test/integration/pending.js index 36331ed6b0..6d63b1fae1 100644 --- a/test/integration/pending.js +++ b/test/integration/pending.js @@ -62,7 +62,7 @@ describe('pending', function() { }); describe('asynchronous skip()', function() { - this.timeout(1000); + this.timeout(2000); describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { From 58ced061f95733566ae3eba263128746010ad730 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 21:06:08 -0700 Subject: [PATCH 0515/1771] add "expect" to eslint globals in test/ --- test/.eslintrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/.eslintrc b/test/.eslintrc index 6db2a46c53..956287d60c 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,3 +1,5 @@ --- env: mocha: true +globals: + expect: false From 4610303ca87d49e77a49527cc10cd4c46edc172c Mon Sep 17 00:00:00 2001 From: Matt Giles Date: Mon, 2 May 2016 09:47:20 -0700 Subject: [PATCH 0516/1771] Add this.skip() to docs --- index.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/index.md b/index.md index e9a52fa184..e5edf467e4 100644 --- a/index.md +++ b/index.md @@ -451,6 +451,20 @@ describe('Array', function() { }); ``` +You can also defer skipping a test until it's running. This can be useful if a test relies on some particular environment or configuration that can't be detected ahead of time. For example: + +```js +it('should only test in the right environment', function() { + if (/* check test environment */) { + // test the things + } else { + this.skip(); + } +}); +``` + +The difference between calling `this.skip()` and simply not making any assertions is that `this.skip()` will cause the test to be reported as [pending](#pending-tests), while not making any assertions will cause the test to be reported as passed. + ## Retry Tests You can choose to retry failed tests up to a certain number of times. This feature is designed to handle end-to-end tests (functional tests/Selenium...) where resources cannot be easily mocked/stubbed. **It's not recommended to use this feature for unit tests**. From a8fec7121349ef54e9a5b1018110f2545a55dac0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 4 Jul 2016 12:47:27 -0700 Subject: [PATCH 0517/1771] modifications to this.skip() docs --- index.md | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/index.md b/index.md index e5edf467e4..98a52412ba 100644 --- a/index.md +++ b/index.md @@ -433,8 +433,6 @@ describe('Array', function() { }); ``` -> *Best practice*: Use `.skip()` instead of commenting tests out. - Or a specific test-case: ```js @@ -451,19 +449,51 @@ describe('Array', function() { }); ``` -You can also defer skipping a test until it's running. This can be useful if a test relies on some particular environment or configuration that can't be detected ahead of time. For example: +> *Best practice*: Use `.skip()` instead of commenting tests out. + +You may also skip *at runtime* using `this.skip()`. If a test needs an environment or configuration which cannot be detected beforehand, a runtime skip is appropriate. For example: ```js -it('should only test in the right environment', function() { +it('should only test in the correct environment', function() { if (/* check test environment */) { - // test the things + // make assertions } else { this.skip(); } }); ``` -The difference between calling `this.skip()` and simply not making any assertions is that `this.skip()` will cause the test to be reported as [pending](#pending-tests), while not making any assertions will cause the test to be reported as passed. +The above test will be reported as [pending](#pending-tests). It's also important to note that calling `this.skip()` will effectively *abort* the test. + +> *Best practice*: To avoid confusion, do not execute further instructions in a test or hook after calling `this.skip()`. + +Contrast the above test with the following code: + +```js +it('should only test in the correct environment', function() { + if (/* check test environment */) { + // make assertions + } else { + // do nothing + } +}); +``` + +Because this test *does nothing*, it will be reported as *passing*. + +> *Best practice*: Don't do nothing! A test should make an assertion or use `this.skip()`. + +To skip *multiple* tests in this manner, use `this.skip()` in a "before" hook: + +```js +before(function() { + if (/* check test environment */) { + // setup code + } else { + this.skip(); + } +}); +``` ## Retry Tests From 390396dbaf22022bfe727f90f082f68779ef22d2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 4 Jul 2016 13:07:32 -0700 Subject: [PATCH 0518/1771] tweak timeout/hook docs --- index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 99acb00402..713cfd588c 100644 --- a/index.md +++ b/index.md @@ -615,17 +615,19 @@ it('should take less than 500ms', function(done){ ### Hook-level -Hook-level timeouts may also be applied, or the use of `this.timeout(0)` to disable timeout for a hook: +Hook-level timeouts may also be applied: ```js describe('a suite of tests', function() { beforeEach(function(done) { - this.timeout(3000); // A very long evironment setup. + this.timeout(3000); // A very long environment setup. setTimeout(done, 2500); }); }); ``` +Again, use `this.timeout(0)` to disable the timeout for a hook. + ## Diffs Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff: From a40ffd7e627f0559d1a736f59b3a4c6bdcaf87ac Mon Sep 17 00:00:00 2001 From: simov Date: Wed, 6 Jul 2016 12:30:04 +0300 Subject: [PATCH 0519/1771] Exclude the --inspect flag --- bin/mocha | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/mocha b/bin/mocha index f6606e49b5..c0030559a0 100755 --- a/bin/mocha +++ b/bin/mocha @@ -26,6 +26,7 @@ process.argv.slice(2).forEach(function(arg){ case 'debug': case '--debug': case '--debug-brk': + case '--inspect': args.unshift(arg); args.push('--no-timeouts'); break; From 81873618c9d21ad671ea12f423a5df1aa8f6339f Mon Sep 17 00:00:00 2001 From: Ross Warren Date: Sat, 9 Jul 2016 04:32:25 +0100 Subject: [PATCH 0520/1771] Add --preserve-symlinks flag for node (#2364) --- bin/_mocha | 1 + bin/mocha | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/_mocha b/bin/_mocha index 94550d87c0..8a3f50ad5e 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -84,6 +84,7 @@ program .option('--globals ', 'allow the given comma-delimited global [names]', list, []) .option('--es_staging', 'enable all staged features') .option('--harmony<_classes,_generators,...>', 'all node --harmony* flags are available') + .option('--preserve-symlinks', 'Instructs the module loader to preserve symbolic links when resolving and caching modules') .option('--icu-data-dir', 'include ICU data') .option('--inline-diffs', 'display actual/expected differences inline within each string') .option('--interfaces', 'display available interfaces') diff --git a/bin/mocha b/bin/mocha index f6606e49b5..99bc18ae4d 100755 --- a/bin/mocha +++ b/bin/mocha @@ -50,6 +50,7 @@ process.argv.slice(2).forEach(function(arg){ else if (0 == arg.indexOf('--trace')) args.unshift(arg); else if (0 == arg.indexOf('--icu-data-dir')) args.unshift(arg); else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg); + else if (0 == arg.indexOf('--preserve-symlinks')) args.unshift(arg); else args.push(arg); break; } From b37499f30f39b49a4d6892ae8eddee37fec61624 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Jul 2016 23:10:27 -0700 Subject: [PATCH 0521/1771] don't truncate message-list Error in Base.list(); closes #2361 (#2365) --- lib/reporters/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 5fe0eb71a6..4c9e8064cd 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -178,7 +178,7 @@ exports.list = function(failures) { message = ''; } var stack = err.stack || message; - var index = stack.indexOf(message); + var index = message ? stack.indexOf(message) : -1; var actual = err.actual; var expected = err.expected; var escape = true; From 185c0d902e272216232630fe4e2577268456dd9a Mon Sep 17 00:00:00 2001 From: Benson Trent Date: Mon, 11 Jul 2016 01:13:00 -0700 Subject: [PATCH 0522/1771] Update syntax for "border-radius" and "box-shadow", added vendor prefixes for calc() (#2367) * Update syntax for "border-radius" and "box-shadow", added vendor prefixes for calc() * mocha.css: Reverted whitespace differences --- mocha.css | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/mocha.css b/mocha.css index 759a6c8c47..cd24c430d1 100644 --- a/mocha.css +++ b/mocha.css @@ -92,7 +92,7 @@ body { color: #fff; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; @@ -148,23 +148,28 @@ body { padding: 15px; border: 1px solid #eee; max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); max-width: calc(100% - 42px); /*(2)*/ max-height: 300px; word-wrap: break-word; border-bottom-color: #ddd; - -webkit-border-radius: 3px; -webkit-box-shadow: 0 1px 3px #eee; - -moz-border-radius: 3px; -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; border-radius: 3px; } #mocha .test .html-error pre.error { border: none; - -webkit-border-radius: none; - -webkit-box-shadow: none; - -moz-border-radius: none; - -moz-box-shadow: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0; + -moz-box-shadow: 0; + box-shadow: 0; padding: 0; margin: 0; margin-top: 18px; @@ -185,13 +190,16 @@ body { padding: 15px; border: 1px solid #eee; max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); max-width: calc(100% - 42px); /*(2)*/ word-wrap: break-word; border-bottom-color: #ddd; - -webkit-border-radius: 3px; -webkit-box-shadow: 0 1px 3px #eee; - -moz-border-radius: 3px; -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; border-radius: 3px; } @@ -212,10 +220,12 @@ body { text-align: center; background: #eee; font-size: 15px; + -webkit-border-radius: 15px; -moz-border-radius: 15px; border-radius: 15px; - -webkit-transition: opacity 200ms; - -moz-transition: opacity 200ms; + -webkit-transition:opacity 200ms; + -moz-transition:opacity 200ms; + -o-transition:opacity 200ms; transition: opacity 200ms; opacity: 0.3; color: #888; @@ -261,13 +271,15 @@ body { #mocha-stats .progress { float: right; padding-top: 0; - + /** * Set safe initial values, so mochas .progress does not inherit these * properties from Bootstrap .progress (which causes .progress height to * equal line height set in Bootstrap). */ height: auto; + -webkit-box-shadow: none; + -moz-box-shadow: none; box-shadow: none; background-color: initial; } From b69ce7873b6e3d37f59ee863dca78ef794c752dd Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 12 Jul 2016 00:05:06 -0700 Subject: [PATCH 0523/1771] update all the things in preparation for v3.0.0 changes - changed some opencollective-related copy; cc @xdamman - fixed erroneous license in `package.json` - generate sponsors and backers list in a Liquid loop - use Kramdown to hide avatars in a section until they have all loaded, then fade into view quickly - fix potential `http`/`https` asset disagreements - update excluded files - use `markdown-toc` package instead of a decrepit hack - remove `Makefile`; use `p-s` which should help with portability - update `package.json` info with license, contributors, original author - update & simplify `README.md` - increase font weight, generally - uppercase transforms for `h2` and `h3` - *underlined* `a` tags--who'da thunk it? - `a` hover color - increase font size in TOC and feature list - some optimizations; use cdn for normalize.css; remove (some) unused css --- Makefile | 15 ------- README.md | 55 ++++++++--------------- _config.yml | 3 +- _includes/backers.md | 6 +++ _includes/ga.html | 10 ----- _includes/head.html | 6 +-- _includes/header.html | 7 +-- _includes/sponsors.md | 6 +++ css/normalize.min.css | 2 - css/style.css | 43 +++++++----------- index.md | 91 +++++--------------------------------- js/avatars.js | 12 +++++ js/ga.js | 7 +++ package.json | 73 +++++++++++++++++++++++++----- scripts/package-scripts.js | 16 +++++++ scripts/toc.js | 34 ++++++++++++++ 16 files changed, 196 insertions(+), 190 deletions(-) delete mode 100644 Makefile create mode 100644 _includes/backers.md delete mode 100644 _includes/ga.html create mode 100644 _includes/sponsors.md delete mode 100644 css/normalize.min.css create mode 100644 js/avatars.js create mode 100644 js/ga.js create mode 100644 scripts/package-scripts.js create mode 100755 scripts/toc.js diff --git a/Makefile b/Makefile deleted file mode 100644 index 18519e8bf7..0000000000 --- a/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -PORT ?= 3000 -bundle := bundle - -start: toc bundle - ${bundle} exec jekyll serve --safe --drafts --watch --port ${PORT} - - -build: toc bundle - ${bundle} exec jekyll build --safe - -toc: - ./node_modules/.bin/toc-idx -i index.md --max-depth 1 --omit 'Backers' 'Sponsors' --bullet "\- " index.md - -bundle: - ${bundle} diff --git a/README.md b/README.md index 538228fe67..ef95c30ec2 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,32 @@ -# [mochajs.org](http://mochajs.org): How to Build the Site +# mochajs.org *So you wanna build the site?* -[mochajs.org](http://mochajs.org) is now built using [Jekyll](http://jekyllrb.com), the popular static site generator. +[mochajs.org](https://mochajs.org) is built using [Jekyll](http://jekyllrb.com), the popular static site generator. ## Prerequisites -1. Some recent version of Ruby -2. Some version of [RubyGems](https://rubygems.org) -3. Some recent version of Node.JS +- Ruby +- RubyGems +- Bundler +- (Optional) Node.js v4.0.0 or greater -## Installation +## Development -1. Execute `npm install`. This will install [Bundler](http://bundler.io), Jekyll, and [markdown-toc-index](https://www.npmjs.com/package/markdown-toc-index). -2. To build, execute `npm run build` or `make build` +1. Clone this repo +2. Execute `npm install` and follow the directions. -### Problems? +> Mac users: You may need to install Xcode command line tools if `bundle install` fails. Execute `xcode-select --install` if so. -#### Permissions-Related +### Notes -If `npm install` fails due to an `EACCESS` problem, try this: +- Node.js is only necessary if you need to rebuild the table of contents. +- To serve the site and rebuild as changes are made, execute `npm start serve`. +- To rebuild the site *once*, execute `npm start build`. +- To update the table of contents, execute: `npm start toc`. This will only alter `index.md`; it will not rebuild the site unless `npm start serve` is running in another process. +- The `_site` directory is where the generated static site lives (and is what you see at [mochajs.org](https://mochajs.org)). It is *not* under version control. +- `Gemfile.lock` is ignored as to always get the latest `github-pages` gem. -```shell -$ sudo gem install bundler -$ npm install --ignore-scripts -$ bundle install -``` - -#### Ruby-Related on OS X - -You may need to install the Xcode command line tools if `bundle install` fails somewhere. Execute this: - -```shell -$ xcode-select --install -``` - -## Local development - -1. Run `make` to build the project and start a development server that auto-watches for changes on http://localhost:3000 - -For more information, refer to the [Jekyll Docs](http://jekyllrb.com/docs/home/) and [GitHub's Tutorial](https://help.github.com/articles/using-jekyll-with-pages/) on the subject. - -## Notes - -- To update `index.md` with the TOC, execute: `node_modules/.bin/toc-idx -i index.md --max-depth 1 --bullet "\- " index.md` -- `bundle exec jekyll build` rebuilds the site without updating the TOC -- The `_site` directory is where the generated site lives. It is *not* under version control, because GitHub Pages generates it for us. +## License +:copyright: 2016 mochajs.org contributors. Content licensed CC-BY-4.0; code licensed MIT. diff --git a/_config.yml b/_config.yml index 3230590e50..c115cc7cb5 100644 --- a/_config.yml +++ b/_config.yml @@ -5,7 +5,8 @@ exclude: - Gemfile* - package.json - CNAME - - Makefile - npm-debug.log* + - scripts + - .* diff --git a/_includes/backers.md b/_includes/backers.md new file mode 100644 index 0000000000..ccf561abfa --- /dev/null +++ b/_includes/backers.md @@ -0,0 +1,6 @@ +## Backers + +Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support) and support Mocha with a monthly donation. + +{: id="_backers" } +{% for i in (0..29) %}[![](//opencollective.com/mochajs/backer/{{ i }}/avatar){: onload="window.avatars.backerLoaded()" }](https://opencollective.com/mochajs/backer/{{ i }}/website){: target="_blank"} {% endfor %} diff --git a/_includes/ga.html b/_includes/ga.html deleted file mode 100644 index 94bc6dc8f0..0000000000 --- a/_includes/ga.html +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/_includes/head.html b/_includes/head.html index 725c4488c2..509d0b7ebf 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -1,8 +1,7 @@ {{ page.title }} - - + @@ -10,5 +9,6 @@ - {% include ga.html %} + + diff --git a/_includes/header.html b/_includes/header.html index cc6a0c4735..99427f5c50 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,7 +1,4 @@ - -
              -

              +
              +

              simple, flexible, fun

              diff --git a/_includes/sponsors.md b/_includes/sponsors.md new file mode 100644 index 0000000000..5fe0c7d9c1 --- /dev/null +++ b/_includes/sponsors.md @@ -0,0 +1,6 @@ +## Sponsors + +Use Mocha at Work? Ask your manager or marketing team if they'd help [support](https://opencollective.com/mochajs#support) our project. Your company's logo will also be displayed on [npmjs.com](http://npmjs.com/package/mocha) and our [GitHub repository](https://github.com/mochajs/mocha#sponsors). + +{: id="_sponsors" } +{% for i in (0..29) %}[![](//opencollective.com/mochajs/sponsor/{{ i }}/avatar){: onload="window.avatars.sponsorLoaded()" }](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} diff --git a/css/normalize.min.css b/css/normalize.min.css deleted file mode 100644 index 429ec37e45..0000000000 --- a/css/normalize.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ -article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} \ No newline at end of file diff --git a/css/style.css b/css/style.css index b0d8e8bb76..8df06950c7 100644 --- a/css/style.css +++ b/css/style.css @@ -24,15 +24,24 @@ h1 { transition: opacity 1s; } -.onload h1 { +#_backers a, #_sponsors a { + opacity: 0; + -webkit-transition: opacity .3s; + -moz-transition: opacity .3s; + -o-transition: opacity .3s; + transition: opacity .3s; +} + +.onload h1, #_backers.onload a, #_sponsors.onload a { opacity: 1; } h2 { margin-top: 80px; - font-weight: 100; + font-weight: 400; letter-spacing: 1px; border-bottom: 1px solid #ddd; + text-transform: uppercase; } h3 { @@ -40,6 +49,7 @@ h3 { letter-spacing: 1px; border-bottom: 1px solid #eee; margin-top: 40px; + text-transform: uppercase; } #tag { @@ -67,19 +77,17 @@ h3 { } #content > p:first-child { - font-size: 22px; - font-weight: 100; + font-size: 20px; + font-weight: 200; letter-spacing: 1px; } a { - color: #8a6343; - font-weight: bold; - text-decoration: none; + color: #8D6748; } a:hover { - text-decoration: underline; + color: #717171; } ul { @@ -100,7 +108,6 @@ ul li { list-style: none; border-bottom: 1px solid #eee; padding: 5px 0; - font-size: 12px; -webkit-column-break-inside: avoid; -moz-column-break-inside: avoid; column-break-inside: avoid; @@ -152,24 +159,6 @@ img[src*="opencollective.com/mochajs"], img[src*=badges], img[src*=".svg"] { box-shadow: none; } -.badge { - margin-right: 8px; - display: inline-block; -} - -.badge > img { - margin: 0; - padding: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - -o-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - display: block; -} - footer { background-color: #eee; width: 100%; diff --git a/index.md b/index.md index 3831bfa631..283eae7d7a 100644 --- a/index.md +++ b/index.md @@ -3,85 +3,14 @@ layout: default title: "Mocha - the fun, simple, flexible JavaScript test framework" --- +Mocha is a feature-rich JavaScript test framework running on [Node.js](http://nodejs.org) and in the browser, making asynchronous testing *simple* and *fun*. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). -Mocha is a feature-rich JavaScript test framework running on [Node.js](http://nodejs.org) and in the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). - -[![Gitter](//badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha) -[![OpenCollective](https://opencollective.com/mochajs/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/mochajs/sponsors/badge.svg)](#sponsors) - - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mochajs#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Is your company using Mocha? Ask your manager to support us. Your company logo will show up here and on our [Github page](https://github.com/mochajs/mocha#sponsors). [[Become a sponsor](https://opencollective.com/mochajs#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [![Gitter](//badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha) + [![OpenCollective](//opencollective.com/mochajs/backers/badge.svg)](#backers) + [![OpenCollective](//opencollective.com/mochajs/sponsors/badge.svg)](#sponsors) +{% include backers.md %} +{% include sponsors.md %} ## Features @@ -118,8 +47,8 @@ Is your company using Mocha? Ask your manager to support us. Your company logo w ## Table of Contents - -- [Features](#features) + + - [Installation](#installation) - [Getting Started](#getting-started) - [Assertions](#assertions) @@ -145,11 +74,11 @@ Is your company using Mocha? Ask your manager to support us. Your company logo w - [Testing Mocha](#testing-mocha) - [More Information](#more-information) - + ## Installation -Install with [npm](http://npmjs.org): +Install with [npm](https://npmjs.org): ```sh $ npm install -g mocha diff --git a/js/avatars.js b/js/avatars.js new file mode 100644 index 0000000000..153dba24cc --- /dev/null +++ b/js/avatars.js @@ -0,0 +1,12 @@ +// dumb thing that helps with animation of avatars +function avatars (type) { + return function avatarLoaded () { + avatars[type] = typeof avatars[type] === 'number' ? avatars[type] + 1 : 1; + if (avatars[type] === 30) { + document.getElementById(type).classList.add('onload'); + } + } +} + +avatars.backerLoaded = avatars('_backers'); +avatars.sponsorLoaded = avatars('_sponsors'); diff --git a/js/ga.js b/js/ga.js new file mode 100644 index 0000000000..6e3ff1949b --- /dev/null +++ b/js/ga.js @@ -0,0 +1,7 @@ +(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ +(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), +m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) +})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + +ga('create', 'UA-65024936-1', 'auto'); +ga('send', 'pageview'); diff --git a/package.json b/package.json index f6aa5331c1..25647acf3b 100644 --- a/package.json +++ b/package.json @@ -3,25 +3,78 @@ "version": "1.0.0", "description": "Mocha's gh-pages branch", "private": true, - "authors": [ - "David da Silva Contín ", - "Christopher Hiller ", - "Travis Jeffery " - ], "scripts": { - "prepublish": "gem install bundler && bundle install", - "build": "make build" + "prepublish": "npm start postinstall", + "start": "package-scripts --silent --config ./scripts/package-scripts.js" }, "repository": { "type": "git", "url": "https://github.com/mochajs/mochajs.github.io.git" }, - "license": "MIT", + "license": "CC-BY-4.0 AND MIT", "bugs": { "url": "https://github.com/mochajs/mochajs.github.io/issues" }, "homepage": "https://mochajs.org", "devDependencies": { - "markdown-toc-index": "^0.2.0" - } + "chalk": "^1.1.3", + "markdown-toc": "^0.12.14", + "p-s": "^1.0.4", + "shx": "^0.1.2" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=2.0.0" + }, + "author": "TJ Holowaychuk (https://github.com/tj)", + "contributors": [ + "Alexander Shepelin (https://github.com/44px)", + "Al Scott (https://github.com/scottaj)", + "amsul (https://github.com/amsul)", + "Anders Olsen Sandvik (https://github.com/Andersos)", + "Andy Matthews (https://github.com/commadelimited)", + "Ariel Mashraki (https://github.com/a8m)", + "Artem Govorov (https://github.com/ArtemGovorov)", + "Bernard Kobos (https://github.com/bernii)", + "Christoffer Hallas (https://github.com/hallas)", + "Christopher Hiller (https://github.com/boneskull)", + "Daniel St. Jules (https://github.com/danielstjules)", + "Dan Oved (https://github.com/oveddan)", + "David da Silva (https://github.com/dasilvacontin)", + "David Henderson (https://github.com/dhendo)", + "Dmitriy Simushev (https://github.com/JustBlackBird)", + "Domenic Denicola (https://github.com/domenic)", + "Erik Eng (https://github.com/ptz0n)", + "Fabio M. Costa (https://github.com/fabiomcosta)", + "Fagner Brack (https://github.com/FagnerMartinsBrack)", + "Guillermo Rauch (https://github.com/rauchg)", + "Hugo Giraudel (https://github.com/HugoGiraudel)", + "Jacob Wejendorp (https://github.com/wejendorp)", + "Jake Verbaten (https://github.com/Raynos)", + "James Carr (https://github.com/jamescarr)", + "Jan Lehnardt (https://github.com/janl)", + "Joel Kemp (https://github.com/mrjoelkemp)", + "Jo Liss (https://github.com/joliss)", + "Jonathan Rajavuori (https://github.com/jrajav)", + "Kelong Wang (https://github.com/wkl)", + "Kevin Reed (https://github.com/kavun)", + "Long Ho (https://github.com/longlho)", + "Michiel de Jong (https://github.com/michielbdejong)", + "Nik Nyby (https://github.com/nikolas)", + "Oscar Godson (https://github.com/OscarGodson)", + "Peter Rust (https://github.com/prust)", + "PoppinL (https://github.com/poppinlp)", + "Rich Trott (https://github.com/Trott)", + "Rico Sta. Cruz (https://github.com/rstacruz)", + "Roman Shtylman (https://github.com/defunctzombie)", + "Ryan Tablada (https://github.com/rtablada)", + "Ryunosuke Sato (https://github.com/tricknotes)", + "sarehag (https://github.com/sarehag)", + "Sune Simonsen (https://github.com/sunesimonsen)", + "Timothy Gu (https://github.com/TimothyGu)", + "Travis Jeffery (https://github.com/travisjeffery)", + "Will Langstroth (https://github.com/wlangstroth)", + "Xavier Damman (https://github.com/xdamman)", + "XhmikosR (https://github.com/XhmikosR)" + ] } diff --git a/scripts/package-scripts.js b/scripts/package-scripts.js new file mode 100644 index 0000000000..db487e3b55 --- /dev/null +++ b/scripts/package-scripts.js @@ -0,0 +1,16 @@ +'use strict'; + +const chalk = require('chalk'); +const pkg = require('../package.json'); + +module.exports = { + scripts: { + postinstall: `shx echo "\uD83D\uDC49 ${chalk.yellow(pkg.name)} installation: + 1. Follow directions for your platform at ${chalk.underline('https://git.io/vKcdH')} to install prereqs. + 2. Execute ${chalk.bold('bundle install')} in this directory. + 3. Execute ${chalk.bold('npm start serve')} to serve the site locally."`, + serve: 'bundle exec jekyll serve --safe --drafts --watch', + build: 'bundle exec jekyll build --safe --drafts', + toc: require.resolve('./toc') + } +}; diff --git a/scripts/toc.js b/scripts/toc.js new file mode 100755 index 0000000000..8c25fa8f73 --- /dev/null +++ b/scripts/toc.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/** + * The CLI included with markdown-toc doesn't support `bullets` + * and `maxdepth` options, so that's why this exists. + */ + +'use strict'; + +const toc = require('markdown-toc'); +const utils = require('markdown-toc/lib/utils'); +const fs = require('fs'); +const path = require('path'); +const filepath = path.join(__dirname, '..', 'index.md'); + +console.log('Updating TOC...'); + +const input = fs.createReadStream(filepath); + +input.pipe( + utils.concat(input => fs.writeFileSync(filepath, toc.insert(String(input), { + bullets: '-', + maxdepth: 2 + })))); + +input.on('error', err => { + console.log(err); + process.exit(1); +}); + +input.on('close', () => { + console.log('Done.'); + process.exit(); +}); From d162e87b993d71d15b543181dcffaf6fba0c775b Mon Sep 17 00:00:00 2001 From: rmacklin Date: Mon, 18 Jul 2016 23:26:53 -0700 Subject: [PATCH 0524/1771] Fix reporters documentation (#47) - Remove reference of TeamCity reporter as part of mocha core (it was removed from core in https://github.com/mochajs/mocha/commit/16a55b28ebe6ef719a016d6d2238c047a7fd4555) - Add section about Third party reporters --- index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index 283eae7d7a..543bd1c3f6 100644 --- a/index.md +++ b/index.md @@ -966,7 +966,11 @@ The "HTML" reporter is currently the only browser reporter supported by Mocha, a ### Undocumented Reporters -The "XUnit" and "TeamCity" reporters are also available, but someone needs to write the documentation. +The "XUnit" reporter is also available, but someone needs to write the documentation. + +### Third party reporters + +Mocha allows you to define custom third-party reporters. For more information see the [wiki](https://github.com/mochajs/mocha/wiki/Third-party-reporters). An example is the [TeamCity reporter](https://github.com/travisjeffery/mocha-teamcity-reporter). ## Running Mocha in the Browser From 186c0c041a8a1e05c23c8ff325e187893d6a5ef6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 23 Jul 2016 13:11:01 -0700 Subject: [PATCH 0525/1771] update some gitter notifications (again) --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 29f9bff62d..664e34d2fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,7 @@ script: travis_retry make $TARGET notifications: urls: # for gitter - - secure: "nSYqkR0NKB/vB3PsPS+7+U2ZGhP+NbqFncPPZxsGb0TeRvuRL62BemEZGs5+VsajutCN8Dn/yXSIWkYZ6ivZt8xSQ9vk2OnboBMPH/e8P9t+6BBUyIb4ztJuHbsUyx1POYFyukT2TiqRuEGvUUACeXH0OIrWNPt254DipDhe2P0=" + - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU= on_success: change on_failure: always + on_start: never From d00a1636a2099842d06db63118c0adf787160629 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 22:48:44 -0700 Subject: [PATCH 0526/1771] updates for v3.0.0 - update new features - update CLI usage - remove HTMLCov/JSONCov stuff - clarify various things; fix some decrepitude - new screenshot for dot reporter - reorder sync/async sections to properly segue - use grammar good --- images/reporter-dot.png | Bin 4221 -> 13461 bytes images/reporter-htmlcov.png | Bin 117134 -> 0 bytes index.md | 339 +++++++++++++++++++++++------------- 3 files changed, 216 insertions(+), 123 deletions(-) delete mode 100644 images/reporter-htmlcov.png diff --git a/images/reporter-dot.png b/images/reporter-dot.png index b284db351bf38ad2ffe9ab2853293ad6c0786069..5477cb63f4b84d80e50c799f5e9b3ffc4af25329 100644 GIT binary patch literal 13461 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 diff --git a/images/reporter-htmlcov.png b/images/reporter-htmlcov.png deleted file mode 100644 index 4a24b770d4946fe71c02305632bc18c59b55f99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117134 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�-@KOHG?P(W69*8OFp%^*mK&qSb>2gitw=xo6T#{IEGl`Jn@tO zpe8qL*Vq>Wt5*2B=XvG6LE>B*5kw_^#}P?v(HQO-d;LS`l@xHrKkE>D@y&0WwlzGl z*H&OYkDxj6JBiv^f9*dF~7gsHc;iPDc*AIojHF5UVA4Xf9hV~<=54eCW8ff)*| zfkK+SR3DEKfgUjFRT*M?x<5CPYqmrn)6PaItb926D#kE_C}L?$zuZ{^;DR)bPMH3E)|4`)r(8Y0q3DBvNLZ4zWe_~BLmor(js>nFgs&N4EFx*!u})pmz-XPHPJz~^bo|Ea|C{#en;n;EX~~6dPy~8l2!MNdFJXK`PGdK+2*xN} zB;E{H2V}w;T1KcNj!EqYsE+hyu4@WrJzgKQ_PdA=9%e-6zIL1vR_vR1V@*j9ihjpJ z)9jRzFHYyEYJk z%&uKtsu!k6QB|}^@CQzU3G+6O-VzgWTtZYk++14MIo?;%ZNQwp@Qmf6sHH^1|Jwu8 zi4LF_#}EZdTRW5MZEFT=YbXJbmgV$h&n54aI?=d3hK}TjzuslI8Yy%{Vw59b8VF9( zR?ted$dQ5=y<5YtPz;et^yKM72N2++xwdIjnM;?`1WHeS>wzmDZA#$VKFqn;V`+Y4 zG^}WnnA}z2y(J7L45D}J!P5MC<{UcGZ$mK~Qz9`dGye$1wRs`R&>-=_*ULRGXA_-R z7wSl~F~$Ncgs4)0E|1U*tvk^;C9(cDm%#$wmldAwHRPFxb2 zx8|Lpu9ca_h^)UPb$YF1>x_v=HxWUM??Jq9GGwB*dW zgBuxk`MwOy7(^!0+QxXG;)g{cJuDo6S65y9J?-15=l(ZH@CPY`_w+CsF^F_71oV#k zt-I{IGF|21EPHVc8ukX{CVn*i@YYt~-^%1jYFYmmF-dF3C4qUG(X%D((2fv=OBWBH zN30l)tuv2LA3i*!>mCt=Px6inzV0!k1|B_4T8S#qfA9X1)5$>zgO0$wKnO_O-B=GW z!THb7xSs(SzetK;0RRjTf|Tip(1~#3v8GT&^c=K*+~vT`6NoqSc2SI}WnuzJC*YIO zg@1_5L4?m&7}7|B1w8*2^3hlhYoHTr1->c-pQusbvS-po`;8c>2R^EI=YHo0EcXD? z0r;y7Q8`F(Qia$rt+{02n_qb>4PS&0|Jzm+f)9a2DA014p`mmr5>_h$R&OU3BF-L| z>fccBD|`Y;{wLbY_-f%8<;Au%z&ed0{4{t}& zMKWBYd6{woFc6`WdJ}F4QRZ()GhI(Y@OX2Dh^@K&J5^e2-;!Q;3pOykK^Zj<`9&hG z_fHdtU@dQ~)T2xAl#~2`t;>8Pu?;01YvQnfOQh39dFhl!`_?=lbP?kCn1X;&+==na zi;;^u$Z~WKu3MIT{n_9&SAJjZ&Gb3Ul`-!*!*xt>FT?fJ=>#El-#L1X9RdE6msa{%DQW!e F{{Vx-1=9ck diff --git a/index.md b/index.md index 543bd1c3f6..8506067aaa 100644 --- a/index.md +++ b/index.md @@ -1,7 +1,6 @@ --- layout: default -title: "Mocha - the fun, simple, flexible JavaScript test framework" - +title: 'Mocha - the fun, simple, flexible JavaScript test framework' --- Mocha is a feature-rich JavaScript test framework running on [Node.js](http://nodejs.org) and in the browser, making asynchronous testing *simple* and *fun*. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub](https://github.com/mochajs/mocha). @@ -52,8 +51,8 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no - [Installation](#installation) - [Getting Started](#getting-started) - [Assertions](#assertions) -- [Synchronous Code](#synchronous-code) - [Asynchronous Code](#asynchronous-code) +- [Synchronous Code](#synchronous-code) - [Arrow Functions](#arrow-functions) - [Hooks](#hooks) - [Pending Tests](#pending-tests) @@ -78,30 +77,38 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no ## Installation -Install with [npm](https://npmjs.org): +Install with [npm](https://npmjs.org) globally: + +```sh +$ npm install --global mocha +``` +or as a development dependency for your project: + ```sh -$ npm install -g mocha +$ npm install --save-dev mocha ``` +> To install Mocha v3.0.0 or newer with `npm`, you will need `npm` v1.4.0 or newer. Additionally, to run Mocha, you will need Node.js v0.10 or newer. + +Mocha can also be installed via [Bower](http://bower.io) (`bower install mocha`), and is available at [cdnjs](https://cdnjs.com/libraries/mocha). + ## Getting Started ```sh -$ npm install -g mocha +$ npm install mocha $ mkdir test -$ $EDITOR test/test.js - +$ $EDITOR test/test.js # or open with your favorite editor ``` In your editor: ```js -var assert = require('chai').assert; +var assert = require('assert'); describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { - assert.equal(-1, [1,2,3].indexOf(5)); - assert.equal(-1, [1,2,3].indexOf(0)); + assert.equal(-1, [1,2,3].indexOf(4)); }); }); }); @@ -110,41 +117,27 @@ describe('Array', function() { Back in the terminal: ```sh -$ mocha + Array + #indexOf() + ✓ should return -1 when the value is not present - . - ✔ 1 test complete (1ms) + 1 passing (9ms) ``` ## Assertions -Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as: - -- [should.js](https://github.com/shouldjs/should.js) BDD style shown throughout these docs -- [expect.js](https://github.com/LearnBoost/expect.js) expect() style assertions -- [chai](http://chaijs.com/) expect(), assert() and should style assertions -- [better-assert](https://github.com/visionmedia/better-assert) c-style self-documenting assert() -- [unexpected](http://unexpected.js.org) the extensible BDD assertion toolkit - -## Synchronous Code - -When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. +Mocha allows you to use any assertion library you wish. In the above example, we're using Node.js' built-in [assert](https://nodejs.org/api/assert.html) module--but generally, if it throws an `Error`, it will work! This means you can use libraries such as: -```js -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { - [1,2,3].indexOf(5).should.equal(-1); - [1,2,3].indexOf(0).should.equal(-1); - }); - }); -}); -``` +- [should.js](https://github.com/shouldjs/should.js) - BDD style shown throughout these docs +- [expect.js](https://github.com/LearnBoost/expect.js) - `expect()` style assertions +- [chai](http://chaijs.com/) - `expect()`, `assert()` and `should`-style assertions +- [better-assert](https://github.com/visionmedia/better-assert) - C-style self-documenting `assert()` +- [unexpected](http://unexpected.js.org) - "the extensible BDD assertion toolkit" ## Asynchronous Code -Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()` Mocha will know that it should wait for completion. +Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()`, Mocha will know that it should wait for this function to be called to complete the test. ```js describe('User', function() { @@ -192,15 +185,58 @@ describe('#find()', function() { }); ``` -(The latter example uses [Chai as Promised](https://www.npmjs.com/package/chai-as-promised) for fluent promise assertions.) +> The latter example uses [Chai as Promised](https://www.npmjs.com/package/chai-as-promised) for fluent promise assertions. + +In Mocha v3.0.0 and newer, returning a `Promise` *and* calling `done()` will result in an exception, as this is generally a mistake: + +```js +const assert = require('assert'); + +it('should complete this test', function (done) { + return new Promise(function (resolve) { + assert.ok(true); + resolve(); + }) + .then(done); +}); +``` + +The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`. In versions older than v3.0.0, the call to `done()` is effectively ignored. + +## Synchronous Code + +When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. + +```js +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { + [1,2,3].indexOf(5).should.equal(-1); + [1,2,3].indexOf(0).should.equal(-1); + }); + }); +}); +``` ## Arrow Functions -Passing [arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) to Mocha is discouraged. Their lexical binding of the `this` value makes them unable to access the Mocha context, and statements like `this.timeout(1000);` will not work inside an arrow function. +Passing [arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) ("lambdas") to Mocha is discouraged. Due to the lexical binding of `this`, such functions are unable to access the Mocha context. For example, the following code will fail due to the nature of lambdas: + +```js +describe('my suite', () => { + it('my test', () => { + // should set the timeout of this test to 1000 ms; instead will fail + this.timeout(1000); + assert.ok(true); + }); +}); +``` + +*If you do not need to use* Mocha's context, lambdas should work. However, the result will be more difficult to refactor if the need eventually arises. ## Hooks -Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`, which can be used to set up preconditions and clean up after your tests. +With its default "BDD"-style interface, Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`. These should be used to set up preconditions and clean up after your tests. ```js describe('hooks', function() { @@ -225,9 +261,11 @@ describe('hooks', function() { }); ``` +> Tests can appear before, after, or interspersed with your hooks. Hooks will run in the order they are defined, as appropriate; all `before()` hooks run (once), then any `beforeEach()` hooks, tests, any `afterEach()` hooks, and finally `after()` hooks (once). + ### Describing Hooks -All hooks can be invoked with an optional description, making it easier to pinpoint errors in your tests. If hooks are given named functions, those names will be used if no description is supplied. +Any hook can be invoked with an optional description, making it easier to pinpoint errors in your tests. If a hook is given a named function, that name will be used if no description is supplied. ```js beforeEach(function() { @@ -245,7 +283,7 @@ beforeEach('some description', function() { ### Asynchronous Hooks -All "hooks" (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: +All hooks (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: ```js describe('Connection', function() { @@ -273,10 +311,9 @@ describe('Connection', function() { }); ``` - ### Root-Level Hooks -You may also pick any file and add "root"-level hooks. For example, add `beforeEach()` outside of all `describe()` blocks. This will cause the callback to `beforeEach()` to run before any test case, regardless of the file it lives in (this is because Mocha has a hidden `describe()` block, called the "root suite"). +You may also pick any file and add "root"-level hooks. For example, add `beforeEach()` outside of all `describe()` blocks. This will cause the callback to `beforeEach()` to run before any test case, regardless of the file it lives in (this is because Mocha has an *implied* `describe()` block, called the "root suite"). ```js beforeEach(function() { @@ -284,9 +321,11 @@ beforeEach(function() { }); ``` +> This is typically done in Node by placing your hook(s) in a `.js` module, and using the `--require /path/to/module` option on the command-line. + ### Delayed Root Suite -If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Simply run Mocha with the `--delay` flag. This will provide a special function, `run()`, in the global context. +If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: ```js setTimeout(function() { @@ -302,7 +341,7 @@ setTimeout(function() { ## Pending Tests -"Pending"--as in "someone should write these test cases eventually"--test-cases are simply those without a callback: +"Pending"--as in "someone should write these test cases eventually"--test-cases are simply those *without* a callback: ```js describe('Array', function() { @@ -330,7 +369,7 @@ describe('Array', function() { *Note*: All nested suites will still be executed. -Here's an example of executing a particular test case: +Here's an example of executing an individual test case: ```js describe('Array', function() { @@ -346,9 +385,73 @@ describe('Array', function() { }); ``` +Previous to v3.0.0, `.only()` used string matching to decide which tests to execute. As of v3.0.0, this is no longer the case. In v3.0.0 or newer, `.only()` can be used multiple times to define a subset of tests to run: + +```js +describe('Array', function() { + describe('#indexOf()', function() { + it.only('should return -1 unless present', function() { + // this test will be run + }); + + it.only('should return the index when present', function() { + // this test will also be run + }); + + it('should return -1 if called with a non-Array context', function() { + // this test will not be run + }); + }); +}); +``` + +You may also choose multiple suites: + +```js +describe('Array', function() { + describe.only('#indexOf()', function() { + it('should return -1 unless present', function() { + // this test will be run + }); + + it('should return the index when present', function() { + // this test will also be run + }); + }); + + describe.only('#concat()', function () { + it('should return a new Array', function () { + // this test will also be run + }); + }); + + describe('#slice()', function () { + it('should return a new Array', function () { + // this test will not be run + }); + }); +}); +``` + +But *tests will have precedence*: + +```js +describe('Array', function() { + describe.only('#indexOf()', function() { + it.only('should return -1 unless present', function() { + // this test will be run + }); + + it('should return the index when present', function() { + // this test will not be run + }); + }); +}); +``` + *Note*: Hooks, if present, will still be executed. -*Warning*: Having more than one call to `.only()` in your tests or suites may result in unexpected behavior. +> Be mindful not to commit usages of `.only()` to version control, unless you really mean it! ## Inclusive Tests @@ -368,11 +471,11 @@ Or a specific test-case: describe('Array', function() { describe('#indexOf()', function() { it.skip('should return -1 unless present', function() { - // ... + // this test will not be run }); it('should return the index when present', function() { - // ... + // this test will be run }); }); }); @@ -424,6 +527,8 @@ before(function() { }); ``` +> Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and hooks. + ## Retry Tests You can choose to retry failed tests up to a certain number of times. This feature is designed to handle end-to-end tests (functional tests/Selenium...) where resources cannot be easily mocked/stubbed. **It's not recommended to use this feature for unit tests**. @@ -557,6 +662,8 @@ describe('a suite of tests', function() { Again, use `this.timeout(0)` to disable the timeout for a hook. +> In v3.0.0 or newer, a parameter passed to `this.timeout()` greater than the [maximum delay value](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) will cause the timeout to be disabled. + ## Diffs Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff: @@ -568,62 +675,60 @@ Mocha supports the `err.expected` and `err.actual` properties of any thrown `Ass ``` Usage: mocha [debug] [options] [files] + Commands: - init - initialize a client-side mocha setup at + init initialize a client-side mocha setup at Options: - -h, --help output usage information - -V, --version output the version number - -A, --async-only force all tests to take a callback (async) or return a promise - -c, --colors force enabling of colors - -C, --no-colors force disabling of colors - -G, --growl enable growl notification support - -O, --reporter-options reporter-specific options - -R, --reporter specify the reporter to use - -S, --sort sort test files - -b, --bail bail after first test failure - -d, --debug enable node's debugger, synonym for node --debug - -g, --grep only run tests matching - -f, --fgrep only run tests containing - -gc, --expose-gc expose gc extension - -i, --invert inverts --grep and --fgrep matches - -r, --require require the given module - -s, --slow "slow" test threshold in milliseconds [75] - -t, --timeout set test-case timeout in milliseconds [2000] - -u, --ui specify user-interface (bdd|tdd|exports) - -w, --watch watch files for changes - --check-leaks check for global variable leaks - --compilers :,... use the given module(s) to compile files - --debug-brk enable node's debugger breaking on the first line - --delay wait for async suite definition - --es_staging enable all staged features - --full-trace display the full stack trace - --globals allow the given comma-delimited global [names] - --harmony enable all harmony features (except typeof) - --harmony-collections enable harmony collections (sets, maps, and weak maps) - --harmony-generators enable harmony generators - --harmony-proxies enable harmony proxies - --harmony_arrow_functions enable "harmony arrow functions" (iojs) - --harmony_classes enable "harmony classes" (iojs) - --harmony_proxies enable "harmony proxies" (iojs) - --harmony_shipping enable all shipped harmony features (iojs) - --inline-diffs display actual/expected differences inline within each string - --interfaces display available interfaces - --no-deprecation silence deprecation warnings - --no-exit require a clean shutdown of the event loop: mocha will not call process.exit - --no-timeouts disables timeouts, given implicitly with --debug - --opts specify opts path - --prof log statistical profiling information - --recursive include sub directories - --reporters display available reporters - --retries set number of times to retry failed test cases - --throw-deprecation throw an exception anytime a deprecated function is used - --trace trace function calls - --trace-deprecation show stack traces on deprecations - --watch-extensions ,... additional extensions to monitor with --watch + -h, --help output usage information + -V, --version output the version number + -A, --async-only force all tests to take a callback (async) or return a promise + -c, --colors force enabling of colors + -C, --no-colors force disabling of colors + -G, --growl enable growl notification support + -O, --reporter-options reporter-specific options + -R, --reporter specify the reporter to use + -S, --sort sort test files + -b, --bail bail after first test failure + -d, --debug enable node's debugger, synonym for node --debug + -g, --grep only run tests matching + -f, --fgrep only run tests containing + -gc, --expose-gc expose gc extension + -i, --invert inverts --grep and --fgrep matches + -r, --require require the given module + -s, --slow "slow" test threshold in milliseconds [75] + -t, --timeout set test-case timeout in milliseconds [2000] + -u, --ui specify user-interface (bdd|tdd|qunit|exports) + -w, --watch watch files for changes + --check-leaks check for global variable leaks + --full-trace display the full stack trace + --compilers :,... use the given module(s) to compile files + --debug-brk enable node's debugger breaking on the first line + --globals allow the given comma-delimited global [names] + --es_staging enable all staged features + --harmony<_classes,_generators,...> all node --harmony* flags are available + --preserve-symlinks Instructs the module loader to preserve symbolic links when resolving and caching modules + --icu-data-dir include ICU data + --inline-diffs display actual/expected differences inline within each string + --interfaces display available interfaces + --no-deprecation silence deprecation warnings + --no-exit require a clean shutdown of the event loop: mocha will not call process.exit + --no-timeouts disables timeouts, given implicitly with --debug + --opts specify opts path + --perf-basic-prof enable perf linux profiler (basic support) + --prof log statistical profiling information + --log-timer-events Time events including external callbacks + --recursive include sub directories + --reporters display available reporters + --retries set numbers of time to retry a failed test case + --throw-deprecation throw an exception anytime a deprecated function is used + --trace trace function calls + --trace-deprecation show stack traces on deprecations + --use_strict enforce strict mode + --watch-extensions ,... additional extensions to monitor with --watch + --delay wait for async suite definition ``` ### `-w, --watch` @@ -637,6 +742,10 @@ may be used by mapping the file extensions (for use with `--watch`) and the modu name. For example `--compilers coffee:coffee-script` with CoffeeScript 1.6- or `--compilers coffee:coffee-script/register` with CoffeeScript 1.7+. +#### About Babel + +If your ES6 modules have extension `.js`, you can `npm install --save-dev babel-register` and use `mocha --require babel-register`; `--compilers` is only necessary if you need to specify a file extension. + ### `-b, --bail` Only interested in the first exception? use `--bail`! @@ -841,7 +950,7 @@ This is the default reporter. The "spec" reporter outputs a hierarchical view n ### Dot Matrix -The dot matrix (or "dot") reporter is simply a series of dots that represent test cases, failures highlight in red, pending in blue, slow as yellow. Good if you would like minimal output. +The dot matrix (or "dot") reporter is simply a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. ![dot matrix reporter](images/reporter-dot.png) @@ -888,18 +997,6 @@ The "JSON stream" reporter outputs newline-delimited JSON "events" as they occur ![json stream reporter](images/reporter-json-stream.png) -### JSONCov - -The "JSONCov" reporter is similar to the JSON reporter, however when run against a library instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage) it will produce coverage output. - -### HTMLCov - -The "HTMLCov" reporter extends the JSONCov reporter. The library being tested should first be instrumented by [node-jscoverage](https://github.com/visionmedia/node-jscoverage), this allows Mocha to capture the coverage information necessary to produce a single-page HTML report. - -For an integration example, view the mocha test coverage support [commit](https://github.com/visionmedia/express/commit/b6ee5fafd0d6c79cf7df5560cb324ebee4fe3a7f) for Express. - -![code coverage reporting](images/reporter-htmlcov.png) - ### Min The "min" reporter displays the summary only, while still outputting errors on failure. This reporter works great with `--watch` as it clears the terminal in order to keep your test summary at the top. @@ -1106,22 +1203,18 @@ Real live example code: ## Testing Mocha -To run Mocha's tests: - -```sh -$ make test -``` - -Run all tests, including interfaces: +To run Mocha's tests, you will need GNU Make or compatible; Cygwin should work. ```sh -$ make test-all +$ cd /path/to/mocha +$ npm install +$ npm test ``` -Alter the reporter: +To use a different reporter: ```sh -$ make test REPORTER=list +$ REPORTER=nyan npm test ``` ## More Information From bbcd534398aad4a022e83c2c777913db14ca8630 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 29 Jul 2016 10:54:47 -0700 Subject: [PATCH 0527/1771] update karma config - more clarity around what's happening when it's happening - attempting to ensure PR builds from `mochajs/mocha` branches will run SauceLabs; previously only the "branch" build was running --- karma.conf.js | 57 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 853a5c5025..35e490aebb 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -38,37 +38,54 @@ module.exports = function(config) { }; // see https://github.com/saucelabs/karma-sauce-example - // TO RUN LOCALLY: - // Execute `CI=1 make test-browser`, once you've set the SAUCE_USERNAME and - // SAUCE_ACCESS_KEY env vars. - if (process.env.CI && !process.env.APPVEYOR) { - // we can't run SauceLabs tests on PRs from forks on Travis cuz security. - if (process.env.TRAVIS) { - if (process.env.TRAVIS_REPO_SLUG === 'mochajs/mocha' - && process.env.TRAVIS_PULL_REQUEST === 'false') { - addSauceTests(cfg); + // TO RUN LOCALLY, execute: + // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= make test-browser` + var env = process.env; + var sauceConfig; + + if (env.CI) { + console.err('CI mode enabled'); + if (env.TRAVIS) { + console.err('Travis-CI detected'); + if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis - cfg.sauceLabs.build = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER - + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - cfg.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; + sauceConfig = { + build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER + + ' (' + env.TRAVIS_BUILD_ID + ')', + tunnelIdentifier: env.TRAVIS_JOB_NUMBER + }; + console.err('Configured SauceLabs') + } else { + console.err('No SauceLabs credentials present'); } + } else if (env.APPVEYOR) { + console.error('AppVeyor detected'); } else { - if (!(process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY)) { - throw new Error('Must set SAUCE_USERNAME and SAUCE_ACCESS_KEY ' - + 'environment variables!'); + console.err('Local/unknown environment detected') + // don't need to run sauce from appveyor b/c travis does it. + if (!(env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY)) { + console.err('No SauceLabs credentials present'); + } else { + sauceConfig = { + build: require('os').hostname() + ' (' + Date.now() + ')' + }; + console.err('Configured SauceLabs'); } - - // remember, this is for a local run. - addSauceTests(cfg); - cfg.sauceLabs.build = require('os').hostname() + ' (' + Date.now() + ')'; } + } else { + console.err('CI mode disabled'); + } + + if (sauceConfig) { + cfg.sauceLabs = sauceConfig; + addSauceTests(cfg); } // the MOCHA_UI env var will determine if we're running interface-specific // tets. since you can only load one at a time, each must be run separately. // each has its own set of acceptance tests and a fixture. // the "bdd" fixture is used by default. - var ui = process.env.MOCHA_UI; + var ui = env.MOCHA_UI; if (ui) { if (cfg.sauceLabs) { cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests'; From 56323e7902325b2f89498680ee9be8a8e72c1d8e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 29 Jul 2016 11:03:34 -0700 Subject: [PATCH 0528/1771] console.err -> console.error (.travis.yml) --- karma.conf.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 35e490aebb..b51e7f3699 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -44,9 +44,9 @@ module.exports = function(config) { var sauceConfig; if (env.CI) { - console.err('CI mode enabled'); + console.error('CI mode enabled'); if (env.TRAVIS) { - console.err('Travis-CI detected'); + console.error('Travis-CI detected'); if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis sauceConfig = { @@ -54,26 +54,26 @@ module.exports = function(config) { + ' (' + env.TRAVIS_BUILD_ID + ')', tunnelIdentifier: env.TRAVIS_JOB_NUMBER }; - console.err('Configured SauceLabs') + console.error('Configured SauceLabs') } else { - console.err('No SauceLabs credentials present'); + console.error('No SauceLabs credentials present'); } } else if (env.APPVEYOR) { console.error('AppVeyor detected'); } else { - console.err('Local/unknown environment detected') + console.error('Local/unknown environment detected') // don't need to run sauce from appveyor b/c travis does it. if (!(env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY)) { - console.err('No SauceLabs credentials present'); + console.error('No SauceLabs credentials present'); } else { sauceConfig = { build: require('os').hostname() + ' (' + Date.now() + ')' }; - console.err('Configured SauceLabs'); + console.error('Configured SauceLabs'); } } } else { - console.err('CI mode disabled'); + console.error('CI mode disabled'); } if (sauceConfig) { From 712947b8f92b814f0006d6fa5b87202b8f2ae16b Mon Sep 17 00:00:00 2001 From: Nathan Houle Date: Mon, 16 May 2016 12:01:51 -0700 Subject: [PATCH 0529/1771] Fix missing methods/globals in IE7, IE8 environments --- lib/context.js | 6 ++++++ lib/runnable.js | 1 + lib/utils.js | 2 ++ package.json | 1 + 4 files changed, 10 insertions(+) diff --git a/lib/context.js b/lib/context.js index 4e7247b841..6d82fcadf4 100644 --- a/lib/context.js +++ b/lib/context.js @@ -1,3 +1,9 @@ +/** + * Module dependencies. + */ + +var JSON = require('json3'); + /** * Expose `Context`. */ diff --git a/lib/runnable.js b/lib/runnable.js index 4bc2be2448..5b9ed23173 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -3,6 +3,7 @@ */ var EventEmitter = require('events').EventEmitter; +var JSON = require('json3'); var Pending = require('./pending'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); diff --git a/lib/utils.js b/lib/utils.js index 35e59c09c5..8efa735cf8 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -4,6 +4,7 @@ * Module dependencies. */ +var JSON = require('json3'); var basename = require('path').basename; var debug = require('debug')('mocha:watch'); var exists = require('fs').existsSync || require('path').existsSync; @@ -11,6 +12,7 @@ var glob = require('glob'); var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; +var toISOString = require('@segment/to-iso-string'); var watchFile = require('fs').watchFile; var toISOString = require('to-iso-string'); diff --git a/package.json b/package.json index 3840adf7f5..e070780f1b 100644 --- a/package.json +++ b/package.json @@ -323,6 +323,7 @@ "glob": "3.2.11", "growl": "1.9.2", "jade": "0.26.3", + "json3": "3.3.2", "mkdirp": "0.5.1", "os-tmpdir": "1.0.1", "supports-color": "1.2.0", From 0fdd5a280d195465c53fc25fab0712612aaa3ade Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 9 Jun 2016 20:24:40 -0700 Subject: [PATCH 0530/1771] fix toISOString and utils tests for IE7 --- karma.conf.js | 6 ++++++ lib/utils.js | 1 - test/acceptance/utils.js | 1 + test/utils.js | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index b51e7f3699..a1484831d9 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -111,6 +111,12 @@ function addSauceTests(cfg) { platform: 'Windows 7', version: '8.0' }, + ie7: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows XP', + version: '7.0' + }, chrome: { base: 'SauceLabs', browserName: 'chrome', diff --git a/lib/utils.js b/lib/utils.js index 8efa735cf8..1205587e61 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -12,7 +12,6 @@ var glob = require('glob'); var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; -var toISOString = require('@segment/to-iso-string'); var watchFile = require('fs').watchFile; var toISOString = require('to-iso-string'); diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index 366d2d8579..04e4380163 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -1,5 +1,6 @@ var utils = require('../../lib/utils'); var toISOString = require('to-iso-string'); +var JSON = require('json3'); describe('lib/utils', function () { describe('clean', function () { diff --git a/test/utils.js b/test/utils.js index 881e5342a9..c169f48675 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,5 +1,6 @@ var mocha = require('..'); var utils = mocha.utils; +var JSON = require('json3'); describe('utils', function() { describe('.clean()', function() { From a2968f0b17d8c1f266637b36a20bee16877d5d88 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 25 Jun 2016 23:15:17 -0700 Subject: [PATCH 0531/1771] add json3 to json-cov and json-stream reporters --- lib/reporters/json-cov.js | 1 + lib/reporters/json-stream.js | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/reporters/json-cov.js b/lib/reporters/json-cov.js index 5a32569f03..a1ead3728c 100644 --- a/lib/reporters/json-cov.js +++ b/lib/reporters/json-cov.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var JSON = require('json3'); /** * Expose `JSONCov`. diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js index 02399e7dbc..f07f8657c0 100644 --- a/lib/reporters/json-stream.js +++ b/lib/reporters/json-stream.js @@ -3,6 +3,7 @@ */ var Base = require('./base'); +var JSON = require('json3'); /** * Expose `List`. From 6051107f7c67228de1f181adfeab0faba65b53f5 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 19 Oct 2014 12:56:34 -0400 Subject: [PATCH 0532/1771] Update glob to 4.0.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e070780f1b..f3e5932247 100644 --- a/package.json +++ b/package.json @@ -320,7 +320,7 @@ "debug": "2.2.0", "diff": "1.4.0", "escape-string-regexp": "1.0.2", - "glob": "3.2.11", + "glob": "4.0.6", "growl": "1.9.2", "jade": "0.26.3", "json3": "3.3.2", From ca396bfd06b77455292cbfc0885725daa7de2d99 Mon Sep 17 00:00:00 2001 From: Shinnosuke Watanabe Date: Wed, 29 Oct 2014 10:54:22 +0900 Subject: [PATCH 0533/1771] Require npm version which supports `^` specifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://travis-ci.org/mochajs/mocha/jobs/38422941 The only problem in this error is that npm v1.2 doesn’t support `^` version specifier. It's not the problem of Node v0.8 itself. So I updated the installation command to install the latest version of npm, before installing the dependencies of mocha. --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f3e5932247..097539fc58 100644 --- a/package.json +++ b/package.json @@ -310,8 +310,10 @@ "_mocha": "./bin/_mocha" }, "engines": { - "node": ">= 0.8.x" + "node": ">= 0.8.x", + "npm": ">=1.4.3" }, + "engineStrict": true, "scripts": { "test": "make test" }, From 12ffe0e9d330ca09d9d36e72c353d60d06af19fc Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 22 Aug 2014 19:08:40 -0400 Subject: [PATCH 0534/1771] Fail when test resolution method is overspecified Users may register `Runnable`s as asynchronous in one of two ways: - Via callback (by defining the body function to have an arity of one) - Via promise (by returning a Promise object from the body function) When both a callback function is specified *and* a Promise object is returned, the `Runnable`'s resolution condition is ambiguous. Practically speaking, users are most likely to make this mistake as they transition between asynchronous styles. Currently, Mocha silently prefers the callback amd ignores the Promise object. Update the implementation of the `Runnable` class to fail immediately when the test resolution method is over-specified in this way. --- lib/runnable.js | 6 +++++- lib/utils.js | 10 ++++++++++ test/acceptance/overspecified-async.js | 8 ++++++++ test/utils.js | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/acceptance/overspecified-async.js diff --git a/lib/runnable.js b/lib/runnable.js index 5b9ed23173..49f52c7dcf 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -351,7 +351,7 @@ Runnable.prototype.run = function(fn) { } function callFnAsync(fn) { - fn.call(ctx, function(err) { + var result = fn.call(ctx, function(err) { if (err instanceof Error || toString.call(err) === '[object Error]') { return done(err); } @@ -362,6 +362,10 @@ Runnable.prototype.run = function(fn) { } return done(new Error('done() invoked with non-Error: ' + err)); } + if (result && utils.isPromise(result)) { + return done(new Error('Asynchronous resolution method is overspecified. Specify a callback *or* return a Promise, not both.')); + } + done(); }); } diff --git a/lib/utils.js b/lib/utils.js index 1205587e61..dfe591c129 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -749,3 +749,13 @@ exports.stackTraceFilter = function() { return stack.join('\n'); }; }; + +/** + * Crude, but effective. + * @api + * @param {*} value + * @returns {boolean} Whether or not `value` is a Promise + */ +exports.isPromise = function isPromise(value) { + return typeof value === 'object' && typeof value.then === 'function'; +}; diff --git a/test/acceptance/overspecified-async.js b/test/acceptance/overspecified-async.js new file mode 100644 index 0000000000..2844920379 --- /dev/null +++ b/test/acceptance/overspecified-async.js @@ -0,0 +1,8 @@ +describe('overspecified asynchronous resolution method', function() { + it('should fail when multiple methods are used', function(done) { + setTimeout(done, 0); + + // uncomment + // return { then: function() {} }; + }); +}); diff --git a/test/utils.js b/test/utils.js index c169f48675..501ea7abe8 100644 --- a/test/utils.js +++ b/test/utils.js @@ -183,4 +183,18 @@ describe('utils', function() { }); }); }); + + describe('.isPromise', function() { + it('should return true if the value is Promise-ish', function() { + utils.isPromise({then: function() {}}).should.be.true; + }); + + it('should return false if the value is not an object', function() { + utils.isPromise(1).should.be.false; + }); + + it('should return false if the value is an object w/o a "then" function', function() { + utils.isPromise({}).should.be.false; + }); + }); }); From fdad1dc29f619f3296dc63afeecdc265627cbdbf Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Mon, 13 Apr 2015 18:14:09 +0100 Subject: [PATCH 0535/1771] Throw an exception when timeout too large. closes #1644 --- lib/runnable.js | 3 ++- test/runnable.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/runnable.js b/lib/runnable.js index 49f52c7dcf..3291b28f33 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -75,7 +75,8 @@ Runnable.prototype.timeout = function(ms) { if (!arguments.length) { return this._timeout; } - if (ms === 0) { + // see #1652 for reasoning + if (ms === 0 || ms > Math.pow(2, 31)) { this._enableTimeouts = false; } if (typeof ms === 'string') { diff --git a/test/runnable.js b/test/runnable.js index a3d88adda2..ba1ea48f55 100644 --- a/test/runnable.js +++ b/test/runnable.js @@ -41,6 +41,13 @@ describe('Runnable(title, fn)', function(){ }) }) + describe('#timeout(ms) when ms>2^31', function(){ + it('should throw an error', function () { + var run = new Runnable; + run.timeout.bind(run, 1e10).should.throw(/Timeout too large/); + }); + }); + describe('#enableTimeouts(enabled)', function(){ it('should set enabled', function(){ var run = new Runnable; From 6e6bd574d929a580e2c04e43bac448d17ac90443 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sat, 18 Jul 2015 16:03:07 +0300 Subject: [PATCH 0536/1771] feature(mocha/grep): improve grep - issue #808 Add the ability to pass grep as a regexp-like string. (query in the browser or flag in the cli). This improvement gives you pass a regexp that including a flag, and solved #808 as well. --- bin/_mocha | 4 +- browser-entry.js | 4 +- lib/mocha.js | 22 ++++++-- test/grep.js | 61 +++++++++++++++-------- test/integration/fixtures/options/grep.js | 7 ++- test/integration/options.js | 34 +++++++++---- 6 files changed, 92 insertions(+), 40 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 8a3f50ad5e..a6adadd38a 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -254,11 +254,11 @@ mocha.suite.bail(program.bail); // --grep -if (program.grep) mocha.grep(new RegExp(program.grep)); +if (program.grep) mocha.grep(program.grep); // --fgrep -if (program.fgrep) mocha.grep(program.fgrep); +if (program.fgrep) mocha.fgrep(program.fgrep); // --invert diff --git a/browser-entry.js b/browser-entry.js index 27ea71f514..341a199914 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -132,8 +132,8 @@ mocha.run = function(fn){ mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(new RegExp(query.grep)); - if (query.fgrep) mocha.grep(query.fgrep); + if (query.grep) mocha.grep(query.grep); + if (query.fgrep) mocha.fgrep(query.fgrep); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ diff --git a/lib/mocha.js b/lib/mocha.js index 46775ab55c..de0f32ee5a 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -80,7 +80,7 @@ function Mocha(options) { this.grep(new RegExp(options.grep)); } if (options.fgrep) { - this.grep(options.fgrep); + this.fgrep(options.fgrep); } this.suite = new exports.Suite('', new exports.Context()); this.ui(options.ui); @@ -246,6 +246,17 @@ Mocha.prototype._growl = function(runner, reporter) { }); }; +/** + * Escape string and add it to grep as a regexp. + * + * @api public + * @param str + * @returns {Mocha} + */ +Mocha.prototype.fgrep = function(str) { + return this.grep(new RegExp(escapeRe(str))); +}; + /** * Add regexp to grep, if `re` is a string it is escaped. * @@ -256,10 +267,15 @@ Mocha.prototype._growl = function(runner, reporter) { * @return {Mocha} */ Mocha.prototype.grep = function(re) { - this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re; + if (utils.isString(re)) { + // extract args if it's regex-like, i.e: [string, pattern, flag] + var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); + this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); + } else { + this.options.grep = re; + } return this; }; - /** * Invert `.grep()` matches. * diff --git a/test/grep.js b/test/grep.js index ff9d25a171..bbc5c55eba 100644 --- a/test/grep.js +++ b/test/grep.js @@ -5,44 +5,61 @@ describe('Mocha', function(){ it('should add a RegExp to the mocha.options object', function(){ var mocha = new Mocha({ grep: /foo.*/ }); mocha.options.grep.toString().should.equal('/foo.*/'); - }) + }); it('should convert string to a RegExp', function(){ var mocha = new Mocha({ grep: 'foo.*' }); mocha.options.grep.toString().should.equal('/foo.*/'); - }) - }) + }); + }); describe('"fgrep" option', function(){ it('should escape and convert string to a RegExp', function(){ var mocha = new Mocha({ fgrep: 'foo.*' }); mocha.options.grep.toString().should.equal('/foo\\.\\*/'); - }) - }) + }); + }); - describe('.grep()', function(){ - it('should add a RegExp to the mocha.options object', function(){ - var mocha = new Mocha; - mocha.grep(/foo/); - mocha.options.grep.toString().should.equal('/foo/'); - }) + describe('.grep()', function() { + // Test helper + function testGrep(mocha) { + return function testGrep(grep, expected) { + mocha.grep(grep); + mocha.options.grep.toString().should.equal(expected); + } + } - it('should convert grep string to a RegExp', function(){ - var mocha = new Mocha; - mocha.grep('foo'); - mocha.options.grep.toString().should.equal('/foo/'); - }) + it('should add a RegExp to the mocha.options object', function() { + var test = testGrep(new Mocha); + test(/foo/, '/foo/'); + }); + + it('should convert grep string to a RegExp', function() { + var test = testGrep(new Mocha); + test('foo', '/foo/'); + test('^foo.*bar$', '/^foo.*bar$/'); + test('^@.*(?=\\(\\)$)', '/^@.*(?=\\(\\)$)/'); + }); + + it('should covert grep regex-like string to a RegExp', function() { + var test = testGrep(new Mocha); + test('/foo/', '/foo/'); + // Keep the flags + test('/baz/i', '/baz/i'); + test('/bar/g', '/bar/g'); + test('/^foo(.*)bar/g', '/^foo(.*)bar/g'); + }); it('should return it\'s parent Mocha object for chainability', function(){ var mocha = new Mocha; mocha.grep().should.equal(mocha); - }) - }) + }); + }); describe('"invert" option', function(){ it('should add a Boolean to the mocha.options object', function(){ var mocha = new Mocha({ invert: true }); - mocha.options.invert.should.be.ok(); - }) - }) -}) + mocha.options.invert.should.be.ok; + }); + }); +}); diff --git a/test/integration/fixtures/options/grep.js b/test/integration/fixtures/options/grep.js index 5e163f5ee7..94785dc7db 100644 --- a/test/integration/fixtures/options/grep.js +++ b/test/integration/fixtures/options/grep.js @@ -1,10 +1,15 @@ describe('grep', function() { + describe('Match', function() { + it('should run', function(){}); + it('should also run', function() {}); + }); + describe('match', function() { it('should run', function(){}); it('should also run', function() {}); }); - describe('fail', function(){ + describe('fail', function() { it('should not be ran', function() { throw new Error('Spec should not run'); }); diff --git a/test/integration/options.js b/test/integration/options.js index 1e25b6ef3d..afd961b3a5 100644 --- a/test/integration/options.js +++ b/test/integration/options.js @@ -125,15 +125,29 @@ describe('options', function() { }); }); - it('runs specs matching a RegExp', function(done) { - args = ['--grep', '.*']; - run('options/grep.js', args, function(err, res) { - assert(!err); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 1); - assert.equal(res.code, 1); - done(); + describe('runs specs matching a RegExp', function() { + it('with RegExp like strings(pattern follow by flag)', function(done) { + args = ['--grep', '/match/i']; + run('options/grep.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 4); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + + it('string as pattern', function(done) { + args = ['--grep', '.*']; + run('options/grep.js', args, function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 4); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + done(); + }); }); }); @@ -143,7 +157,7 @@ describe('options', function() { run('options/grep.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); + assert.equal(res.stats.passes, 4); assert.equal(res.stats.failures, 0); assert.equal(res.code, 0); done(); From 989758f3d97ec1fcce5f420af894c5d490ddb316 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 01:14:59 -0700 Subject: [PATCH 0537/1771] fix test for my sneaky change to timeout() --- test/runnable.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/runnable.js b/test/runnable.js index ba1ea48f55..d6b020a6a1 100644 --- a/test/runnable.js +++ b/test/runnable.js @@ -41,10 +41,11 @@ describe('Runnable(title, fn)', function(){ }) }) - describe('#timeout(ms) when ms>2^31', function(){ - it('should throw an error', function () { - var run = new Runnable; - run.timeout.bind(run, 1e10).should.throw(/Timeout too large/); + describe('#timeout(ms) when ms>2^31', function() { + it('should set disabled', function() { + var run = new Runnable(); + run.timeout(1e10); + run.enableTimeouts().should.be.false; }); }); From 7b5675e385b83c33cf8e008bab8f96617f827632 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 01:17:08 -0700 Subject: [PATCH 0538/1771] drop v0.8x support --- .travis.yml | 7 ------- scripts/upgrade-npm.js | 21 --------------------- 2 files changed, 28 deletions(-) delete mode 100644 scripts/upgrade-npm.js diff --git a/.travis.yml b/.travis.yml index 664e34d2fa..0f9f3a10f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,13 +27,6 @@ matrix: env: TARGET=test-node - node_js: '0.10' env: TARGET=test-node - - node_js: '0.8' - env: TARGET=test-node - -before_install: - # node 0.8 won't install our dev deps with an out-of-box npm; - # this upgrades it - - node ./scripts/upgrade-npm.js script: travis_retry make $TARGET diff --git a/scripts/upgrade-npm.js b/scripts/upgrade-npm.js deleted file mode 100644 index 2e8be81e0a..0000000000 --- a/scripts/upgrade-npm.js +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node - -/** - * This upgrades npm on Travis when using Node.js 0.8x - */ - -if (process.env.TRAVIS_NODE_VERSION === '0.8') { - var exec = require('child_process').exec; - // ensure *dependencies* can be installed using provided npm - exec('npm install --production', function (err) { - if (err) { - throw new Error(err); - } - exec('npm install --global npm@2', function (err) { - if (err) { - throw new Error(err); - } - console.log('Upgraded to npm@2'); - }); - }); -} From 8a11fb06c080bd4fc6ad00c8f76ce8cb0837d595 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 20:05:36 -0700 Subject: [PATCH 0539/1771] upgrade all possible deps; use pug instead of jade --- lib/reporters/html-cov.js | 6 +++--- package.json | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/reporters/html-cov.js b/lib/reporters/html-cov.js index e3f2dd91e3..8c6bac4d72 100644 --- a/lib/reporters/html-cov.js +++ b/lib/reporters/html-cov.js @@ -19,10 +19,10 @@ exports = module.exports = HTMLCov; * @param {Runner} runner */ function HTMLCov(runner) { - var jade = require('jade'); - var file = join(__dirname, '/templates/coverage.jade'); + var pug = require('pug'); + var file = join(__dirname, '/templates/coverage.pug'); var str = readFileSync(file, 'utf8'); - var fn = jade.compile(str, { filename: file }); + var fn = pug.compile(str, { filename: file }); var self = this; JSONCov.call(this, runner, false); diff --git a/package.json b/package.json index 097539fc58..6438aca293 100644 --- a/package.json +++ b/package.json @@ -310,32 +310,32 @@ "_mocha": "./bin/_mocha" }, "engines": { - "node": ">= 0.8.x", - "npm": ">=1.4.3" + "node": ">= 0.10.x", + "npm": ">= 1.4.x" }, "engineStrict": true, "scripts": { "test": "make test" }, "dependencies": { - "commander": "2.3.0", + "commander": "2.9.0", "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "4.0.6", + "diff": "2.2.3", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", "growl": "1.9.2", - "jade": "0.26.3", "json3": "3.3.2", "mkdirp": "0.5.1", "os-tmpdir": "1.0.1", - "supports-color": "1.2.0", + "pug": "2.0.0-beta3", + "supports-color": "3.1.2", "to-iso-string": "0.0.2" }, "devDependencies": { "browser-stdout": "^1.2.0", "browserify": "^13.0.0", - "coffee-script": "~1.8.0", - "eslint": "^1.2.1", + "coffee-script": "^1.10.0", + "eslint": "^1.10.3", "expect.js": "^0.3.1", "karma": "^1.1.0", "karma-browserify": "^5.0.5", @@ -345,8 +345,8 @@ "karma-sauce-launcher": "^1.0.0", "karma-spec-reporter": "0.0.26", "phantomjs": "1.9.8", - "should": "~8.0.0", - "through2": "~0.6.5", + "should": "^9.0.2", + "through2": "^2.0.1", "watchify": "^3.7.0" }, "files": [ @@ -364,7 +364,7 @@ "events": "./lib/browser/events.js", "tty": "./lib/browser/tty.js", "./index.js": "./browser-entry.js", - "jade": false, + "pug": false, "fs": false, "glob": false, "path": false, From 12d7f27e25710571db0e77d45381600b52dc3eec Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 22:28:02 -0700 Subject: [PATCH 0540/1771] rename *.jade => .pug --- lib/reporters/templates/{coverage.jade => coverage.pug} | 0 lib/reporters/templates/{menu.jade => menu.pug} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/reporters/templates/{coverage.jade => coverage.pug} (100%) rename lib/reporters/templates/{menu.jade => menu.pug} (100%) diff --git a/lib/reporters/templates/coverage.jade b/lib/reporters/templates/coverage.pug similarity index 100% rename from lib/reporters/templates/coverage.jade rename to lib/reporters/templates/coverage.pug diff --git a/lib/reporters/templates/menu.jade b/lib/reporters/templates/menu.pug similarity index 100% rename from lib/reporters/templates/menu.jade rename to lib/reporters/templates/menu.pug From 864e5fa092881c5a72f8629bebf5968397786b19 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 23:24:40 -0700 Subject: [PATCH 0541/1771] fail fast in CI; try to cache phantom binary; enable artifact addon --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0f9f3a10f1..9cc01a25c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ env: global: PHANTOMJS_CDNURL='https://cnpmjs.org/downloads' matrix: + fast_finish: true include: - node_js: '6' env: TARGET='clean lint test-node test-browser' @@ -36,4 +37,10 @@ notifications: - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU= on_success: change on_failure: always - on_start: never + +cache: + directories: + - node_modules/phantomjs/lib/phantom + +addons: + artifacts: true From 3833d3f23f7f80f32c3436682efb149e88b0d698 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 23:48:56 -0700 Subject: [PATCH 0542/1771] remove unneeded os-tmpdir --- package.json | 1 - test/acceptance/fs.js | 3 ++- test/acceptance/lookup-files.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6438aca293..f2ad728921 100644 --- a/package.json +++ b/package.json @@ -326,7 +326,6 @@ "growl": "1.9.2", "json3": "3.3.2", "mkdirp": "0.5.1", - "os-tmpdir": "1.0.1", "pug": "2.0.0-beta3", "supports-color": "3.1.2", "to-iso-string": "0.0.2" diff --git a/test/acceptance/fs.js b/test/acceptance/fs.js index f4c92ea727..3a70f2752c 100644 --- a/test/acceptance/fs.js +++ b/test/acceptance/fs.js @@ -1,6 +1,7 @@ var fs = require('fs'); var path = require('path'); -var tmpFile = path.join.bind(path, require('os-tmpdir')()); +var os = require('os'); +var tmpFile = path.join.bind(path, os.tmpdir()); describe('fs.readFile()', function(){ describe('when the file exists', function(){ diff --git a/test/acceptance/lookup-files.js b/test/acceptance/lookup-files.js index 7b84d93171..958f1b70f2 100644 --- a/test/acceptance/lookup-files.js +++ b/test/acceptance/lookup-files.js @@ -4,7 +4,7 @@ describe('lookupFiles', function() { var fs = require('fs'), path = require('path'), existsSync = fs.existsSync || path.existsSync, - tmpDir = require('os-tmpdir')(), + tmpDir = require('os').tmpDir(), tmpFile = path.join.bind(path, tmpDir), symlinkSupported = false; From 03464ff0c0238beb213497891c2c4930b59de60a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 23:49:21 -0700 Subject: [PATCH 0543/1771] generate build artifacts from bundled test files --- .gitignore | 1 + karma.conf.js | 22 ++++++++++++++++++++-- package.json | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e36f109724..cc19425077 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ lib/browser/diff.js *.diff npm-debug.log* .envrc +.karma/ diff --git a/karma.conf.js b/karma.conf.js index a1484831d9..47867de1f3 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,6 +1,13 @@ 'use strict'; +var fs = require('fs'); +var path = require('path'); +var mkdirp = require('mkdirp'); +var bundleDirpath = path.join(__dirname, '.karma'); + module.exports = function(config) { + mkdirp.sync(bundleDirpath); + var cfg = { frameworks: [ 'browserify', @@ -25,9 +32,20 @@ module.exports = function(config) { debug: true, configure: function configure(b) { b.ignore('glob') - .ignore('jade') + .ignore('pug') .ignore('supports-color') - .exclude('./lib-cov/mocha'); + .exclude('./lib-cov/mocha') + .on('bundled', function (err, content) { + var filepath = path.join(bundleDirpath, + 'bundle.' + Date.now() + '.js'); + if (!err) { + fs.writeFile(filepath, content, function (err) { + if (!err) { + console.error('Wrote test bundle to ' + filepath); + } + }); + } + }); } }, reporters: ['spec'], diff --git a/package.json b/package.json index f2ad728921..470f33f543 100644 --- a/package.json +++ b/package.json @@ -343,6 +343,7 @@ "karma-phantomjs-launcher": "^0.2.3", "karma-sauce-launcher": "^1.0.0", "karma-spec-reporter": "0.0.26", + "mkdirp": "^0.5.1", "phantomjs": "1.9.8", "should": "^9.0.2", "through2": "^2.0.1", From 7c81b1b1b5dd49be41d9f77070a2e3462efe1c8a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 15:14:10 -0700 Subject: [PATCH 0544/1771] downgrade diff for ES3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 470f33f543..2a7504706b 100644 --- a/package.json +++ b/package.json @@ -320,7 +320,7 @@ "dependencies": { "commander": "2.9.0", "debug": "2.2.0", - "diff": "2.2.3", + "diff": "1.3.2", "escape-string-regexp": "1.0.5", "glob": "7.0.5", "growl": "1.9.2", From 1ab7d084fd10877a5213c518c11935f6687e3066 Mon Sep 17 00:00:00 2001 From: ELLIOTTCABLE Date: Wed, 9 Dec 2015 13:26:09 -0600 Subject: [PATCH 0545/1771] Use more visually-distinctive characters on the 'dot' reporter --- lib/reporters/base.js | 4 +++- lib/reporters/dot.js | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 4c9e8064cd..c754c5231f 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -78,7 +78,9 @@ exports.colors = { exports.symbols = { ok: '✓', err: '✖', - dot: '․' + dot: '․', + comma: ',', + bang: '!' }; // With node.js on Windows: use symbols available in terminal default fonts diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index e905dc6860..f8b4b41fe0 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -33,7 +33,7 @@ function Dot(runner) { if (++n % width === 0) { process.stdout.write('\n '); } - process.stdout.write(color('pending', Base.symbols.dot)); + process.stdout.write(color('pending', Base.symbols.comma)); }); runner.on('pass', function(test) { @@ -51,7 +51,7 @@ function Dot(runner) { if (++n % width === 0) { process.stdout.write('\n '); } - process.stdout.write(color('fail', Base.symbols.dot)); + process.stdout.write(color('fail', Base.symbols.bang)); }); runner.on('end', function() { From 57734b678e23077e5be12922be0d5139fafd0f6a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 1 Jul 2016 22:38:27 -0700 Subject: [PATCH 0546/1771] fix integration tests with changes to dot reporter --- test/integration/hook.err.js | 37 ++++++++++++++++++------------------ test/integration/retries.js | 3 ++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index f874b8f3b6..5cdde133a9 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -1,6 +1,7 @@ var assert = require('assert'); var runMocha = require('./helpers').runMocha; var splitRegExp = require('./helpers').splitRegExp; +var bang = require('../../lib/reporters/base').symbols.bang; describe('hook error handling', function() { this.timeout(2000); @@ -12,7 +13,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test 3'] + ['before', bang + 'test 3'] ); }); }); @@ -32,7 +33,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test 3'] + ['before', bang + 'test 3'] ); }); }); @@ -42,7 +43,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['test 1', 'test 2', 'after', 'test 3'] + ['test 1', 'test 2', 'after', bang + 'test 3'] ); }); }); @@ -52,7 +53,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['test 1', 'after', 'test 3'] + ['test 1', 'after', bang + 'test 3'] ); }); }); @@ -68,25 +69,25 @@ describe('hook error handling', function() { 'root before each', '1 before each', '1-1 before each', - '1-1 after each', + bang + '1-1 after each', '1 after each', 'root after each', '1-1 after', - '1-2 before', + bang + '1-2 before', 'root before each', '1 before each', '1-2 before each', '1-2 test 1', '1-2 after each', - '1 after each', + bang + '1 after each', 'root after each', '1-2 after', '1 after', '2-1 before', 'root before each', '2 before each', - '2 after each', - 'root after each', + bang + '2 after each', + bang + 'root after each', '2-1 after', '2 after', 'root after' @@ -100,7 +101,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test 3'] + ['before', bang + 'test 3'] ); }); }); @@ -120,7 +121,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['before', 'test 3'] + ['before', bang + 'test 3'] ); }); }); @@ -130,7 +131,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['test 1', 'test 2', 'after', 'test 3'] + ['test 1', 'test 2', 'after', bang + 'test 3'] ); }); }); @@ -140,7 +141,7 @@ describe('hook error handling', function() { it('should verify results', function() { assert.deepEqual( lines, - ['test 1', 'after', 'test 3'] + ['test 1', 'after', bang + 'test 3'] ); }); }); @@ -156,25 +157,25 @@ describe('hook error handling', function() { 'root before each', '1 before each', '1-1 before each', - '1-1 after each', + bang + '1-1 after each', '1 after each', 'root after each', '1-1 after', - '1-2 before', + bang + '1-2 before', 'root before each', '1 before each', '1-2 before each', '1-2 test 1', '1-2 after each', - '1 after each', + bang + '1 after each', 'root after each', '1-2 after', '1 after', '2-1 before', 'root before each', '2 before each', - '2 after each', - 'root after each', + bang + '2 after each', + bang + 'root after each', '2-1 after', '2 after', 'root after' diff --git a/test/integration/retries.js b/test/integration/retries.js index 756cc9dd9b..a24fc482a3 100644 --- a/test/integration/retries.js +++ b/test/integration/retries.js @@ -1,6 +1,7 @@ var assert = require('assert'); var helpers = require('./helpers'); var args = []; +var bang = require('../../lib/reporters/base').symbols.bang; describe('retries', function() { this.timeout(2000); @@ -33,7 +34,7 @@ describe('retries', function() { 'after each 4', 'before each 4', 'TEST 4', - 'after each 5', + bang + 'after each 5', 'after' ]; From 6471db9a437f55f608c0c71ec7af27d294b75b09 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 15:20:48 -0700 Subject: [PATCH 0547/1771] remove dupe mkdirp dep --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 2a7504706b..0c7417859f 100644 --- a/package.json +++ b/package.json @@ -343,7 +343,6 @@ "karma-phantomjs-launcher": "^0.2.3", "karma-sauce-launcher": "^1.0.0", "karma-spec-reporter": "0.0.26", - "mkdirp": "^0.5.1", "phantomjs": "1.9.8", "should": "^9.0.2", "through2": "^2.0.1", From 9efb860bb8c7b1f3c6cae51e040980f2d5b0581c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 15:23:47 -0700 Subject: [PATCH 0548/1771] upgrade diff back to original --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c7417859f..453ff3aa53 100644 --- a/package.json +++ b/package.json @@ -320,7 +320,7 @@ "dependencies": { "commander": "2.9.0", "debug": "2.2.0", - "diff": "1.3.2", + "diff": "1.4.0", "escape-string-regexp": "1.0.5", "glob": "7.0.5", "growl": "1.9.2", From 7910a9208b71113832949f09e901f64f72d87a9a Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Thu, 12 Nov 2015 11:38:35 +0200 Subject: [PATCH 0549/1771] fix(Suite/Test): untitled suite/test-case #1632 Throw a user-friendly error when the suite title or the test-case title isn't provided. --- lib/suite.js | 3 +++ lib/test.js | 6 +++++- test/acceptance/throw.js | 2 +- test/runner.js | 2 +- test/suite.js | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/lib/suite.js b/lib/suite.js index d43dd45604..74054dd0c6 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -41,6 +41,9 @@ exports.create = function(parent, title) { * @param {Context} parentContext */ function Suite(title, parentContext) { + if (!utils.isString(title)) { + throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.'); + } this.title = title; function Context() {} Context.prototype = parentContext; diff --git a/lib/test.js b/lib/test.js index a95cd31a48..1e00c6f5cc 100644 --- a/lib/test.js +++ b/lib/test.js @@ -3,7 +3,8 @@ */ var Runnable = require('./runnable'); -var inherits = require('./utils').inherits; +var create = require('lodash.create'); +var isString = require('./utils').isString; /** * Expose `Test`. @@ -19,6 +20,9 @@ module.exports = Test; * @param {Function} fn */ function Test(title, fn) { + if (!isString(title)) { + throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.'); + } Runnable.call(this, title, fn); this.pending = !fn; this.type = 'test'; diff --git a/test/acceptance/throw.js b/test/acceptance/throw.js index 1016a19efe..46cfbad6ad 100644 --- a/test/acceptance/throw.js +++ b/test/acceptance/throw.js @@ -6,7 +6,7 @@ describe('a test that throws', function () { var suite, runner; beforeEach(function(){ - suite = new Suite(null, 'root'); + suite = new Suite('Suite', 'root'); runner = new Runner(suite); }) diff --git a/test/runner.js b/test/runner.js index 7673a8384e..37aeb22d6f 100644 --- a/test/runner.js +++ b/test/runner.js @@ -7,7 +7,7 @@ describe('Runner', function(){ var suite, runner; beforeEach(function(){ - suite = new Suite(null, 'root'); + suite = new Suite('Suite', 'root'); runner = new Runner(suite); }) diff --git a/test/suite.js b/test/suite.js index 6588e24817..7fead0745a 100644 --- a/test/suite.js +++ b/test/suite.js @@ -398,4 +398,42 @@ describe('Suite', function(){ }); }); + + describe('initialization', function() { + it('should throw an error if the title isn\'t a string', function() { + (function() { + new Suite(undefined, 'root'); + }).should.throw(); + + (function() { + new Suite(function(){}, 'root'); + }).should.throw(); + }); + + it('should not throw if the title is a string', function() { + (function() { + new Suite('Bdd suite', 'root'); + }).should.not.throw(); + }); + }); }); + +describe('Test', function() { + describe('initialization', function() { + it('should throw an error if the title isn\'t a string', function() { + (function() { + new Test(function(){}); + }).should.throw(); + + (function() { + new Test(undefined, function(){}); + }).should.throw(); + }); + + it('should not throw if the title is a string', function() { + (function() { + new Test('test-case', function(){}); + }).should.not.throw(); + }); + }); +}); \ No newline at end of file From 829928e54346ddf6d6c02dd0c702017dbd71b431 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 16:18:50 -0700 Subject: [PATCH 0550/1771] fixup merge for pr #1809 --- lib/runnable.js | 6 ++++-- lib/test.js | 4 +++- package.json | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/runnable.js b/lib/runnable.js index 3291b28f33..2492248eba 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -8,7 +8,7 @@ var Pending = require('./pending'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); var utils = require('./utils'); -var inherits = utils.inherits; +var create = require('lodash.create'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -62,7 +62,9 @@ function Runnable(title, fn) { /** * Inherit from `EventEmitter.prototype`. */ -inherits(Runnable, EventEmitter); +Runnable.prototype = create(EventEmitter.prototype, { + constructor: Runnable +}); /** * Set & get timeout `ms`. diff --git a/lib/test.js b/lib/test.js index 1e00c6f5cc..05d4ed86d5 100644 --- a/lib/test.js +++ b/lib/test.js @@ -31,7 +31,9 @@ function Test(title, fn) { /** * Inherit from `Runnable.prototype`. */ -inherits(Test, Runnable); +Test.prototype = create(Runnable.prototype, { + constructor: Test +}); Test.prototype.clone = function() { var test = new Test(this.title, this.fn); diff --git a/package.json b/package.json index 453ff3aa53..1ca947775a 100644 --- a/package.json +++ b/package.json @@ -325,6 +325,7 @@ "glob": "7.0.5", "growl": "1.9.2", "json3": "3.3.2", + "lodash.create": "4.0.4", "mkdirp": "0.5.1", "pug": "2.0.0-beta3", "supports-color": "3.1.2", From cbf9bca72345f8a909bbaea37b9f1bd6fe07525f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 21:05:14 -0700 Subject: [PATCH 0551/1771] fix wonky lookupFiles test; closes #2347 --- package.json | 1 + test/acceptance/lookup-files.js | 57 ++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 1ca947775a..e77b31fce2 100644 --- a/package.json +++ b/package.json @@ -345,6 +345,7 @@ "karma-sauce-launcher": "^1.0.0", "karma-spec-reporter": "0.0.26", "phantomjs": "1.9.8", + "rimraf": "^2.5.2", "should": "^9.0.2", "through2": "^2.0.1", "watchify": "^3.7.0" diff --git a/test/acceptance/lookup-files.js b/test/acceptance/lookup-files.js index 958f1b70f2..5d4a48d8af 100644 --- a/test/acceptance/lookup-files.js +++ b/test/acceptance/lookup-files.js @@ -1,23 +1,35 @@ +'use strict'; + var utils = require('../../lib/utils'); +var fs = require('fs'); +var path = require('path'); +var os = require('os'); +var mkdirp = require('mkdirp'); +var rimraf = require('rimraf'); describe('lookupFiles', function() { - var fs = require('fs'), - path = require('path'), - existsSync = fs.existsSync || path.existsSync, - tmpDir = require('os').tmpDir(), - tmpFile = path.join.bind(path, tmpDir), - symlinkSupported = false; + var tmpDir = path.join(os.tmpDir(), 'mocha-lookup-files'); + var existsSync = fs.existsSync; + var tmpFile = path.join.bind(path, tmpDir); + var symlinkSupported = false; - fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); - try { - fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js')); - symlinkSupported = true; - } catch (ignored) { - } + (function testSymlinkSupport() { + makeTempDir(); - cleanup(); + fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); + try { + fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js')); + symlinkSupported = true; + } catch (ignored) { + // ignored + } finally { + removeTempDir(); + } + }()); beforeEach(function() { + makeTempDir(); + fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); if (symlinkSupported) { fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js')); @@ -66,18 +78,13 @@ describe('lookupFiles', function() { .length(expectedLength); }); - afterEach(cleanup); + afterEach(removeTempDir); + + function makeTempDir() { + mkdirp.sync(tmpDir); + } - function cleanup() { - [ - 'mocha-utils.js', - 'mocha-utils-link.js', - 'bob' - ].forEach(function(path) { - try { - fs.unlinkSync(tmpFile(path)); - } catch (ignored) { - } - }); + function removeTempDir() { + rimraf.sync(tmpDir); } }); From cddbe529f35acb534de48471345e92be114cf9b9 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Wed, 9 Mar 2016 15:15:56 +0200 Subject: [PATCH 0552/1771] feat(runner): fix '.only()' exclusive feature, #1481 This PR fix #1481, and also extends the .only() behaviour. (i.e: it's not use grep anymore, support suite, test-case or both, add the ability to run multiple .only) --- Makefile | 15 ++- lib/interfaces/bdd.js | 12 +- lib/interfaces/common.js | 31 +++++ lib/interfaces/qunit.js | 8 +- lib/interfaces/tdd.js | 8 +- lib/mocha.js | 1 + lib/runner.js | 25 ++++ test/acceptance/misc/only/bdd.js | 125 +++++++++++++++++- test/acceptance/misc/only/global/bdd.js | 12 ++ test/acceptance/misc/only/global/qunit.js | 12 ++ test/acceptance/misc/only/global/tdd.js | 12 ++ test/acceptance/misc/only/qunit.js | 72 +++++++++- test/acceptance/misc/only/tdd.js | 125 +++++++++++++++++- test/integration/fixtures/options/only/bdd.js | 21 +++ .../fixtures/options/only/qunit.js | 26 ++++ test/integration/fixtures/options/only/tdd.js | 23 ++++ test/integration/only.js | 39 ++++++ 17 files changed, 523 insertions(+), 44 deletions(-) create mode 100644 test/acceptance/misc/only/global/bdd.js create mode 100644 test/acceptance/misc/only/global/qunit.js create mode 100644 test/acceptance/misc/only/global/tdd.js create mode 100644 test/integration/fixtures/options/only/bdd.js create mode 100644 test/integration/fixtures/options/only/qunit.js create mode 100644 test/integration/fixtures/options/only/tdd.js create mode 100644 test/integration/only.js diff --git a/Makefile b/Makefile index 92daf92a18..6bef227921 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ lint: @printf "==> [Test :: Lint]\n" @$(ESLINT) $(SRC) -test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only +test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only test-browser: test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports @@ -154,10 +154,21 @@ test-only: --ui qunit \ test/acceptance/misc/only/bdd-require +test-global-only: + @./bin/mocha \ + --reporter $(REPORTER) \ + --ui tdd \ + test/acceptance/misc/only/global/tdd + + @./bin/mocha \ + --reporter $(REPORTER) \ + --ui bdd \ + test/acceptance/misc/only/global/bdd + @./bin/mocha \ --reporter $(REPORTER) \ --ui qunit \ - test/acceptance/misc/only/qunit + test/acceptance/misc/only/global/qunit test-mocha: @printf "==> [Test :: Mocha]\n" diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index 8519a9a7b4..186986b863 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -4,7 +4,6 @@ var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * BDD-style interface: @@ -66,9 +65,7 @@ module.exports = function(suite) { */ context.describe.only = function(title, fn) { - var suite = context.describe(title, fn); - mocha.grep(suite.fullTitle()); - return suite; + return common.suite.only(mocha, context.describe(title, fn)); }; /** @@ -77,7 +74,7 @@ module.exports = function(suite) { * acting as a thunk. */ - var it = context.it = context.specify = function(title, fn) { + context.it = context.specify = function(title, fn) { var suite = suites[0]; if (suite.isPending()) { fn = null; @@ -93,10 +90,7 @@ module.exports = function(suite) { */ context.it.only = function(title, fn) { - var test = it(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); - return test; + return common.test.only(mocha, context.it(title, fn)); }; /** diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index db939085ca..f5ffd9609c 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -62,7 +62,38 @@ module.exports = function(suites, context) { suites[0].afterEach(name, fn); }, + suite: { + /** + * Exclusive suite. + * + * @param {Object} mocha + * @param {Function} suite + */ + + only: function(mocha, suite) { + suite.isOnly = true; + mocha.options.hasOnly = true; + return suite; + } + }, + test: { + + /** + * Exclusive test-case. + * + * @param {Object} mocha + * @param {Function} test + * @returns {*} + */ + only: function(mocha, test) { + var suite = test.parent; + suite.isOnly = true; + suite.onlyTests = (suite.onlyTests || []).concat(test); + mocha.options.hasOnly = true; + return test; + }, + /** * Pending test case. * diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index b79dcc68cb..6ce20bb828 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -4,7 +4,6 @@ var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * QUnit-style interface: @@ -61,8 +60,7 @@ module.exports = function(suite) { */ context.suite.only = function(title, fn) { - var suite = context.suite(title, fn); - mocha.grep(suite.fullTitle()); + return common.suite.only(mocha, context.suite(title, fn)); }; /** @@ -83,9 +81,7 @@ module.exports = function(suite) { */ context.test.only = function(title, fn) { - var test = context.test(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); + return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index d37936ae41..90dcc787ad 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -4,7 +4,6 @@ var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * TDD-style interface: @@ -71,8 +70,7 @@ module.exports = function(suite) { * Exclusive test-case. */ context.suite.only = function(title, fn) { - var suite = context.suite(title, fn); - mocha.grep(suite.fullTitle()); + return common.suite.only(mocha, context.suite(title, fn)); }; /** @@ -95,9 +93,7 @@ module.exports = function(suite) { */ context.test.only = function(title, fn) { - var test = context.test(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); + return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; diff --git a/lib/mocha.js b/lib/mocha.js index de0f32ee5a..a649715191 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -491,6 +491,7 @@ Mocha.prototype.run = function(fn) { var reporter = new this._reporter(runner, options); runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; + runner.hasOnly = options.hasOnly; runner.asyncOnly = options.asyncOnly; runner.allowUncaught = options.allowUncaught; if (options.grep) { diff --git a/lib/runner.js b/lib/runner.js index 86bd4dc4af..1e085a6e45 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -778,6 +778,11 @@ Runner.prototype.run = function(fn) { var self = this; var rootSuite = this.suite; + // If there is an `only` filter + if (this.hasOnly) { + filterOnly(rootSuite); + } + fn = fn || function() {}; function uncaught(err) { @@ -833,6 +838,26 @@ Runner.prototype.abort = function() { return this; }; +/** + * Filter suites based on `isOnly` logic. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function filterOnly(suite) { + // If it has `only` tests, run only those + if (suite.onlyTests) { + suite.tests = suite.onlyTests; + } + // Filter the nested suites + suite.suites = filter(suite.suites, filterOnly); + // Don't run tests from suites that are not marked as `only` + suite.tests = suite.isOnly ? suite.tests : []; + // Keep the suite only if there is something to run + return suite.suites.length || suite.tests.length; +} + /** * Filter leaks with the given globals flagged as `ok`. * diff --git a/test/acceptance/misc/only/bdd.js b/test/acceptance/misc/only/bdd.js index bb05ad9792..7a33a74eac 100644 --- a/test/acceptance/misc/only/bdd.js +++ b/test/acceptance/misc/only/bdd.js @@ -1,14 +1,125 @@ describe('should only run .only test in this bdd suite', function() { it('should not run this test', function() { - var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); }); - it.only('should run this test', function() { - var zero = 0; - expect(zero).to.equal(0, 'this .only test should run'); + it.only('should run this test', function() { + (0).should.equal(0, 'this .only test should run'); }); it('should run this test, not (includes the title of the .only test)', function() { - var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); }); }); + +describe('should not run this suite', function() { + it('should not run this test', function() { + (true).should.equal(false); + }); + + it('should not run this test', function() { + (true).should.equal(false); + }); + + it('should not run this test', function() { + (true).should.equal(false); + }); +}); + +describe.only('should run all tests in this bdd suite', function() { + it('should run this test #1', function() { + (true).should.equal(true); + }); + + it('should run this test #2', function() { + (1).should.equal(1); + }); + + it('should run this test #3', function() { + ('foo').should.equal('foo'); + }); +}); + +describe('should run only suites that marked as `only`', function() { + describe.only('should run all this tdd suite', function() { + it('should run this test #1', function() { + (true).should.equal(true); + }); + + it('should run this test #2', function() { + (true).should.equal(true); + }); + }); + + describe('should not run this suite', function() { + it('should run this test', function() { + (true).should.equal(false); + }); + }); +}); + +// Nested situation +describe('should not run parent tests', function() { + it('should not run this test', function() { + (true).should.equal(false); + }); + describe('and not the child tests too', function() { + it('should not run this test', function() { + (true).should.equal(false); + }); + describe.only('but run all the tests in this suite', function() { + it('should run this test #1', function() { + (true).should.equal(true); + }); + it('should run this test #2', function() { + (true).should.equal(true); + }); + }); + }); +}); + +// mark test as `only` override the suite behavior +describe.only('should run only tests that marked as `only`', function() { + it('should not run this test #1', function() { + (false).should.equal(true); + }); + + it.only('should run this test #2', function() { + (true).should.equal(true); + }); + + it('should not run this test #3', function() { + (false).should.equal(true); + }); + + it.only('should run this test #4', function() { + (true).should.equal(true); + }); +}); + +describe.only('Should run only test cases that mark as only', function() { + it.only('should runt his test', function() { + (true).should.equal(true); + }); + + it('should not run this test', function() { + (false).should.equal(true); + }); + + describe('should not run this suite', function() { + it('should not run this test', function() { + (false).should.equal(true); + }); + }); +}); + +// Root Suite +it.only('#Root-Suite, should run this test-case #1', function() { + (true).should.equal(true); +}); + +it.only('#Root-Suite, should run this test-case #2', function() { + (true).should.equal(true); +}); + +it('#Root-Suite, should not run this test', function() { + (false).should.equal(true); +}); diff --git a/test/acceptance/misc/only/global/bdd.js b/test/acceptance/misc/only/global/bdd.js new file mode 100644 index 0000000000..e923876f84 --- /dev/null +++ b/test/acceptance/misc/only/global/bdd.js @@ -0,0 +1,12 @@ +// Root-only test cases +it.only('#Root-Suite, should run this bdd test-case #1', function() { + (true).should.equal(true); +}); + +it('#Root-Suite, should not run this bdd test-case #2', function() { + (false).should.equal(true); +}); + +it('#Root-Suite, should not run this bdd test-case #3', function() { + (false).should.equal(true); +}); \ No newline at end of file diff --git a/test/acceptance/misc/only/global/qunit.js b/test/acceptance/misc/only/global/qunit.js new file mode 100644 index 0000000000..59ad72c3bf --- /dev/null +++ b/test/acceptance/misc/only/global/qunit.js @@ -0,0 +1,12 @@ +// Root-only test cases +test.only('#Root-Suite, should run this qunit test-case #1', function() { + (true).should.equal(true); +}); + +test('#Root-Suite, should not run this qunit test-case #2', function() { + (false).should.equal(true); +}); + +test('#Root-Suite, should not run this qunit test-case #3', function() { + (false).should.equal(true); +}); \ No newline at end of file diff --git a/test/acceptance/misc/only/global/tdd.js b/test/acceptance/misc/only/global/tdd.js new file mode 100644 index 0000000000..08d456848b --- /dev/null +++ b/test/acceptance/misc/only/global/tdd.js @@ -0,0 +1,12 @@ +// Root-only test cases +test.only('#Root-Suite, should run this tdd test-case #1', function() { + (true).should.equal(true); +}); + +test('#Root-Suite, should not run this tdd test-case #2', function() { + (false).should.equal(true); +}); + +test('#Root-Suite, should not run this tdd test-case #3', function() { + (false).should.equal(true); +}); \ No newline at end of file diff --git a/test/acceptance/misc/only/qunit.js b/test/acceptance/misc/only/qunit.js index 07c240f617..1248adeba7 100644 --- a/test/acceptance/misc/only/qunit.js +++ b/test/acceptance/misc/only/qunit.js @@ -1,15 +1,73 @@ -function ok(expr, msg) { - if (!expr) throw new Error(msg); -} +// Root Suite +test.only('#Root-Suite, should run this test-case #1', function() { + (true).should.equal(true); +}); + +test.only('#Root-Suite, should run this test-case #2', function() { + (true).should.equal(true); +}); + +test('#Root-Suite, should not run this test', function() { + (false).should.equal(true); +}); suite('should only run .only test in this qunit suite'); test('should not run this test', function() { - ok(0 === 1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); }); -test.only('should run this test', function() { - ok(0 === 0, 'this .only test should run'); +test.only('should run this test', function() { + (0).should.equal(0, 'this .only test should run'); }); test('should run this test, not (includes the title of the .only test)', function() { - ok(0 === 1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); +}); + +// Mark suite +suite.only('should run all tests in this suite'); + +test('should run this test #1', function() { + (true).should.equal(true); +}); + +test('should run this test #2', function() { + (true).should.equal(true); +}); + +test('should run this test #3', function() { + (true).should.equal(true); +}); + +// Unmark this suite +suite('should not run any of this suite\'s tests'); + +test('should not run this test', function() { + (false).should.equal(true); +}); + +test('should not run this test', function() { + (false).should.equal(true); }); + +test('should not run this test', function() { + (false).should.equal(true); +}); + +// Mark test as `only` override the suite behavior +suite.only('should run only tests that marked as `only`'); + +test('should not run this test #1', function() { + (false).should.equal(true); +}); + +test.only('should not run this test #2', function() { + (true).should.equal(true); +}); + +test('should not run this test #3', function() { + (false).should.equal(true); +}); + +test.only('should not run this test #4', function() { + (true).should.equal(true); +}); \ No newline at end of file diff --git a/test/acceptance/misc/only/tdd.js b/test/acceptance/misc/only/tdd.js index 306d06a9f9..7e37e7a3b3 100644 --- a/test/acceptance/misc/only/tdd.js +++ b/test/acceptance/misc/only/tdd.js @@ -1,14 +1,125 @@ suite('should only run .only test in this tdd suite', function() { test('should not run this test', function() { - var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); }); - test.only('should run this test', function() { - var zero = 0; - expect(zero).to.equal(0, 'this .only test should run'); + test.only('should run this test', function() { + (0).should.equal(0, 'this .only test should run'); }); test('should run this test, not (includes the title of the .only test)', function() { - var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + (0).should.equal(1, 'this test should have been skipped'); }); }); + +suite('should not run this suite', function() { + test('should not run this test', function() { + (true).should.equal(false); + }); + + test('should not run this test', function() { + (true).should.equal(false); + }); + + test('should not run this test', function() { + (true).should.equal(false); + }); +}); + +suite.only('should run all tests in this tdd suite', function() { + test('should run this test #1', function() { + (true).should.equal(true); + }); + + test('should run this test #2', function() { + (1).should.equal(1); + }); + + test('should run this test #3', function() { + ('foo').should.equal('foo'); + }); +}); + +suite('should run only suites that marked as `only`', function() { + suite.only('should run all this tdd suite', function() { + test('should run this test #1', function() { + (true).should.equal(true); + }); + + test('should run this test #2', function() { + (true).should.equal(true); + }); + }); + + suite('should not run this suite', function() { + test('should not run this test', function() { + (true).should.equal(false); + }); + }); +}); + +// Nested situation +suite('should not run parent tests', function() { + test('should not run this test', function() { + (true).should.equal(false); + }); + suite('and not the child tests too', function() { + test('should not run this test', function() { + (true).should.equal(false); + }); + suite.only('but run all the tests in this suite', function() { + test('should run this test #1', function() { + (true).should.equal(true); + }); + test('should run this test #2', function() { + (true).should.equal(true); + }); + }); + }); +}); + +// mark test as `only` override the suite behavior +suite.only('should run only tests that marked as `only`', function() { + test('should not run this test #1', function() { + (false).should.equal(true); + }); + + test.only('should run this test #2', function() { + (true).should.equal(true); + }); + + test('should not run this test #3', function() { + (false).should.equal(true); + }); + + test.only('should run this test #4', function() { + (true).should.equal(true); + }); +}); + +suite.only('Should run only test cases that mark as only', function() { + test.only('should runt his test', function() { + (true).should.equal(true); + }); + + test('should not run this test', function() { + (false).should.equal(true); + }); + + suite('should not run this suite', function() { + test('should not run this test', function() { + (false).should.equal(true); + }); + }); +}); + +// Root Suite +test.only('#Root-Suite, should run this test-case #1', function() { + (true).should.equal(true); +}); + +test.only('#Root-Suite, should run this test-case #2', function() { + (true).should.equal(true); +}); + +test('#Root-Suite, should not run this test', function() { + (false).should.equal(true); +}); diff --git a/test/integration/fixtures/options/only/bdd.js b/test/integration/fixtures/options/only/bdd.js new file mode 100644 index 0000000000..f2fc4fd40b --- /dev/null +++ b/test/integration/fixtures/options/only/bdd.js @@ -0,0 +1,21 @@ +describe.only('should run this suite', function() { + it('should run this test', function() {}); + + it('should run this test', function() {}); + + it('should run this test', function() {}); +}); + +describe('should not run this suite', function() { + it('should not run this test', function() { + (true).should.equal(false); + }); + + it('should not run this test', function() { + (true).should.equal(false); + }); + + it('should not run this test', function() { + (true).should.equal(false); + }); +}); \ No newline at end of file diff --git a/test/integration/fixtures/options/only/qunit.js b/test/integration/fixtures/options/only/qunit.js new file mode 100644 index 0000000000..9fa95f440b --- /dev/null +++ b/test/integration/fixtures/options/only/qunit.js @@ -0,0 +1,26 @@ +suite.only('should run all tests in this suite'); + +test('should run this test #1', function() {}); + +test('should run this test #2', function() {}); + +test('should run this test #3', function() {}); + +test('should run this test #4', function() {}); + +test('should run this test #5', function() {}); + + +suite('should not run any of this suite\'s tests'); + +test('should not run this test', function() { + (false).should.equal(true); +}); + +test('should not run this test', function() { + (false).should.equal(true); +}); + +test('should not run this test', function() { + (false).should.equal(true); +}); \ No newline at end of file diff --git a/test/integration/fixtures/options/only/tdd.js b/test/integration/fixtures/options/only/tdd.js new file mode 100644 index 0000000000..6e1e37becf --- /dev/null +++ b/test/integration/fixtures/options/only/tdd.js @@ -0,0 +1,23 @@ +suite.only('should run all tests in this tdd suite', function() { + test('should run this test #1', function() {}); + + test('should run this test #2', function() {}); + + test('should run this test #3', function() {}); + + test('should run this test #4', function() {}); +}); + +suite('should not run this suite', function() { + test('should not run this test', function() { + (true).should.equal(false); + }); + + test('should not run this test', function() { + (true).should.equal(false); + }); + + test('should not run this test', function() { + (true).should.equal(false); + }); +}); \ No newline at end of file diff --git a/test/integration/only.js b/test/integration/only.js new file mode 100644 index 0000000000..52c11a3a0b --- /dev/null +++ b/test/integration/only.js @@ -0,0 +1,39 @@ +var run = require('./helpers').runMochaJSON; +var assert = require('assert'); + +describe('.only()', function() { + this.timeout(2000); + + it('should run only tests that marked as `only`', function(done) { + run('options/only/bdd.js', ['--ui', 'bdd'], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 3); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + + it('should run only tests that marked as `only`', function(done) { + run('options/only/tdd.js', ['--ui', 'tdd'], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 4); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); + + it('should run only tests that marked as `only`', function(done) { + run('options/only/qunit.js', ['--ui', 'qunit'], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 5); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); +}); \ No newline at end of file From f9216238a69002370934339ae28896c11cfc21c3 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 23:08:13 -0700 Subject: [PATCH 0553/1771] fix .PHONY [ci skip] --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6bef227921..c94da8a8ca 100644 --- a/Makefile +++ b/Makefile @@ -203,4 +203,4 @@ tm: @printf "==> [TM]\n" @open editors/$(TM_BUNDLE) -.PHONY: test-cov test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint +.PHONY: test-cov test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint test-only test-global-only From 522d943be1a982a8cd456a15f28f2f9fcc59873b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 2 Jul 2016 21:39:49 -0700 Subject: [PATCH 0554/1771] update travis.yml and karma to upload karma bundles to S3 for debugging --- .travis.yml | 20 ++++++++++++++------ karma.conf.js | 17 ++++++----------- scripts/travis-after-script.sh | 9 +++++++++ scripts/travis-before-script.sh | 7 +++++++ 4 files changed, 36 insertions(+), 17 deletions(-) create mode 100755 scripts/travis-after-script.sh create mode 100755 scripts/travis-before-script.sh diff --git a/.travis.yml b/.travis.yml index 9cc01a25c6..609b8dae8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,19 @@ dist: trusty language: node_js env: - global: PHANTOMJS_CDNURL='https://cnpmjs.org/downloads' + global: + # phantomjs hosts binaries @ bitbucket, which has fairly restrictive + # rate-limiting. pull it from this sketchy site in China instead. + - PHANTOMJS_CDNURL='https://cnpmjs.org/downloads' + # we're going to use s3 to temporarily store Karma test bundles for debugging + - AWS_ACCESS_KEY_ID=AKIAJ3QQTLQXWXYJ6PTA + - secure: k4musDC734E1NFOWaY5qb/l0B9K1cfusFTvMZFayTMs5ubKjeNYCgct2sDSvO5tO7Un935I0sYOOSRPvANPhs8dP1a/8/x0PnwIfnpoCFQCCaI0bWnIQj7nOZ2TaEB/fngZCerCFpNDlzqI6BmaR+XoMvA74v2YD/vVXnzvXNQk= matrix: fast_finish: true include: - node_js: '6' - env: TARGET='clean lint test-node test-browser' + env: TARGET='clean lint test-node test-browser' S3=1 - node_js: '5' env: TARGET=test-node - node_js: '4' @@ -29,7 +35,11 @@ matrix: - node_js: '0.10' env: TARGET=test-node -script: travis_retry make $TARGET +before_script: scripts/travis-before-script.sh + +script: make $TARGET + +after_script: scripts/travis-after-script.sh notifications: urls: @@ -38,9 +48,7 @@ notifications: on_success: change on_failure: always +# attempt to cache phantom binaries cache: directories: - node_modules/phantomjs/lib/phantom - -addons: - artifacts: true diff --git a/karma.conf.js b/karma.conf.js index 47867de1f3..926cb7c9c3 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,11 +3,10 @@ var fs = require('fs'); var path = require('path'); var mkdirp = require('mkdirp'); -var bundleDirpath = path.join(__dirname, '.karma'); +var baseBundleDirpath = path.join(__dirname, '.karma'); module.exports = function(config) { - mkdirp.sync(bundleDirpath); - + var bundleDirpath; var cfg = { frameworks: [ 'browserify', @@ -35,15 +34,11 @@ module.exports = function(config) { .ignore('pug') .ignore('supports-color') .exclude('./lib-cov/mocha') - .on('bundled', function (err, content) { - var filepath = path.join(bundleDirpath, - 'bundle.' + Date.now() + '.js'); + .on('bundled', function(err, content) { if (!err) { - fs.writeFile(filepath, content, function (err) { - if (!err) { - console.error('Wrote test bundle to ' + filepath); - } - }); + // write bundle to directory for debugging + fs.writeFileSync(path.join(bundleDirpath, + 'bundle.' + Date.now() + '.js'), content); } }); } diff --git a/scripts/travis-after-script.sh b/scripts/travis-after-script.sh new file mode 100755 index 0000000000..e93c98f796 --- /dev/null +++ b/scripts/travis-after-script.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# syncs Karma test bundles to S3 if $S3 is set + +if [ ${S3} ] +then + mkdir -p .karma/${TRAVIS_JOB_NUMBER} + cp ./mocha.js ".karma/${TRAVIS_JOB_NUMBER}/mocha.js" + aws s3 sync ".karma/${TRAVIS_JOB_NUMBER}" "s3://mochajs/karma-bundles/${TRAVIS_JOB_NUMBER}" +fi diff --git a/scripts/travis-before-script.sh b/scripts/travis-before-script.sh new file mode 100755 index 0000000000..e5c6b25414 --- /dev/null +++ b/scripts/travis-before-script.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# installs awscli from pip if $S3 is set + +if [ ${S3} ] +then + sudo pip install awscli +fi From c9166031ba39ad2d3f7433faeab753123d3a536e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 00:06:45 -0700 Subject: [PATCH 0555/1771] downgrade lodash.create to v3 for ES3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e77b31fce2..7d1f886440 100644 --- a/package.json +++ b/package.json @@ -325,7 +325,7 @@ "glob": "7.0.5", "growl": "1.9.2", "json3": "3.3.2", - "lodash.create": "4.0.4", + "lodash.create": "3.1.1", "mkdirp": "0.5.1", "pug": "2.0.0-beta3", "supports-color": "3.1.2", From 27dd1532bc9916afbeaa9d90e8a89362657337e2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 00:14:56 -0700 Subject: [PATCH 0556/1771] split up matrix a bit --- .travis.yml | 6 +++++- Makefile | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 609b8dae8d..c5e134b711 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ matrix: fast_finish: true include: - node_js: '6' - env: TARGET='clean lint test-node test-browser' S3=1 + env: TARGET=test-node - node_js: '5' env: TARGET=test-node - node_js: '4' @@ -34,6 +34,10 @@ matrix: env: TARGET=test-node - node_js: '0.10' env: TARGET=test-node + - node_js: '6' + env: TARGET=lint + - node_js: '6' + env: TARGET=test-browser S3=1 before_script: scripts/travis-before-script.sh diff --git a/Makefile b/Makefile index c94da8a8ca..22f3649fe1 100644 --- a/Makefile +++ b/Makefile @@ -42,11 +42,11 @@ lint: test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only -test-browser: test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports +test-browser: clean mocha.js test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports test: lint test-node test-browser -test-browser-unit: mocha.js +test-browser-unit: @printf "==> [Test :: Browser]\n" @NODE_PATH=. $(KARMA) start From 2ea802da0551d443de3805b5451fb7676e9b3de4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 00:20:39 -0700 Subject: [PATCH 0557/1771] caching doesn't work; forget it --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c5e134b711..8e11c3e3df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,8 +51,3 @@ notifications: - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU= on_success: change on_failure: always - -# attempt to cache phantom binaries -cache: - directories: - - node_modules/phantomjs/lib/phantom From 7240300672a2fc2faeec803568a7969ee8b316c8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 10:28:49 -0700 Subject: [PATCH 0558/1771] ensure bundle dir is set before trying to write somewhere in Karma --- karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index 926cb7c9c3..d6c6fe762a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -35,7 +35,7 @@ module.exports = function(config) { .ignore('supports-color') .exclude('./lib-cov/mocha') .on('bundled', function(err, content) { - if (!err) { + if (!err && bundleDirpath) { // write bundle to directory for debugging fs.writeFileSync(path.join(bundleDirpath, 'bundle.' + Date.now() + '.js'), content); From 37abf8c26b369cc0f8f2bc711916afc956f7f26c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 10:42:04 -0700 Subject: [PATCH 0559/1771] increase timeout in test/color.js for AppVeyor --- test/color.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/color.js b/test/color.js index 3913c0099c..5ee46e71c4 100644 --- a/test/color.js +++ b/test/color.js @@ -3,7 +3,7 @@ var child_process = require('child_process'); var path = require('path'); describe('Mocha', function() { - this.timeout(1000); + this.timeout(2000); it('should not output colors to pipe', function(cb) { var command = [path.join('bin', 'mocha'), '--grep', 'missing-test']; From b45b3c883870d022336c896c36801319f05122ae Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 13:24:26 -0700 Subject: [PATCH 0560/1771] increase integration test timeouts across-the-board for AppVeyor --- Makefile | 1 + test/integration/diffs.js | 1 - test/integration/fixtures/regression/issue-1991.js | 2 -- test/integration/hook.err.js | 2 -- test/integration/hooks.js | 2 -- test/integration/multiple.done.js | 2 -- test/integration/only.js | 4 +--- test/integration/options.js | 2 -- test/integration/pending.js | 6 ------ test/integration/regression.js | 2 -- test/integration/reporters.js | 2 -- test/integration/retries.js | 2 -- test/integration/timeout.js | 2 -- test/integration/uncaught.js | 2 -- 14 files changed, 2 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 22f3649fe1..31365aaf51 100644 --- a/Makefile +++ b/Makefile @@ -77,6 +77,7 @@ test-unit: test-integration: @printf "==> [Test :: Integrations]\n" @./bin/mocha \ + --timeout 5000 \ --reporter $(REPORTER) \ test/integration/*.js diff --git a/test/integration/diffs.js b/test/integration/diffs.js index 25d9ae6d7f..111b6f2042 100644 --- a/test/integration/diffs.js +++ b/test/integration/diffs.js @@ -15,7 +15,6 @@ function getExpectedOutput() { describe('diffs', function() { var diffs, expected; - this.timeout(2000); before(function(done) { run('diffs/diffs.js', ['-C'], function(err, res) { diff --git a/test/integration/fixtures/regression/issue-1991.js b/test/integration/fixtures/regression/issue-1991.js index ee08a1d043..7c1eb19b5f 100644 --- a/test/integration/fixtures/regression/issue-1991.js +++ b/test/integration/fixtures/regression/issue-1991.js @@ -38,8 +38,6 @@ for (var i = 0; i < numOfTests; i += 1) { }); it('access a variable via a closure', function () { - // slow performance on older node.js versions - this.timeout(2000); closureVar = new MemoryLeak(); }); diff --git a/test/integration/hook.err.js b/test/integration/hook.err.js index 5cdde133a9..f3a16c15d1 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook.err.js @@ -4,8 +4,6 @@ var splitRegExp = require('./helpers').splitRegExp; var bang = require('../../lib/reporters/base').symbols.bang; describe('hook error handling', function() { - this.timeout(2000); - var lines; describe('before hook error', function() { diff --git a/test/integration/hooks.js b/test/integration/hooks.js index 1795856072..acd829f7c9 100644 --- a/test/integration/hooks.js +++ b/test/integration/hooks.js @@ -4,8 +4,6 @@ var splitRegExp = require('./helpers').splitRegExp; var args = []; describe('hooks', function() { - this.timeout(2000); - it('are ran in correct order', function(done) { run('cascade.js', args, function(err, res) { var lines, expected; diff --git a/test/integration/multiple.done.js b/test/integration/multiple.done.js index d9d9645f32..0159e90e43 100644 --- a/test/integration/multiple.done.js +++ b/test/integration/multiple.done.js @@ -4,8 +4,6 @@ var args = []; describe('multiple calls to done()', function() { var res; - this.timeout(2000); - describe('from a spec', function() { before(function(done) { run('multiple.done.js', args, function(err, result) { diff --git a/test/integration/only.js b/test/integration/only.js index 52c11a3a0b..3d0e4dc682 100644 --- a/test/integration/only.js +++ b/test/integration/only.js @@ -2,8 +2,6 @@ var run = require('./helpers').runMochaJSON; var assert = require('assert'); describe('.only()', function() { - this.timeout(2000); - it('should run only tests that marked as `only`', function(done) { run('options/only/bdd.js', ['--ui', 'bdd'], function(err, res) { assert(!err); @@ -36,4 +34,4 @@ describe('.only()', function() { done(); }); }); -}); \ No newline at end of file +}); diff --git a/test/integration/options.js b/test/integration/options.js index afd961b3a5..5e18ac5e71 100644 --- a/test/integration/options.js +++ b/test/integration/options.js @@ -3,8 +3,6 @@ var run = require('./helpers').runMochaJSON; var args = []; describe('options', function() { - this.timeout(2000); - describe('--async-only', function() { before(function() { diff --git a/test/integration/pending.js b/test/integration/pending.js index 6d63b1fae1..0c18ab4bc7 100644 --- a/test/integration/pending.js +++ b/test/integration/pending.js @@ -4,8 +4,6 @@ var args = []; describe('pending', function() { describe('pending specs', function() { - this.timeout(2000); - it('should be created by omitting a function', function(done) { run('pending/spec.js', args, function(err, res) { assert(!err); @@ -19,8 +17,6 @@ describe('pending', function() { }); describe('synchronous skip()', function() { - this.timeout(2000); - describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { run('pending/skip.sync.spec.js', args, function(err, res) { @@ -62,8 +58,6 @@ describe('pending', function() { }); describe('asynchronous skip()', function() { - this.timeout(2000); - describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { run('pending/skip.async.spec.js', args, function(err, res) { diff --git a/test/integration/regression.js b/test/integration/regression.js index 6e6606a5ff..3d132a6ea2 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -4,8 +4,6 @@ var path = require('path'); var run = require('./helpers').runMocha; describe('regressions', function() { - this.timeout(2000); - it('issue-1327: should run all 3 specs exactly once', function(done) { var args = []; run('regression/issue-1327.js', args, function(err, res) { diff --git a/test/integration/reporters.js b/test/integration/reporters.js index 19cf0bdd1e..c2f022fe29 100644 --- a/test/integration/reporters.js +++ b/test/integration/reporters.js @@ -6,8 +6,6 @@ var path = require('path'); var run = require('./helpers').runMocha; describe('reporters', function() { - this.timeout(3000); - describe('markdown', function() { var res; diff --git a/test/integration/retries.js b/test/integration/retries.js index a24fc482a3..56516b3a92 100644 --- a/test/integration/retries.js +++ b/test/integration/retries.js @@ -4,8 +4,6 @@ var args = []; var bang = require('../../lib/reporters/base').symbols.bang; describe('retries', function() { - this.timeout(2000); - it('are ran in correct order', function(done) { helpers.runMocha('retries/hooks.js', args, function(err, res) { var lines, expected; diff --git a/test/integration/timeout.js b/test/integration/timeout.js index c8321c0b66..b2dfb201f3 100644 --- a/test/integration/timeout.js +++ b/test/integration/timeout.js @@ -3,8 +3,6 @@ var run = require('./helpers').runMochaJSON; var args = []; describe('this.timeout()', function() { - this.timeout(2000); - it('is respected by sync and async suites', function(done) { run('timeout.js', args, function(err, res) { assert(!err); diff --git a/test/integration/uncaught.js b/test/integration/uncaught.js index 2ca186e471..92a0ce5d35 100644 --- a/test/integration/uncaught.js +++ b/test/integration/uncaught.js @@ -3,8 +3,6 @@ var run = require('./helpers').runMochaJSON; var args = []; describe('uncaught exceptions', function() { - this.timeout(2000); - it('handles uncaught exceptions from hooks', function(done) { run('uncaught.hook.js', args, function(err, res) { assert(!err); From 76ecc39c006e7ddd83fedae85da6721820539fac Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 13:28:00 -0700 Subject: [PATCH 0561/1771] build for prerelease --- mocha.js | 5630 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 3879 insertions(+), 1751 deletions(-) diff --git a/mocha.js b/mocha.js index df54445862..ed03481518 100644 --- a/mocha.js +++ b/mocha.js @@ -134,8 +134,8 @@ mocha.run = function(fn){ mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(new RegExp(query.grep)); - if (query.fgrep) mocha.grep(query.fgrep); + if (query.grep) mocha.grep(query.grep); + if (query.fgrep) mocha.fgrep(query.fgrep); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(err){ @@ -168,7 +168,7 @@ global.mocha = mocha; module.exports = global; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/mocha":14,"_process":58,"browser-stdout":42}],2:[function(require,module,exports){ +},{"./lib/mocha":14,"_process":69,"browser-stdout":41}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -504,6 +504,12 @@ exports.getWindowSize = function getWindowSize() { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],6:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var JSON = require('json3'); + /** * Expose `Context`. */ @@ -609,7 +615,7 @@ Context.prototype.inspect = function() { }, 2); }; -},{}],7:[function(require,module,exports){ +},{"json3":56}],7:[function(require,module,exports){ /** * Module dependencies. */ @@ -664,7 +670,6 @@ Hook.prototype.error = function(err) { var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * BDD-style interface: @@ -726,9 +731,7 @@ module.exports = function(suite) { */ context.describe.only = function(title, fn) { - var suite = context.describe(title, fn); - mocha.grep(suite.fullTitle()); - return suite; + return common.suite.only(mocha, context.describe(title, fn)); }; /** @@ -737,7 +740,7 @@ module.exports = function(suite) { * acting as a thunk. */ - var it = context.it = context.specify = function(title, fn) { + context.it = context.specify = function(title, fn) { var suite = suites[0]; if (suite.isPending()) { fn = null; @@ -753,10 +756,7 @@ module.exports = function(suite) { */ context.it.only = function(title, fn) { - var test = it(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); - return test; + return common.test.only(mocha, context.it(title, fn)); }; /** @@ -776,7 +776,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],9:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9}],9:[function(require,module,exports){ 'use strict'; /** @@ -841,7 +841,38 @@ module.exports = function(suites, context) { suites[0].afterEach(name, fn); }, + suite: { + /** + * Exclusive suite. + * + * @param {Object} mocha + * @param {Function} suite + */ + + only: function(mocha, suite) { + suite.isOnly = true; + mocha.options.hasOnly = true; + return suite; + } + }, + test: { + + /** + * Exclusive test-case. + * + * @param {Object} mocha + * @param {Function} test + * @returns {*} + */ + only: function(mocha, test) { + var suite = test.parent; + suite.isOnly = true; + suite.onlyTests = (suite.onlyTests || []).concat(test); + mocha.options.hasOnly = true; + return test; + }, + /** * Pending test case. * @@ -939,7 +970,6 @@ exports.exports = require('./exports'); var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * QUnit-style interface: @@ -996,8 +1026,7 @@ module.exports = function(suite) { */ context.suite.only = function(title, fn) { - var suite = context.suite(title, fn); - mocha.grep(suite.fullTitle()); + return common.suite.only(mocha, context.suite(title, fn)); }; /** @@ -1018,9 +1047,7 @@ module.exports = function(suite) { */ context.test.only = function(title, fn) { - var test = context.test(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); + return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; @@ -1028,14 +1055,13 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],13:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9}],13:[function(require,module,exports){ /** * Module dependencies. */ var Suite = require('../suite'); var Test = require('../test'); -var escapeRe = require('escape-string-regexp'); /** * TDD-style interface: @@ -1102,8 +1128,7 @@ module.exports = function(suite) { * Exclusive test-case. */ context.suite.only = function(title, fn) { - var suite = context.suite(title, fn); - mocha.grep(suite.fullTitle()); + return common.suite.only(mocha, context.suite(title, fn)); }; /** @@ -1126,9 +1151,7 @@ module.exports = function(suite) { */ context.test.only = function(title, fn) { - var test = context.test(title, fn); - var reString = '^' + escapeRe(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); + return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; @@ -1136,7 +1159,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9,"escape-string-regexp":49}],14:[function(require,module,exports){ +},{"../suite":37,"../test":38,"./common":9}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1220,7 +1243,7 @@ function Mocha(options) { this.grep(new RegExp(options.grep)); } if (options.fgrep) { - this.grep(options.fgrep); + this.fgrep(options.fgrep); } this.suite = new exports.Suite('', new exports.Context()); this.ui(options.ui); @@ -1386,6 +1409,17 @@ Mocha.prototype._growl = function(runner, reporter) { }); }; +/** + * Escape string and add it to grep as a regexp. + * + * @api public + * @param str + * @returns {Mocha} + */ +Mocha.prototype.fgrep = function(str) { + return this.grep(new RegExp(escapeRe(str))); +}; + /** * Add regexp to grep, if `re` is a string it is escaped. * @@ -1396,10 +1430,15 @@ Mocha.prototype._growl = function(runner, reporter) { * @return {Mocha} */ Mocha.prototype.grep = function(re) { - this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re; + if (utils.isString(re)) { + // extract args if it's regex-like, i.e: [string, pattern, flag] + var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); + this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); + } else { + this.options.grep = re; + } return this; }; - /** * Invert `.grep()` matches. * @@ -1615,6 +1654,7 @@ Mocha.prototype.run = function(fn) { var reporter = new this._reporter(runner, options); runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; + runner.hasOnly = options.hasOnly; runner.asyncOnly = options.asyncOnly; runner.allowUncaught = options.allowUncaught; if (options.grep) { @@ -1643,7 +1683,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":58,"escape-string-regexp":49,"growl":51,"path":43}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":69,"escape-string-regexp":50,"growl":51,"path":42}],15:[function(require,module,exports){ /** * Helpers. */ @@ -1872,7 +1912,9 @@ exports.colors = { exports.symbols = { ok: '✓', err: '✖', - dot: '․' + dot: '․', + comma: ',', + bang: '!' }; // With node.js on Windows: use symbols available in terminal default fonts @@ -2281,7 +2323,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":58,"diff":48,"supports-color":43,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":39,"_process":69,"diff":49,"supports-color":42,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2339,7 +2381,7 @@ function Doc(runner) { runner.on('fail', function(test, err) { console.log('%s

              %s
              ', indent(), utils.escape(test.title)); - var code = utils.escape(utils.clean(test.fn.body)); + var code = utils.escape(utils.clean(test.body)); console.log('%s
              %s
              ', indent(), code); console.log('%s
              %s
              ', indent(), utils.escape(err)); }); @@ -2382,7 +2424,7 @@ function Dot(runner) { if (++n % width === 0) { process.stdout.write('\n '); } - process.stdout.write(color('pending', Base.symbols.dot)); + process.stdout.write(color('pending', Base.symbols.comma)); }); runner.on('pass', function(test) { @@ -2400,7 +2442,7 @@ function Dot(runner) { if (++n % width === 0) { process.stdout.write('\n '); } - process.stdout.write(color('fail', Base.symbols.dot)); + process.stdout.write(color('fail', Base.symbols.bang)); }); runner.on('end', function() { @@ -2415,7 +2457,7 @@ function Dot(runner) { inherits(Dot, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],20:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],20:[function(require,module,exports){ (function (process,__dirname){ /** * Module dependencies. @@ -2438,10 +2480,10 @@ exports = module.exports = HTMLCov; * @param {Runner} runner */ function HTMLCov(runner) { - var jade = require('jade'); - var file = join(__dirname, '/templates/coverage.jade'); + var pug = require('pug'); + var file = join(__dirname, '/templates/coverage.pug'); var str = readFileSync(file, 'utf8'); - var fn = jade.compile(str, { filename: file }); + var fn = pug.compile(str, { filename: file }); var self = this; JSONCov.call(this, runner, false); @@ -2474,8 +2516,8 @@ function coverageClass(coveragePctg) { return 'terrible'; } -}).call(this,require('_process'),"/lib\\reporters") -},{"./json-cov":23,"_process":58,"fs":43,"jade":43,"path":43}],21:[function(require,module,exports){ +}).call(this,require('_process'),"/lib/reporters") +},{"./json-cov":23,"_process":69,"fs":42,"path":42,"pug":40}],21:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2604,6 +2646,7 @@ function HTML(runner) { runner.on('suite end', function(suite) { if (suite.root) { + updateStats(); return; } stack.shift(); @@ -2674,7 +2717,7 @@ function HTML(runner) { function updateStats() { // TODO: add to stats - var percent = stats.tests / this.total * 100 | 0; + var percent = stats.tests / runner.total * 100 | 0; if (progress) { progress.update(percent).draw(ctx); } @@ -2822,7 +2865,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":49}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":50}],22:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2850,6 +2893,7 @@ exports.JSONStream = exports['json-stream'] = require('./json-stream'); */ var Base = require('./base'); +var JSON = require('json3'); /** * Expose `JSONCov`. @@ -2998,13 +3042,14 @@ function clean(test) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":58}],24:[function(require,module,exports){ +},{"./base":17,"_process":69,"json3":56}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. */ var Base = require('./base'); +var JSON = require('json3'); /** * Expose `List`. @@ -3062,7 +3107,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":58}],25:[function(require,module,exports){ +},{"./base":17,"_process":69,"json3":56}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3156,7 +3201,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":58}],26:[function(require,module,exports){ +},{"./base":17,"_process":69}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3252,7 +3297,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],27:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3317,7 +3362,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],28:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3418,7 +3463,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],29:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3458,7 +3503,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],30:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],30:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3723,7 +3768,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],31:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],31:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3816,7 +3861,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":58}],32:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69}],32:[function(require,module,exports){ /** * Module dependencies. */ @@ -4141,18 +4186,19 @@ function tag(name, attrs, close, content) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":39,"./base":17,"_process":58,"fs":43,"mkdirp":55,"path":43}],35:[function(require,module,exports){ +},{"../utils":39,"./base":17,"_process":69,"fs":42,"mkdirp":66,"path":42}],35:[function(require,module,exports){ (function (global){ /** * Module dependencies. */ var EventEmitter = require('events').EventEmitter; +var JSON = require('json3'); var Pending = require('./pending'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('./ms'); var utils = require('./utils'); -var inherits = utils.inherits; +var create = require('lodash.create'); /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -4206,7 +4252,9 @@ function Runnable(title, fn) { /** * Inherit from `EventEmitter.prototype`. */ -inherits(Runnable, EventEmitter); +Runnable.prototype = create(EventEmitter.prototype, { + constructor: Runnable +}); /** * Set & get timeout `ms`. @@ -4219,7 +4267,8 @@ Runnable.prototype.timeout = function(ms) { if (!arguments.length) { return this._timeout; } - if (ms === 0) { + // see #1652 for reasoning + if (ms === 0 || ms > Math.pow(2, 31)) { this._enableTimeouts = false; } if (typeof ms === 'string') { @@ -4241,7 +4290,7 @@ Runnable.prototype.timeout = function(ms) { * @return {Runnable|number} ms or Runnable instance. */ Runnable.prototype.slow = function(ms) { - if (!arguments.length) { + if (typeof ms === 'undefined') { return this._slow; } if (typeof ms === 'string') { @@ -4443,6 +4492,10 @@ Runnable.prototype.run = function(fn) { return callFnAsync(this.fn); } try { + // allows skip() to be used in an explicit async context + this.skip = function() { + done(new Pending()); + }; callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); @@ -4491,7 +4544,7 @@ Runnable.prototype.run = function(fn) { } function callFnAsync(fn) { - fn.call(ctx, function(err) { + var result = fn.call(ctx, function(err) { if (err instanceof Error || toString.call(err) === '[object Error]') { return done(err); } @@ -4502,13 +4555,17 @@ Runnable.prototype.run = function(fn) { } return done(new Error('done() invoked with non-Error: ' + err)); } + if (result && utils.isPromise(result)) { + return done(new Error('Asynchronous resolution method is overspecified. Specify a callback *or* return a Promise, not both.')); + } + done(); }); } }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3}],36:[function(require,module,exports){ +},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3,"json3":56,"lodash.create":62}],36:[function(require,module,exports){ (function (process,global){ /** * Module dependencies. @@ -5290,6 +5347,11 @@ Runner.prototype.run = function(fn) { var self = this; var rootSuite = this.suite; + // If there is an `only` filter + if (this.hasOnly) { + filterOnly(rootSuite); + } + fn = fn || function() {}; function uncaught(err) { @@ -5345,6 +5407,26 @@ Runner.prototype.abort = function() { return this; }; +/** + * Filter suites based on `isOnly` logic. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function filterOnly(suite) { + // If it has `only` tests, run only those + if (suite.onlyTests) { + suite.tests = suite.onlyTests; + } + // Filter the nested suites + suite.suites = filter(suite.suites, filterOnly); + // Don't run tests from suites that are not marked as `only` + suite.tests = suite.isOnly ? suite.tests : []; + // Keep the suite only if there is something to run + return suite.suites.length || suite.tests.length; +} + /** * Filter leaks with the given globals flagged as `ok`. * @@ -5412,7 +5494,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":35,"./utils":39,"_process":58,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":35,"./utils":39,"_process":69,"debug":2,"events":3}],37:[function(require,module,exports){ /** * Module dependencies. */ @@ -5456,6 +5538,9 @@ exports.create = function(parent, title) { * @param {Context} parentContext */ function Suite(title, parentContext) { + if (!utils.isString(title)) { + throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.'); + } this.title = title; function Context() {} Context.prototype = parentContext; @@ -5815,7 +5900,8 @@ Suite.prototype.run = function run() { */ var Runnable = require('./runnable'); -var inherits = require('./utils').inherits; +var create = require('lodash.create'); +var isString = require('./utils').isString; /** * Expose `Test`. @@ -5831,6 +5917,9 @@ module.exports = Test; * @param {Function} fn */ function Test(title, fn) { + if (!isString(title)) { + throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.'); + } Runnable.call(this, title, fn); this.pending = !fn; this.type = 'test'; @@ -5839,7 +5928,9 @@ function Test(title, fn) { /** * Inherit from `Runnable.prototype`. */ -inherits(Test, Runnable); +Test.prototype = create(Runnable.prototype, { + constructor: Test +}); Test.prototype.clone = function() { var test = new Test(this.title, this.fn); @@ -5855,7 +5946,7 @@ Test.prototype.clone = function() { return test; }; -},{"./runnable":35,"./utils":39}],39:[function(require,module,exports){ +},{"./runnable":35,"./utils":39,"lodash.create":62}],39:[function(require,module,exports){ (function (process,Buffer){ /* eslint-env browser */ @@ -5863,6 +5954,7 @@ Test.prototype.clone = function() { * Module dependencies. */ +var JSON = require('json3'); var basename = require('path').basename; var debug = require('debug')('mocha:watch'); var exists = require('fs').existsSync || require('path').existsSync; @@ -6608,121 +6700,20 @@ exports.stackTraceFilter = function() { }; }; -}).call(this,require('_process'),require("buffer").Buffer) -},{"_process":58,"buffer":45,"debug":2,"fs":43,"glob":43,"path":43,"to-iso-string":72,"util":75}],40:[function(require,module,exports){ -'use strict' - -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -function init () { - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i - } - - revLookup['-'.charCodeAt(0)] = 62 - revLookup['_'.charCodeAt(0)] = 63 -} - -init() - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) +/** + * Crude, but effective. + * @api + * @param {*} value + * @returns {boolean} Whether or not `value` is a Promise + */ +exports.isPromise = function isPromise(value) { + return typeof value === 'object' && typeof value.then === 'function'; +}; - return parts.join('') -} +}).call(this,require('_process'),require("buffer").Buffer) +},{"_process":69,"buffer":43,"debug":2,"fs":42,"glob":42,"json3":56,"path":42,"to-iso-string":81,"util":84}],40:[function(require,module,exports){ },{}],41:[function(require,module,exports){ - -},{}],42:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -6751,194 +6742,82 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":58,"stream":59,"util":75}],43:[function(require,module,exports){ -arguments[4][41][0].apply(exports,arguments) -},{"dup":41}],44:[function(require,module,exports){ +},{"_process":69,"stream":46,"util":84}],42:[function(require,module,exports){ +arguments[4][40][0].apply(exports,arguments) +},{"dup":40}],43:[function(require,module,exports){ (function (global){ -'use strict'; +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ -var buffer = require('buffer'); -var Buffer = buffer.Buffer; -var SlowBuffer = buffer.SlowBuffer; -var MAX_LEN = buffer.kMaxLength || 2147483647; -exports.alloc = function alloc(size, fill, encoding) { - if (typeof Buffer.alloc === 'function') { - return Buffer.alloc(size, fill, encoding); - } - if (typeof encoding === 'number') { - throw new TypeError('encoding must not be number'); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('isarray') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +/* + * Export kMaxLength after typed array support is determined. + */ +exports.kMaxLength = kMaxLength() + +function typedArraySupport () { + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + return arr.foo() === 42 && // typed array instances can be augmented + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - var enc = encoding; - var _fill = fill; - if (_fill === undefined) { - enc = undefined; - _fill = 0; - } - var buf = new Buffer(size); - if (typeof _fill === 'string') { - var fillBuf = new Buffer(_fill, enc); - var flen = fillBuf.length; - var i = -1; - while (++i < size) { - buf[i] = fillBuf[i % flen]; - } - } else { - buf.fill(_fill); - } - return buf; -} -exports.allocUnsafe = function allocUnsafe(size) { - if (typeof Buffer.allocUnsafe === 'function') { - return Buffer.allocUnsafe(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - return new Buffer(size); -} -exports.from = function from(value, encodingOrOffset, length) { - if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { - return Buffer.from(value, encodingOrOffset, length); - } - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number'); - } - if (typeof value === 'string') { - return new Buffer(value, encodingOrOffset); - } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - var offset = encodingOrOffset; - if (arguments.length === 1) { - return new Buffer(value); - } - if (typeof offset === 'undefined') { - offset = 0; - } - var len = length; - if (typeof len === 'undefined') { - len = value.byteLength - offset; - } - if (offset >= value.byteLength) { - throw new RangeError('\'offset\' is out of bounds'); - } - if (len > value.byteLength - offset) { - throw new RangeError('\'length\' is out of bounds'); - } - return new Buffer(value.slice(offset, offset + len)); - } - if (Buffer.isBuffer(value)) { - var out = new Buffer(value.length); - value.copy(out, 0, 0, value.length); - return out; - } - if (value) { - if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { - return new Buffer(value); - } - if (value.type === 'Buffer' && Array.isArray(value.data)) { - return new Buffer(value.data); - } - } - - throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); -} -exports.allocUnsafeSlow = function allocUnsafeSlow(size) { - if (typeof Buffer.allocUnsafeSlow === 'function') { - return Buffer.allocUnsafeSlow(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size >= MAX_LEN) { - throw new RangeError('size is too large'); - } - return new SlowBuffer(size); -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"buffer":45}],45:[function(require,module,exports){ -(function (global){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - -'use strict' - -var base64 = require('base64-js') -var ieee754 = require('ieee754') -var isArray = require('isarray') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() - -/* - * Export kMaxLength after typed array support is determined. - */ -exports.kMaxLength = kMaxLength() - -function typedArraySupport () { - try { - var arr = new Uint8Array(1) - arr.foo = function () { return 42 } - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -} - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance @@ -8580,1483 +8459,3858 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":40,"ieee754":52,"isarray":46}],46:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; +},{"base64-js":44,"ieee754":52,"isarray":55}],44:[function(require,module,exports){ +'use strict' -},{}],47:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); +function init () { + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; -function isBoolean(arg) { - return typeof arg === 'boolean'; + revLookup['-'.charCodeAt(0)] = 62 + revLookup['_'.charCodeAt(0)] = 63 } -exports.isBoolean = isBoolean; -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; +init() -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders) -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + var L = 0 -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); + return arr } -exports.isError = isError; -function isFunction(arg) { - return typeof arg === 'function'; +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } -exports.isFunction = isFunction; -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') } -exports.isPrimitive = isPrimitive; -exports.isBuffer = Buffer.isBuffer; +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 -function objectToString(o) { - return Object.prototype.toString.call(o); + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') } -}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":54}],48:[function(require,module,exports){ -/* See LICENSE file for terms of use */ +},{}],45:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. -/* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ -(function(global, undefined) { - var objectPrototypeToString = Object.prototype.toString; +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; - /*istanbul ignore next*/ - function map(arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); - } +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; - var other = new Array(arr.length); +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; - for (var i = 0, n = arr.length; i < n; i++) { - other[i] = mapper.call(that, arr[i], i, arr); - } - return other; - } - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } - } - return ret; - } - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, '&'); - n = n.replace(//g, '>'); - n = n.replace(/"/g, '"'); +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; - return n; - } +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; - // This function handles the presence of circular references by bailing out when encountering an - // object that is already on the "stack" of items being processed. - function canonicalize(obj, stack, replacementStack) { - stack = stack || []; - replacementStack = replacementStack || []; +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; - var i; + if (!this._events) + this._events = {}; - for (i = 0; i < stack.length; i += 1) { - if (stack[i] === obj) { - return replacementStack[i]; + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event } + throw TypeError('Uncaught, unspecified "error" event.'); } + } - var canonicalizedObj; + handler = this._events[type]; - if ('[object Array]' === objectPrototypeToString.call(obj)) { - stack.push(obj); - canonicalizedObj = new Array(obj.length); - replacementStack.push(canonicalizedObj); - for (i = 0; i < obj.length; i += 1) { - canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); - } else if (typeof obj === 'object' && obj !== null) { - stack.push(obj); - canonicalizedObj = {}; - replacementStack.push(canonicalizedObj); - var sortedKeys = [], - key; - for (key in obj) { - sortedKeys.push(key); - } - sortedKeys.sort(); - for (i = 0; i < sortedKeys.length; i += 1) { - key = sortedKeys[i]; - canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); - } else { - canonicalizedObj = obj; + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); } - return canonicalizedObj; + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); } - function buildValues(components, newString, oldString, useLongestToken) { - var componentPos = 0, - componentLen = components.length, - newPos = 0, - oldPos = 0; + return true; +}; - for (; componentPos < componentLen; componentPos++) { - var component = components[componentPos]; - if (!component.removed) { - if (!component.added && useLongestToken) { - var value = newString.slice(newPos, newPos + component.count); - value = map(value, function(value, i) { - var oldValue = oldString[oldPos + i]; - return oldValue.length > value.length ? oldValue : value; - }); - - component.value = value.join(''); - } else { - component.value = newString.slice(newPos, newPos + component.count).join(''); - } - newPos += component.count; +EventEmitter.prototype.addListener = function(type, listener) { + var m; - // Common case - if (!component.added) { - oldPos += component.count; - } - } else { - component.value = oldString.slice(oldPos, oldPos + component.count).join(''); - oldPos += component.count; + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // Reverse add and remove so removes are output first to match common convention - // The diffing algorithm is tied to add then remove output and this is the simplest - // route to get the desired output with minimal overhead. - if (componentPos && components[componentPos - 1].added) { - var tmp = components[componentPos - 1]; - components[componentPos - 1] = components[componentPos]; - components[componentPos] = tmp; - } - } - } + if (!this._events) + this._events = {}; - return components; - } + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); - function Diff(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - } - Diff.prototype = { - diff: function(oldString, newString, callback) { - var self = this; + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; - function done(value) { - if (callback) { - setTimeout(function() { callback(undefined, value); }, 0); - return true; - } else { - return value; - } - } + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString === oldString) { - return done([{ value: newString }]); - } - if (!newString) { - return done([{ value: oldString, removed: true }]); - } - if (!oldString) { - return done([{ value: newString, added: true }]); + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); } + } + } - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); + return this; +}; - var newLen = newString.length, oldLen = oldString.length; - var editLength = 1; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - // Identity per the equality and tokenizer - return done([{value: newString.join('')}]); - } +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // Main worker method. checks all permutations of a given edit length for acceptance. - function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { - var basePath; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath - 1] = undefined; - } + var fired = false; - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - // If this path is a terminal then prune - bestPath[diagonalPath] = undefined; - continue; - } + function g() { + this.removeListener(type, g); - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); - } else { - basePath = addPath; // No need to clone, we've pulled it from the list - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); - } + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } - oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + g.listener = listener; + this.on(type, g); - // If we have hit the end of both strings, then we are done - if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); - } else { - // Otherwise track this path as a potential candidate and continue. - bestPath[diagonalPath] = basePath; - } - } + return this; +}; - editLength++; - } +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; - // Performs the length of edit iteration. Is a bit fugly as this has to support the - // sync and async mode which is never fun. Loops over execEditLength until a value - // is produced. - if (callback) { - (function exec() { - setTimeout(function() { - // This should not happen, but we want to be safe. - /*istanbul ignore next */ - if (editLength > maxEditLength) { - return callback(); - } + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - if (!execEditLength()) { - exec(); - } - }, 0); - }()); - } else { - while (editLength <= maxEditLength) { - var ret = execEditLength(); - if (ret) { - return ret; - } - } - } - }, + if (!this._events || !this._events[type]) + return this; - pushComponent: function(components, added, removed) { - var last = components[components.length - 1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; - } else { - components.push({count: 1, added: added, removed: removed }); - } - }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, + list = this._events[type]; + length = list.length; + position = -1; - commonCount = 0; - while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { - newPos++; - oldPos++; - commonCount++; - } + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); - if (commonCount) { - basePath.components.push({count: commonCount}); + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; } + } - basePath.newPos = newPos; - return oldPos; - }, + if (position < 0) + return this; - equals: function(left, right) { - var reWhitespace = /\S/; - return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); - }, - tokenize: function(value) { - return value.split(''); + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); } - }; - var CharDiff = new Diff(); + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } - var WordDiff = new Diff(true); - var WordWithSpaceDiff = new Diff(); - WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; - - var CssDiff = new Diff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; + return this; +}; - var LineDiff = new Diff(); +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; - var TrimmedLineDiff = new Diff(); - TrimmedLineDiff.ignoreTrim = true; + if (!this._events) + return this; - LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { - var retLines = [], - lines = value.split(/^/m); - for (var i = 0; i < lines.length; i++) { - var line = lines[i], - lastLine = lines[i - 1], - lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } - // Merge lines that may contain windows new lines - if (line === '\n' && lastLineLastChar === '\r') { - retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; - } else { - if (this.ignoreTrim) { - line = line.trim(); - // add a newline unless this is the last line. - if (i < lines.length - 1) { - line += '\n'; - } - } - retLines.push(line); - } + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } - return retLines; - }; + listeners = this._events[type]; - var PatchDiff = new Diff(); - PatchDiff.tokenize = function(value) { - var ret = [], - linesAndNewlines = value.split(/(\n|\r\n)/); + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; - // Ignore the final empty token that occurs if the string ends with a new line - if (!linesAndNewlines[linesAndNewlines.length - 1]) { - linesAndNewlines.pop(); - } + return this; +}; - // Merge the content and line separators into single tokens - for (var i = 0; i < linesAndNewlines.length; i++) { - var line = linesAndNewlines[i]; +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; - if (i % 2) { - ret[ret.length - 1] += line; - } else { - ret.push(line); - } - } - return ret; - }; +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; - var SentenceDiff = new Diff(); - SentenceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); - }; + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; - var JsonDiff = new Diff(); - // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a - // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: - JsonDiff.useLongestToken = true; - JsonDiff.tokenize = LineDiff.tokenize; - JsonDiff.equals = function(left, right) { - return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); - }; +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; - var JsDiff = { - Diff: Diff, +function isFunction(arg) { + return typeof arg === 'function'; +} - diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, - diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, - diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, - diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, - diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, +function isNumber(arg) { + return typeof arg === 'number'; +} - diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} - diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, - diffJson: function(oldObj, newObj, callback) { - return JsonDiff.diff( - typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), - typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), - callback - ); - }, +function isUndefined(arg) { + return arg === void 0; +} - createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; +},{}],46:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - if (oldFileName == newFileName) { - ret.push('Index: ' + oldFileName); - } - ret.push('==================================================================='); - ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); - ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); +module.exports = Stream; - var diff = PatchDiff.diff(oldStr, newStr); - diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier +var EE = require('events').EventEmitter; +var inherits = require('inherits'); - // Formats a given set of lines for printing as context lines in a patch - function contextLines(lines) { - return map(lines, function(entry) { return ' ' + entry; }); - } +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); - // Outputs the no newline at end of file warning if needed - function eofNL(curRange, i, current) { - var last = diff[diff.length - 2], - isLast = i === diff.length - 2, - isLastOfType = i === diff.length - 3 && current.added !== last.added; +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; - // Figure out if this is the last line for the given file and missing NL - if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; - if (current.added || current.removed) { - // If we have previous context, start with that - if (!oldRangeStart) { - var prev = diff[i - 1]; - oldRangeStart = oldLine; - newRangeStart = newLine; +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } +function Stream() { + EE.call(this); +} - // Output our changes - curRange.push.apply(curRange, map(lines, function(entry) { - return (current.added ? '+' : '-') + entry; - })); - eofNL(curRange, i, current); +Stream.prototype.pipe = function(dest, options) { + var source = this; - // Track the updated file position - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - // Identical context lines. Track line changes - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length - 2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) - + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) - + ' @@'); - ret.push.apply(ret, curRange); + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":45,"inherits":53,"readable-stream/duplex.js":70,"readable-stream/passthrough.js":76,"readable-stream/readable.js":77,"readable-stream/transform.js":78,"readable-stream/writable.js":79}],47:[function(require,module,exports){ +(function (global){ +'use strict'; + +var buffer = require('buffer'); +var Buffer = buffer.Buffer; +var SlowBuffer = buffer.SlowBuffer; +var MAX_LEN = buffer.kMaxLength || 2147483647; +exports.alloc = function alloc(size, fill, encoding) { + if (typeof Buffer.alloc === 'function') { + return Buffer.alloc(size, fill, encoding); + } + if (typeof encoding === 'number') { + throw new TypeError('encoding must not be number'); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + var enc = encoding; + var _fill = fill; + if (_fill === undefined) { + enc = undefined; + _fill = 0; + } + var buf = new Buffer(size); + if (typeof _fill === 'string') { + var fillBuf = new Buffer(_fill, enc); + var flen = fillBuf.length; + var i = -1; + while (++i < size) { + buf[i] = fillBuf[i % flen]; + } + } else { + buf.fill(_fill); + } + return buf; +} +exports.allocUnsafe = function allocUnsafe(size) { + if (typeof Buffer.allocUnsafe === 'function') { + return Buffer.allocUnsafe(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + return new Buffer(size); +} +exports.from = function from(value, encodingOrOffset, length) { + if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { + return Buffer.from(value, encodingOrOffset, length); + } + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number'); + } + if (typeof value === 'string') { + return new Buffer(value, encodingOrOffset); + } + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + var offset = encodingOrOffset; + if (arguments.length === 1) { + return new Buffer(value); + } + if (typeof offset === 'undefined') { + offset = 0; + } + var len = length; + if (typeof len === 'undefined') { + len = value.byteLength - offset; + } + if (offset >= value.byteLength) { + throw new RangeError('\'offset\' is out of bounds'); + } + if (len > value.byteLength - offset) { + throw new RangeError('\'length\' is out of bounds'); + } + return new Buffer(value.slice(offset, offset + len)); + } + if (Buffer.isBuffer(value)) { + var out = new Buffer(value.length); + value.copy(out, 0, 0, value.length); + return out; + } + if (value) { + if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { + return new Buffer(value); + } + if (value.type === 'Buffer' && Array.isArray(value.data)) { + return new Buffer(value.data); + } + } + + throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); +} +exports.allocUnsafeSlow = function allocUnsafeSlow(size) { + if (typeof Buffer.allocUnsafeSlow === 'function') { + return Buffer.allocUnsafeSlow(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size >= MAX_LEN) { + throw new RangeError('size is too large'); + } + return new SlowBuffer(size); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"buffer":43}],48:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":54}],49:[function(require,module,exports){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +(function(global, undefined) { + var objectPrototypeToString = Object.prototype.toString; + + /*istanbul ignore next*/ + function map(arr, mapper, that) { + if (Array.prototype.map) { + return Array.prototype.map.call(arr, mapper, that); + } + + var other = new Array(arr.length); + + for (var i = 0, n = arr.length; i < n; i++) { + other[i] = mapper.call(that, arr[i], i, arr); + } + return other; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. + function canonicalize(obj, stack, replacementStack) { + stack = stack || []; + replacementStack = replacementStack || []; + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + key; + for (key in obj) { + sortedKeys.push(key); + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + key = sortedKeys[i]; + canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + return canonicalizedObj; + } + + function buildValues(components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = map(value, function(value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + + component.value = value.join(''); + } else { + component.value = newString.slice(newPos, newPos + component.count).join(''); + } + newPos += component.count; + + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = oldString.slice(oldPos, oldPos + component.count).join(''); + oldPos += component.count; + + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } + + return components; + } + + function Diff(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + } + Diff.prototype = { + diff: function(oldString, newString, callback) { + var self = this; + + function done(value) { + if (callback) { + setTimeout(function() { callback(undefined, value); }, 0); + return true; + } else { + return value; + } + } + + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return done([{ value: newString }]); + } + if (!newString) { + return done([{ value: oldString, removed: true }]); + } + if (!oldString) { + return done([{ value: newString, added: true }]); + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{value: newString.join('')}]); + } + + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } + + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function() { + // This should not happen, but we want to be safe. + /*istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + }()); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, + + pushComponent: function(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({count: commonCount}); + } + + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); + }, + tokenize: function(value) { + return value.split(''); + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + + var TrimmedLineDiff = new Diff(); + TrimmedLineDiff.ignoreTrim = true; + + LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { + var retLines = [], + lines = value.split(/^/m); + for (var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1], + lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; + + // Merge lines that may contain windows new lines + if (line === '\n' && lastLineLastChar === '\r') { + retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; + } else { + if (this.ignoreTrim) { + line = line.trim(); + // add a newline unless this is the last line. + if (i < lines.length - 1) { + line += '\n'; + } + } + retLines.push(line); + } + } + + return retLines; + }; + + var PatchDiff = new Diff(); + PatchDiff.tokenize = function(value) { + var ret = [], + linesAndNewlines = value.split(/(\n|\r\n)/); + + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } + + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2) { + ret[ret.length - 1] += line; + } else { + ret.push(line); + } + } + return ret; + }; + + var SentenceDiff = new Diff(); + SentenceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); + }; + + var JsonDiff = new Diff(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + JsonDiff.useLongestToken = true; + JsonDiff.tokenize = LineDiff.tokenize; + JsonDiff.equals = function(left, right) { + return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; + + var JsDiff = { + Diff: Diff, + + diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, + diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, + diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, + diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, + diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, + + diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, + + diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, + diffJson: function(oldObj, newObj, callback) { + return JsonDiff.diff( + typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), + typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), + callback + ); + }, + + createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + ret.push('==================================================================='); + ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = PatchDiff.diff(oldStr, newStr); + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + // Formats a given set of lines for printing as context lines in a patch + function contextLines(lines) { + return map(lines, function(entry) { return ' ' + entry; }); + } + + // Outputs the no newline at end of file warning if needed + function eofNL(curRange, i, current) { + var last = diff[diff.length - 2], + isLast = i === diff.length - 2, + isLastOfType = i === diff.length - 3 && current.added !== last.added; + + // Figure out if this is the last line for the given file and missing NL + if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + + // Output our changes + curRange.push.apply(curRange, map(lines, function(entry) { + return (current.added ? '+' : '-') + entry; + })); + eofNL(curRange, i, current); + + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length - 2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + + ' @@'); + ret.push.apply(ret, curRange); ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); if (lines.length <= 4) { eofNL(ret, i, current); } - oldRangeStart = 0; - newRangeStart = 0; - curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - } + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'), + hunks = [], + i = 0, + remEOFNL = false, + addEOFNL = false; + + // Skip to the first change hunk + while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { + i++; + } + + // Parse the unified diff + for (; i < diffstr.length; i++) { + if (diffstr[i][0] === '@') { + var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + hunks.unshift({ + start: chnukHeader[3], + oldlength: +chnukHeader[2], + removed: [], + newlength: chnukHeader[4], + added: [] + }); + } else if (diffstr[i][0] === '+') { + hunks[0].added.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '-') { + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === ' ') { + hunks[0].added.push(diffstr[i].substr(1)); + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '\\') { + if (diffstr[i - 1][0] === '+') { + remEOFNL = true; + } else if (diffstr[i - 1][0] === '-') { + addEOFNL = true; + } + } + } + + // Apply the diff to the input + var lines = oldStr.split('\n'); + for (i = hunks.length - 1; i >= 0; i--) { + var hunk = hunks[i]; + // Sanity check the input string. Bail if we don't match. + for (var j = 0; j < hunk.oldlength; j++) { + if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { + return false; + } + } + Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); + } + + // Handle EOFNL insertion/removal + if (remEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + } + } else if (addEOFNL) { + lines.push(''); + } + return lines.join('\n'); + }, + + convertChangesToXML: function(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes) { + var ret = [], + change, + operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + return ret; + }, + + canonicalize: canonicalize + }; + + /*istanbul ignore next */ + /*global module */ + if (typeof module !== 'undefined' && module.exports) { + module.exports = JsDiff; + } else if (typeof define === 'function' && define.amd) { + /*global define */ + define([], function() { return JsDiff; }); + } else if (typeof global.JsDiff === 'undefined') { + global.JsDiff = JsDiff; + } +}(this)); + +},{}],50:[function(require,module,exports){ +'use strict'; + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRe, '\\$&'); +}; + +},{}],51:[function(require,module,exports){ +(function (process){ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) + +/** + * Module dependencies. + */ + +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; + +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; + + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; + } +} + +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , icon: '-appIcon' + , sound: '-sound' + , url: '-open' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + if (which('growl')) { + cmd = { + type: "Linux-Growl" + , pkg: "growl" + , msg: '-m' + , title: '-title' + , subtitle: '-subtitle' + , host: { + cmd: '-H' + , hostname: '192.168.33.1' + } + }; + } else { + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + } + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , url: '/cu:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} + +/** + * Expose `growl`. + */ + +exports = module.exports = growl; + +/** + * Node-growl version. + */ + +exports.version = '1.4.1' + +/** + * Send growl notification _msg_ with _options_. + * + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public + */ + +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; + + if (options.exec) { + cmd = { + type: "Custom" + , pkg: options.exec + , range: [] + }; + } + + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; + + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, quote(image)) + break; + case 'Darwin-NotificationCenter': + args.push(cmd.icon, quote(image)); + break; + case 'Linux': + args.push(cmd.icon, quote(image)); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } + } + + // sticky + if (options.sticky) args.push(cmd.sticky); + + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } + } + + //sound + if(options.sound && cmd.type === 'Darwin-NotificationCenter'){ + args.push(cmd.sound, options.sound) + } + + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } + + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); + break; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + var stringifiedMsg = quote(msg); + var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n'); + args.push(escapedMsg); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.subtitle)); + } + if (options.url) { + args.push(cmd.url); + args.push(quote(options.url)); + } + break; + case 'Linux-Growl': + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(quote(options.title)); + if (cmd.host) { + args.push(cmd.host.cmd, cmd.host.hostname) + } + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg).replace(/\\n/g, '\n')); + } else { + args.push(quote(msg).replace(/\\n/g, '\n')); + } + break; + case 'Windows': + args.push(quote(msg).replace(/\\n/g, '\n')); + if (options.title) args.push(cmd.title + quote(options.title)); + if (options.url) args.push(cmd.url + quote(options.url)); + break; + case 'Custom': + args[0] = (function(origCommand) { + var message = options.title + ? options.title + ': ' + msg + : msg; + var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message)); + if (command === origCommand) args.push(quote(message)); + return command; + })(args[0]); + break; + } + + // execute + exec(args.join(' '), fn); +}; + +}).call(this,require('_process')) +},{"_process":69,"child_process":42,"fs":42,"os":67,"path":42}],52:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],53:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],54:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} - return ret.join('\n') + '\n'; - }, +},{}],55:[function(require,module,exports){ +var toString = {}.toString; - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); - }, +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; - applyPatch: function(oldStr, uniDiff) { - var diffstr = uniDiff.split('\n'), - hunks = [], - i = 0, - remEOFNL = false, - addEOFNL = false; +},{}],56:[function(require,module,exports){ +(function (global){ +/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ +;(function () { + // Detect the `define` function exposed by asynchronous module loaders. The + // strict `define` check is necessary for compatibility with `r.js`. + var isLoader = typeof define === "function" && define.amd; + + // A set of types used to distinguish objects from primitives. + var objectTypes = { + "function": true, + "object": true + }; - // Skip to the first change hunk - while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { - i++; + // Detect the `exports` object exposed by CommonJS implementations. + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + // Use the `global` object exposed by Node (including Browserify via + // `insert-module-globals`), Narwhal, and Ringo as the default context, + // and the `window` object in browsers. Rhino exports a `global` function + // instead. + var root = objectTypes[typeof window] && window || this, + freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global; + + if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) { + root = freeGlobal; + } + + // Public: Initializes JSON 3 using the given `context` object, attaching the + // `stringify` and `parse` functions to the specified `exports` object. + function runInContext(context, exports) { + context || (context = root["Object"]()); + exports || (exports = root["Object"]()); + + // Native constructor aliases. + var Number = context["Number"] || root["Number"], + String = context["String"] || root["String"], + Object = context["Object"] || root["Object"], + Date = context["Date"] || root["Date"], + SyntaxError = context["SyntaxError"] || root["SyntaxError"], + TypeError = context["TypeError"] || root["TypeError"], + Math = context["Math"] || root["Math"], + nativeJSON = context["JSON"] || root["JSON"]; + + // Delegate to the native `stringify` and `parse` implementations. + if (typeof nativeJSON == "object" && nativeJSON) { + exports.stringify = nativeJSON.stringify; + exports.parse = nativeJSON.parse; + } + + // Convenience aliases. + var objectProto = Object.prototype, + getClass = objectProto.toString, + isProperty, forEach, undef; + + // Test the `Date#getUTC*` methods. Based on work by @Yaffle. + var isExtended = new Date(-3509827334573292); + try { + // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical + // results for certain dates in Opera >= 10.53. + isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 && + // Safari < 2.0.2 stores the internal millisecond time value correctly, + // but clips the values returned by the date methods to the range of + // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]). + isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708; + } catch (exception) {} + + // Internal: Determines whether the native `JSON.stringify` and `parse` + // implementations are spec-compliant. Based on work by Ken Snyder. + function has(name) { + if (has[name] !== undef) { + // Return cached feature test result. + return has[name]; } - - // Parse the unified diff - for (; i < diffstr.length; i++) { - if (diffstr[i][0] === '@') { - var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); - hunks.unshift({ - start: chnukHeader[3], - oldlength: +chnukHeader[2], - removed: [], - newlength: chnukHeader[4], - added: [] - }); - } else if (diffstr[i][0] === '+') { - hunks[0].added.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '-') { - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === ' ') { - hunks[0].added.push(diffstr[i].substr(1)); - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '\\') { - if (diffstr[i - 1][0] === '+') { - remEOFNL = true; - } else if (diffstr[i - 1][0] === '-') { - addEOFNL = true; + var isSupported; + if (name == "bug-string-char-index") { + // IE <= 7 doesn't support accessing string characters using square + // bracket notation. IE 8 only supports this for primitives. + isSupported = "a"[0] != "a"; + } else if (name == "json") { + // Indicates whether both `JSON.stringify` and `JSON.parse` are + // supported. + isSupported = has("json-stringify") && has("json-parse"); + } else { + var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}'; + // Test `JSON.stringify`. + if (name == "json-stringify") { + var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended; + if (stringifySupported) { + // A test function object with a custom `toJSON` method. + (value = function () { + return 1; + }).toJSON = value; + try { + stringifySupported = + // Firefox 3.1b1 and b2 serialize string, number, and boolean + // primitives as object literals. + stringify(0) === "0" && + // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object + // literals. + stringify(new Number()) === "0" && + stringify(new String()) == '""' && + // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or + // does not define a canonical JSON representation (this applies to + // objects with `toJSON` properties as well, *unless* they are nested + // within an object or array). + stringify(getClass) === undef && + // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and + // FF 3.1b3 pass this test. + stringify(undef) === undef && + // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s, + // respectively, if the value is omitted entirely. + stringify() === undef && + // FF 3.1b1, 2 throw an error if the given value is not a number, + // string, array, object, Boolean, or `null` literal. This applies to + // objects with custom `toJSON` methods as well, unless they are nested + // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON` + // methods entirely. + stringify(value) === "1" && + stringify([value]) == "[1]" && + // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of + // `"[null]"`. + stringify([undef]) == "[null]" && + // YUI 3.0.0b1 fails to serialize `null` literals. + stringify(null) == "null" && + // FF 3.1b1, 2 halts serialization if an array contains a function: + // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3 + // elides non-JSON values from objects and arrays, unless they + // define custom `toJSON` methods. + stringify([undef, getClass, null]) == "[null,null,null]" && + // Simple serialization test. FF 3.1b1 uses Unicode escape sequences + // where character escape codes are expected (e.g., `\b` => `\u0008`). + stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized && + // FF 3.1b1 and b2 ignore the `filter` and `width` arguments. + stringify(null, value) === "1" && + stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" && + // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly + // serialize extended years. + stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' && + // The milliseconds are optional in ES 5, but required in 5.1. + stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' && + // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative + // four-digit years instead of six-digit years. Credits: @Yaffle. + stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' && + // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond + // values less than 1000. Credits: @Yaffle. + stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"'; + } catch (exception) { + stringifySupported = false; + } } + isSupported = stringifySupported; } - } - - // Apply the diff to the input - var lines = oldStr.split('\n'); - for (i = hunks.length - 1; i >= 0; i--) { - var hunk = hunks[i]; - // Sanity check the input string. Bail if we don't match. - for (var j = 0; j < hunk.oldlength; j++) { - if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { - return false; + // Test `JSON.parse`. + if (name == "json-parse") { + var parse = exports.parse; + if (typeof parse == "function") { + try { + // FF 3.1b1, b2 will throw an exception if a bare literal is provided. + // Conforming implementations should also coerce the initial argument to + // a string prior to parsing. + if (parse("0") === 0 && !parse(false)) { + // Simple parsing test. + value = parse(serialized); + var parseSupported = value["a"].length == 5 && value["a"][0] === 1; + if (parseSupported) { + try { + // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings. + parseSupported = !parse('"\t"'); + } catch (exception) {} + if (parseSupported) { + try { + // FF 4.0 and 4.0.1 allow leading `+` signs and leading + // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow + // certain octal literals. + parseSupported = parse("01") !== 1; + } catch (exception) {} + } + if (parseSupported) { + try { + // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal + // points. These environments, along with FF 3.1b1 and 2, + // also allow trailing commas in JSON objects and arrays. + parseSupported = parse("1.") !== 1; + } catch (exception) {} + } + } + } + } catch (exception) { + parseSupported = false; + } } + isSupported = parseSupported; } - Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); + } + return has[name] = !!isSupported; + } + + if (!has("json")) { + // Common `[[Class]]` name aliases. + var functionClass = "[object Function]", + dateClass = "[object Date]", + numberClass = "[object Number]", + stringClass = "[object String]", + arrayClass = "[object Array]", + booleanClass = "[object Boolean]"; + + // Detect incomplete support for accessing string characters by index. + var charIndexBuggy = has("bug-string-char-index"); + + // Define additional utility methods if the `Date` methods are buggy. + if (!isExtended) { + var floor = Math.floor; + // A mapping between the months of the year and the number of days between + // January 1st and the first of the respective month. + var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + // Internal: Calculates the number of days between the Unix epoch and the + // first day of the given month. + var getDay = function (year, month) { + return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400); + }; } - // Handle EOFNL insertion/removal - if (remEOFNL) { - while (!lines[lines.length - 1]) { - lines.pop(); - } - } else if (addEOFNL) { - lines.push(''); + // Internal: Determines if a property is a direct property of the given + // object. Delegates to the native `Object#hasOwnProperty` method. + if (!(isProperty = objectProto.hasOwnProperty)) { + isProperty = function (property) { + var members = {}, constructor; + if ((members.__proto__ = null, members.__proto__ = { + // The *proto* property cannot be set multiple times in recent + // versions of Firefox and SeaMonkey. + "toString": 1 + }, members).toString != getClass) { + // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but + // supports the mutable *proto* property. + isProperty = function (property) { + // Capture and break the object's prototype chain (see section 8.6.2 + // of the ES 5.1 spec). The parenthesized expression prevents an + // unsafe transformation by the Closure Compiler. + var original = this.__proto__, result = property in (this.__proto__ = null, this); + // Restore the original prototype chain. + this.__proto__ = original; + return result; + }; + } else { + // Capture a reference to the top-level `Object` constructor. + constructor = members.constructor; + // Use the `constructor` property to simulate `Object#hasOwnProperty` in + // other environments. + isProperty = function (property) { + var parent = (this.constructor || constructor).prototype; + return property in this && !(property in parent && this[property] === parent[property]); + }; + } + members = null; + return isProperty.call(this, property); + }; } - return lines.join('\n'); - }, - convertChangesToXML: function(changes) { - var ret = []; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); + // Internal: Normalizes the `for...in` iteration algorithm across + // environments. Each enumerated key is yielded to a `callback` function. + forEach = function (object, callback) { + var size = 0, Properties, members, property; + + // Tests for bugs in the current environment's `for...in` algorithm. The + // `valueOf` property inherits the non-enumerable flag from + // `Object.prototype` in older versions of IE, Netscape, and Mozilla. + (Properties = function () { + this.valueOf = 0; + }).prototype.valueOf = 0; + + // Iterate over a new instance of the `Properties` class. + members = new Properties(); + for (property in members) { + // Ignore all properties inherited from `Object.prototype`. + if (isProperty.call(members, property)) { + size++; + } + } + Properties = members = null; + + // Normalize the iteration algorithm. + if (!size) { + // A list of non-enumerable properties inherited from `Object.prototype`. + members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"]; + // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable + // properties. + forEach = function (object, callback) { + var isFunction = getClass.call(object) == functionClass, property, length; + var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty; + for (property in object) { + // Gecko <= 1.0 enumerates the `prototype` property of functions under + // certain conditions; IE does not. + if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) { + callback(property); + } + } + // Manually invoke the callback for each non-enumerable property. + for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property)); + }; + } else if (size == 2) { + // Safari <= 2.0.4 enumerates shadowed properties twice. + forEach = function (object, callback) { + // Create a set of iterated properties. + var members = {}, isFunction = getClass.call(object) == functionClass, property; + for (property in object) { + // Store each property name to prevent double enumeration. The + // `prototype` property of functions is not enumerated due to cross- + // environment inconsistencies. + if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) { + callback(property); + } + } + }; + } else { + // No bugs detected; use the standard `for...in` algorithm. + forEach = function (object, callback) { + var isFunction = getClass.call(object) == functionClass, property, isConstructor; + for (property in object) { + if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) { + callback(property); + } + } + // Manually invoke the callback for the `constructor` property due to + // cross-environment inconsistencies. + if (isConstructor || isProperty.call(object, (property = "constructor"))) { + callback(property); + } + }; } + return forEach(object, callback); + }; - ret.push(escapeHTML(change.value)); + // Public: Serializes a JavaScript `value` as a JSON string. The optional + // `filter` argument may specify either a function that alters how object and + // array members are serialized, or an array of strings and numbers that + // indicates which properties should be serialized. The optional `width` + // argument may be either a string or number that specifies the indentation + // level of the output. + if (!has("json-stringify")) { + // Internal: A map of control characters and their escaped equivalents. + var Escapes = { + 92: "\\\\", + 34: '\\"', + 8: "\\b", + 12: "\\f", + 10: "\\n", + 13: "\\r", + 9: "\\t" + }; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } - } - return ret.join(''); - }, + // Internal: Converts `value` into a zero-padded string such that its + // length is at least equal to `width`. The `width` must be <= 6. + var leadingZeroes = "000000"; + var toPaddedString = function (width, value) { + // The `|| 0` expression is necessary to work around a bug in + // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`. + return (leadingZeroes + (value || 0)).slice(-width); + }; - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - convertChangesToDMP: function(changes) { - var ret = [], - change, - operation; - for (var i = 0; i < changes.length; i++) { - change = changes[i]; - if (change.added) { - operation = 1; - } else if (change.removed) { - operation = -1; - } else { - operation = 0; - } + // Internal: Double-quotes a string `value`, replacing all ASCII control + // characters (characters with code unit values between 0 and 31) with + // their escaped equivalents. This is an implementation of the + // `Quote(value)` operation defined in ES 5.1 section 15.12.3. + var unicodePrefix = "\\u00"; + var quote = function (value) { + var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10; + var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value); + for (; index < length; index++) { + var charCode = value.charCodeAt(index); + // If the character is a control character, append its Unicode or + // shorthand escape sequence; otherwise, append the character as-is. + switch (charCode) { + case 8: case 9: case 10: case 12: case 13: case 34: case 92: + result += Escapes[charCode]; + break; + default: + if (charCode < 32) { + result += unicodePrefix + toPaddedString(2, charCode.toString(16)); + break; + } + result += useCharIndex ? symbols[index] : value.charAt(index); + } + } + return result + '"'; + }; - ret.push([operation, change.value]); + // Internal: Recursively serializes an object. Implements the + // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations. + var serialize = function (property, object, callback, properties, whitespace, indentation, stack) { + var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result; + try { + // Necessary for host object support. + value = object[property]; + } catch (exception) {} + if (typeof value == "object" && value) { + className = getClass.call(value); + if (className == dateClass && !isProperty.call(value, "toJSON")) { + if (value > -1 / 0 && value < 1 / 0) { + // Dates are serialized according to the `Date#toJSON` method + // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15 + // for the ISO 8601 date time string format. + if (getDay) { + // Manually compute the year, month, date, hours, minutes, + // seconds, and milliseconds if the `getUTC*` methods are + // buggy. Adapted from @Yaffle's `date-shim` project. + date = floor(value / 864e5); + for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++); + for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++); + date = 1 + date - getDay(year, month); + // The `time` value specifies the time within the day (see ES + // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used + // to compute `A modulo B`, as the `%` operator does not + // correspond to the `modulo` operation for negative numbers. + time = (value % 864e5 + 864e5) % 864e5; + // The hours, minutes, seconds, and milliseconds are obtained by + // decomposing the time within the day. See section 15.9.1.10. + hours = floor(time / 36e5) % 24; + minutes = floor(time / 6e4) % 60; + seconds = floor(time / 1e3) % 60; + milliseconds = time % 1e3; + } else { + year = value.getUTCFullYear(); + month = value.getUTCMonth(); + date = value.getUTCDate(); + hours = value.getUTCHours(); + minutes = value.getUTCMinutes(); + seconds = value.getUTCSeconds(); + milliseconds = value.getUTCMilliseconds(); + } + // Serialize extended years correctly. + value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) + + "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) + + // Months, dates, hours, minutes, and seconds should have two + // digits; milliseconds should have three. + "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) + + // Milliseconds are optional in ES 5.0, but required in 5.1. + "." + toPaddedString(3, milliseconds) + "Z"; + } else { + value = null; + } + } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) { + // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the + // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3 + // ignores all `toJSON` methods on these objects unless they are + // defined directly on an instance. + value = value.toJSON(property); + } + } + if (callback) { + // If a replacement function was provided, call it to obtain the value + // for serialization. + value = callback.call(object, property, value); + } + if (value === null) { + return "null"; + } + className = getClass.call(value); + if (className == booleanClass) { + // Booleans are represented literally. + return "" + value; + } else if (className == numberClass) { + // JSON numbers must be finite. `Infinity` and `NaN` are serialized as + // `"null"`. + return value > -1 / 0 && value < 1 / 0 ? "" + value : "null"; + } else if (className == stringClass) { + // Strings are double-quoted and escaped. + return quote("" + value); + } + // Recursively serialize objects and arrays. + if (typeof value == "object") { + // Check for cyclic structures. This is a linear search; performance + // is inversely proportional to the number of unique nested objects. + for (length = stack.length; length--;) { + if (stack[length] === value) { + // Cyclic structures cannot be serialized by `JSON.stringify`. + throw TypeError(); + } + } + // Add the object to the stack of traversed objects. + stack.push(value); + results = []; + // Save the current indentation level and indent one additional level. + prefix = indentation; + indentation += whitespace; + if (className == arrayClass) { + // Recursively serialize array elements. + for (index = 0, length = value.length; index < length; index++) { + element = serialize(index, value, callback, properties, whitespace, indentation, stack); + results.push(element === undef ? "null" : element); + } + result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]"; + } else { + // Recursively serialize object members. Members are selected from + // either a user-specified list of property names, or the object + // itself. + forEach(properties || value, function (property) { + var element = serialize(property, value, callback, properties, whitespace, indentation, stack); + if (element !== undef) { + // According to ES 5.1 section 15.12.3: "If `gap` {whitespace} + // is not the empty string, let `member` {quote(property) + ":"} + // be the concatenation of `member` and the `space` character." + // The "`space` character" refers to the literal space + // character, not the `space` {width} argument provided to + // `JSON.stringify`. + results.push(quote(property) + ":" + (whitespace ? " " : "") + element); + } + }); + result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}"; + } + // Remove the object from the traversed object stack. + stack.pop(); + return result; + } + }; + + // Public: `JSON.stringify`. See ES 5.1 section 15.12.3. + exports.stringify = function (source, filter, width) { + var whitespace, callback, properties, className; + if (objectTypes[typeof filter] && filter) { + if ((className = getClass.call(filter)) == functionClass) { + callback = filter; + } else if (className == arrayClass) { + // Convert the property names array into a makeshift set. + properties = {}; + for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1)); + } + } + if (width) { + if ((className = getClass.call(width)) == numberClass) { + // Convert the `width` to an integer and create a string containing + // `width` number of space characters. + if ((width -= width % 1) > 0) { + for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " "); + } + } else if (className == stringClass) { + whitespace = width.length <= 10 ? width : width.slice(0, 10); + } + } + // Opera <= 7.54u2 discards the values associated with empty string keys + // (`""`) only if they are used directly within an object member list + // (e.g., `!("" in { "": 1})`). + return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []); + }; } - return ret; - }, - canonicalize: canonicalize - }; + // Public: Parses a JSON source string. + if (!has("json-parse")) { + var fromCharCode = String.fromCharCode; + + // Internal: A map of escaped control characters and their unescaped + // equivalents. + var Unescapes = { + 92: "\\", + 34: '"', + 47: "/", + 98: "\b", + 116: "\t", + 110: "\n", + 102: "\f", + 114: "\r" + }; - /*istanbul ignore next */ - /*global module */ - if (typeof module !== 'undefined' && module.exports) { - module.exports = JsDiff; - } else if (typeof define === 'function' && define.amd) { - /*global define */ - define([], function() { return JsDiff; }); - } else if (typeof global.JsDiff === 'undefined') { - global.JsDiff = JsDiff; - } -}(this)); + // Internal: Stores the parser state. + var Index, Source; -},{}],49:[function(require,module,exports){ -'use strict'; + // Internal: Resets the parser state and throws a `SyntaxError`. + var abort = function () { + Index = Source = null; + throw SyntaxError(); + }; -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + // Internal: Returns the next token, or `"$"` if the parser has reached + // the end of the source string. A token may be a string, number, `null` + // literal, or Boolean literal. + var lex = function () { + var source = Source, length = source.length, value, begin, position, isSigned, charCode; + while (Index < length) { + charCode = source.charCodeAt(Index); + switch (charCode) { + case 9: case 10: case 13: case 32: + // Skip whitespace tokens, including tabs, carriage returns, line + // feeds, and space characters. + Index++; + break; + case 123: case 125: case 91: case 93: case 58: case 44: + // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at + // the current position. + value = charIndexBuggy ? source.charAt(Index) : source[Index]; + Index++; + return value; + case 34: + // `"` delimits a JSON string; advance to the next character and + // begin parsing the string. String tokens are prefixed with the + // sentinel `@` character to distinguish them from punctuators and + // end-of-string tokens. + for (value = "@", Index++; Index < length;) { + charCode = source.charCodeAt(Index); + if (charCode < 32) { + // Unescaped ASCII control characters (those with a code unit + // less than the space character) are not permitted. + abort(); + } else if (charCode == 92) { + // A reverse solidus (`\`) marks the beginning of an escaped + // control character (including `"`, `\`, and `/`) or Unicode + // escape sequence. + charCode = source.charCodeAt(++Index); + switch (charCode) { + case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114: + // Revive escaped control characters. + value += Unescapes[charCode]; + Index++; + break; + case 117: + // `\u` marks the beginning of a Unicode escape sequence. + // Advance to the first character and validate the + // four-digit code point. + begin = ++Index; + for (position = Index + 4; Index < position; Index++) { + charCode = source.charCodeAt(Index); + // A valid sequence comprises four hexdigits (case- + // insensitive) that form a single hexadecimal value. + if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) { + // Invalid Unicode escape sequence. + abort(); + } + } + // Revive the escaped character. + value += fromCharCode("0x" + source.slice(begin, Index)); + break; + default: + // Invalid escape sequence. + abort(); + } + } else { + if (charCode == 34) { + // An unescaped double-quote character marks the end of the + // string. + break; + } + charCode = source.charCodeAt(Index); + begin = Index; + // Optimize for the common case where a string is valid. + while (charCode >= 32 && charCode != 92 && charCode != 34) { + charCode = source.charCodeAt(++Index); + } + // Append the string as-is. + value += source.slice(begin, Index); + } + } + if (source.charCodeAt(Index) == 34) { + // Advance to the next character and return the revived string. + Index++; + return value; + } + // Unterminated string. + abort(); + default: + // Parse numbers and literals. + begin = Index; + // Advance past the negative sign, if one is specified. + if (charCode == 45) { + isSigned = true; + charCode = source.charCodeAt(++Index); + } + // Parse an integer or floating-point value. + if (charCode >= 48 && charCode <= 57) { + // Leading zeroes are interpreted as octal literals. + if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) { + // Illegal octal literal. + abort(); + } + isSigned = false; + // Parse the integer component. + for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++); + // Floats cannot contain a leading decimal point; however, this + // case is already accounted for by the parser. + if (source.charCodeAt(Index) == 46) { + position = ++Index; + // Parse the decimal component. + for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + if (position == Index) { + // Illegal trailing decimal. + abort(); + } + Index = position; + } + // Parse exponents. The `e` denoting the exponent is + // case-insensitive. + charCode = source.charCodeAt(Index); + if (charCode == 101 || charCode == 69) { + charCode = source.charCodeAt(++Index); + // Skip past the sign following the exponent, if one is + // specified. + if (charCode == 43 || charCode == 45) { + Index++; + } + // Parse the exponential component. + for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + if (position == Index) { + // Illegal empty exponent. + abort(); + } + Index = position; + } + // Coerce the parsed value to a JavaScript number. + return +source.slice(begin, Index); + } + // A negative sign may only precede numbers. + if (isSigned) { + abort(); + } + // `true`, `false`, and `null` literals. + if (source.slice(Index, Index + 4) == "true") { + Index += 4; + return true; + } else if (source.slice(Index, Index + 5) == "false") { + Index += 5; + return false; + } else if (source.slice(Index, Index + 4) == "null") { + Index += 4; + return null; + } + // Unrecognized token. + abort(); + } + } + // Return the sentinel `$` character if the parser has reached the end + // of the source string. + return "$"; + }; -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } + // Internal: Parses a JSON `value` token. + var get = function (value) { + var results, hasMembers; + if (value == "$") { + // Unexpected end of input. + abort(); + } + if (typeof value == "string") { + if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") { + // Remove the sentinel `@` character. + return value.slice(1); + } + // Parse object and array literals. + if (value == "[") { + // Parses a JSON array, returning a new JavaScript array. + results = []; + for (;; hasMembers || (hasMembers = true)) { + value = lex(); + // A closing square bracket marks the end of the array literal. + if (value == "]") { + break; + } + // If the array literal contains elements, the current token + // should be a comma separating the previous element from the + // next. + if (hasMembers) { + if (value == ",") { + value = lex(); + if (value == "]") { + // Unexpected trailing `,` in array literal. + abort(); + } + } else { + // A `,` must separate each array element. + abort(); + } + } + // Elisions and leading commas are not permitted. + if (value == ",") { + abort(); + } + results.push(get(value)); + } + return results; + } else if (value == "{") { + // Parses a JSON object, returning a new JavaScript object. + results = {}; + for (;; hasMembers || (hasMembers = true)) { + value = lex(); + // A closing curly brace marks the end of the object literal. + if (value == "}") { + break; + } + // If the object literal contains members, the current token + // should be a comma separator. + if (hasMembers) { + if (value == ",") { + value = lex(); + if (value == "}") { + // Unexpected trailing `,` in object literal. + abort(); + } + } else { + // A `,` must separate each object member. + abort(); + } + } + // Leading commas are not permitted, object property names must be + // double-quoted strings, and a `:` must separate each property + // name and value. + if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") { + abort(); + } + results[value.slice(1)] = get(lex()); + } + return results; + } + // Unexpected token encountered. + abort(); + } + return value; + }; - return str.replace(matchOperatorsRe, '\\$&'); -}; + // Internal: Updates a traversed object member. + var update = function (source, property, callback) { + var element = walk(source, property, callback); + if (element === undef) { + delete source[property]; + } else { + source[property] = element; + } + }; -},{}],50:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + // Internal: Recursively traverses a parsed JSON object, invoking the + // `callback` function for each value. This is an implementation of the + // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2. + var walk = function (source, property, callback) { + var value = source[property], length; + if (typeof value == "object" && value) { + // `forEach` can't be used to traverse an array in Opera <= 8.54 + // because its `Object#hasOwnProperty` implementation returns `false` + // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`). + if (getClass.call(value) == arrayClass) { + for (length = value.length; length--;) { + update(value, length, callback); + } + } else { + forEach(value, function (property) { + update(value, property, callback); + }); + } + } + return callback.call(source, property, value); + }; + + // Public: `JSON.parse`. See ES 5.1 section 15.12.2. + exports.parse = function (source, callback) { + var result, value; + Index = 0; + Source = "" + source; + result = get(lex()); + // If a JSON string contains multiple tokens, it is invalid. + if (lex() != "$") { + abort(); + } + // Reset the parser state. + Index = Source = null; + return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result; + }; + } + } + + exports["runInContext"] = runInContext; + return exports; + } + + if (freeExports && !isLoader) { + // Export for CommonJS environments. + runInContext(root, freeExports); + } else { + // Export for web browsers and JavaScript engines. + var nativeJSON = root.JSON, + previousJSON = root["JSON3"], + isRestored = false; + + var JSON3 = runInContext(root, (root["JSON3"] = { + // Public: Restores the original value of the global `JSON` object and + // returns a reference to the `JSON3` object. + "noConflict": function () { + if (!isRestored) { + isRestored = true; + root.JSON = nativeJSON; + root["JSON3"] = previousJSON; + nativeJSON = previousJSON = null; + } + return JSON3; + } + })); -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; + root.JSON = { + "parse": JSON3.parse, + "stringify": JSON3.stringify + }; + } -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; + // Export for asynchronous module loaders. + if (isLoader) { + define(function () { + return JSON3; + }); + } +}).call(this); -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],57:[function(require,module,exports){ +/** + * lodash 3.2.0 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var baseCopy = require('lodash._basecopy'), + keys = require('lodash.keys'); -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; -}; +module.exports = baseAssign; -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; +},{"lodash._basecopy":58,"lodash.keys":65}],58:[function(require,module,exports){ +/** + * lodash 3.0.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - if (!this._events) - this._events = {}; +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } - throw TypeError('Uncaught, unspecified "error" event.'); - } + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; } + return object; +} - handler = this._events[type]; +module.exports = baseCopy; - if (isUndefined(handler)) - return false; +},{}],59:[function(require,module,exports){ +/** + * lodash 3.0.3 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; -}; + return result || {}; + }; +}()); -EventEmitter.prototype.addListener = function(type, listener) { - var m; +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} - if (!isFunction(listener)) - throw TypeError('listener must be a function'); +module.exports = baseCreate; - if (!this._events) - this._events = {}; +},{}],60:[function(require,module,exports){ +/** + * lodash 3.9.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } +/** Used for native method references. */ +var objectProto = Object.prototype; - return this; -}; +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; -EventEmitter.prototype.on = EventEmitter.prototype.addListener; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; - var fired = false; +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); - function g() { - this.removeListener(type, g); +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} - g.listener = listener; - this.on(type, g); +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} - return this; -}; +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; +module.exports = getNative; - if (!isFunction(listener)) - throw TypeError('listener must be a function'); +},{}],61:[function(require,module,exports){ +/** + * lodash 3.0.9 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - if (!this._events || !this._events[type]) - return this; +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; - list = this._events[type]; - length = list.length; - position = -1; +/** + * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); - if (position < 0) - return this; +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} - if (this._events.removeListener) - this.emit('removeListener', type, listener); +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} - return this; -}; +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; +module.exports = isIterateeCall; - if (!this._events) - return this; +},{}],62:[function(require,module,exports){ +/** + * lodash 3.1.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var baseAssign = require('lodash._baseassign'), + baseCreate = require('lodash._basecreate'), + isIterateeCall = require('lodash._isiterateecall'); - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; } + return properties ? baseAssign(result, properties) : result; +} - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } +module.exports = create; - listeners = this._events[type]; +},{"lodash._baseassign":57,"lodash._basecreate":59,"lodash._isiterateecall":61}],63:[function(require,module,exports){ +/** + * lodash 3.0.8 (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright 2012-2016 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; - return this; -}; +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]'; -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; -}; +/** Used for built-in method references. */ +var objectProto = Object.prototype; -EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; -}; +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; -EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); -}; +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; -function isFunction(arg) { - return typeof arg === 'function'; +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; } -function isNumber(arg) { - return typeof arg === 'number'; -} +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); -function isObject(arg) { - return typeof arg === 'object' && arg !== null; +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); } -function isUndefined(arg) { - return arg === void 0; +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)) && !isFunction(value); } -},{}],51:[function(require,module,exports){ -(function (process){ -// Growl - Copyright TJ Holowaychuk (MIT Licensed) - /** - * Module dependencies. + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} -var exec = require('child_process').exec - , fs = require('fs') - , path = require('path') - , exists = fs.existsSync || path.existsSync - , os = require('os') - , quote = JSON.stringify - , cmd; - -function which(name) { - var paths = process.env.PATH.split(':'); - var loc; +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8 which returns 'object' for typed array and weak map constructors, + // and PhantomJS 1.9 which returns 'function' for `NodeList` instances. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} - for (var i = 0, len = paths.length; i < len; ++i) { - loc = path.join(paths[i], name); - if (exists(loc)) return loc; - } +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } -switch(os.type()) { - case 'Darwin': - if (which('terminal-notifier')) { - cmd = { - type: "Darwin-NotificationCenter" - , pkg: "terminal-notifier" - , msg: '-message' - , title: '-title' - , subtitle: '-subtitle' - , icon: '-appIcon' - , sound: '-sound' - , url: '-open' - , priority: { - cmd: '-execute' - , range: [] - } - }; - } else { - cmd = { - type: "Darwin-Growl" - , pkg: "growlnotify" - , msg: '-m' - , sticky: '--sticky' - , priority: { - cmd: '--priority' - , range: [ - -2 - , -1 - , 0 - , 1 - , 2 - , "Very Low" - , "Moderate" - , "Normal" - , "High" - , "Emergency" - ] - } - }; - } - break; - case 'Linux': - if (which('growl')) { - cmd = { - type: "Linux-Growl" - , pkg: "growl" - , msg: '-m' - , title: '-title' - , subtitle: '-subtitle' - , host: { - cmd: '-H' - , hostname: '192.168.33.1' - } - }; - } else { - cmd = { - type: "Linux" - , pkg: "notify-send" - , msg: '' - , sticky: '-t 0' - , icon: '-i' - , priority: { - cmd: '-u' - , range: [ - "low" - , "normal" - , "critical" - ] - } - }; - } - break; - case 'Windows_NT': - cmd = { - type: "Windows" - , pkg: "growlnotify" - , msg: '' - , sticky: '/s:true' - , title: '/t:' - , icon: '/i:' - , url: '/cu:' - , priority: { - cmd: '/p:' - , range: [ - -2 - , -1 - , 0 - , 1 - , 2 - ] - } - }; - break; +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); } /** - * Expose `growl`. + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} -exports = module.exports = growl; +module.exports = isArguments; +},{}],64:[function(require,module,exports){ /** - * Node-growl version. + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license */ -exports.version = '1.4.1' +/** `Object#toString` result references. */ +var arrayTag = '[object Array]', + funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; /** - * Send growl notification _msg_ with _options_. - * - * Options: + * Checks if `value` is object-like. * - * - title Notification title - * - sticky Make the notification stick (defaults to false) - * - priority Specify an int or named key (default is 0) - * - name Application name (defaults to growlnotify) - * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x - * - image - * - path to an icon sets --iconpath - * - path to an image sets --image - * - capitalized word sets --appIcon - * - filename uses extname as --icon - * - otherwise treated as --icon + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Gets the native function at `key` of `object`. * - * Examples: + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a valid array-like length. * - * growl('New email') - * growl('5 new emails', { title: 'Thunderbird' }) - * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' }) - * growl('Email sent', function(){ - * // ... notification sent - * }) + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). * - * @param {string} msg - * @param {object} options - * @param {function} fn - * @api public + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} -function growl(msg, options, fn) { - var image - , args - , options = options || {} - , fn = fn || function(){}; +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; - if (options.exec) { - cmd = { - type: "Custom" - , pkg: options.exec - , range: [] - }; - } +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} - // noop - if (!cmd) return fn(new Error('growl not supported on this platform')); - args = [cmd.pkg]; +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} - // image - if (image = options.image) { - switch(cmd.type) { - case 'Darwin-Growl': - var flag, ext = path.extname(image).substr(1) - flag = flag || ext == 'icns' && 'iconpath' - flag = flag || /^[A-Z]/.test(image) && 'appIcon' - flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' - flag = flag || ext && (image = ext) && 'icon' - flag = flag || 'icon' - args.push('--' + flag, quote(image)) - break; - case 'Darwin-NotificationCenter': - args.push(cmd.icon, quote(image)); - break; - case 'Linux': - args.push(cmd.icon, quote(image)); - // libnotify defaults to sticky, set a hint for transient notifications - if (!options.sticky) args.push('--hint=int:transient:1'); - break; - case 'Windows': - args.push(cmd.icon + quote(image)); - break; - } +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; } - - // sticky - if (options.sticky) args.push(cmd.sticky); - - // priority - if (options.priority) { - var priority = options.priority + ''; - var checkindexOf = cmd.priority.range.indexOf(priority); - if (~cmd.priority.range.indexOf(priority)) { - args.push(cmd.priority, options.priority); - } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); } + return isObjectLike(value) && reIsHostCtor.test(value); +} - //sound - if(options.sound && cmd.type === 'Darwin-NotificationCenter'){ - args.push(cmd.sound, options.sound) - } +module.exports = isArray; - // name - if (options.name && cmd.type === "Darwin-Growl") { - args.push('--name', options.name); - } +},{}],65:[function(require,module,exports){ +/** + * lodash 3.1.2 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var getNative = require('lodash._getnative'), + isArguments = require('lodash.isarguments'), + isArray = require('lodash.isarray'); - switch(cmd.type) { - case 'Darwin-Growl': - args.push(cmd.msg); - args.push(quote(msg).replace(/\\n/g, '\n')); - if (options.title) args.push(quote(options.title)); - break; - case 'Darwin-NotificationCenter': - args.push(cmd.msg); - var stringifiedMsg = quote(msg); - var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n'); - args.push(escapedMsg); - if (options.title) { - args.push(cmd.title); - args.push(quote(options.title)); - } - if (options.subtitle) { - args.push(cmd.subtitle); - args.push(quote(options.subtitle)); - } - if (options.url) { - args.push(cmd.url); - args.push(quote(options.url)); - } - break; - case 'Linux-Growl': - args.push(cmd.msg); - args.push(quote(msg).replace(/\\n/g, '\n')); - if (options.title) args.push(quote(options.title)); - if (cmd.host) { - args.push(cmd.host.cmd, cmd.host.hostname) - } - break; - case 'Linux': - if (options.title) { - args.push(quote(options.title)); - args.push(cmd.msg); - args.push(quote(msg).replace(/\\n/g, '\n')); - } else { - args.push(quote(msg).replace(/\\n/g, '\n')); - } - break; - case 'Windows': - args.push(quote(msg).replace(/\\n/g, '\n')); - if (options.title) args.push(cmd.title + quote(options.title)); - if (options.url) args.push(cmd.url + quote(options.url)); - break; - case 'Custom': - args[0] = (function(origCommand) { - var message = options.title - ? options.title + ': ' + msg - : msg; - var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message)); - if (command === origCommand) args.push(quote(message)); - return command; - })(args[0]); - break; - } +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; - // execute - exec(args.join(' '), fn); -}; +/** Used for native method references. */ +var objectProto = Object.prototype; -}).call(this,require('_process')) -},{"_process":58,"child_process":43,"fs":43,"os":56,"path":43}],52:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - i += d +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; } -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} - value = Math.abs(value) +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); } } + return result; +} - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); } -},{}],53:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); } -} + return isObject(object) ? nativeKeys(object) : []; +}; -},{}],54:[function(require,module,exports){ /** - * Determine if an object is Buffer + * Creates an array of the own and inherited enumerable property names of `object`. * - * Author: Feross Aboukhadijeh - * License: MIT + * **Note:** Non-object values are coerced to objects. * - * `npm install is-buffer` + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; -module.exports = function (obj) { - return !!(obj != null && - (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) - (obj.constructor && - typeof obj.constructor.isBuffer === 'function' && - obj.constructor.isBuffer(obj)) - )) + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; } -},{}],55:[function(require,module,exports){ +module.exports = keys; + +},{"lodash._getnative":60,"lodash.isarguments":63,"lodash.isarray":64}],66:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); @@ -10158,7 +12412,7 @@ mkdirP.sync = function sync (p, opts, made) { }; }).call(this,require('_process')) -},{"_process":58,"fs":43,"path":43}],56:[function(require,module,exports){ +},{"_process":69,"fs":42,"path":42}],67:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -10205,7 +12459,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],57:[function(require,module,exports){ +},{}],68:[function(require,module,exports){ (function (process){ 'use strict'; @@ -10252,10 +12506,15 @@ function nextTick(fn, arg1, arg2, arg3) { } }).call(this,require('_process')) -},{"_process":58}],58:[function(require,module,exports){ +},{"_process":69}],69:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it don't break things. +var cachedSetTimeout = setTimeout; +var cachedClearTimeout = clearTimeout; + var queue = []; var draining = false; var currentQueue; @@ -10280,7 +12539,7 @@ function drainQueue() { if (draining) { return; } - var timeout = setTimeout(cleanUpNextTick); + var timeout = cachedSetTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -10297,7 +12556,7 @@ function drainQueue() { } currentQueue = null; draining = false; - clearTimeout(timeout); + cachedClearTimeout(timeout); } process.nextTick = function (fun) { @@ -10309,7 +12568,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); + cachedSetTimeout(drainQueue, 0); } }; @@ -10348,141 +12607,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],59:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":50,"inherits":53,"readable-stream/duplex.js":61,"readable-stream/passthrough.js":67,"readable-stream/readable.js":68,"readable-stream/transform.js":69,"readable-stream/writable.js":70}],60:[function(require,module,exports){ -arguments[4][46][0].apply(exports,arguments) -},{"dup":46}],61:[function(require,module,exports){ +},{}],70:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":62}],62:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":71}],71:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -10558,7 +12686,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":64,"./_stream_writable":66,"core-util-is":47,"inherits":53,"process-nextick-args":57}],63:[function(require,module,exports){ +},{"./_stream_readable":73,"./_stream_writable":75,"core-util-is":48,"inherits":53,"process-nextick-args":68}],72:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -10585,7 +12713,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":65,"core-util-is":47,"inherits":53}],64:[function(require,module,exports){ +},{"./_stream_transform":74,"core-util-is":48,"inherits":53}],73:[function(require,module,exports){ (function (process){ 'use strict'; @@ -11481,7 +13609,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":62,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":47,"events":50,"inherits":53,"isarray":60,"process-nextick-args":57,"string_decoder/":71,"util":41}],65:[function(require,module,exports){ +},{"./_stream_duplex":71,"_process":69,"buffer":43,"buffer-shims":47,"core-util-is":48,"events":45,"inherits":53,"isarray":55,"process-nextick-args":68,"string_decoder/":80,"util":40}],74:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -11662,7 +13790,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":62,"core-util-is":47,"inherits":53}],66:[function(require,module,exports){ +},{"./_stream_duplex":71,"core-util-is":48,"inherits":53}],75:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -12191,10 +14319,10 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":62,"_process":58,"buffer":45,"buffer-shims":44,"core-util-is":47,"events":50,"inherits":53,"process-nextick-args":57,"util-deprecate":73}],67:[function(require,module,exports){ +},{"./_stream_duplex":71,"_process":69,"buffer":43,"buffer-shims":47,"core-util-is":48,"events":45,"inherits":53,"process-nextick-args":68,"util-deprecate":82}],76:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":63}],68:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":72}],77:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -12214,13 +14342,13 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":62,"./lib/_stream_passthrough.js":63,"./lib/_stream_readable.js":64,"./lib/_stream_transform.js":65,"./lib/_stream_writable.js":66,"_process":58}],69:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":71,"./lib/_stream_passthrough.js":72,"./lib/_stream_readable.js":73,"./lib/_stream_transform.js":74,"./lib/_stream_writable.js":75,"_process":69}],78:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":65}],70:[function(require,module,exports){ +},{"./lib/_stream_transform.js":74}],79:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":66}],71:[function(require,module,exports){ +},{"./lib/_stream_writable.js":75}],80:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -12443,7 +14571,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":45}],72:[function(require,module,exports){ +},{"buffer":43}],81:[function(require,module,exports){ /** * Expose `toIsoString`. @@ -12484,7 +14612,7 @@ function pad (number) { var n = number.toString(); return n.length === 1 ? '0' + n : n; } -},{}],73:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ (function (global){ /** @@ -12555,14 +14683,14 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],74:[function(require,module,exports){ +},{}],83:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],75:[function(require,module,exports){ +},{}],84:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -13152,4 +15280,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":74,"_process":58,"inherits":53}]},{},[1]); +},{"./support/isBuffer":83,"_process":69,"inherits":53}]},{},[1]); From 925ce9fe829132ab1a95524aaeba5e44ad78345c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 13:29:17 -0700 Subject: [PATCH 0562/1771] Release v3.0.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d1f886440..fbbc8974e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "2.5.3", + "version": "3.0.0-0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From d08b82f4364993e246cecf159c1db8a532d20ae2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 3 Jul 2016 13:40:52 -0700 Subject: [PATCH 0563/1771] drop component support; closes #2269 --- component.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 component.json diff --git a/component.json b/component.json deleted file mode 100644 index 2f9246fbcd..0000000000 --- a/component.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "mocha", - "version": "2.4.0", - "repo": "mochajs/mocha", - "description": "simple, flexible, fun test framework", - "keywords": [ - "mocha", - "test", - "bdd", - "tdd", - "tap" - ], - "main": "mocha.js", - "scripts": [ - "mocha.js" - ], - "styles": [ - "mocha.css" - ] -} \ No newline at end of file From c59c0431060378bd97614cf9fbc5d94ebc439019 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 5 Jul 2016 00:02:06 -0700 Subject: [PATCH 0564/1771] revert changes that broke a regression test fixture --- test/integration/fixtures/regression/issue-1991.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/integration/fixtures/regression/issue-1991.js b/test/integration/fixtures/regression/issue-1991.js index 7c1eb19b5f..96860332a2 100644 --- a/test/integration/fixtures/regression/issue-1991.js +++ b/test/integration/fixtures/regression/issue-1991.js @@ -38,6 +38,8 @@ for (var i = 0; i < numOfTests; i += 1) { }); it('access a variable via a closure', function () { + // slow performance on older node.js versions + this.timeout(1000); closureVar = new MemoryLeak(); }); From 47cb3bb10e462a13da98284af5d0a1cc5a261a7d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 5 Jul 2016 00:49:17 -0700 Subject: [PATCH 0565/1771] update contributors [ci skip] - used [update-contributors](https://www.npmjs.com/package/update-contributors), sorted ascending case-insensitive; removed dupes --- package.json | 560 +++++++++++++++++++++++++-------------------------- 1 file changed, 272 insertions(+), 288 deletions(-) diff --git a/package.json b/package.json index fbbc8974e8..2a284eb289 100644 --- a/package.json +++ b/package.json @@ -11,294 +11,278 @@ ], "author": "TJ Holowaychuk ", "contributors": [ - "TJ Holowaychuk ", - "Travis Jeffery ", - "Christopher Hiller ", - "Daniel St. Jules ", - "Joshua Appelman ", - "David da Silva Contín ", - "Guillermo Rauch ", - "Ariel Mashraki ", - "Attila Domokos ", - "John Firebaugh ", - "Jo Liss ", - "Nathan Rajlich ", - "Nathan Houle ", - "Mike Pennisi ", - "James Carr ", - "Brendan Nee ", - "Glen Mailer ", - "Mislav Marohnić ", - "Aaron Heckmann ", - "Ryunosuke SATO ", - "Jonathan Ong ", - "Joshua Krall ", - "Maximilian Antoni ", - "hokaccha ", - "Domenic Denicola ", - "Forbes Lindesay ", - "Raynos ", - "Xavier Antoviaque ", - "Andreas Lind Petersen ", - "Ben Lindsey ", - "Mathieu Desvé ", - "Fredrik Enestad ", - "Rico Sta. Cruz ", - "Paul Miller ", - "Ben Bradley ", - "fool2fish ", - "Cory Thomas ", - "Sune Simonsen ", - "Michael Demmer ", - "Tyson Tate ", - "eiji.ienaga ", - "Valentin Agachi ", - "Sindre Sorhus ", - "Merrick Christensen ", - "Wil Moore III ", - "Nathan Bowser ", - "Jesse Dailey ", - "Benjie Gillam ", - "Vlad Magdalin ", - "David Henderson ", - "Long Ho ", - "Adam Gruber ", - "Sean Lang ", - "Shawn Krisman ", - "Simon Gaeremynck ", - "John Reeves ", - "Soel ", - "Buck Doyle ", - "Max Goodman ", - "Jonas Westerlund ", - "Michael Riley ", - "Ian Storm Taylor ", - "Timo Tijhof ", - "Ian W. Remmel ", - "Tobias Bieniek ", - "Arian Stolwijk ", - "Nathan Alderson ", - "Brian Beck ", - "Dominique Quatravaux ", - "Xavier Damman ", - "Benjamin Eidelman ", - "Outsider ", - "fcrisci ", - "FARKAS Máté ", - "Parker Moore ", - "Paul Armstrong ", - "jsdevel ", - "Justin DuJardin ", - "Juzer Ali ", - "Jacob Wejendorp ", - "monowerker ", - "Alexander Early ", - "Quang Van ", - "Quanlong He ", - "James Nylen ", - "Konstantin Käfer ", - "Jordan Sexton ", - "Josh Lory ", - "Julien Wajsberg ", - "Jussi Virtanen ", - "Jérémie Astori ", - "Katie Gengler ", - "Keith Cirkel ", - "Kent C. Dodds ", - "Kevin Burke ", - "Kevin Conway ", - "Kevin Kirsche ", - "Kirill Korolyov ", - "Koen Punt ", - "Kris Rasmussen ", - "Kyle Mitchell ", - "Laszlo Bacsi ", - "Liam Newman ", - "Linus Unnebäck ", - "Maciej Małecki ", - "Mal Graty ", - "Marc Kuo ", - "Marcello Bastea-Forte ", - "Mark Banner ", - "Martin Marko ", - "Matija Marohnić ", - "Matt Robenolt ", - "Matt Smith ", - "Matthew Shanley ", - "Mattias Tidlund ", - "Michael Jackson ", - "Michael Olson ", - "Michael Schoonmaker ", - "Michal Charemza ", - "Moshe Kolodny ", - "Nathan Black ", - "Nick Fitzgerald ", - "Nicolo Taddei ", - "Noshir Patel ", - "OlegTsyba ", - "Panu Horsmalahti ", - "Pavel Zubkou ", - "Pete Hawkins ", - "Phil Sung ", - "Prayag Verma ", - "R56 ", - "Refael Ackermann ", - "Richard Dingwall ", - "Richard Knop ", - "Rob Raux ", - "Rob Wu ", - "Robert Rossmann ", - "Romain Prieto ", - "Roman Neuhauser ", - "Roman Shtylman ", - "Russ Bradberry ", - "Russell Munson ", - "Rustem Mustafin ", - "Ryan Hubbard ", - "Ryan Shaw ", - "Salehen Shovon Rahman ", - "Sam Mussell ", - "Sasha Koss ", - "ScottFreeCode ", - "Seiya Konno ", - "Sergey Simonchik ", - "Sergio Santoro ", - "Shaine Hatch ", - "Simon Goumaz ", - "Sorin Iclanzan ", - "Standa Opichal ", - "Stephen Mathieson ", - "Steve Mason ", - "Stewart Taylor ", - "Stone ", - "Tapiwa Kelvin ", - "Teddy Zeenny ", - "Thedark1337 ", - "Tim Ehat ", - "Tingan Ho ", - "Todd Agulnick ", - "Tom Coquereau ", - "Tom Hughes ", - "Vadim Nikitin ", - "Victor Costan ", - "Will Langstroth ", - "Yanis Wang ", - "Yuest Wang ", - "Zsolt Takács ", - "abrkn ", - "airportyh ", - "amsul ", - "badunk ", - "claudyus ", - "fengmk2 ", - "gaye ", - "gigadude ", - "grasGendarme ", - "klaemo ", - "lakmeer ", - "lodr ", - "mrShturman ", - "nexdrew ", - "nishigori ", - "omardelarosa ", - "qiuzuhui ", - "ryym ", - "samuel goldszmidt ", - "sebv ", - "slyg ", - "startswithaj ", - "tgautier@yahoo.com ", - "tmont ", - "traleig1 ", - "vlad ", - "wsw ", - "yuitest ", - "Aaron Hamid ", - "zhiyelee ", - "Aaron Krause ", - "Adam Crabtree ", - "Adrian Ludwig ", - "Ajay Kodali ", - "Andreas Brekken ", - "Andrew Nesbitt ", - "Andrey Popp <8mayday@gmail.com>", - "Andrii Shumada ", - "Anis Safine ", - "Arnaud Brousseau ", - "Atsuya Takagi ", - "Austin Birch ", - "Ben Noordhuis ", - "Ben Vinegar ", - "Benoit Larroque ", - "Benoît Zugmeyer ", - "Berker Peksag ", - "Bjørge Næss ", - "Brian Lalor ", - "Brian M. Carlson ", - "Brian Moore ", - "Bryan Donovan ", - "C. Scott Ananian ", - "Casey Foster ", - "Charles Lowell ", - "Chris Buckley ", - "ChrisWren ", - "Connor Dunn ", - "Corey Butler ", - "Daniel Stockman ", - "Dave McKenna ", - "Denis Bardadym ", - "Devin Weaver ", - "Di Wu ", - "Diogo Monteiro ", - "Dmitry Shirokov ", - "Dominic Barnes ", - "Douglas Christopher Wilson ", - "Duncan Beevers ", - "Fede Ramirez ", - "Fedor Indutny ", - "Florian Margaine ", - "Frederico Silva ", - "Fredrik Lindin ", - "Gabriel Silk ", - "Gareth Murphy ", - "Gavin Mogan ", - "Giovanni Bassi ", - "Glen Huang ", - "Greg Perkins ", - "Guy Arye ", - "Gyandeep Singh ", - "Harish ", - "Harry Brundage ", - "Herman Junge ", - "Ian Young ", - "Ian Zamojc ", - "Ivan ", - "JP Bochi ", - "Jaakko Salonen ", - "Jake Craige ", - "Jake Marsh ", - "Jakub Nešetřil ", - "James Bowes ", - "James G. Kim ", - "James Lal ", - "Jan Kopriva ", - "Jason Barry ", - "Jason Lai ", - "Javier Aranda ", - "Jean Ponchon ", - "Jeff Kunkle ", - "Jeff Schilling ", - "Jeremy Martin ", - "Jimmy Cuadra ", - "Joao Moreno ", - "Joey Cozza ", - "John Doty ", - "Johnathon Sanders ", - "Jonas Dohse ", - "Jonathan Creamer ", - "Jonathan Delgado ", - "Jonathan Kim ", - "Jonathan Park " + "aaroncrows (https://github.com/aaroncrows)", + "Aaron Hamid (https://github.com/ahamid)", + "Aaron Heckmann (https://github.com/aheckmann)", + "Adam Crabtree (CrabDude's alias) (https://github.com/CrabBot)", + "Adam Gruber (https://github.com/adamgruber)", + "Adrian Ludwig (https://github.com/adrian-ludwig)", + "Ainthe Kitchen (https://github.com/ainthek)", + "ajaykodali (https://github.com/ajaykodali)", + "Alex Early (https://github.com/aearly)", + "Alex Pham (https://github.com/thedark1337)", + "amsul (https://github.com/amsul)", + "Andreas Brekken (https://github.com/abrkn)", + "Andreas Lind (https://github.com/papandreou)", + "Andrew Miller (https://github.com/vnikiti)", + "Andrew Nesbitt (https://github.com/andrew)", + "Andrey Popp <8mayday@gmail.com> (https://github.com/andreypopp)", + "Andrii Shumada (https://github.com/eagleeye)", + "Anis Safine (https://github.com/anis)", + "Arian Stolwijk (https://github.com/arian)", + "Ariel Mashraki (https://github.com/a8m)", + "Arnaud Brousseau (https://github.com/ArnaudBrousseau)", + "Atsuya Takagi (https://github.com/atsuya)", + "Attila Domokos (https://github.com/adomokos)", + "Austin Birch (https://github.com/austinbirch)", + "Avi Vahl (https://github.com/AviVahl)", + "Ben Bradley (https://github.com/ben-bradley)", + "beneidel (https://github.com/beneidel)", + "Benjie Gillam (https://github.com/benjie)", + "Ben Noordhuis (https://github.com/bnoordhuis)", + "Benoit Larroque (https://github.com/zetaben)", + "Benoît Zugmeyer (https://github.com/BenoitZugmeyer)", + "Ben Vinegar (https://github.com/benvinegar)", + "Berker Peksag (https://github.com/berkerpeksag)", + "Bjørge Næss (https://github.com/bjoerge)", + "Brendan Nee (https://github.com/brendannee)", + "Brian Beck (https://github.com/exogen)", + "Brian C (https://github.com/brianc)", + "Brian Lalor (https://github.com/blalor)", + "Brian Moore (https://github.com/bionicbrian)", + "Bryan Donovan (https://github.com/BryanDonovan)", + "Buck Doyle (https://github.com/backspace)", + "C. Scott Ananian (https://github.com/cscott)", + "Casey Foster (https://github.com/caseywebdev)", + "Charles Lowell (https://github.com/cowboyd)", + "Chris Buckley (https://github.com/cmbuckley)", + "Christopher Hiller (https://github.com/boneskull)", + "Chris Wren (https://github.com/ChrisWren)", + "Clemens Stolle (https://github.com/klaemo)", + "Connor Dunn (https://github.com/Connorhd)", + "Corey Butler (https://github.com/coreybutler)", + "Cory Thomas (https://github.com/dump247)", + "cybertk (https://github.com/cybertk)", + "Daniel Ericsson (https://github.com/monowerker)", + "Daniel St. Jules (https://github.com/danielstjules)", + "Daniel Stockman (https://github.com/evocateur)", + "Dave McKenna (https://github.com/davemckenna01)", + "David da Silva (https://github.com/dasilvacontin)", + "David Henderson (https://github.com/dhendo)", + "Denis Bardadym (https://github.com/btd)", + "Devin Weaver (https://github.com/sukima)", + "Diogo Monteiro (https://github.com/diogogmt)", + "Dmitry Shirokov (https://github.com/runk)", + "Domenic Denicola (https://github.com/domenic)", + "Dominic Barnes (https://github.com/dominicbarnes)", + "domq (https://github.com/domq)", + "Douglas Wilson (https://github.com/dougwilson)", + "Duncan Beevers (https://github.com/duncanbeevers)", + "Duncan Wong (https://github.com/badunk)", + "eiji.ienaga (https://github.com/haru01)", + "Fabio Crisci (https://github.com/piuccio)", + "Fede Ramirez (https://github.com/2fd)", + "Fedor Indutny (https://github.com/indutny)", + "fengmk2 (https://github.com/fengmk2)", + "Florian Margaine (https://github.com/ralt)", + "Forbes Lindesay (https://github.com/ForbesLindesay)", + "Frederico Silva (https://github.com/fredericosilva)", + "Fredrik Enestad (https://github.com/fredr)", + "Fredrik Lindin (https://github.com/Cowboy-coder)", + "Gabriel Silk (https://github.com/gsilk)", + "Gareth Aye (https://github.com/gaye)", + "Gavin Mogan (https://github.com/halkeye)", + "gigadude (https://github.com/gigadude)", + "Giovanni Bassi (https://github.com/giggio)", + "Glen Huang (https://github.com/curvedmark)", + "Glen Mailer (https://github.com/glenjamin)", + "Greg Perkins (https://github.com/gregrperkins)", + "Guillermo Rauch (https://github.com/rauchg)", + "Guy Arye (https://github.com/aryeguy)", + "Gyandeep Singh (https://github.com/gyandeeps)", + "Harish (https://github.com/hyeluri)", + "Harry Brundage (https://github.com/airhorns)", + "Ian Remmel (https://github.com/ianwremmel)", + "Ian Storm Taylor (https://github.com/ianstormtaylor)", + "Ian Young (https://github.com/iangreenleaf)", + "Ivan (https://github.com/ivanstoyanov)", + "Jaakko Salonen (https://github.com/jsalonen)", + "Jacob Wejendorp (https://github.com/wejendorp)", + "Jake Craige (https://github.com/jakecraige)", + "Jake Marsh (https://github.com/jakemmarsh)", + "Jake Mc (https://github.com/startswithaj)", + "Jake Verbaten (https://github.com/Raynos)", + "Jakub Nešetřil (https://github.com/zzen)", + "James Bowes (https://github.com/jbowes)", + "James Carr (https://github.com/jamescarr)", + "James G. Kim (https://github.com/jgkim)", + "James Lal (https://github.com/lightsofapollo)", + "James Nylen (https://github.com/nylen)", + "Jason (https://github.com/jlai)", + "Jason Barry (https://github.com/JCBarry)", + "Javier Aranda (https://github.com/javierav)", + "jcreamer898 (https://github.com/jcreamer898)", + "Jean Ponchon (https://github.com/nopnop)", + "Jeff Kunkle (https://github.com/kunklejr)", + "Jeff Schilling (https://github.com/jschilli)", + "JeongHoon Byun (aka Outsider) (https://github.com/outsideris)", + "Jeremy Martin (https://github.com/jmar777)", + "jimenglish81 (https://github.com/jimenglish81)", + "Jimmy Cuadra (https://github.com/jimmycuadra)", + "jldailey (https://github.com/jldailey)", + "jleyba (https://github.com/jleyba)", + "Joey Cozza (https://github.com/joeycozza)", + "Johnathon Sanders (https://github.com/outdooricon)", + "John Doty (https://github.com/jrhdoty)", + "John Firebaugh (https://github.com/jfirebaugh)", + "John Reeves (https://github.com/jonnyreeves)", + "Jo Liss (https://github.com/joliss)", + "Jonas Dohse (https://github.com/dohse)", + "Jonathan Kim (https://github.com/jkimbo)", + "Jonathan Park (https://github.com/park9140)", + "jongleberry (https://github.com/jonathanong)", + "Jordan Sexton (https://github.com/jordansexton)", + "Joseph Spencer (https://github.com/jsdevel)", + "Josh Lory (https://github.com/joshlory)", + "Joshua Appelman (https://github.com/jbnicolai)", + "Joshua Krall (https://github.com/jkrall)", + "João Moreno (https://github.com/joaomoreno)", + "João Paulo Bochi (https://github.com/jpbochi)", + "jugglinmike (https://github.com/jugglinmike)", + "Julien Wajsberg (https://github.com/julienw)", + "Jussi Virtanen (https://github.com/jvirtanen)", + "Justin DuJardin (https://github.com/justindujardin)", + "Juzer Ali (https://github.com/juzerali)", + "Jérémie Astori (https://github.com/astorije)", + "Katie Gengler (https://github.com/kategengler)", + "Kazuhito Hokamura (https://github.com/hokaccha)", + "Keith Cirkel (https://github.com/keithamus)", + "Kent C. Dodds (https://github.com/kentcdodds)", + "Kevin Burke (https://github.com/kevinburke)", + "Kevin Conway (https://github.com/kevinconway)", + "Kevin Kirsche (https://github.com/kkirsche)", + "Kirill Korolyov (https://github.com/Dremora)", + "Koen Punt (https://github.com/koenpunt)", + "Konstantin Käfer (https://github.com/kkaefer)", + "Kris Rasmussen (https://github.com/krisr)", + "Kyle Mitchell (https://github.com/kemitchell)", + "lakmeer (https://github.com/lakmeer)", + "Liam Newman (https://github.com/bitwiseman)", + "Linus Unnebäck (https://github.com/LinusU)", + "Long Ho (https://github.com/longlho)", + "László Bácsi (https://github.com/lackac)", + "Maciej Małecki (https://github.com/mmalecki)", + "Mal Graty (https://github.com/mal)", + "Marcello Bastéa-Forte (https://github.com/marcello3d)", + "Marc Kuo (https://github.com/mck-)", + "Mark Banner (https://github.com/Standard8)", + "Matija Marohnić (https://github.com/silvenon)", + "Matthew Shanley (https://github.com/arkadyan)", + "mattias-lw (https://github.com/mattias-lw)", + "Matt Robenolt (https://github.com/mattrobenolt)", + "Matt Smith (https://github.com/twobitfool)", + "Max Goodman (https://github.com/chromakode)", + "Maximilian Antoni (https://github.com/mantoni)", + "Merrick Christensen (https://github.com/iammerrick)", + "michael-adsk (https://github.com/michael-adsk)", + "Michael Demmer (https://github.com/demmer)", + "Michael Jackson (https://github.com/mjackson)", + "Michael Schoonmaker (https://github.com/Schoonology)", + "Michal Charemza (https://github.com/michalc)", + "Mike Olson (https://github.com/mwolson)", + "Mislav Marohnić (https://github.com/mislav)", + "mrShturman (https://github.com/mrShturman)", + "Nathan Alderson (https://github.com/nathanalderson)", + "Nathan Black (https://github.com/nathanboktae)", + "Nathan Bowser (https://github.com/nathanbowser)", + "Nathan Houle (https://github.com/ndhoule)", + "Nathan Rajlich (https://github.com/TooTallNate)", + "Nick Fitzgerald (https://github.com/fitzgen)", + "noirlab (https://github.com/noirlab)", + "Noshir Patel (https://github.com/noshir-patel)", + "OlegTsyba (https://github.com/OlegTsyba)", + "omar (https://github.com/omardelarosa)", + "Panu Horsmalahti (https://github.com/panuhorsmalahti)", + "Parker Moore (https://github.com/parkr)", + "Paul Armstrong (https://github.com/paularmstrong)", + "Paul Miller (https://github.com/paulmillr)", + "Pavel Zubkou (https://github.com/irnc)", + "Pete Hawkins (https://github.com/phawk)", + "Phil Sung (https://github.com/psung)", + "Prayag Verma (https://github.com/pra85)", + "qiu zuhui (https://github.com/qiuzuhui)", + "Quang Van (https://github.com/quangv)", + "Rauno (https://github.com/Rauno56)", + "Refael Ackermann (https://github.com/refack)", + "Richard Dingwall (https://github.com/rdingwall)", + "Richard Knop (https://github.com/RichardKnop)", + "Rico Sta. Cruz (https://github.com/rstacruz)", + "Robert Rossmann (https://github.com/Alaneor)", + "Rob Wu (https://github.com/Rob--W)", + "Romain (https://github.com/rprieto)", + "Roman Neuhauser (https://github.com/roman-neuhauser)", + "Roman Shtylman (https://github.com/defunctzombie)", + "Russ Bradberry (https://github.com/devdazed)", + "Russell Munson (https://github.com/rmunson)", + "Ryan (https://github.com/ryan-shaw)", + "Ryan Hubbard (https://github.com/ryedog)", + "Ryunosuke Sato (https://github.com/tricknotes)", + "ryym (https://github.com/ryym)", + "Salehen Shovon Rahman (https://github.com/shovon)", + "Salvador de la Puente González (https://github.com/delapuente)", + "Sam Mussell (https://github.com/smussell)", + "Samuel Goldszmidt (https://github.com/ouhouhsami)", + "Sasha Koss (https://github.com/kossnocorp)", + "Scott Santucci (https://github.com/ScottFreeCode)", + "Sean Lang (https://github.com/slang800)", + "seb vincent (https://github.com/sebv)", + "Seiya Konno (https://github.com/nulltask)", + "Sergey Simonchik (https://github.com/segrey)", + "Sergio Santoro (https://github.com/taueres)", + "Shahar Soel (https://github.com/bd82)", + "Shaine Hatch (https://github.com/shaine)", + "Shiwei Wang (https://github.com/wsw0108)", + "Simon Gaeremynck (https://github.com/simong)", + "Simon Goumaz (https://github.com/sgoumaz)", + "Sindre Sorhus (https://github.com/sindresorhus)", + "slientcloud (https://github.com/silentcloud)", + "Sorin Iclanzan (https://github.com/iclanzan)", + "Standa Opichal (https://github.com/opichals)", + "Stephen Mathieson (https://github.com/stephenmathieson)", + "Steve Mason (https://github.com/spmason)", + "Stewart Taylor (https://github.com/Stewart-Taylor)", + "Sune Simonsen (https://github.com/sunesimonsen)", + "Sylvain Faucherand (https://github.com/slyg)", + "Takuya Nishigori (https://github.com/nishigori)", + "Taylor Gautier (https://github.com/tsgautier)", + "Teddy Zeenny (https://github.com/teddyzeenny)", + "Thomas Grainger (https://github.com/graingert)", + "Tim Ehat (https://github.com/timehat)", + "Timothy Gu (https://github.com/TimothyGu)", + "Timo Tijhof (https://github.com/Krinkle)", + "Tingan Ho (https://github.com/tinganho)", + "TJ Holowaychuk (https://github.com/tj)", + "Tobias Bieniek (https://github.com/Turbo87)", + "Toby Ho (https://github.com/airportyh)", + "Todd Agulnick (https://github.com/tawdle)", + "Tom Hughes (https://github.com/tomhughes)", + "Tommy Montgomery (https://github.com/tmont)", + "traleig1 (https://github.com/traleig1)", + "Travis Jeffery (https://github.com/travisjeffery)", + "Tyson Tate (https://github.com/tysontate)", + "Valentin Agachi (https://github.com/avaly)", + "Victor Costan (https://github.com/pwnall)", + "Vladimir Chernis (https://github.com/vlazzle)", + "Vlad Magdalin (https://github.com/callmevlad)", + "Will Langstroth (https://github.com/wlangstroth)", + "Wil Moore III (https://github.com/wilmoore)", + "Xavier Antoviaque (https://github.com/antoviaque)", + "Xavier Damman (https://github.com/xdamman)", + "Yanis Wang (https://github.com/yaniswang)", + "yuitest (https://github.com/yuitest)", + "Zhiye Li (https://github.com/zhiyelee)", + "Zhouxuan Yang (https://github.com/fool2fish)", + "Zsolt Takács (https://github.com/oker1)" ], "license": "MIT", "repository": { From 84b181a46157b72bbee5fb7323d3bca3e6e3ed42 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 5 Jul 2016 01:04:41 -0700 Subject: [PATCH 0566/1771] add production "sanity" check to Travis CI --- .travis.yml | 2 ++ scripts/travis-before-install.sh | 5 +++++ test/sanity/sanity.js | 9 +++++++++ 3 files changed, 16 insertions(+) create mode 100755 scripts/travis-before-install.sh create mode 100644 test/sanity/sanity.js diff --git a/.travis.yml b/.travis.yml index 8e11c3e3df..29b4c419e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,8 @@ matrix: - node_js: '6' env: TARGET=test-browser S3=1 +before_install: scripts/travis-before-install.sh + before_script: scripts/travis-before-script.sh script: make $TARGET diff --git a/scripts/travis-before-install.sh b/scripts/travis-before-install.sh new file mode 100755 index 0000000000..c725d38948 --- /dev/null +++ b/scripts/travis-before-install.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +npm install --production +# this avoids our mocha.opts (and thus devDependencies) in a roundabout way +./bin/mocha --opts /dev/null --reporter spec test/sanity/sanity.js diff --git a/test/sanity/sanity.js b/test/sanity/sanity.js new file mode 100644 index 0000000000..59d5896515 --- /dev/null +++ b/test/sanity/sanity.js @@ -0,0 +1,9 @@ +'use strict'; + +var assert = require('assert'); + +describe('a production installation of Mocha', function() { + it('should be able to execute a test', function() { + assert.ok(true); + }); +}); From f45598913a09c07e29db8cf8bac19d6156a98bc7 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 5 Jul 2016 01:14:08 -0700 Subject: [PATCH 0567/1771] update woefully out-of-date bower.json [ci skip] --- bower.json | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/bower.json b/bower.json index b21940fcbc..e96cc9526d 100644 --- a/bower.json +++ b/bower.json @@ -1,17 +1,7 @@ { "name": "mocha", - "homepage": "http://mocha.github.io/mocha", + "homepage": "https://mochajs.org", "description": "simple, flexible, fun test framework", - "authors": [ - "TJ Holowaychuk ", - "Joshua Appelman ", - "Oleg Gaidarenko ", - "Christoffer Hallas ", - "Christopher Hiller ", - "Travis Jeffery ", - "Johnathan Ong ", - "Guillermo Rauch " - ], "repository": { "type": "git", "url": "git://github.com/mochajs/mocha.git" @@ -25,15 +15,17 @@ "editors", "images", "lib", - "support", + "scripts", "test", - ".gitignore", - ".npmignore", - ".travis.yml", - "component.json", + "assets", + "media", + ".*", "index.js", + "karma.conf.js", + "browser-entry.js", "Makefile", - "package.json" + "package.json", + "appveyor.yml" ], "keywords": [ "mocha", From 0e3c238635857a2ffb15591b9444cac6e3302a48 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Jul 2016 23:38:09 -0700 Subject: [PATCH 0568/1771] drop jsoncov/htmlcov reporters; closes #2356 --- .gitignore | 2 - Makefile | 17 +- index.js | 6 +- karma.conf.js | 2 - lib/reporters/html-cov.js | 56 ----- lib/reporters/index.js | 2 - lib/reporters/json-cov.js | 152 ------------- lib/reporters/templates/coverage.pug | 51 ----- lib/reporters/templates/menu.pug | 13 -- lib/reporters/templates/script.html | 34 --- lib/reporters/templates/style.html | 324 --------------------------- package.json | 2 - 12 files changed, 5 insertions(+), 656 deletions(-) delete mode 100644 lib/reporters/html-cov.js delete mode 100644 lib/reporters/json-cov.js delete mode 100644 lib/reporters/templates/coverage.pug delete mode 100644 lib/reporters/templates/menu.pug delete mode 100644 lib/reporters/templates/script.html delete mode 100644 lib/reporters/templates/style.html diff --git a/.gitignore b/.gitignore index cc19425077..943d6ace8b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -coverage.html -lib-cov .DS_Store node_modules test-outputs diff --git a/Makefile b/Makefile index 31365aaf51..5f4f67416b 100644 --- a/Makefile +++ b/Makefile @@ -15,26 +15,13 @@ mocha.js: $(SRC) $(SUPPORT) @$(BROWSERIFY) ./browser-entry \ --ignore 'fs' \ --ignore 'glob' \ - --ignore 'jade' \ --ignore 'path' \ - --ignore 'supports-color' \ - --exclude './lib-cov/mocha' > $@ + --ignore 'supports-color' > $@ clean: @printf "==> [Clean]\n" rm -f mocha.js rm -rf test-outputs - rm -rf lib-cov - rm -f coverage.html - -test-cov: lib-cov - @printf "==> [Test :: Coverage]\n" - @COV=1 $(MAKE) test REPORTER=html-cov > coverage.html - -lib-cov: - @printf "==> [Coverage]\n" - @rm -fr ./$@ - @jscoverage lib $@ lint: @printf "==> [Test :: Lint]\n" @@ -204,4 +191,4 @@ tm: @printf "==> [TM]\n" @open editors/$(TM_BUNDLE) -.PHONY: test-cov test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint test-only test-global-only +.PHONY: test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint test-only test-global-only diff --git a/index.js b/index.js index 169b271770..d2b7d19609 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,3 @@ -module.exports = process.env.COV - ? require('./lib-cov/mocha') - : require('./lib/mocha'); +'use strict'; + +module.exports = require('./lib/mocha'); diff --git a/karma.conf.js b/karma.conf.js index d6c6fe762a..60b0ad9b4b 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -31,9 +31,7 @@ module.exports = function(config) { debug: true, configure: function configure(b) { b.ignore('glob') - .ignore('pug') .ignore('supports-color') - .exclude('./lib-cov/mocha') .on('bundled', function(err, content) { if (!err && bundleDirpath) { // write bundle to directory for debugging diff --git a/lib/reporters/html-cov.js b/lib/reporters/html-cov.js deleted file mode 100644 index 8c6bac4d72..0000000000 --- a/lib/reporters/html-cov.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Module dependencies. - */ - -var JSONCov = require('./json-cov'); -var readFileSync = require('fs').readFileSync; -var join = require('path').join; - -/** - * Expose `HTMLCov`. - */ - -exports = module.exports = HTMLCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @api public - * @param {Runner} runner - */ -function HTMLCov(runner) { - var pug = require('pug'); - var file = join(__dirname, '/templates/coverage.pug'); - var str = readFileSync(file, 'utf8'); - var fn = pug.compile(str, { filename: file }); - var self = this; - - JSONCov.call(this, runner, false); - - runner.on('end', function() { - process.stdout.write(fn({ - cov: self.cov, - coverageClass: coverageClass - })); - }); -} - -/** - * Return coverage class for a given coverage percentage. - * - * @api private - * @param {number} coveragePctg - * @return {string} - */ -function coverageClass(coveragePctg) { - if (coveragePctg >= 75) { - return 'high'; - } - if (coveragePctg >= 50) { - return 'medium'; - } - if (coveragePctg >= 25) { - return 'low'; - } - return 'terrible'; -} diff --git a/lib/reporters/index.js b/lib/reporters/index.js index 51f5cffee1..221a81d95b 100644 --- a/lib/reporters/index.js +++ b/lib/reporters/index.js @@ -14,6 +14,4 @@ exports.XUnit = exports.xunit = require('./xunit'); exports.Markdown = exports.markdown = require('./markdown'); exports.Progress = exports.progress = require('./progress'); exports.Landing = exports.landing = require('./landing'); -exports.JSONCov = exports['json-cov'] = require('./json-cov'); -exports.HTMLCov = exports['html-cov'] = require('./html-cov'); exports.JSONStream = exports['json-stream'] = require('./json-stream'); diff --git a/lib/reporters/json-cov.js b/lib/reporters/json-cov.js deleted file mode 100644 index a1ead3728c..0000000000 --- a/lib/reporters/json-cov.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var JSON = require('json3'); - -/** - * Expose `JSONCov`. - */ - -exports = module.exports = JSONCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @api public - * @param {Runner} runner - * @param {boolean} output - */ -function JSONCov(runner, output) { - Base.call(this, runner); - - output = arguments.length === 1 || output; - var self = this; - var tests = []; - var failures = []; - var passes = []; - - runner.on('test end', function(test) { - tests.push(test); - }); - - runner.on('pass', function(test) { - passes.push(test); - }); - - runner.on('fail', function(test) { - failures.push(test); - }); - - runner.on('end', function() { - var cov = global._$jscoverage || {}; - var result = self.cov = map(cov); - result.stats = self.stats; - result.tests = tests.map(clean); - result.failures = failures.map(clean); - result.passes = passes.map(clean); - if (!output) { - return; - } - process.stdout.write(JSON.stringify(result, null, 2)); - }); -} - -/** - * Map jscoverage data to a JSON structure - * suitable for reporting. - * - * @api private - * @param {Object} cov - * @return {Object} - */ - -function map(cov) { - var ret = { - instrumentation: 'node-jscoverage', - sloc: 0, - hits: 0, - misses: 0, - coverage: 0, - files: [] - }; - - for (var filename in cov) { - if (Object.prototype.hasOwnProperty.call(cov, filename)) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; - } - } - - ret.files.sort(function(a, b) { - return a.filename.localeCompare(b.filename); - }); - - if (ret.sloc > 0) { - ret.coverage = (ret.hits / ret.sloc) * 100; - } - - return ret; -} - -/** - * Map jscoverage data for a single source file - * to a JSON structure suitable for reporting. - * - * @api private - * @param {string} filename name of the source file - * @param {Object} data jscoverage coverage data - * @return {Object} - */ -function coverage(filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc: 0, - source: {} - }; - - data.source.forEach(function(line, num) { - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - ret.source[num] = { - source: line, - coverage: data[num] === undefined ? '' : data[num] - }; - }); - - ret.coverage = ret.hits / ret.sloc * 100; - - return ret; -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @api private - * @param {Object} test - * @return {Object} - */ -function clean(test) { - return { - duration: test.duration, - currentRetry: test.currentRetry(), - fullTitle: test.fullTitle(), - title: test.title - }; -} diff --git a/lib/reporters/templates/coverage.pug b/lib/reporters/templates/coverage.pug deleted file mode 100644 index edd59d8864..0000000000 --- a/lib/reporters/templates/coverage.pug +++ /dev/null @@ -1,51 +0,0 @@ -doctype html -html - head - title Coverage - meta(charset='utf-8') - include script.html - include style.html - body - #coverage - h1#overview Coverage - include menu - - #stats(class=coverageClass(cov.coverage)) - .percentage #{cov.coverage | 0}% - .sloc= cov.sloc - .hits= cov.hits - .misses= cov.misses - - #files - for file in cov.files - .file - h2(id=file.filename)= file.filename - #stats(class=coverageClass(file.coverage)) - .percentage #{file.coverage | 0}% - .sloc= file.sloc - .hits= file.hits - .misses= file.misses - - table#source - thead - tr - th Line - th Hits - th Source - tbody - for line, number in file.source - if line.coverage > 0 - tr.hit - td.line= number - td.hits= line.coverage - td.source= line.source - else if 0 === line.coverage - tr.miss - td.line= number - td.hits 0 - td.source= line.source - else - tr - td.line= number - td.hits - td.source= line.source || ' ' diff --git a/lib/reporters/templates/menu.pug b/lib/reporters/templates/menu.pug deleted file mode 100644 index c682e3f0ee..0000000000 --- a/lib/reporters/templates/menu.pug +++ /dev/null @@ -1,13 +0,0 @@ -#menu - li - a(href='#overview') overview - for file in cov.files - li - span.cov(class=coverageClass(file.coverage)) #{file.coverage | 0} - a(href='##{file.filename}') - segments = file.filename.split('/') - basename = segments.pop() - if segments.length - span.dirname= segments.join('/') + '/' - span.basename= basename - a#logo(href='http://mochajs.org/') m diff --git a/lib/reporters/templates/script.html b/lib/reporters/templates/script.html deleted file mode 100644 index 073cf7939c..0000000000 --- a/lib/reporters/templates/script.html +++ /dev/null @@ -1,34 +0,0 @@ - diff --git a/lib/reporters/templates/style.html b/lib/reporters/templates/style.html deleted file mode 100644 index 4c9c37cfd9..0000000000 --- a/lib/reporters/templates/style.html +++ /dev/null @@ -1,324 +0,0 @@ - diff --git a/package.json b/package.json index 2a284eb289..cd1850783d 100644 --- a/package.json +++ b/package.json @@ -311,7 +311,6 @@ "json3": "3.3.2", "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "pug": "2.0.0-beta3", "supports-color": "3.1.2", "to-iso-string": "0.0.2" }, @@ -349,7 +348,6 @@ "events": "./lib/browser/events.js", "tty": "./lib/browser/tty.js", "./index.js": "./browser-entry.js", - "pug": false, "fs": false, "glob": false, "path": false, From 4c5c97832e795d6bd9c9e98be6a4d46cb4dc9872 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Jul 2016 23:38:28 -0700 Subject: [PATCH 0569/1771] fix some modules which should be ignored in karma config --- karma.conf.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/karma.conf.js b/karma.conf.js index 60b0ad9b4b..e245aa474c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -31,6 +31,8 @@ module.exports = function(config) { debug: true, configure: function configure(b) { b.ignore('glob') + .ignore('fs') + .ignore('path') .ignore('supports-color') .on('bundled', function(err, content) { if (!err && bundleDirpath) { From 0ad80bc2535bf8e87261bf7ad6af35111db870a1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Jul 2016 23:46:50 -0700 Subject: [PATCH 0570/1771] remove redundant "licenses" field and deprecated "engineStrict" from package.json --- package.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/package.json b/package.json index cd1850783d..5bc15b373d 100644 --- a/package.json +++ b/package.json @@ -297,7 +297,6 @@ "node": ">= 0.10.x", "npm": ">= 1.4.x" }, - "engineStrict": true, "scripts": { "test": "make test" }, @@ -352,11 +351,5 @@ "glob": false, "path": false, "supports-color": false - }, - "licenses": [ - { - "type": "MIT", - "url": "https://raw.github.com/mochajs/mocha/master/LICENSE" - } - ] + } } From 982fa558b6ce885e67c60db2ca67a81581fa23a1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Jul 2016 23:47:25 -0700 Subject: [PATCH 0571/1771] change repo url to https scheme instead of git --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5bc15b373d..045121e624 100644 --- a/package.json +++ b/package.json @@ -287,7 +287,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "git://github.com/mochajs/mocha.git" + "url": "https://github.com/mochajs/mocha.git" }, "bin": { "mocha": "./bin/mocha", From f79488200cd271c0fe64a9559517180d5bd5cadd Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 7 Jul 2016 23:09:00 -0700 Subject: [PATCH 0572/1771] rebuild --- mocha.js | 2874 +++++++++++++++++++++++++----------------------------- 1 file changed, 1340 insertions(+), 1534 deletions(-) diff --git a/mocha.js b/mocha.js index ed03481518..cd854f7305 100644 --- a/mocha.js +++ b/mocha.js @@ -168,7 +168,7 @@ global.mocha = mocha; module.exports = global; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/mocha":14,"_process":69,"browser-stdout":41}],2:[function(require,module,exports){ +},{"./lib/mocha":14,"_process":66,"browser-stdout":40}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -615,7 +615,7 @@ Context.prototype.inspect = function() { }, 2); }; -},{"json3":56}],7:[function(require,module,exports){ +},{"json3":53}],7:[function(require,module,exports){ /** * Module dependencies. */ @@ -663,7 +663,7 @@ Hook.prototype.error = function(err) { this._error = err; }; -},{"./runnable":35,"./utils":39}],8:[function(require,module,exports){ +},{"./runnable":33,"./utils":37}],8:[function(require,module,exports){ /** * Module dependencies. */ @@ -776,7 +776,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9}],9:[function(require,module,exports){ +},{"../suite":35,"../test":36,"./common":9}],9:[function(require,module,exports){ 'use strict'; /** @@ -957,7 +957,7 @@ module.exports = function(suite) { } }; -},{"../suite":37,"../test":38}],11:[function(require,module,exports){ +},{"../suite":35,"../test":36}],11:[function(require,module,exports){ exports.bdd = require('./bdd'); exports.tdd = require('./tdd'); exports.qunit = require('./qunit'); @@ -1055,7 +1055,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9}],13:[function(require,module,exports){ +},{"../suite":35,"../test":36,"./common":9}],13:[function(require,module,exports){ /** * Module dependencies. */ @@ -1159,7 +1159,7 @@ module.exports = function(suite) { }); }; -},{"../suite":37,"../test":38,"./common":9}],14:[function(require,module,exports){ +},{"../suite":35,"../test":36,"./common":9}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1683,7 +1683,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":22,"./runnable":35,"./runner":36,"./suite":37,"./test":38,"./utils":39,"_process":69,"escape-string-regexp":50,"growl":51,"path":42}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":37,"_process":66,"escape-string-regexp":46,"growl":48,"path":41}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2323,7 +2323,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":39,"_process":69,"diff":49,"supports-color":42,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":37,"_process":66,"diff":45,"supports-color":41,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2387,7 +2387,7 @@ function Doc(runner) { }); } -},{"../utils":39,"./base":17}],19:[function(require,module,exports){ +},{"../utils":37,"./base":17}],19:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2457,67 +2457,7 @@ function Dot(runner) { inherits(Dot, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],20:[function(require,module,exports){ -(function (process,__dirname){ -/** - * Module dependencies. - */ - -var JSONCov = require('./json-cov'); -var readFileSync = require('fs').readFileSync; -var join = require('path').join; - -/** - * Expose `HTMLCov`. - */ - -exports = module.exports = HTMLCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @api public - * @param {Runner} runner - */ -function HTMLCov(runner) { - var pug = require('pug'); - var file = join(__dirname, '/templates/coverage.pug'); - var str = readFileSync(file, 'utf8'); - var fn = pug.compile(str, { filename: file }); - var self = this; - - JSONCov.call(this, runner, false); - - runner.on('end', function() { - process.stdout.write(fn({ - cov: self.cov, - coverageClass: coverageClass - })); - }); -} - -/** - * Return coverage class for a given coverage percentage. - * - * @api private - * @param {number} coveragePctg - * @return {string} - */ -function coverageClass(coveragePctg) { - if (coveragePctg >= 75) { - return 'high'; - } - if (coveragePctg >= 50) { - return 'medium'; - } - if (coveragePctg >= 25) { - return 'low'; - } - return 'terrible'; -} - -}).call(this,require('_process'),"/lib/reporters") -},{"./json-cov":23,"_process":69,"fs":42,"path":42,"pug":40}],21:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],20:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2865,7 +2805,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":39,"./base":17,"escape-string-regexp":50}],22:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":37,"./base":17,"escape-string-regexp":46}],21:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2882,167 +2822,9 @@ exports.XUnit = exports.xunit = require('./xunit'); exports.Markdown = exports.markdown = require('./markdown'); exports.Progress = exports.progress = require('./progress'); exports.Landing = exports.landing = require('./landing'); -exports.JSONCov = exports['json-cov'] = require('./json-cov'); -exports.HTMLCov = exports['html-cov'] = require('./html-cov'); exports.JSONStream = exports['json-stream'] = require('./json-stream'); -},{"./base":17,"./doc":18,"./dot":19,"./html":21,"./html-cov":20,"./json":25,"./json-cov":23,"./json-stream":24,"./landing":26,"./list":27,"./markdown":28,"./min":29,"./nyan":30,"./progress":31,"./spec":32,"./tap":33,"./xunit":34}],23:[function(require,module,exports){ -(function (process,global){ -/** - * Module dependencies. - */ - -var Base = require('./base'); -var JSON = require('json3'); - -/** - * Expose `JSONCov`. - */ - -exports = module.exports = JSONCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @api public - * @param {Runner} runner - * @param {boolean} output - */ -function JSONCov(runner, output) { - Base.call(this, runner); - - output = arguments.length === 1 || output; - var self = this; - var tests = []; - var failures = []; - var passes = []; - - runner.on('test end', function(test) { - tests.push(test); - }); - - runner.on('pass', function(test) { - passes.push(test); - }); - - runner.on('fail', function(test) { - failures.push(test); - }); - - runner.on('end', function() { - var cov = global._$jscoverage || {}; - var result = self.cov = map(cov); - result.stats = self.stats; - result.tests = tests.map(clean); - result.failures = failures.map(clean); - result.passes = passes.map(clean); - if (!output) { - return; - } - process.stdout.write(JSON.stringify(result, null, 2)); - }); -} - -/** - * Map jscoverage data to a JSON structure - * suitable for reporting. - * - * @api private - * @param {Object} cov - * @return {Object} - */ - -function map(cov) { - var ret = { - instrumentation: 'node-jscoverage', - sloc: 0, - hits: 0, - misses: 0, - coverage: 0, - files: [] - }; - - for (var filename in cov) { - if (Object.prototype.hasOwnProperty.call(cov, filename)) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; - } - } - - ret.files.sort(function(a, b) { - return a.filename.localeCompare(b.filename); - }); - - if (ret.sloc > 0) { - ret.coverage = (ret.hits / ret.sloc) * 100; - } - - return ret; -} - -/** - * Map jscoverage data for a single source file - * to a JSON structure suitable for reporting. - * - * @api private - * @param {string} filename name of the source file - * @param {Object} data jscoverage coverage data - * @return {Object} - */ -function coverage(filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc: 0, - source: {} - }; - - data.source.forEach(function(line, num) { - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - ret.source[num] = { - source: line, - coverage: data[num] === undefined ? '' : data[num] - }; - }); - - ret.coverage = ret.hits / ret.sloc * 100; - - return ret; -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @api private - * @param {Object} test - * @return {Object} - */ -function clean(test) { - return { - duration: test.duration, - currentRetry: test.currentRetry(), - fullTitle: test.fullTitle(), - title: test.title - }; -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./base":17,"_process":69,"json3":56}],24:[function(require,module,exports){ +},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3107,7 +2889,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":69,"json3":56}],25:[function(require,module,exports){ +},{"./base":17,"_process":66,"json3":53}],23:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3201,7 +2983,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":69}],26:[function(require,module,exports){ +},{"./base":17,"_process":66}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3297,7 +3079,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],27:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3362,7 +3144,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],28:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3463,7 +3245,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],29:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3503,7 +3285,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],30:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3768,7 +3550,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],31:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3861,7 +3643,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":39,"./base":17,"_process":69}],32:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66}],30:[function(require,module,exports){ /** * Module dependencies. */ @@ -3946,7 +3728,7 @@ function Spec(runner) { */ inherits(Spec, Base); -},{"../utils":39,"./base":17}],33:[function(require,module,exports){ +},{"../utils":37,"./base":17}],31:[function(require,module,exports){ /** * Module dependencies. */ @@ -4016,7 +3798,7 @@ function title(test) { return test.fullTitle().replace(/#/g, ''); } -},{"./base":17}],34:[function(require,module,exports){ +},{"./base":17}],32:[function(require,module,exports){ (function (process,global){ /** * Module dependencies. @@ -4186,7 +3968,7 @@ function tag(name, attrs, close, content) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":39,"./base":17,"_process":69,"fs":42,"mkdirp":66,"path":42}],35:[function(require,module,exports){ +},{"../utils":37,"./base":17,"_process":66,"fs":41,"mkdirp":63,"path":41}],33:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -4565,7 +4347,7 @@ Runnable.prototype.run = function(fn) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ms":15,"./pending":16,"./utils":39,"debug":2,"events":3,"json3":56,"lodash.create":62}],36:[function(require,module,exports){ +},{"./ms":15,"./pending":16,"./utils":37,"debug":2,"events":3,"json3":53,"lodash.create":59}],34:[function(require,module,exports){ (function (process,global){ /** * Module dependencies. @@ -5494,7 +5276,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":35,"./utils":39,"_process":69,"debug":2,"events":3}],37:[function(require,module,exports){ +},{"./pending":16,"./runnable":33,"./utils":37,"_process":66,"debug":2,"events":3}],35:[function(require,module,exports){ /** * Module dependencies. */ @@ -5894,7 +5676,7 @@ Suite.prototype.run = function run() { } }; -},{"./hook":7,"./ms":15,"./utils":39,"debug":2,"events":3}],38:[function(require,module,exports){ +},{"./hook":7,"./ms":15,"./utils":37,"debug":2,"events":3}],36:[function(require,module,exports){ /** * Module dependencies. */ @@ -5946,7 +5728,7 @@ Test.prototype.clone = function() { return test; }; -},{"./runnable":35,"./utils":39,"lodash.create":62}],39:[function(require,module,exports){ +},{"./runnable":33,"./utils":37,"lodash.create":59}],37:[function(require,module,exports){ (function (process,Buffer){ /* eslint-env browser */ @@ -6711,9 +6493,120 @@ exports.isPromise = function isPromise(value) { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":69,"buffer":43,"debug":2,"fs":42,"glob":42,"json3":56,"path":42,"to-iso-string":81,"util":84}],40:[function(require,module,exports){ +},{"_process":66,"buffer":43,"debug":2,"fs":41,"glob":41,"json3":53,"path":41,"to-iso-string":79,"util":82}],38:[function(require,module,exports){ +'use strict' -},{}],41:[function(require,module,exports){ +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +function init () { + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i + } + + revLookup['-'.charCodeAt(0)] = 62 + revLookup['_'.charCodeAt(0)] = 63 +} + +init() + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],39:[function(require,module,exports){ + +},{}],40:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -6742,29 +6635,141 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":69,"stream":46,"util":84}],42:[function(require,module,exports){ -arguments[4][40][0].apply(exports,arguments) -},{"dup":40}],43:[function(require,module,exports){ +},{"_process":66,"stream":77,"util":82}],41:[function(require,module,exports){ +arguments[4][39][0].apply(exports,arguments) +},{"dup":39}],42:[function(require,module,exports){ (function (global){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - -'use strict' - -var base64 = require('base64-js') -var ieee754 = require('ieee754') -var isArray = require('isarray') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 +'use strict'; -/** +var buffer = require('buffer'); +var Buffer = buffer.Buffer; +var SlowBuffer = buffer.SlowBuffer; +var MAX_LEN = buffer.kMaxLength || 2147483647; +exports.alloc = function alloc(size, fill, encoding) { + if (typeof Buffer.alloc === 'function') { + return Buffer.alloc(size, fill, encoding); + } + if (typeof encoding === 'number') { + throw new TypeError('encoding must not be number'); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + var enc = encoding; + var _fill = fill; + if (_fill === undefined) { + enc = undefined; + _fill = 0; + } + var buf = new Buffer(size); + if (typeof _fill === 'string') { + var fillBuf = new Buffer(_fill, enc); + var flen = fillBuf.length; + var i = -1; + while (++i < size) { + buf[i] = fillBuf[i % flen]; + } + } else { + buf.fill(_fill); + } + return buf; +} +exports.allocUnsafe = function allocUnsafe(size) { + if (typeof Buffer.allocUnsafe === 'function') { + return Buffer.allocUnsafe(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size > MAX_LEN) { + throw new RangeError('size is too large'); + } + return new Buffer(size); +} +exports.from = function from(value, encodingOrOffset, length) { + if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { + return Buffer.from(value, encodingOrOffset, length); + } + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number'); + } + if (typeof value === 'string') { + return new Buffer(value, encodingOrOffset); + } + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + var offset = encodingOrOffset; + if (arguments.length === 1) { + return new Buffer(value); + } + if (typeof offset === 'undefined') { + offset = 0; + } + var len = length; + if (typeof len === 'undefined') { + len = value.byteLength - offset; + } + if (offset >= value.byteLength) { + throw new RangeError('\'offset\' is out of bounds'); + } + if (len > value.byteLength - offset) { + throw new RangeError('\'length\' is out of bounds'); + } + return new Buffer(value.slice(offset, offset + len)); + } + if (Buffer.isBuffer(value)) { + var out = new Buffer(value.length); + value.copy(out, 0, 0, value.length); + return out; + } + if (value) { + if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { + return new Buffer(value); + } + if (value.type === 'Buffer' && Array.isArray(value.data)) { + return new Buffer(value.data); + } + } + + throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); +} +exports.allocUnsafeSlow = function allocUnsafeSlow(size) { + if (typeof Buffer.allocUnsafeSlow === 'function') { + return Buffer.allocUnsafeSlow(size); + } + if (typeof size !== 'number') { + throw new TypeError('size must be a number'); + } + if (size >= MAX_LEN) { + throw new RangeError('size is too large'); + } + return new SlowBuffer(size); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"buffer":43}],43:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('isarray') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +/** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) @@ -6800,7 +6805,7 @@ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) - arr.foo = function () { return 42 } + arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` @@ -6944,7 +6949,7 @@ function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; i++) { + for (var i = 0; i < size; ++i) { that[i] = 0 } } @@ -7122,14 +7127,14 @@ Buffer.concat = function concat (list, length) { var i if (length === undefined) { length = 0 - for (i = 0; i < list.length; i++) { + for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 - for (i = 0; i < list.length; i++) { + for (i = 0; i < list.length; ++i) { var buf = list[i] if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') @@ -7161,7 +7166,6 @@ function byteLength (string, encoding) { switch (encoding) { case 'ascii': case 'binary': - // Deprecated case 'raw': case 'raws': return len @@ -7399,15 +7403,16 @@ function arrayIndexOf (arr, val, byteOffset, encoding) { } var foundIndex = -1 - for (var i = 0; byteOffset + i < arrLength; i++) { - if (read(arr, byteOffset + i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + for (var i = byteOffset; i < arrLength; ++i) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return (byteOffset + foundIndex) * indexSize + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } + return -1 } @@ -7472,7 +7477,7 @@ function hexWrite (buf, string, offset, length) { if (length > strLen / 2) { length = strLen / 2 } - for (var i = 0; i < length; i++) { + for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) return i buf[offset + i] = parsed @@ -7686,7 +7691,7 @@ function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret @@ -7696,7 +7701,7 @@ function binarySlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret @@ -7709,7 +7714,7 @@ function hexSlice (buf, start, end) { if (!end || end < 0 || end > len) end = len var out = '' - for (var i = start; i < end; i++) { + for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out @@ -7752,7 +7757,7 @@ Buffer.prototype.slice = function slice (start, end) { } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; i++) { + for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } @@ -7979,7 +7984,7 @@ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } @@ -8013,7 +8018,7 @@ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } @@ -8228,12 +8233,12 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (this === target && start < targetStart && targetStart < end) { // descending copy from end - for (i = len - 1; i >= 0; i--) { + for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start - for (i = 0; i < len; i++) { + for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { @@ -8294,7 +8299,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) { var i if (typeof val === 'number') { - for (i = start; i < end; i++) { + for (i = start; i < end; ++i) { this[i] = val } } else { @@ -8302,7 +8307,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) { ? val : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length - for (i = 0; i < end - start; i++) { + for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } @@ -8344,7 +8349,7 @@ function utf8ToBytes (string, units) { var leadSurrogate = null var bytes = [] - for (var i = 0; i < length; i++) { + for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component @@ -8419,7 +8424,7 @@ function utf8ToBytes (string, units) { function asciiToBytes (str) { var byteArray = [] - for (var i = 0; i < str.length; i++) { + for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } @@ -8429,7 +8434,7 @@ function asciiToBytes (str) { function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] - for (var i = 0; i < str.length; i++) { + for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) @@ -8447,7 +8452,7 @@ function base64ToBytes (str) { } function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { + for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } @@ -8459,118 +8464,8 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":44,"ieee754":52,"isarray":55}],44:[function(require,module,exports){ -'use strict' - -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -function init () { - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i - } - - revLookup['-'.charCodeAt(0)] = 62 - revLookup['_'.charCodeAt(0)] = 63 -} - -init() - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') -} - -},{}],45:[function(require,module,exports){ +},{"base64-js":38,"ieee754":49,"isarray":52}],44:[function(require,module,exports){ +(function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -8592,1271 +8487,1033 @@ function fromByteArray (uint8) { // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; -}; +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; - if (!this._events) - this._events = {}; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } - throw TypeError('Uncaught, unspecified "error" event.'); - } - } +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; - handler = this._events[type]; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; - if (isUndefined(handler)) - return false; +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; - return true; -}; +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -EventEmitter.prototype.addListener = function(type, listener) { - var m; +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; - if (!isFunction(listener)) - throw TypeError('listener must be a function'); +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; - if (!this._events) - this._events = {}; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); +exports.isBuffer = Buffer.isBuffer; - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; +function objectToString(o) { + return Object.prototype.toString.call(o); +} - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":51}],45:[function(require,module,exports){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +(function(global, undefined) { + var objectPrototypeToString = Object.prototype.toString; + + /*istanbul ignore next*/ + function map(arr, mapper, that) { + if (Array.prototype.map) { + return Array.prototype.map.call(arr, mapper, that); } - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); + var other = new Array(arr.length); + + for (var i = 0, n = arr.length; i < n; i++) { + other[i] = mapper.call(that, arr[i], i, arr); + } + return other; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); } } + return ret; } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); - return this; -}; + return n; + } -EventEmitter.prototype.on = EventEmitter.prototype.addListener; + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. + function canonicalize(obj, stack, replacementStack) { + stack = stack || []; + replacementStack = replacementStack || []; -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); + var i; - var fired = false; + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } - function g() { - this.removeListener(type, g); + var canonicalizedObj; - if (!fired) { - fired = true; - listener.apply(this, arguments); + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + key; + for (key in obj) { + sortedKeys.push(key); + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + key = sortedKeys[i]; + canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; } + return canonicalizedObj; } - g.listener = listener; - this.on(type, g); - - return this; -}; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); + function buildValues(components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; - if (!this._events || !this._events[type]) - return this; + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = map(value, function(value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); - list = this._events[type]; - length = list.length; - position = -1; + component.value = value.join(''); + } else { + component.value = newString.slice(newPos, newPos + component.count).join(''); + } + newPos += component.count; - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = oldString.slice(oldPos, oldPos + component.count).join(''); + oldPos += component.count; - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } } } - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } - - if (this._events.removeListener) - this.emit('removeListener', type, listener); - } - - return this; -}; - -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; - - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; + return components; } - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; + function Diff(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; } + Diff.prototype = { + diff: function(oldString, newString, callback) { + var self = this; - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; + function done(value) { + if (callback) { + setTimeout(function() { callback(undefined, value); }, 0); + return true; + } else { + return value; + } + } - return this; -}; + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return done([{ value: newString }]); + } + if (!newString) { + return done([{ value: oldString, removed: true }]); + } + if (!oldString) { + return done([{ value: newString, added: true }]); + } -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; -}; + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); -EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; -}; + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{value: newString.join('')}]); + } -EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); -}; + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } -function isFunction(arg) { - return typeof arg === 'function'; -} + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } -function isNumber(arg) { - return typeof arg === 'number'; -} + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} + oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); -function isUndefined(arg) { - return arg === void 0; -} + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } -},{}],46:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. + editLength++; + } -module.exports = Stream; + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function() { + // This should not happen, but we want to be safe. + /*istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); + if (!execEditLength()) { + exec(); + } + }, 0); + }()); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":45,"inherits":53,"readable-stream/duplex.js":70,"readable-stream/passthrough.js":76,"readable-stream/readable.js":77,"readable-stream/transform.js":78,"readable-stream/writable.js":79}],47:[function(require,module,exports){ -(function (global){ -'use strict'; - -var buffer = require('buffer'); -var Buffer = buffer.Buffer; -var SlowBuffer = buffer.SlowBuffer; -var MAX_LEN = buffer.kMaxLength || 2147483647; -exports.alloc = function alloc(size, fill, encoding) { - if (typeof Buffer.alloc === 'function') { - return Buffer.alloc(size, fill, encoding); - } - if (typeof encoding === 'number') { - throw new TypeError('encoding must not be number'); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - var enc = encoding; - var _fill = fill; - if (_fill === undefined) { - enc = undefined; - _fill = 0; - } - var buf = new Buffer(size); - if (typeof _fill === 'string') { - var fillBuf = new Buffer(_fill, enc); - var flen = fillBuf.length; - var i = -1; - while (++i < size) { - buf[i] = fillBuf[i % flen]; - } - } else { - buf.fill(_fill); - } - return buf; -} -exports.allocUnsafe = function allocUnsafe(size) { - if (typeof Buffer.allocUnsafe === 'function') { - return Buffer.allocUnsafe(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - return new Buffer(size); -} -exports.from = function from(value, encodingOrOffset, length) { - if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { - return Buffer.from(value, encodingOrOffset, length); - } - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number'); - } - if (typeof value === 'string') { - return new Buffer(value, encodingOrOffset); - } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - var offset = encodingOrOffset; - if (arguments.length === 1) { - return new Buffer(value); - } - if (typeof offset === 'undefined') { - offset = 0; - } - var len = length; - if (typeof len === 'undefined') { - len = value.byteLength - offset; - } - if (offset >= value.byteLength) { - throw new RangeError('\'offset\' is out of bounds'); - } - if (len > value.byteLength - offset) { - throw new RangeError('\'length\' is out of bounds'); - } - return new Buffer(value.slice(offset, offset + len)); - } - if (Buffer.isBuffer(value)) { - var out = new Buffer(value.length); - value.copy(out, 0, 0, value.length); - return out; - } - if (value) { - if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { - return new Buffer(value); - } - if (value.type === 'Buffer' && Array.isArray(value.data)) { - return new Buffer(value.data); - } - } - - throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); -} -exports.allocUnsafeSlow = function allocUnsafeSlow(size) { - if (typeof Buffer.allocUnsafeSlow === 'function') { - return Buffer.allocUnsafeSlow(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size >= MAX_LEN) { - throw new RangeError('size is too large'); - } - return new SlowBuffer(size); -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"buffer":43}],48:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; + }, -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; + pushComponent: function(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; + if (commonCount) { + basePath.components.push({count: commonCount}); + } -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + basePath.newPos = newPos; + return oldPos; + }, -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + equals: function(left, right) { + var reWhitespace = /\S/; + return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); + }, + tokenize: function(value) { + return value.split(''); + } + }; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + var CharDiff = new Diff(); -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; + var LineDiff = new Diff(); -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; + var TrimmedLineDiff = new Diff(); + TrimmedLineDiff.ignoreTrim = true; -exports.isBuffer = Buffer.isBuffer; + LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { + var retLines = [], + lines = value.split(/^/m); + for (var i = 0; i < lines.length; i++) { + var line = lines[i], + lastLine = lines[i - 1], + lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; -function objectToString(o) { - return Object.prototype.toString.call(o); -} + // Merge lines that may contain windows new lines + if (line === '\n' && lastLineLastChar === '\r') { + retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; + } else { + if (this.ignoreTrim) { + line = line.trim(); + // add a newline unless this is the last line. + if (i < lines.length - 1) { + line += '\n'; + } + } + retLines.push(line); + } + } -}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":54}],49:[function(require,module,exports){ -/* See LICENSE file for terms of use */ + return retLines; + }; -/* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ -(function(global, undefined) { - var objectPrototypeToString = Object.prototype.toString; + var PatchDiff = new Diff(); + PatchDiff.tokenize = function(value) { + var ret = [], + linesAndNewlines = value.split(/(\n|\r\n)/); - /*istanbul ignore next*/ - function map(arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); } - var other = new Array(arr.length); + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; - for (var i = 0, n = arr.length; i < n; i++) { - other[i] = mapper.call(that, arr[i], i, arr); - } - return other; - } - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); + if (i % 2) { + ret[ret.length - 1] += line; + } else { + ret.push(line); } } return ret; - } - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, '&'); - n = n.replace(//g, '>'); - n = n.replace(/"/g, '"'); - - return n; - } - - // This function handles the presence of circular references by bailing out when encountering an - // object that is already on the "stack" of items being processed. - function canonicalize(obj, stack, replacementStack) { - stack = stack || []; - replacementStack = replacementStack || []; - - var i; + }; - for (i = 0; i < stack.length; i += 1) { - if (stack[i] === obj) { - return replacementStack[i]; - } - } + var SentenceDiff = new Diff(); + SentenceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); + }; - var canonicalizedObj; + var JsonDiff = new Diff(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + JsonDiff.useLongestToken = true; + JsonDiff.tokenize = LineDiff.tokenize; + JsonDiff.equals = function(left, right) { + return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; - if ('[object Array]' === objectPrototypeToString.call(obj)) { - stack.push(obj); - canonicalizedObj = new Array(obj.length); - replacementStack.push(canonicalizedObj); - for (i = 0; i < obj.length; i += 1) { - canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); - } else if (typeof obj === 'object' && obj !== null) { - stack.push(obj); - canonicalizedObj = {}; - replacementStack.push(canonicalizedObj); - var sortedKeys = [], - key; - for (key in obj) { - sortedKeys.push(key); - } - sortedKeys.sort(); - for (i = 0; i < sortedKeys.length; i += 1) { - key = sortedKeys[i]; - canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); - } - stack.pop(); - replacementStack.pop(); - } else { - canonicalizedObj = obj; - } - return canonicalizedObj; - } + var JsDiff = { + Diff: Diff, - function buildValues(components, newString, oldString, useLongestToken) { - var componentPos = 0, - componentLen = components.length, - newPos = 0, - oldPos = 0; + diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, + diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, + diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, + diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, + diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, - for (; componentPos < componentLen; componentPos++) { - var component = components[componentPos]; - if (!component.removed) { - if (!component.added && useLongestToken) { - var value = newString.slice(newPos, newPos + component.count); - value = map(value, function(value, i) { - var oldValue = oldString[oldPos + i]; - return oldValue.length > value.length ? oldValue : value; - }); + diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, - component.value = value.join(''); - } else { - component.value = newString.slice(newPos, newPos + component.count).join(''); - } - newPos += component.count; + diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, + diffJson: function(oldObj, newObj, callback) { + return JsonDiff.diff( + typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), + typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), + callback + ); + }, - // Common case - if (!component.added) { - oldPos += component.count; - } - } else { - component.value = oldString.slice(oldPos, oldPos + component.count).join(''); - oldPos += component.count; + createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; - // Reverse add and remove so removes are output first to match common convention - // The diffing algorithm is tied to add then remove output and this is the simplest - // route to get the desired output with minimal overhead. - if (componentPos && components[componentPos - 1].added) { - var tmp = components[componentPos - 1]; - components[componentPos - 1] = components[componentPos]; - components[componentPos] = tmp; - } + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); } - } + ret.push('==================================================================='); + ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); - return components; - } + var diff = PatchDiff.diff(oldStr, newStr); + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier - function Diff(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - } - Diff.prototype = { - diff: function(oldString, newString, callback) { - var self = this; + // Formats a given set of lines for printing as context lines in a patch + function contextLines(lines) { + return map(lines, function(entry) { return ' ' + entry; }); + } - function done(value) { - if (callback) { - setTimeout(function() { callback(undefined, value); }, 0); - return true; - } else { - return value; + // Outputs the no newline at end of file warning if needed + function eofNL(curRange, i, current) { + var last = diff[diff.length - 2], + isLast = i === diff.length - 2, + isLastOfType = i === diff.length - 3 && current.added !== last.added; + + // Figure out if this is the last line for the given file and missing NL + if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); } } - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString === oldString) { - return done([{ value: newString }]); - } - if (!newString) { - return done([{ value: oldString, removed: true }]); - } - if (!oldString) { - return done([{ value: newString, added: true }]); - } + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); + if (current.added || current.removed) { + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; - var newLen = newString.length, oldLen = oldString.length; - var editLength = 1; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } - // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - // Identity per the equality and tokenizer - return done([{value: newString.join('')}]); - } + // Output our changes + curRange.push.apply(curRange, map(lines, function(entry) { + return (current.added ? '+' : '-') + entry; + })); + eofNL(curRange, i, current); - // Main worker method. checks all permutations of a given edit length for acceptance. - function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { - var basePath; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath - 1] = undefined; + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length - 2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - // If this path is a terminal then prune - bestPath[diagonalPath] = undefined; - continue; + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } } + oldLine += lines.length; + newLine += lines.length; + } + } - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); - } else { - basePath = addPath; // No need to clone, we've pulled it from the list - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); - } + return ret.join('\n') + '\n'; + }, - oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); + }, - // If we have hit the end of both strings, then we are done - if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); - } else { - // Otherwise track this path as a potential candidate and continue. - bestPath[diagonalPath] = basePath; + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'), + hunks = [], + i = 0, + remEOFNL = false, + addEOFNL = false; + + // Skip to the first change hunk + while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { + i++; + } + + // Parse the unified diff + for (; i < diffstr.length; i++) { + if (diffstr[i][0] === '@') { + var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + hunks.unshift({ + start: chnukHeader[3], + oldlength: +chnukHeader[2], + removed: [], + newlength: chnukHeader[4], + added: [] + }); + } else if (diffstr[i][0] === '+') { + hunks[0].added.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '-') { + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === ' ') { + hunks[0].added.push(diffstr[i].substr(1)); + hunks[0].removed.push(diffstr[i].substr(1)); + } else if (diffstr[i][0] === '\\') { + if (diffstr[i - 1][0] === '+') { + remEOFNL = true; + } else if (diffstr[i - 1][0] === '-') { + addEOFNL = true; } } + } - editLength++; + // Apply the diff to the input + var lines = oldStr.split('\n'); + for (i = hunks.length - 1; i >= 0; i--) { + var hunk = hunks[i]; + // Sanity check the input string. Bail if we don't match. + for (var j = 0; j < hunk.oldlength; j++) { + if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { + return false; + } + } + Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); } - // Performs the length of edit iteration. Is a bit fugly as this has to support the - // sync and async mode which is never fun. Loops over execEditLength until a value - // is produced. - if (callback) { - (function exec() { - setTimeout(function() { - // This should not happen, but we want to be safe. - /*istanbul ignore next */ - if (editLength > maxEditLength) { - return callback(); - } + // Handle EOFNL insertion/removal + if (remEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + } + } else if (addEOFNL) { + lines.push(''); + } + return lines.join('\n'); + }, - if (!execEditLength()) { - exec(); - } - }, 0); - }()); - } else { - while (editLength <= maxEditLength) { - var ret = execEditLength(); - if (ret) { - return ret; - } + convertChangesToXML: function(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); } - } - }, - pushComponent: function(components, added, removed) { - var last = components[components.length - 1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; - } else { - components.push({count: 1, added: added, removed: removed }); + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } } + return ret.join(''); }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, - commonCount = 0; - while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { - newPos++; - oldPos++; - commonCount++; - } + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes) { + var ret = [], + change, + operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } - if (commonCount) { - basePath.components.push({count: commonCount}); + ret.push([operation, change.value]); } - - basePath.newPos = newPos; - return oldPos; + return ret; }, - equals: function(left, right) { - var reWhitespace = /\S/; - return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); - }, - tokenize: function(value) { - return value.split(''); - } + canonicalize: canonicalize }; - var CharDiff = new Diff(); + /*istanbul ignore next */ + /*global module */ + if (typeof module !== 'undefined' && module.exports) { + module.exports = JsDiff; + } else if (typeof define === 'function' && define.amd) { + /*global define */ + define([], function() { return JsDiff; }); + } else if (typeof global.JsDiff === 'undefined') { + global.JsDiff = JsDiff; + } +}(this)); - var WordDiff = new Diff(true); - var WordWithSpaceDiff = new Diff(); - WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; +},{}],46:[function(require,module,exports){ +'use strict'; - var CssDiff = new Diff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - var LineDiff = new Diff(); +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } - var TrimmedLineDiff = new Diff(); - TrimmedLineDiff.ignoreTrim = true; + return str.replace(matchOperatorsRe, '\\$&'); +}; - LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { - var retLines = [], - lines = value.split(/^/m); - for (var i = 0; i < lines.length; i++) { - var line = lines[i], - lastLine = lines[i - 1], - lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; +},{}],47:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - // Merge lines that may contain windows new lines - if (line === '\n' && lastLineLastChar === '\r') { - retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event } else { - if (this.ignoreTrim) { - line = line.trim(); - // add a newline unless this is the last line. - if (i < lines.length - 1) { - line += '\n'; - } - } - retLines.push(line); + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; } } + } - return retLines; - }; + handler = this._events[type]; - var PatchDiff = new Diff(); - PatchDiff.tokenize = function(value) { - var ret = [], - linesAndNewlines = value.split(/(\n|\r\n)/); + if (isUndefined(handler)) + return false; - // Ignore the final empty token that occurs if the string ends with a new line - if (!linesAndNewlines[linesAndNewlines.length - 1]) { - linesAndNewlines.pop(); + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } - // Merge the content and line separators into single tokens - for (var i = 0; i < linesAndNewlines.length; i++) { - var line = linesAndNewlines[i]; + return true; +}; - if (i % 2) { - ret[ret.length - 1] += line; - } else { - ret.push(line); - } - } - return ret; - }; +EventEmitter.prototype.addListener = function(type, listener) { + var m; - var SentenceDiff = new Diff(); - SentenceDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); - }; + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - var JsonDiff = new Diff(); - // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a - // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: - JsonDiff.useLongestToken = true; - JsonDiff.tokenize = LineDiff.tokenize; - JsonDiff.equals = function(left, right) { - return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); - }; + if (!this._events) + this._events = {}; - var JsDiff = { - Diff: Diff, + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } - diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, - diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, - diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, - diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, - diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } - diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, + return this; +}; - diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, - diffJson: function(oldObj, newObj, callback) { - return JsonDiff.diff( - typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), - typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), - callback - ); - }, +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - if (oldFileName == newFileName) { - ret.push('Index: ' + oldFileName); - } - ret.push('==================================================================='); - ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); - ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + var fired = false; - var diff = PatchDiff.diff(oldStr, newStr); - diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + function g() { + this.removeListener(type, g); - // Formats a given set of lines for printing as context lines in a patch - function contextLines(lines) { - return map(lines, function(entry) { return ' ' + entry; }); - } + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } - // Outputs the no newline at end of file warning if needed - function eofNL(curRange, i, current) { - var last = diff[diff.length - 2], - isLast = i === diff.length - 2, - isLastOfType = i === diff.length - 3 && current.added !== last.added; + g.listener = listener; + this.on(type, g); - // Figure out if this is the last line for the given file and missing NL - if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } + return this; +}; - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; - if (current.added || current.removed) { - // If we have previous context, start with that - if (!oldRangeStart) { - var prev = diff[i - 1]; - oldRangeStart = oldLine; - newRangeStart = newLine; + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } + if (!this._events || !this._events[type]) + return this; - // Output our changes - curRange.push.apply(curRange, map(lines, function(entry) { - return (current.added ? '+' : '-') + entry; - })); - eofNL(curRange, i, current); + list = this._events[type]; + length = list.length; + position = -1; - // Track the updated file position - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - // Identical context lines. Track line changes - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length - 2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) - + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) - + ' @@'); - ret.push.apply(ret, curRange); - ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); - if (lines.length <= 4) { - eofNL(ret, i, current); - } + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); - oldRangeStart = 0; - newRangeStart = 0; - curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; } + } - return ret.join('\n') + '\n'; - }, + if (position < 0) + return this; - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); - }, + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } - applyPatch: function(oldStr, uniDiff) { - var diffstr = uniDiff.split('\n'), - hunks = [], - i = 0, - remEOFNL = false, - addEOFNL = false; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } - // Skip to the first change hunk - while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { - i++; - } + return this; +}; - // Parse the unified diff - for (; i < diffstr.length; i++) { - if (diffstr[i][0] === '@') { - var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); - hunks.unshift({ - start: chnukHeader[3], - oldlength: +chnukHeader[2], - removed: [], - newlength: chnukHeader[4], - added: [] - }); - } else if (diffstr[i][0] === '+') { - hunks[0].added.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '-') { - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === ' ') { - hunks[0].added.push(diffstr[i].substr(1)); - hunks[0].removed.push(diffstr[i].substr(1)); - } else if (diffstr[i][0] === '\\') { - if (diffstr[i - 1][0] === '+') { - remEOFNL = true; - } else if (diffstr[i - 1][0] === '-') { - addEOFNL = true; - } - } - } +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; - // Apply the diff to the input - var lines = oldStr.split('\n'); - for (i = hunks.length - 1; i >= 0; i--) { - var hunk = hunks[i]; - // Sanity check the input string. Bail if we don't match. - for (var j = 0; j < hunk.oldlength; j++) { - if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { - return false; - } - } - Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); - } + if (!this._events) + return this; - // Handle EOFNL insertion/removal - if (remEOFNL) { - while (!lines[lines.length - 1]) { - lines.pop(); - } - } else if (addEOFNL) { - lines.push(''); - } - return lines.join('\n'); - }, + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } - convertChangesToXML: function(changes) { - var ret = []; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } - ret.push(escapeHTML(change.value)); + listeners = this._events[type]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } - } - return ret.join(''); - }, + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - convertChangesToDMP: function(changes) { - var ret = [], - change, - operation; - for (var i = 0; i < changes.length; i++) { - change = changes[i]; - if (change.added) { - operation = 1; - } else if (change.removed) { - operation = -1; - } else { - operation = 0; - } + return this; +}; - ret.push([operation, change.value]); - } - return ret; - }, +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; - canonicalize: canonicalize - }; +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; - /*istanbul ignore next */ - /*global module */ - if (typeof module !== 'undefined' && module.exports) { - module.exports = JsDiff; - } else if (typeof define === 'function' && define.amd) { - /*global define */ - define([], function() { return JsDiff; }); - } else if (typeof global.JsDiff === 'undefined') { - global.JsDiff = JsDiff; + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; } -}(this)); + return 0; +}; -},{}],50:[function(require,module,exports){ -'use strict'; +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +function isFunction(arg) { + return typeof arg === 'function'; +} -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } +function isNumber(arg) { + return typeof arg === 'number'; +} - return str.replace(matchOperatorsRe, '\\$&'); -}; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} -},{}],51:[function(require,module,exports){ +function isUndefined(arg) { + return arg === void 0; +} + +},{}],48:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -10150,7 +9807,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":69,"child_process":42,"fs":42,"os":67,"path":42}],52:[function(require,module,exports){ +},{"_process":66,"child_process":41,"fs":41,"os":64,"path":41}],49:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 @@ -10236,7 +9893,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],53:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -10261,7 +9918,7 @@ if (typeof Object.create === 'function') { } } -},{}],54:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ /** * Determine if an object is Buffer * @@ -10280,14 +9937,14 @@ module.exports = function (obj) { )) } -},{}],55:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; -},{}],56:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ (function (global){ /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ ;(function () { @@ -11193,7 +10850,7 @@ module.exports = Array.isArray || function (arr) { }).call(this); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],57:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ /** * lodash 3.2.0 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11222,7 +10879,7 @@ function baseAssign(object, source) { module.exports = baseAssign; -},{"lodash._basecopy":58,"lodash.keys":65}],58:[function(require,module,exports){ +},{"lodash._basecopy":55,"lodash.keys":62}],55:[function(require,module,exports){ /** * lodash 3.0.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11256,7 +10913,7 @@ function baseCopy(source, props, object) { module.exports = baseCopy; -},{}],59:[function(require,module,exports){ +},{}],56:[function(require,module,exports){ /** * lodash 3.0.3 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11315,7 +10972,7 @@ function isObject(value) { module.exports = baseCreate; -},{}],60:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ /** * lodash 3.9.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11454,7 +11111,7 @@ function isNative(value) { module.exports = getNative; -},{}],61:[function(require,module,exports){ +},{}],58:[function(require,module,exports){ /** * lodash 3.0.9 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11588,7 +11245,7 @@ function isObject(value) { module.exports = isIterateeCall; -},{}],62:[function(require,module,exports){ +},{}],59:[function(require,module,exports){ /** * lodash 3.1.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11645,7 +11302,7 @@ function create(prototype, properties, guard) { module.exports = create; -},{"lodash._baseassign":57,"lodash._basecreate":59,"lodash._isiterateecall":61}],63:[function(require,module,exports){ +},{"lodash._baseassign":54,"lodash._basecreate":56,"lodash._isiterateecall":58}],60:[function(require,module,exports){ /** * lodash 3.0.8 (Custom Build) * Build: `lodash modularize exports="npm" -o ./` @@ -11890,7 +11547,7 @@ function isObjectLike(value) { module.exports = isArguments; -},{}],64:[function(require,module,exports){ +},{}],61:[function(require,module,exports){ /** * lodash 3.0.4 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -12072,7 +11729,7 @@ function isNative(value) { module.exports = isArray; -},{}],65:[function(require,module,exports){ +},{}],62:[function(require,module,exports){ /** * lodash 3.1.2 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -12310,7 +11967,7 @@ function keysIn(object) { module.exports = keys; -},{"lodash._getnative":60,"lodash.isarguments":63,"lodash.isarray":64}],66:[function(require,module,exports){ +},{"lodash._getnative":57,"lodash.isarguments":60,"lodash.isarray":61}],63:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); @@ -12412,7 +12069,7 @@ mkdirP.sync = function sync (p, opts, made) { }; }).call(this,require('_process')) -},{"_process":69,"fs":42,"path":42}],67:[function(require,module,exports){ +},{"_process":66,"fs":41,"path":41}],64:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -12459,7 +12116,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],68:[function(require,module,exports){ +},{}],65:[function(require,module,exports){ (function (process){ 'use strict'; @@ -12506,15 +12163,35 @@ function nextTick(fn, arg1, arg2, arg3) { } }).call(this,require('_process')) -},{"_process":69}],69:[function(require,module,exports){ +},{"_process":66}],66:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; -// cached from whatever global is present so that test runners that stub it don't break things. -var cachedSetTimeout = setTimeout; -var cachedClearTimeout = clearTimeout; +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. +var cachedSetTimeout; +var cachedClearTimeout; + +(function () { + try { + cachedSetTimeout = setTimeout; + } catch (e) { + cachedSetTimeout = function () { + throw new Error('setTimeout is not defined'); + } + } + try { + cachedClearTimeout = clearTimeout; + } catch (e) { + cachedClearTimeout = function () { + throw new Error('clearTimeout is not defined'); + } + } +} ()) var queue = []; var draining = false; var currentQueue; @@ -12607,10 +12284,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],70:[function(require,module,exports){ +},{}],67:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":71}],71:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":68}],68:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -12686,7 +12363,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":73,"./_stream_writable":75,"core-util-is":48,"inherits":53,"process-nextick-args":68}],72:[function(require,module,exports){ +},{"./_stream_readable":70,"./_stream_writable":72,"core-util-is":44,"inherits":50,"process-nextick-args":65}],69:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -12713,7 +12390,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":74,"core-util-is":48,"inherits":53}],73:[function(require,module,exports){ +},{"./_stream_transform":71,"core-util-is":44,"inherits":50}],70:[function(require,module,exports){ (function (process){ 'use strict'; @@ -13609,7 +13286,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":71,"_process":69,"buffer":43,"buffer-shims":47,"core-util-is":48,"events":45,"inherits":53,"isarray":55,"process-nextick-args":68,"string_decoder/":80,"util":40}],74:[function(require,module,exports){ +},{"./_stream_duplex":68,"_process":66,"buffer":43,"buffer-shims":42,"core-util-is":44,"events":47,"inherits":50,"isarray":52,"process-nextick-args":65,"string_decoder/":78,"util":39}],71:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -13790,7 +13467,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":71,"core-util-is":48,"inherits":53}],75:[function(require,module,exports){ +},{"./_stream_duplex":68,"core-util-is":44,"inherits":50}],72:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -14319,10 +13996,10 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":71,"_process":69,"buffer":43,"buffer-shims":47,"core-util-is":48,"events":45,"inherits":53,"process-nextick-args":68,"util-deprecate":82}],76:[function(require,module,exports){ +},{"./_stream_duplex":68,"_process":66,"buffer":43,"buffer-shims":42,"core-util-is":44,"events":47,"inherits":50,"process-nextick-args":65,"util-deprecate":80}],73:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":72}],77:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":69}],74:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -14342,13 +14019,142 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":71,"./lib/_stream_passthrough.js":72,"./lib/_stream_readable.js":73,"./lib/_stream_transform.js":74,"./lib/_stream_writable.js":75,"_process":69}],78:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":68,"./lib/_stream_passthrough.js":69,"./lib/_stream_readable.js":70,"./lib/_stream_transform.js":71,"./lib/_stream_writable.js":72,"_process":66}],75:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":74}],79:[function(require,module,exports){ +},{"./lib/_stream_transform.js":71}],76:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":75}],80:[function(require,module,exports){ +},{"./lib/_stream_writable.js":72}],77:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":47,"inherits":50,"readable-stream/duplex.js":67,"readable-stream/passthrough.js":73,"readable-stream/readable.js":74,"readable-stream/transform.js":75,"readable-stream/writable.js":76}],78:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -14571,7 +14377,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":43}],81:[function(require,module,exports){ +},{"buffer":43}],79:[function(require,module,exports){ /** * Expose `toIsoString`. @@ -14612,7 +14418,7 @@ function pad (number) { var n = number.toString(); return n.length === 1 ? '0' + n : n; } -},{}],82:[function(require,module,exports){ +},{}],80:[function(require,module,exports){ (function (global){ /** @@ -14683,14 +14489,14 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],83:[function(require,module,exports){ +},{}],81:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],84:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -15280,4 +15086,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":83,"_process":69,"inherits":53}]},{},[1]); +},{"./support/isBuffer":81,"_process":66,"inherits":50}]},{},[1]); From 635cb3eeeae6aac13c9335abda24ed439c4b93b0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 7 Jul 2016 23:14:47 -0700 Subject: [PATCH 0573/1771] add missing "homepage" to package.json [ci skip] --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 045121e624..47c6ad9a84 100644 --- a/package.json +++ b/package.json @@ -351,5 +351,6 @@ "glob": false, "path": false, "supports-color": false - } + }, + "homepage": "https://mochajs.org" } From 733ca2988a8ec241f33a73bb4cc73b583cb5daee Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 7 Jul 2016 23:19:58 -0700 Subject: [PATCH 0574/1771] Release v3.0.0-1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 47c6ad9a84..cb9d9e022f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.0-0", + "version": "3.0.0-1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 4de8045c185ae22bee09acfba799727ce99339ee Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Jul 2016 23:14:09 -0700 Subject: [PATCH 0575/1771] remove references to test-outputs/ dir, which is unused --- .gitignore | 1 - Makefile | 1 - 2 files changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 943d6ace8b..99fb76a31b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .DS_Store node_modules -test-outputs *.sock testing _mocha.js diff --git a/Makefile b/Makefile index 5f4f67416b..f26f663ce3 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,6 @@ mocha.js: $(SRC) $(SUPPORT) clean: @printf "==> [Clean]\n" rm -f mocha.js - rm -rf test-outputs lint: @printf "==> [Test :: Lint]\n" From 19131e39ce98c1bbf2cb20459844f0d94ce57d0d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Jul 2016 23:16:21 -0700 Subject: [PATCH 0576/1771] fix mocha.js target - remove non-existent files (`SUPPORT`) - add `browser-entry.js` --- Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f26f663ce3..95a8df209e 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,10 @@ REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle SRC = $(shell find lib -name "*.js" -type f | sort) TESTS = $(shell find test -name "*.js" -type f | sort) -SUPPORT = $(wildcard support/*.js) all: mocha.js -mocha.js: $(SRC) $(SUPPORT) +mocha.js: $(SRC) browser-entry.js @printf "==> [Browser :: build]\n" @$(BROWSERIFY) ./browser-entry \ --ignore 'fs' \ From 5c3445117b9e1018b7cd68e3ebfa594916e3c1b8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Jul 2016 23:23:26 -0700 Subject: [PATCH 0577/1771] display executed commands in Makefile for debugging --- Makefile | 77 ++++++++++++++++++++++---------------------------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index 95a8df209e..ab9437e712 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ BROWSERIFY := "node_modules/.bin/browserify" ESLINT := "node_modules/.bin/eslint" KARMA := "node_modules/.bin/karma" +MOCHA := "bin/mocha" REPORTER ?= spec TM_BUNDLE = JavaScript\ mocha.tmbundle @@ -11,7 +12,7 @@ all: mocha.js mocha.js: $(SRC) browser-entry.js @printf "==> [Browser :: build]\n" - @$(BROWSERIFY) ./browser-entry \ + $(BROWSERIFY) ./browser-entry \ --ignore 'fs' \ --ignore 'glob' \ --ignore 'path' \ @@ -23,7 +24,7 @@ clean: lint: @printf "==> [Test :: Lint]\n" - @$(ESLINT) $(SRC) + $(ESLINT) $(SRC) test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only @@ -33,51 +34,47 @@ test: lint test-node test-browser test-browser-unit: @printf "==> [Test :: Browser]\n" - @NODE_PATH=. $(KARMA) start + NODE_PATH=. $(KARMA) start test-browser-bdd: @printf "==> [Test :: Browser :: BDD]\n" - @MOCHA_UI=bdd $(MAKE) test-browser-unit + MOCHA_UI=bdd $(MAKE) test-browser-unit test-browser-qunit: @printf "==> [Test :: Browser :: QUnit]\n" - @MOCHA_UI=qunit $(MAKE) test-browser-unit + MOCHA_UI=qunit $(MAKE) test-browser-unit test-browser-tdd: @printf "==> [Test :: Browser :: TDD]\n" - @MOCHA_UI=tdd $(MAKE) test-browser-unit + MOCHA_UI=tdd $(MAKE) test-browser-unit test-jsapi: @printf "==> [Test :: JS API]\n" - @node test/jsapi + node test/jsapi test-unit: @printf "==> [Test :: Unit]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ test/acceptance/*.js \ --growl \ test/*.js test-integration: @printf "==> [Test :: Integrations]\n" - @./bin/mocha \ - --timeout 5000 \ + $(MOCHA) --timeout 5000 \ --reporter $(REPORTER) \ test/integration/*.js test-compilers: @printf "==> [Test :: Compilers]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --compilers coffee:coffee-script/register,foo:./test/compiler/foo \ test/acceptance/test.coffee \ test/acceptance/test.foo test-requires: @printf "==> [Test :: Requires]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --compilers coffee:coffee-script/register \ --require test/acceptance/require/a.js \ --require test/acceptance/require/b.coffee \ @@ -87,99 +84,85 @@ test-requires: test-bdd: @printf "==> [Test :: BDD]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ test/acceptance/interfaces/bdd test-tdd: @printf "==> [Test :: TDD]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ test/acceptance/interfaces/tdd test-qunit: @printf "==> [Test :: QUnit]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ test/acceptance/interfaces/qunit test-exports: @printf "==> [Test :: Exports]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui exports \ test/acceptance/interfaces/exports test-glob: @printf "==> [Test :: Glob]\n" - @./test/acceptance/glob/glob.sh + bash ./test/acceptance/glob/glob.sh test-reporters: @printf "==> [Test :: Reporters]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ test/reporters/*.js test-only: @printf "==> [Test :: Only]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ test/acceptance/misc/only/tdd - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ test/acceptance/misc/only/bdd - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ test/acceptance/misc/only/bdd-require test-global-only: - @./bin/mocha \ - --reporter $(REPORTER) \ + @printf "==> [Test :: Global Only]\n" + $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ test/acceptance/misc/only/global/tdd - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ test/acceptance/misc/only/global/bdd - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ test/acceptance/misc/only/global/qunit test-mocha: @printf "==> [Test :: Mocha]\n" - @./bin/mocha \ - --reporter $(REPORTER) \ + $(MOCHA) --reporter $(REPORTER) \ test/mocha non-tty: @printf "==> [Test :: Non-TTY]\n" - @./bin/mocha \ - --reporter dot \ + $(MOCHA) --reporter dot \ test/acceptance/interfaces/bdd 2>&1 > /tmp/dot.out @echo dot: @cat /tmp/dot.out - @./bin/mocha \ - --reporter list \ + $(MOCHA) --reporter list \ test/acceptance/interfaces/bdd 2>&1 > /tmp/list.out @echo list: @cat /tmp/list.out - @./bin/mocha \ - --reporter spec \ + $(MOCHA) --reporter spec \ test/acceptance/interfaces/bdd 2>&1 > /tmp/spec.out @echo spec: @@ -187,6 +170,6 @@ non-tty: tm: @printf "==> [TM]\n" - @open editors/$(TM_BUNDLE) + open editors/$(TM_BUNDLE) .PHONY: test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint test-only test-global-only From 3a3a6991d111091b6afc034f94132438a03c2f02 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Jul 2016 12:14:41 -0700 Subject: [PATCH 0578/1771] wip CHANGELOG update --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2997f18253..55b001f528 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# 3.0.0 / 2016-xx-xx + +## Breaking Changes + +- **Mocha no longer supports Node.js v0.8** due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0. +- **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). + +## Enhancements + +- [#2305] Improve ES3 compatibility ([@ndhoule], [@boneskull]) +- TODO + +## Bug Fixes + +- TODO + +[#2305]: https://github.com/mochajs/mocha/pull/2305 + # 2.5.3 / 2016-05-25 - [#2112] - Fix HTML reporter regression causing duplicate error output ([@danielstjules] via 6d24063) From bf216d5509003aa83a6ea54fb2893e0285259640 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 11 Jul 2016 01:39:45 -0700 Subject: [PATCH 0579/1771] tweak wording on "overspecification" exception --- lib/runnable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runnable.js b/lib/runnable.js index 2492248eba..d89a7dd5d7 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -366,7 +366,7 @@ Runnable.prototype.run = function(fn) { return done(new Error('done() invoked with non-Error: ' + err)); } if (result && utils.isPromise(result)) { - return done(new Error('Asynchronous resolution method is overspecified. Specify a callback *or* return a Promise, not both.')); + return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); } done(); From 74940ef1ba79170944f824edc23518d6bbad24ac Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 11 Jul 2016 03:13:51 -0700 Subject: [PATCH 0580/1771] added changes to CHANGELOG.md [ci skip] --- CHANGELOG.md | 106 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55b001f528..d88e4302d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,96 @@ # 3.0.0 / 2016-xx-xx -## Breaking Changes - -- **Mocha no longer supports Node.js v0.8** due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0. -- **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). - -## Enhancements - -- [#2305] Improve ES3 compatibility ([@ndhoule], [@boneskull]) -- TODO - -## Bug Fixes - -- TODO - -[#2305]: https://github.com/mochajs/mocha/pull/2305 +## :boom: Breaking Changes + +- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8** +- :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). +- `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy: +- To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, *and* returns a `Promise`, Mocha will now throw an exception: + + ```js + const assert = require('assert'); + + it('should complete this test', function (done) { + return new Promise(function (resolve) { + assert.ok(true); + resolve(); + }) + .then(done); + }); + ``` + + The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`. +- When a test timeout value *greater than* `2147483648` is specified in any context (`--timeout`, `mocha.setup()`, per-suite, per-test, etc.), the timeout will be *disabled* and the test(s) will be allowed to run indefinitely. This is equivalent to specifying a timeout value of `0`. See [MDN](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) for reasoning. +- The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests. +- Mocha no longer supports [component](https://www.npmjs.com/package/component). +- The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed. + +## :tada: Enhancements + +- [#808]: Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m]) +- [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@ELLIOTTCABLE]) +- [#1632]: Throw a useful exception when a suite or test lacks a title. ([@a8m]) +- [#1481]: Better `.only()` behavior. ([@a8m]) +- [#946]: Allow `this.skip()` in async tests and hooks. ([@boneskull]) +- [#1320]: Throw a useful exception when test resolution method is overspecified. ([@jugglinmike]) +- [#2364]: Support `--preserve-symlinks`. ([@rosswarren]) + +## :bug: Bug Fixes + +- [#2259]: Restore ES3 compatibility. Specifically, support an environment lacking `Date.prototype.toISOString()`, `JSON`, or has a non-standard implementation of `JSON`. ([@ndhoule], [@boneskull]) +- [#2286]: Fix `after()` failing to execute if test skipped using `this.skip()` in `beforeEach()`; no longer marks the entire suite as "pending". ([@dasilvacontin], [@boneskull]) +- [#2208]: Fix function name display in `markdown` and `html` (browser) reporters. ([@ScottFreeCode]) +- [#2299]: Fix progress bar in `html` (browser) reporter. ([@AviVahl]) +- [#2307]: Fix `doc` reporter crashing when test fails. ([@jleyba]) +- [#2323]: Ensure browser entry point (`browser-entry.js`) is published to npm (for use with bundlers). ([@boneskull]) +- [#2310]: Ensure custom reporter with an absolute path works in Windows. ([@silentcloud]) +- [#2311]: Fix problem wherein calling `this.slow()` without a value would blast any previously set value. ([@boneskull]) +- [#1813]: Ensure Mocha's own test suite will run in Windows. ([@tswaters], [@TimothyGu], [@boneskull]) +- [#2317]: Ensure all interfaces are displayed in `--help` on CLI. ([@ScottFreeCode]) +- [#1644]: Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae], [@boneskull]) +- [#2361]: Don't truncate name of thrown anonymous exception. ([@boneskull]) +- [#2367]: Fix invalid CSS. ([@bensontrent]) + +## :nut_and_bolt: Other + +- Upgrade production dependencies to address security advisories (and because now we can): `glob`, `commander`, `escape-string-regexp`, +and `supports-color`. ([@boneskull], [@RobLoach]) +- Add Windows to CI. ([@boneskull], [@TimothyGu]) +- Ensure appropriate `engines` field in `package.json`. ([@shinnn], [@boneskull]) + +We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! + +:shipit: + +[#2361]: https://github.com/mochajs/mocha/pull/2361 +[#2367]: https://github.com/mochajs/mocha/pull/2367 +[#2364]: https://github.com/mochajs/mocha/pull/2364 +[#1320]: https://github.com/mochajs/mocha/pull/1320 +[#2307]: https://github.com/mochajs/mocha/pull/2307 +[#2259]: https://github.com/mochajs/mocha/pull/2259 +[#2208]: https://github.com/mochajs/mocha/pull/2208 +[#2299]: https://github.com/mochajs/mocha/pull/2299 +[#2286]: https://github.com/mochajs/mocha/issue/2286 +[#1644]: https://github.com/mochajs/mocha/issue/1644 +[#2310]: https://github.com/mochajs/mocha/issue/2310 +[#2311]: https://github.com/mochajs/mocha/issue/2311 +[#2323]: https://github.com/mochajs/mocha/issue/2323 +[#2000]: https://github.com/mochajs/mocha/pull/2000 +[#1632]: https://github.com/mochajs/mocha/issue/1632 +[#1813]: https://github.com/mochajs/mocha/issue/1813 +[#946]: https://github.com/mochajs/mocha/issue/946 +[#2317]: https://github.com/mochajs/mocha/issue/2317 +[#1481]: https://github.com/mochajs/mocha/issue/1481 +[@ELLIOTCABLE]: https://github.com/elliottcable +[@RobLoach]: https://github.com/robloach +[@AviVahl]: https://github.com/avivahl +[@silentcloud]: https://github.com/silentcloud +[@tswaters]: https://github.com/tswaters +[@jleyba]: https://github.com/jleyba +[@TimothyGu]: https://github.com/timothygu +[@callumacrae]: https://github.com/callumacrae +[@shinnn]: https://github.com/shinnn +[@bensontrent]: https://github.com/bensontrent # 2.5.3 / 2016-05-25 From 08a6ccf0c40b892990a0ac702337cb7f36a2b6d4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 20 Jul 2016 21:43:40 -0400 Subject: [PATCH 0581/1771] copy to-iso-string; closes #2378 --- .eslintignore | 1 + lib/to-iso-string/LICENSE | 19 +++++++++++++++++++ lib/to-iso-string/index.js | 37 +++++++++++++++++++++++++++++++++++++ lib/utils.js | 2 +- package.json | 3 +-- 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 .eslintignore create mode 100644 lib/to-iso-string/LICENSE create mode 100644 lib/to-iso-string/index.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..e9067bb70d --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +lib/to-iso-string/ diff --git a/lib/to-iso-string/LICENSE b/lib/to-iso-string/LICENSE new file mode 100644 index 0000000000..c25db56595 --- /dev/null +++ b/lib/to-iso-string/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016 Segment.io, Inc. (friends@segment.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/to-iso-string/index.js b/lib/to-iso-string/index.js new file mode 100644 index 0000000000..cd28d7be71 --- /dev/null +++ b/lib/to-iso-string/index.js @@ -0,0 +1,37 @@ +'use strict'; + +/** + * Pad a `number` with a ten's place zero. + * + * @param {number} number + * @return {string} + */ +function pad(number) { + var n = number.toString(); + return n.length === 1 ? '0' + n : n; +} + +/** + * Turn a `date` into an ISO string. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + * + * @param {Date} date + * @return {string} + */ +function toISOString(date) { + return date.getUTCFullYear() + + '-' + pad(date.getUTCMonth() + 1) + + '-' + pad(date.getUTCDate()) + + 'T' + pad(date.getUTCHours()) + + ':' + pad(date.getUTCMinutes()) + + ':' + pad(date.getUTCSeconds()) + + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) + + 'Z'; +} + +/* + * Exports. + */ + +module.exports = toISOString; diff --git a/lib/utils.js b/lib/utils.js index dfe591c129..17bd195024 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -13,7 +13,7 @@ var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; -var toISOString = require('to-iso-string'); +var toISOString = require('./to-iso-string'); /** * Ignored directories. diff --git a/package.json b/package.json index cb9d9e022f..ecd1515b78 100644 --- a/package.json +++ b/package.json @@ -310,8 +310,7 @@ "json3": "3.3.2", "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "supports-color": "3.1.2", - "to-iso-string": "0.0.2" + "supports-color": "3.1.2" }, "devDependencies": { "browser-stdout": "^1.2.0", From 517020b326de8395d972df3a3369c7f1dc2cb7bd Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 20 Jul 2016 21:45:59 -0400 Subject: [PATCH 0582/1771] suppress warning about .eslintignore when running ESLint --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ab9437e712..73e941ef13 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ clean: lint: @printf "==> [Test :: Lint]\n" - $(ESLINT) $(SRC) + $(ESLINT) "lib/**/*.js" test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only From d0d5e507edea951c77cdcd546a674c00200e726e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 20 Jul 2016 22:28:52 -0400 Subject: [PATCH 0583/1771] fix bad reference to to-iso-string in test --- test/acceptance/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/utils.js b/test/acceptance/utils.js index 04e4380163..a2383a739f 100644 --- a/test/acceptance/utils.js +++ b/test/acceptance/utils.js @@ -1,5 +1,5 @@ var utils = require('../../lib/utils'); -var toISOString = require('to-iso-string'); +var toISOString = require('../../lib/to-iso-string'); var JSON = require('json3'); describe('lib/utils', function () { From cab1e43a36dbf9d11c35aa47433a9a8efcf33fc1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 21 Jul 2016 22:22:52 -0400 Subject: [PATCH 0584/1771] markdown fixes for CHANGELOG.md [ci skip] --- CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d88e4302d3..8c39bceee8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## :boom: Breaking Changes -- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8** +- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8**. - :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). - `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy: - To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, *and* returns a `Promise`, Mocha will now throw an exception: @@ -28,7 +28,7 @@ ## :tada: Enhancements - [#808]: Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m]) -- [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@ELLIOTTCABLE]) +- [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable]) - [#1632]: Throw a useful exception when a suite or test lacks a title. ([@a8m]) - [#1481]: Better `.only()` behavior. ([@a8m]) - [#946]: Allow `this.skip()` in async tests and hooks. ([@boneskull]) @@ -62,6 +62,7 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! :shipit: +[#808]: https://github.com/mochajs/mocha/issue/808 [#2361]: https://github.com/mochajs/mocha/pull/2361 [#2367]: https://github.com/mochajs/mocha/pull/2367 [#2364]: https://github.com/mochajs/mocha/pull/2364 @@ -81,7 +82,7 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! [#946]: https://github.com/mochajs/mocha/issue/946 [#2317]: https://github.com/mochajs/mocha/issue/2317 [#1481]: https://github.com/mochajs/mocha/issue/1481 -[@ELLIOTCABLE]: https://github.com/elliottcable +[@elliottcable]: https://github.com/elliottcable [@RobLoach]: https://github.com/robloach [@AviVahl]: https://github.com/avivahl [@silentcloud]: https://github.com/silentcloud @@ -91,6 +92,8 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! [@callumacrae]: https://github.com/callumacrae [@shinnn]: https://github.com/shinnn [@bensontrent]: https://github.com/bensontrent +[@jugglinmike]: https://github.com/jugglinmike +[@rosswarren]: https://github.com/rosswarren # 2.5.3 / 2016-05-25 From f0b184e178f2dbdda3fac37eb3f74053be9f308e Mon Sep 17 00:00:00 2001 From: Anton Date: Fri, 22 Jul 2016 09:53:42 -0400 Subject: [PATCH 0585/1771] Upgrade eslint package to 2.13 version (#2389) Rules space-after-keywords and space-return-throw-case merged into keyword-spacing --- .eslintrc | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.eslintrc b/.eslintrc index 57574b4fd1..d5c733f79f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -112,12 +112,11 @@ rules: radix: 2 semi: [2, always] semi-spacing: [2, { before: false, after: true }] - space-after-keywords: [2, always] space-before-blocks: [2, always] space-before-function-paren: [2, never] space-in-parens: [2, never] space-infix-ops: 2 - space-return-throw-case: 2 + keyword-spacing: 2 space-unary-ops: [2, { words: true, nonwords: false }] spaced-comment: [2, always, { exceptions: ['!'] }] strict: [0, global] # TODO: Change to error diff --git a/package.json b/package.json index ecd1515b78..7ddf8812f0 100644 --- a/package.json +++ b/package.json @@ -316,7 +316,7 @@ "browser-stdout": "^1.2.0", "browserify": "^13.0.0", "coffee-script": "^1.10.0", - "eslint": "^1.10.3", + "eslint": "^2.13.1", "expect.js": "^0.3.1", "karma": "^1.1.0", "karma-browserify": "^5.0.5", From 0cd9dc92485692169a769865e807f5b74d9f33d1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 25 Jul 2016 23:13:50 -0700 Subject: [PATCH 0586/1771] let child suites run if parent is exclusive; closes #2378 (#2387) - includes some more refactoring of interface code into `lib/interfaces/common.js` for DRY (still more work to be done here) - unfortunately said refactoring contains hellish logic which addresses this issue (someone should make a flowchart of this for lolz) - original PR did not address `exports` interface; this doesn't either - may need more coverage against `qunit` interface --- lib/interfaces/bdd.js | 30 ++++---- lib/interfaces/common.js | 69 ++++++++++++++++--- lib/interfaces/qunit.js | 23 ++++--- lib/interfaces/tdd.js | 30 ++++---- lib/runner.js | 6 +- test/integration/fixtures/options/only/bdd.js | 52 +++++++++++++- test/integration/fixtures/options/only/tdd.js | 14 +++- test/integration/only.js | 4 +- 8 files changed, 173 insertions(+), 55 deletions(-) diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index 186986b863..830a5fe67a 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -2,7 +2,6 @@ * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -26,7 +25,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.before = common.before; context.after = common.after; @@ -40,12 +39,11 @@ module.exports = function(suite) { */ context.describe = context.context = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - fn.call(suite); - suites.shift(); - return suite; + return common.suite.create({ + title: title, + file: file, + fn: fn + }); }; /** @@ -53,11 +51,11 @@ module.exports = function(suite) { */ context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.pending = true; - suites.unshift(suite); - fn.call(suite); - suites.shift(); + return common.suite.skip({ + title: title, + file: file, + fn: fn + }); }; /** @@ -65,7 +63,11 @@ module.exports = function(suite) { */ context.describe.only = function(title, fn) { - return common.suite.only(mocha, context.describe(title, fn)); + return common.suite.only({ + title: title, + file: file, + fn: fn + }); }; /** diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index f5ffd9609c..22432cb479 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -1,13 +1,16 @@ 'use strict'; +var Suite = require('../suite'); + /** * Functions common to more than one interface. * * @param {Suite[]} suites * @param {Context} context + * @param {Mocha} mocha * @return {Object} An object containing common functions. */ -module.exports = function(suites, context) { +module.exports = function(suites, context, mocha) { return { /** * This is only present if flag --delay is passed into Mocha. It triggers @@ -64,15 +67,60 @@ module.exports = function(suites, context) { suite: { /** - * Exclusive suite. + * Create an exclusive Suite; convenience function + * See docstring for create() below. * - * @param {Object} mocha - * @param {Function} suite + * @param {Object} opts + * @returns {Suite} */ - - only: function(mocha, suite) { - suite.isOnly = true; + only: function only(opts) { mocha.options.hasOnly = true; + opts.isOnly = true; + return this.create(opts); + }, + + /** + * Create a Suite, but skip it; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + skip: function skip(opts) { + opts.pending = true; + return this.create(opts); + }, + + /** + * Creates a suite. + * @param {Object} opts Options + * @param {string} opts.title Title of Suite + * @param {Function} [opts.fn] Suite Function (not always applicable) + * @param {boolean} [opts.pending] Is Suite pending? + * @param {string} [opts.file] Filepath where this Suite resides + * @param {boolean} [opts.isOnly] Is Suite exclusive? + * @returns {Suite} + */ + create: function create(opts) { + var suite = Suite.create(suites[0], opts.title); + suite.pending = Boolean(opts.pending); + suite.file = opts.file; + suites.unshift(suite); + // I should be pilloried for the following. + if (opts.isOnly) { + if (suite.parent && suite.parent.onlyTests) { + suite.onlyTests = suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + } else { + suite.onlyTests = suite.tests; + } + } else { + suite.onlyTests = suite.parent && suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + } + if (typeof opts.fn === 'function') { + opts.fn.call(suite); + suites.shift(); + } + return suite; } }, @@ -88,8 +136,11 @@ module.exports = function(suites, context) { */ only: function(mocha, test) { var suite = test.parent; - suite.isOnly = true; - suite.onlyTests = (suite.onlyTests || []).concat(test); + if (suite.onlyTests === suite.tests) { + suite.onlyTests = [test]; + } else { + suite.onlyTests = (suite.onlyTests || []).concat(test); + } mocha.options.hasOnly = true; return test; }, diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index 6ce20bb828..a2d67ef90f 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -2,7 +2,6 @@ * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -34,7 +33,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.before = common.before; context.after = common.after; @@ -49,18 +48,24 @@ module.exports = function(suite) { if (suites.length > 1) { suites.shift(); } - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - return suite; + return common.suite.create({ + title: title, + file: file + }); }; /** - * Exclusive test-case. + * Exclusive Suite. */ - context.suite.only = function(title, fn) { - return common.suite.only(mocha, context.suite(title, fn)); + context.suite.only = function(title) { + if (suites.length > 1) { + suites.shift(); + } + return common.suite.only({ + title: title, + file: file + }); }; /** diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index 90dcc787ad..445e992213 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -2,7 +2,6 @@ * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -34,7 +33,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.setup = common.beforeEach; context.teardown = common.afterEach; @@ -47,30 +46,33 @@ module.exports = function(suite) { * nested suites and/or tests. */ context.suite = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - fn.call(suite); - suites.shift(); - return suite; + return common.suite.create({ + title: title, + file: file, + fn: fn + }); }; /** * Pending suite. */ context.suite.skip = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.pending = true; - suites.unshift(suite); - fn.call(suite); - suites.shift(); + return common.suite.skip({ + title: title, + file: file, + fn: fn + }); }; /** * Exclusive test-case. */ context.suite.only = function(title, fn) { - return common.suite.only(mocha, context.suite(title, fn)); + return common.suite.only({ + title: title, + file: file, + fn: fn + }); }; /** diff --git a/lib/runner.js b/lib/runner.js index 1e085a6e45..5f91c0beb3 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -847,13 +847,9 @@ Runner.prototype.abort = function() { */ function filterOnly(suite) { // If it has `only` tests, run only those - if (suite.onlyTests) { - suite.tests = suite.onlyTests; - } + suite.tests = suite.onlyTests ? suite.onlyTests : []; // Filter the nested suites suite.suites = filter(suite.suites, filterOnly); - // Don't run tests from suites that are not marked as `only` - suite.tests = suite.isOnly ? suite.tests : []; // Keep the suite only if there is something to run return suite.suites.length || suite.tests.length; } diff --git a/test/integration/fixtures/options/only/bdd.js b/test/integration/fixtures/options/only/bdd.js index f2fc4fd40b..783ce19b0b 100644 --- a/test/integration/fixtures/options/only/bdd.js +++ b/test/integration/fixtures/options/only/bdd.js @@ -18,4 +18,54 @@ describe('should not run this suite', function() { it('should not run this test', function() { (true).should.equal(false); }); -}); \ No newline at end of file +}); + +describe.only('should run this suite too', function() { + describe('should run this nested suite', function () { + it('should run this test', function() {}); + + it('should run this test', function() {}); + + it('should run this test', function() {}); + }); +}); + +describe.only('should run this suite, even', function() { + describe('should run this nested suite, even', function () { + describe('should run this doubly-nested suite!', function () { + it('should run this test', function() {}); + + it('should run this test', function() {}); + + it('should run this test', function() {}); + }); + }); +}); + + +describe('should run this suite with an exclusive test', function() { + it.only('should run this test', function () {}); + + describe('should not run this nested suite', function () { + describe.only('should not run this doubly-nested suite', function () { + it('should not run this test', function() {}); + + it('should not run this test', function() {}); + + it('should not run this test', function() {}); + }); + }); +}); + +describe('should run this suite with an exclusive test (reverse order)', function() { + describe('should not run this nested suite', function () { + describe.only('should not run this doubly-nested suite', function () { + it('should not run this test', function() {}); + + it('should not run this test', function() {}); + + it('should not run this test', function() {}); + }); + }); + it.only('should run this test', function () {}); +}); diff --git a/test/integration/fixtures/options/only/tdd.js b/test/integration/fixtures/options/only/tdd.js index 6e1e37becf..129a9e5d74 100644 --- a/test/integration/fixtures/options/only/tdd.js +++ b/test/integration/fixtures/options/only/tdd.js @@ -20,4 +20,16 @@ suite('should not run this suite', function() { test('should not run this test', function() { (true).should.equal(false); }); -}); \ No newline at end of file +}); + +suite.only('should run this suite too', function() { + suite('should run this nested suite', function () { + test('should run this test', function() {}); + + test('should run this test', function() {}); + + test('should run this test', function() {}); + + test('should run this test', function() {}); + }); +}); diff --git a/test/integration/only.js b/test/integration/only.js index 3d0e4dc682..dc7644e5a4 100644 --- a/test/integration/only.js +++ b/test/integration/only.js @@ -6,7 +6,7 @@ describe('.only()', function() { run('options/only/bdd.js', ['--ui', 'bdd'], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 3); + assert.equal(res.stats.passes, 11); assert.equal(res.stats.failures, 0); assert.equal(res.code, 0); done(); @@ -17,7 +17,7 @@ describe('.only()', function() { run('options/only/tdd.js', ['--ui', 'tdd'], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 4); + assert.equal(res.stats.passes, 8); assert.equal(res.stats.failures, 0); assert.equal(res.code, 0); done(); From e3ab4ec4e29ee7beb419cb0e0309ccd804e19517 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 25 Jul 2016 23:19:47 -0700 Subject: [PATCH 0587/1771] update CHANGELOG [ci skip] --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c39bceee8..b38831b951 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,11 +57,13 @@ and `supports-color`. ([@boneskull], [@RobLoach]) - Add Windows to CI. ([@boneskull], [@TimothyGu]) - Ensure appropriate `engines` field in `package.json`. ([@shinnn], [@boneskull]) +- [#2348]: Upgrade ESLint to v2 ([@anthony-redfox]) We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! :shipit: +[#2348]: https://github.com/mochajs/mocha/issue/2348 [#808]: https://github.com/mochajs/mocha/issue/808 [#2361]: https://github.com/mochajs/mocha/pull/2361 [#2367]: https://github.com/mochajs/mocha/pull/2367 @@ -94,6 +96,7 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! [@bensontrent]: https://github.com/bensontrent [@jugglinmike]: https://github.com/jugglinmike [@rosswarren]: https://github.com/rosswarren +[@anthony-redfox]: https://github.com/anthony-redfox # 2.5.3 / 2016-05-25 From 15c344c067884cf4856bf0c4235d81be688d54d5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 25 Jul 2016 23:24:24 -0700 Subject: [PATCH 0588/1771] add browser-stdout to dependencies - addresses issue wherein mocha possibly cannot be browserified with a production install --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ddf8812f0..346008507c 100644 --- a/package.json +++ b/package.json @@ -301,6 +301,7 @@ "test": "make test" }, "dependencies": { + "browser-stdout": "1.3.0", "commander": "2.9.0", "debug": "2.2.0", "diff": "1.4.0", @@ -313,7 +314,6 @@ "supports-color": "3.1.2" }, "devDependencies": { - "browser-stdout": "^1.2.0", "browserify": "^13.0.0", "coffee-script": "^1.10.0", "eslint": "^2.13.1", From 4b4009b8e614a2adbb2511e696b39ef85ec08179 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 25 Jul 2016 23:24:45 -0700 Subject: [PATCH 0589/1771] rebuild mocha.js --- mocha.js | 384 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 219 insertions(+), 165 deletions(-) diff --git a/mocha.js b/mocha.js index cd854f7305..6a05a38584 100644 --- a/mocha.js +++ b/mocha.js @@ -168,7 +168,7 @@ global.mocha = mocha; module.exports = global; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/mocha":14,"_process":66,"browser-stdout":40}],2:[function(require,module,exports){ +},{"./lib/mocha":14,"_process":67,"browser-stdout":41}],2:[function(require,module,exports){ /* eslint-disable no-unused-vars */ module.exports = function(type) { return function() {}; @@ -615,7 +615,7 @@ Context.prototype.inspect = function() { }, 2); }; -},{"json3":53}],7:[function(require,module,exports){ +},{"json3":54}],7:[function(require,module,exports){ /** * Module dependencies. */ @@ -663,12 +663,11 @@ Hook.prototype.error = function(err) { this._error = err; }; -},{"./runnable":33,"./utils":37}],8:[function(require,module,exports){ +},{"./runnable":33,"./utils":38}],8:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -692,7 +691,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.before = common.before; context.after = common.after; @@ -706,12 +705,11 @@ module.exports = function(suite) { */ context.describe = context.context = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - fn.call(suite); - suites.shift(); - return suite; + return common.suite.create({ + title: title, + file: file, + fn: fn + }); }; /** @@ -719,11 +717,11 @@ module.exports = function(suite) { */ context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.pending = true; - suites.unshift(suite); - fn.call(suite); - suites.shift(); + return common.suite.skip({ + title: title, + file: file, + fn: fn + }); }; /** @@ -731,7 +729,11 @@ module.exports = function(suite) { */ context.describe.only = function(title, fn) { - return common.suite.only(mocha, context.describe(title, fn)); + return common.suite.only({ + title: title, + file: file, + fn: fn + }); }; /** @@ -776,17 +778,20 @@ module.exports = function(suite) { }); }; -},{"../suite":35,"../test":36,"./common":9}],9:[function(require,module,exports){ +},{"../test":36,"./common":9}],9:[function(require,module,exports){ 'use strict'; +var Suite = require('../suite'); + /** * Functions common to more than one interface. * * @param {Suite[]} suites * @param {Context} context + * @param {Mocha} mocha * @return {Object} An object containing common functions. */ -module.exports = function(suites, context) { +module.exports = function(suites, context, mocha) { return { /** * This is only present if flag --delay is passed into Mocha. It triggers @@ -843,15 +848,60 @@ module.exports = function(suites, context) { suite: { /** - * Exclusive suite. + * Create an exclusive Suite; convenience function + * See docstring for create() below. * - * @param {Object} mocha - * @param {Function} suite + * @param {Object} opts + * @returns {Suite} */ - - only: function(mocha, suite) { - suite.isOnly = true; + only: function only(opts) { mocha.options.hasOnly = true; + opts.isOnly = true; + return this.create(opts); + }, + + /** + * Create a Suite, but skip it; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + skip: function skip(opts) { + opts.pending = true; + return this.create(opts); + }, + + /** + * Creates a suite. + * @param {Object} opts Options + * @param {string} opts.title Title of Suite + * @param {Function} [opts.fn] Suite Function (not always applicable) + * @param {boolean} [opts.pending] Is Suite pending? + * @param {string} [opts.file] Filepath where this Suite resides + * @param {boolean} [opts.isOnly] Is Suite exclusive? + * @returns {Suite} + */ + create: function create(opts) { + var suite = Suite.create(suites[0], opts.title); + suite.pending = Boolean(opts.pending); + suite.file = opts.file; + suites.unshift(suite); + // I should be pilloried for the following. + if (opts.isOnly) { + if (suite.parent && suite.parent.onlyTests) { + suite.onlyTests = suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + } else { + suite.onlyTests = suite.tests; + } + } else { + suite.onlyTests = suite.parent && suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + } + if (typeof opts.fn === 'function') { + opts.fn.call(suite); + suites.shift(); + } + return suite; } }, @@ -867,8 +917,11 @@ module.exports = function(suites, context) { */ only: function(mocha, test) { var suite = test.parent; - suite.isOnly = true; - suite.onlyTests = (suite.onlyTests || []).concat(test); + if (suite.onlyTests === suite.tests) { + suite.onlyTests = [test]; + } else { + suite.onlyTests = (suite.onlyTests || []).concat(test); + } mocha.options.hasOnly = true; return test; }, @@ -894,7 +947,7 @@ module.exports = function(suites, context) { }; }; -},{}],10:[function(require,module,exports){ +},{"../suite":35}],10:[function(require,module,exports){ /** * Module dependencies. */ @@ -968,7 +1021,6 @@ exports.exports = require('./exports'); * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -1000,7 +1052,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.before = common.before; context.after = common.after; @@ -1015,18 +1067,24 @@ module.exports = function(suite) { if (suites.length > 1) { suites.shift(); } - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - return suite; + return common.suite.create({ + title: title, + file: file + }); }; /** - * Exclusive test-case. + * Exclusive Suite. */ - context.suite.only = function(title, fn) { - return common.suite.only(mocha, context.suite(title, fn)); + context.suite.only = function(title) { + if (suites.length > 1) { + suites.shift(); + } + return common.suite.only({ + title: title, + file: file + }); }; /** @@ -1055,12 +1113,11 @@ module.exports = function(suite) { }); }; -},{"../suite":35,"../test":36,"./common":9}],13:[function(require,module,exports){ +},{"../test":36,"./common":9}],13:[function(require,module,exports){ /** * Module dependencies. */ -var Suite = require('../suite'); var Test = require('../test'); /** @@ -1092,7 +1149,7 @@ module.exports = function(suite) { var suites = [suite]; suite.on('pre-require', function(context, file, mocha) { - var common = require('./common')(suites, context); + var common = require('./common')(suites, context, mocha); context.setup = common.beforeEach; context.teardown = common.afterEach; @@ -1105,30 +1162,33 @@ module.exports = function(suite) { * nested suites and/or tests. */ context.suite = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.file = file; - suites.unshift(suite); - fn.call(suite); - suites.shift(); - return suite; + return common.suite.create({ + title: title, + file: file, + fn: fn + }); }; /** * Pending suite. */ context.suite.skip = function(title, fn) { - var suite = Suite.create(suites[0], title); - suite.pending = true; - suites.unshift(suite); - fn.call(suite); - suites.shift(); + return common.suite.skip({ + title: title, + file: file, + fn: fn + }); }; /** * Exclusive test-case. */ context.suite.only = function(title, fn) { - return common.suite.only(mocha, context.suite(title, fn)); + return common.suite.only({ + title: title, + file: file, + fn: fn + }); }; /** @@ -1159,7 +1219,7 @@ module.exports = function(suite) { }); }; -},{"../suite":35,"../test":36,"./common":9}],14:[function(require,module,exports){ +},{"../test":36,"./common":9}],14:[function(require,module,exports){ (function (process,global,__dirname){ /*! * mocha @@ -1683,7 +1743,7 @@ Mocha.prototype.run = function(fn) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") -},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":37,"_process":66,"escape-string-regexp":46,"growl":48,"path":41}],15:[function(require,module,exports){ +},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":67,"escape-string-regexp":47,"growl":49,"path":42}],15:[function(require,module,exports){ /** * Helpers. */ @@ -2014,7 +2074,7 @@ exports.list = function(failures) { message = ''; } var stack = err.stack || message; - var index = stack.indexOf(message); + var index = message ? stack.indexOf(message) : -1; var actual = err.actual; var expected = err.expected; var escape = true; @@ -2323,7 +2383,7 @@ function sameType(a, b) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../ms":15,"../utils":37,"_process":66,"diff":45,"supports-color":41,"tty":5}],18:[function(require,module,exports){ +},{"../ms":15,"../utils":38,"_process":67,"diff":46,"supports-color":42,"tty":5}],18:[function(require,module,exports){ /** * Module dependencies. */ @@ -2387,7 +2447,7 @@ function Doc(runner) { }); } -},{"../utils":37,"./base":17}],19:[function(require,module,exports){ +},{"../utils":38,"./base":17}],19:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2457,7 +2517,7 @@ function Dot(runner) { inherits(Dot, Base); }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],20:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],20:[function(require,module,exports){ (function (global){ /* eslint-env browser */ @@ -2805,7 +2865,7 @@ function on(el, event, fn) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../browser/progress":4,"../utils":37,"./base":17,"escape-string-regexp":46}],21:[function(require,module,exports){ +},{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":47}],21:[function(require,module,exports){ // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); @@ -2889,7 +2949,7 @@ function clean(test) { } }).call(this,require('_process')) -},{"./base":17,"_process":66,"json3":53}],23:[function(require,module,exports){ +},{"./base":17,"_process":67,"json3":54}],23:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -2983,7 +3043,7 @@ function errorJSON(err) { } }).call(this,require('_process')) -},{"./base":17,"_process":66}],24:[function(require,module,exports){ +},{"./base":17,"_process":67}],24:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3079,7 +3139,7 @@ function Landing(runner) { inherits(Landing, Base); }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],25:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],25:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3144,7 +3204,7 @@ function List(runner) { inherits(List, Base); }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],26:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],26:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3245,7 +3305,7 @@ function Markdown(runner) { } }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],27:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],27:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3285,7 +3345,7 @@ function Min(runner) { inherits(Min, Base); }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],28:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],28:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3550,7 +3610,7 @@ function write(string) { } }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],29:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],29:[function(require,module,exports){ (function (process){ /** * Module dependencies. @@ -3643,7 +3703,7 @@ function Progress(runner, options) { inherits(Progress, Base); }).call(this,require('_process')) -},{"../utils":37,"./base":17,"_process":66}],30:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67}],30:[function(require,module,exports){ /** * Module dependencies. */ @@ -3728,7 +3788,7 @@ function Spec(runner) { */ inherits(Spec, Base); -},{"../utils":37,"./base":17}],31:[function(require,module,exports){ +},{"../utils":38,"./base":17}],31:[function(require,module,exports){ /** * Module dependencies. */ @@ -3968,7 +4028,7 @@ function tag(name, attrs, close, content) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../utils":37,"./base":17,"_process":66,"fs":41,"mkdirp":63,"path":41}],33:[function(require,module,exports){ +},{"../utils":38,"./base":17,"_process":67,"fs":42,"mkdirp":64,"path":42}],33:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -4338,7 +4398,7 @@ Runnable.prototype.run = function(fn) { return done(new Error('done() invoked with non-Error: ' + err)); } if (result && utils.isPromise(result)) { - return done(new Error('Asynchronous resolution method is overspecified. Specify a callback *or* return a Promise, not both.')); + return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); } done(); @@ -4347,7 +4407,7 @@ Runnable.prototype.run = function(fn) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ms":15,"./pending":16,"./utils":37,"debug":2,"events":3,"json3":53,"lodash.create":59}],34:[function(require,module,exports){ +},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":54,"lodash.create":60}],34:[function(require,module,exports){ (function (process,global){ /** * Module dependencies. @@ -5198,13 +5258,9 @@ Runner.prototype.abort = function() { */ function filterOnly(suite) { // If it has `only` tests, run only those - if (suite.onlyTests) { - suite.tests = suite.onlyTests; - } + suite.tests = suite.onlyTests ? suite.onlyTests : []; // Filter the nested suites suite.suites = filter(suite.suites, filterOnly); - // Don't run tests from suites that are not marked as `only` - suite.tests = suite.isOnly ? suite.tests : []; // Keep the suite only if there is something to run return suite.suites.length || suite.tests.length; } @@ -5276,7 +5332,7 @@ function extraGlobals() { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./pending":16,"./runnable":33,"./utils":37,"_process":66,"debug":2,"events":3}],35:[function(require,module,exports){ +},{"./pending":16,"./runnable":33,"./utils":38,"_process":67,"debug":2,"events":3}],35:[function(require,module,exports){ /** * Module dependencies. */ @@ -5676,7 +5732,7 @@ Suite.prototype.run = function run() { } }; -},{"./hook":7,"./ms":15,"./utils":37,"debug":2,"events":3}],36:[function(require,module,exports){ +},{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){ /** * Module dependencies. */ @@ -5728,7 +5784,46 @@ Test.prototype.clone = function() { return test; }; -},{"./runnable":33,"./utils":37,"lodash.create":59}],37:[function(require,module,exports){ +},{"./runnable":33,"./utils":38,"lodash.create":60}],37:[function(require,module,exports){ +'use strict'; + +/** + * Pad a `number` with a ten's place zero. + * + * @param {number} number + * @return {string} + */ +function pad(number) { + var n = number.toString(); + return n.length === 1 ? '0' + n : n; +} + +/** + * Turn a `date` into an ISO string. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + * + * @param {Date} date + * @return {string} + */ +function toISOString(date) { + return date.getUTCFullYear() + + '-' + pad(date.getUTCMonth() + 1) + + '-' + pad(date.getUTCDate()) + + 'T' + pad(date.getUTCHours()) + + ':' + pad(date.getUTCMinutes()) + + ':' + pad(date.getUTCSeconds()) + + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) + + 'Z'; +} + +/* + * Exports. + */ + +module.exports = toISOString; + +},{}],38:[function(require,module,exports){ (function (process,Buffer){ /* eslint-env browser */ @@ -5745,7 +5840,7 @@ var join = require('path').join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; -var toISOString = require('to-iso-string'); +var toISOString = require('./to-iso-string'); /** * Ignored directories. @@ -6493,7 +6588,7 @@ exports.isPromise = function isPromise(value) { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"_process":66,"buffer":43,"debug":2,"fs":41,"glob":41,"json3":53,"path":41,"to-iso-string":79,"util":82}],38:[function(require,module,exports){ +},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":82}],39:[function(require,module,exports){ 'use strict' exports.toByteArray = toByteArray @@ -6604,9 +6699,9 @@ function fromByteArray (uint8) { return parts.join('') } -},{}],39:[function(require,module,exports){ - },{}],40:[function(require,module,exports){ + +},{}],41:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits @@ -6635,9 +6730,9 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":66,"stream":77,"util":82}],41:[function(require,module,exports){ -arguments[4][39][0].apply(exports,arguments) -},{"dup":39}],42:[function(require,module,exports){ +},{"_process":67,"stream":78,"util":82}],42:[function(require,module,exports){ +arguments[4][40][0].apply(exports,arguments) +},{"dup":40}],43:[function(require,module,exports){ (function (global){ 'use strict'; @@ -6749,7 +6844,7 @@ exports.allocUnsafeSlow = function allocUnsafeSlow(size) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"buffer":43}],43:[function(require,module,exports){ +},{"buffer":44}],44:[function(require,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. @@ -8464,7 +8559,7 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":38,"ieee754":49,"isarray":52}],44:[function(require,module,exports){ +},{"base64-js":39,"ieee754":50,"isarray":53}],45:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8575,7 +8670,7 @@ function objectToString(o) { } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":51}],45:[function(require,module,exports){ +},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* @@ -9196,7 +9291,7 @@ function objectToString(o) { } }(this)); -},{}],46:[function(require,module,exports){ +},{}],47:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; @@ -9209,7 +9304,7 @@ module.exports = function (str) { return str.replace(matchOperatorsRe, '\\$&'); }; -},{}],47:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -9513,7 +9608,7 @@ function isUndefined(arg) { return arg === void 0; } -},{}],48:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) @@ -9807,7 +9902,7 @@ function growl(msg, options, fn) { }; }).call(this,require('_process')) -},{"_process":66,"child_process":41,"fs":41,"os":64,"path":41}],49:[function(require,module,exports){ +},{"_process":67,"child_process":42,"fs":42,"os":65,"path":42}],50:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 @@ -9893,7 +9988,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],50:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -9918,7 +10013,7 @@ if (typeof Object.create === 'function') { } } -},{}],51:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ /** * Determine if an object is Buffer * @@ -9937,14 +10032,14 @@ module.exports = function (obj) { )) } -},{}],52:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; -},{}],53:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ (function (global){ /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ ;(function () { @@ -10850,7 +10945,7 @@ module.exports = Array.isArray || function (arr) { }).call(this); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],54:[function(require,module,exports){ +},{}],55:[function(require,module,exports){ /** * lodash 3.2.0 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -10879,7 +10974,7 @@ function baseAssign(object, source) { module.exports = baseAssign; -},{"lodash._basecopy":55,"lodash.keys":62}],55:[function(require,module,exports){ +},{"lodash._basecopy":56,"lodash.keys":63}],56:[function(require,module,exports){ /** * lodash 3.0.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -10913,7 +11008,7 @@ function baseCopy(source, props, object) { module.exports = baseCopy; -},{}],56:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ /** * lodash 3.0.3 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -10972,7 +11067,7 @@ function isObject(value) { module.exports = baseCreate; -},{}],57:[function(require,module,exports){ +},{}],58:[function(require,module,exports){ /** * lodash 3.9.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11111,7 +11206,7 @@ function isNative(value) { module.exports = getNative; -},{}],58:[function(require,module,exports){ +},{}],59:[function(require,module,exports){ /** * lodash 3.0.9 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11245,7 +11340,7 @@ function isObject(value) { module.exports = isIterateeCall; -},{}],59:[function(require,module,exports){ +},{}],60:[function(require,module,exports){ /** * lodash 3.1.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11302,7 +11397,7 @@ function create(prototype, properties, guard) { module.exports = create; -},{"lodash._baseassign":54,"lodash._basecreate":56,"lodash._isiterateecall":58}],60:[function(require,module,exports){ +},{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){ /** * lodash 3.0.8 (Custom Build) * Build: `lodash modularize exports="npm" -o ./` @@ -11547,7 +11642,7 @@ function isObjectLike(value) { module.exports = isArguments; -},{}],61:[function(require,module,exports){ +},{}],62:[function(require,module,exports){ /** * lodash 3.0.4 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11729,7 +11824,7 @@ function isNative(value) { module.exports = isArray; -},{}],62:[function(require,module,exports){ +},{}],63:[function(require,module,exports){ /** * lodash 3.1.2 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` @@ -11967,7 +12062,7 @@ function keysIn(object) { module.exports = keys; -},{"lodash._getnative":57,"lodash.isarguments":60,"lodash.isarray":61}],63:[function(require,module,exports){ +},{"lodash._getnative":58,"lodash.isarguments":61,"lodash.isarray":62}],64:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); @@ -12069,7 +12164,7 @@ mkdirP.sync = function sync (p, opts, made) { }; }).call(this,require('_process')) -},{"_process":66,"fs":41,"path":41}],64:[function(require,module,exports){ +},{"_process":67,"fs":42,"path":42}],65:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { @@ -12116,7 +12211,7 @@ exports.tmpdir = exports.tmpDir = function () { exports.EOL = '\n'; -},{}],65:[function(require,module,exports){ +},{}],66:[function(require,module,exports){ (function (process){ 'use strict'; @@ -12163,7 +12258,7 @@ function nextTick(fn, arg1, arg2, arg3) { } }).call(this,require('_process')) -},{"_process":66}],66:[function(require,module,exports){ +},{"_process":67}],67:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -12284,10 +12379,10 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],67:[function(require,module,exports){ +},{}],68:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") -},{"./lib/_stream_duplex.js":68}],68:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":69}],69:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -12363,7 +12458,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":70,"./_stream_writable":72,"core-util-is":44,"inherits":50,"process-nextick-args":65}],69:[function(require,module,exports){ +},{"./_stream_readable":71,"./_stream_writable":73,"core-util-is":45,"inherits":51,"process-nextick-args":66}],70:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -12390,7 +12485,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":71,"core-util-is":44,"inherits":50}],70:[function(require,module,exports){ +},{"./_stream_transform":72,"core-util-is":45,"inherits":51}],71:[function(require,module,exports){ (function (process){ 'use strict'; @@ -13286,7 +13381,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":68,"_process":66,"buffer":43,"buffer-shims":42,"core-util-is":44,"events":47,"inherits":50,"isarray":52,"process-nextick-args":65,"string_decoder/":78,"util":39}],71:[function(require,module,exports){ +},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":79,"util":40}],72:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -13467,7 +13562,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":68,"core-util-is":44,"inherits":50}],72:[function(require,module,exports){ +},{"./_stream_duplex":69,"core-util-is":45,"inherits":51}],73:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -13996,10 +14091,10 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":68,"_process":66,"buffer":43,"buffer-shims":42,"core-util-is":44,"events":47,"inherits":50,"process-nextick-args":65,"util-deprecate":80}],73:[function(require,module,exports){ +},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":80}],74:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":69}],74:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":70}],75:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -14019,13 +14114,13 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":68,"./lib/_stream_passthrough.js":69,"./lib/_stream_readable.js":70,"./lib/_stream_transform.js":71,"./lib/_stream_writable.js":72,"_process":66}],75:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],76:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":71}],76:[function(require,module,exports){ +},{"./lib/_stream_transform.js":72}],77:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":72}],77:[function(require,module,exports){ +},{"./lib/_stream_writable.js":73}],78:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -14154,7 +14249,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":47,"inherits":50,"readable-stream/duplex.js":67,"readable-stream/passthrough.js":73,"readable-stream/readable.js":74,"readable-stream/transform.js":75,"readable-stream/writable.js":76}],78:[function(require,module,exports){ +},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":74,"readable-stream/readable.js":75,"readable-stream/transform.js":76,"readable-stream/writable.js":77}],79:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -14377,48 +14472,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":43}],79:[function(require,module,exports){ - -/** - * Expose `toIsoString`. - */ - -module.exports = toIsoString; - - -/** - * Turn a `date` into an ISO string. - * - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString - * - * @param {Date} date - * @return {String} - */ - -function toIsoString (date) { - return date.getUTCFullYear() - + '-' + pad(date.getUTCMonth() + 1) - + '-' + pad(date.getUTCDate()) - + 'T' + pad(date.getUTCHours()) - + ':' + pad(date.getUTCMinutes()) - + ':' + pad(date.getUTCSeconds()) - + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) - + 'Z'; -} - - -/** - * Pad a `number` with a ten's place zero. - * - * @param {Number} number - * @return {String} - */ - -function pad (number) { - var n = number.toString(); - return n.length === 1 ? '0' + n : n; -} -},{}],80:[function(require,module,exports){ +},{"buffer":44}],80:[function(require,module,exports){ (function (global){ /** @@ -15086,4 +15140,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":81,"_process":66,"inherits":50}]},{},[1]); +},{"./support/isBuffer":81,"_process":67,"inherits":51}]},{},[1]); From 61845293bfde4f0b5f106c54aa95c1933034533a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 00:58:48 -0700 Subject: [PATCH 0590/1771] Release v3.0.0-2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 346008507c..bf165eddd9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.0-1", + "version": "3.0.0-2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From d367bc76fd958b3bb564233f6f4513af69ff7dab Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 22:15:28 -0700 Subject: [PATCH 0591/1771] fix broken/wrong URLs in CHANGELOG.md [ci skip] --- CHANGELOG.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b38831b951..10d66ed553 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ - [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable]) - [#1632]: Throw a useful exception when a suite or test lacks a title. ([@a8m]) - [#1481]: Better `.only()` behavior. ([@a8m]) -- [#946]: Allow `this.skip()` in async tests and hooks. ([@boneskull]) +- [#2334]: Allow `this.skip()` in async tests and hooks. ([@boneskull]) - [#1320]: Throw a useful exception when test resolution method is overspecified. ([@jugglinmike]) - [#2364]: Support `--preserve-symlinks`. ([@rosswarren]) @@ -63,8 +63,8 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! :shipit: -[#2348]: https://github.com/mochajs/mocha/issue/2348 -[#808]: https://github.com/mochajs/mocha/issue/808 +[#2348]: https://github.com/mochajs/mocha/issues/2348 +[#808]: https://github.com/mochajs/mocha/issues/808 [#2361]: https://github.com/mochajs/mocha/pull/2361 [#2367]: https://github.com/mochajs/mocha/pull/2367 [#2364]: https://github.com/mochajs/mocha/pull/2364 @@ -73,17 +73,17 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! [#2259]: https://github.com/mochajs/mocha/pull/2259 [#2208]: https://github.com/mochajs/mocha/pull/2208 [#2299]: https://github.com/mochajs/mocha/pull/2299 -[#2286]: https://github.com/mochajs/mocha/issue/2286 -[#1644]: https://github.com/mochajs/mocha/issue/1644 -[#2310]: https://github.com/mochajs/mocha/issue/2310 -[#2311]: https://github.com/mochajs/mocha/issue/2311 -[#2323]: https://github.com/mochajs/mocha/issue/2323 +[#2286]: https://github.com/mochajs/mocha/issues/2286 +[#1644]: https://github.com/mochajs/mocha/issues/1644 +[#2310]: https://github.com/mochajs/mocha/issues/2310 +[#2311]: https://github.com/mochajs/mocha/issues/2311 +[#2323]: https://github.com/mochajs/mocha/issues/2323 [#2000]: https://github.com/mochajs/mocha/pull/2000 -[#1632]: https://github.com/mochajs/mocha/issue/1632 -[#1813]: https://github.com/mochajs/mocha/issue/1813 -[#946]: https://github.com/mochajs/mocha/issue/946 -[#2317]: https://github.com/mochajs/mocha/issue/2317 -[#1481]: https://github.com/mochajs/mocha/issue/1481 +[#1632]: https://github.com/mochajs/mocha/issues/1632 +[#1813]: https://github.com/mochajs/mocha/issues/1813 +[#2334]: https://github.com/mochajs/mocha/issues/2334 +[#2317]: https://github.com/mochajs/mocha/issues/2317 +[#1481]: https://github.com/mochajs/mocha/issues/1481 [@elliottcable]: https://github.com/elliottcable [@RobLoach]: https://github.com/robloach [@AviVahl]: https://github.com/avivahl From 0e2e49b0d4fa7e0f349bed70862c8099f3f3596f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 22:45:37 -0700 Subject: [PATCH 0592/1771] add bower.json to published package for npmcdn support [ci skip] --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index bf165eddd9..16ea1827d3 100644 --- a/package.json +++ b/package.json @@ -339,7 +339,8 @@ "mocha.css", "mocha.js", "browser-entry.js", - "LICENSE" + "LICENSE", + "bower.json" ], "browser": { "debug": "./lib/browser/debug.js", From 740a511ece291d86b4fcc6cd75a34d2044b25f4e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 22:45:54 -0700 Subject: [PATCH 0593/1771] fix incorrect executable name with new version of commander - yuck --- bin/_mocha | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/_mocha b/bin/_mocha index a6adadd38a..03faf3fdc5 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -105,7 +105,7 @@ program .option('--watch-extensions ,...', 'additional extensions to monitor with --watch', list, []) .option('--delay', 'wait for async suite definition') -program.name = 'mocha'; +program._name = 'mocha'; // init command From 309b8f25b1b28348319bb48f1d51a8556d55d3e2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 26 Jul 2016 23:53:26 -0700 Subject: [PATCH 0594/1771] add "logo" field to package.json [ci skip] --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 16ea1827d3..fb304e7f27 100644 --- a/package.json +++ b/package.json @@ -352,5 +352,6 @@ "path": false, "supports-color": false }, - "homepage": "https://mochajs.org" + "homepage": "https://mochajs.org", + "logo": "https://cldup.com/S9uQ-cOLYz.svg" } From 874150654f83081a51084cb48d40ea4f74d29d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Fri, 29 Jul 2016 00:06:46 +0200 Subject: [PATCH 0595/1771] Remove carriage return before each test line in spec reporter. Served no purpose --- lib/reporters/spec.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index 77a73c4f43..28993a8f32 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -5,7 +5,6 @@ var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; -var cursor = Base.cursor; /** * Expose `Spec`. @@ -57,20 +56,17 @@ function Spec(runner) { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); - cursor.CR(); console.log(fmt, test.title); } else { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); - cursor.CR(); console.log(fmt, test.title, test.duration); } }); runner.on('fail', function(test) { - cursor.CR(); console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); From 7c0284be1718521e46017fc4f68d2f50e37b8219 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 21:09:39 -0700 Subject: [PATCH 0596/1771] fixed typo in mocha.css introduced by 185c0d902e272216232630fe4e2577268456dd9a [ci skip] --- mocha.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mocha.css b/mocha.css index cd24c430d1..ec96b003c9 100644 --- a/mocha.css +++ b/mocha.css @@ -92,7 +92,7 @@ body { color: #fff; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - -box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; From 2f9a40932f3cfe717516c5437659feebdd90b578 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 21:39:26 -0700 Subject: [PATCH 0597/1771] add note about spec reporter to CHANGELOG.md [ci skip] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10d66ed553..314e768160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ - The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests. - Mocha no longer supports [component](https://www.npmjs.com/package/component). - The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed. +- `spec` reporter now omits leading carriage returns (`\r`) in non-TTY environment. ## :tada: Enhancements @@ -50,6 +51,7 @@ - [#1644]: Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae], [@boneskull]) - [#2361]: Don't truncate name of thrown anonymous exception. ([@boneskull]) - [#2367]: Fix invalid CSS. ([@bensontrent]) +- [#2401]: Remove carriage return before each test line in spec reporter. ([@Munter]) ## :nut_and_bolt: Other @@ -63,6 +65,7 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! :shipit: +[#2401]: https://github.com/mochajs/mocha/pull/2401 [#2348]: https://github.com/mochajs/mocha/issues/2348 [#808]: https://github.com/mochajs/mocha/issues/808 [#2361]: https://github.com/mochajs/mocha/pull/2361 @@ -97,6 +100,7 @@ We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! [@jugglinmike]: https://github.com/jugglinmike [@rosswarren]: https://github.com/rosswarren [@anthony-redfox]: https://github.com/anthony-redfox +[@Munter]: https://github.com/munter # 2.5.3 / 2016-05-25 From 16762d1a521c6ea2231e9c3376aa8e2acfc8fb2b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 21:46:09 -0700 Subject: [PATCH 0598/1771] fix bad merge of karma.conf.js --- karma.conf.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index e245aa474c..76e8ae631c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -60,6 +60,7 @@ module.exports = function(config) { console.error('CI mode enabled'); if (env.TRAVIS) { console.error('Travis-CI detected'); + bundleDirpath = path.join(baseBundleDirpath, process.env.TRAVIS_BUILD_ID); if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis sauceConfig = { @@ -67,14 +68,16 @@ module.exports = function(config) { + ' (' + env.TRAVIS_BUILD_ID + ')', tunnelIdentifier: env.TRAVIS_JOB_NUMBER }; - console.error('Configured SauceLabs') + console.error('Configured SauceLabs'); } else { console.error('No SauceLabs credentials present'); } } else if (env.APPVEYOR) { console.error('AppVeyor detected'); + bundleDirpath = path.join(baseBundleDirpath, process.env.APPVEYOR_BUILD_ID); } else { - console.error('Local/unknown environment detected') + console.error('Local/unknown environment detected'); + bundleDirpath = path.join(baseBundleDirpath, 'local'); // don't need to run sauce from appveyor b/c travis does it. if (!(env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY)) { console.error('No SauceLabs credentials present'); @@ -85,6 +88,7 @@ module.exports = function(config) { console.error('Configured SauceLabs'); } } + mkdirp.sync(bundleDirpath); } else { console.error('CI mode disabled'); } From 4944e31ff60105815f4b314996a9861e73f6bfd2 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 21:46:22 -0700 Subject: [PATCH 0599/1771] rebuild mocha.js --- mocha.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mocha.js b/mocha.js index 6a05a38584..fc38566c35 100644 --- a/mocha.js +++ b/mocha.js @@ -3711,7 +3711,6 @@ inherits(Progress, Base); var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; -var cursor = Base.cursor; /** * Expose `Spec`. @@ -3763,20 +3762,17 @@ function Spec(runner) { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); - cursor.CR(); console.log(fmt, test.title); } else { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); - cursor.CR(); console.log(fmt, test.title, test.duration); } }); runner.on('fail', function(test) { - cursor.CR(); console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); From e8cda7399efe1f8f1da97d8295ad323f9c64c8aa Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 22:05:58 -0700 Subject: [PATCH 0600/1771] Release v3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb304e7f27..70befdc4a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.0-2", + "version": "3.0.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 4ad372b9850d29ec8f65567b1a1f257943deb5a6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 31 Jul 2016 22:07:30 -0700 Subject: [PATCH 0601/1771] update date in CHANGELOG.md [ci skip] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 314e768160..075e2195c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 3.0.0 / 2016-xx-xx +# 3.0.0 / 2016-07-31 ## :boom: Breaking Changes From 4e814ed32f1366edc8075ecf4ce1c77d5534d876 Mon Sep 17 00:00:00 2001 From: APerson Date: Wed, 3 Aug 2016 14:19:51 -0400 Subject: [PATCH 0602/1771] Clarify landing strip docs It's not clear that the specified value for REPORTER has to be exactly `landing`, not `landingstrip` or something. --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 8506067aaa..cca4475a5e 100644 --- a/index.md +++ b/index.md @@ -968,7 +968,7 @@ The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia. ### Landing Strip -The 'Landing Strip' reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw +The Landing Strip (or "landing") reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw ![landing strip plane reporter](images/reporter-landing.png) ![landing strip with failure](images/reporter-landing-fail.png) From 8cae7a34f0b6eafeb16567beb8852b827cc5956b Mon Sep 17 00:00:00 2001 From: not-an-aardvark Date: Wed, 3 Aug 2016 18:49:26 -0400 Subject: [PATCH 0603/1771] fix nested describe.only suites; closes #2406 --- lib/interfaces/common.js | 17 ++------- lib/runner.js | 37 ++++++++++++++++--- lib/suite.js | 2 + lib/utils.js | 17 +++++++++ .../fixtures/regression/issue-2406.js | 15 ++++++++ test/integration/regression.js | 21 +++++++++-- 6 files changed, 86 insertions(+), 23 deletions(-) create mode 100644 test/integration/fixtures/regression/issue-2406.js diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 22432cb479..b367544a3f 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -106,15 +106,9 @@ module.exports = function(suites, context, mocha) { suite.pending = Boolean(opts.pending); suite.file = opts.file; suites.unshift(suite); - // I should be pilloried for the following. if (opts.isOnly) { - if (suite.parent && suite.parent.onlyTests) { - suite.onlyTests = suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; - } else { - suite.onlyTests = suite.tests; - } - } else { - suite.onlyTests = suite.parent && suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + suite.parent._onlySuites = suite.parent._onlySuites.concat(suite); + mocha.options.hasOnly = true; } if (typeof opts.fn === 'function') { opts.fn.call(suite); @@ -135,12 +129,7 @@ module.exports = function(suites, context, mocha) { * @returns {*} */ only: function(mocha, test) { - var suite = test.parent; - if (suite.onlyTests === suite.tests) { - suite.onlyTests = [test]; - } else { - suite.onlyTests = (suite.onlyTests || []).concat(test); - } + test.parent._onlyTests = test.parent._onlyTests.concat(test); mocha.options.hasOnly = true; return test; }, diff --git a/lib/runner.js b/lib/runner.js index 5f91c0beb3..ef82a33683 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -10,6 +10,7 @@ var debug = require('debug')('mocha:runner'); var Runnable = require('./runnable'); var filter = utils.filter; var indexOf = utils.indexOf; +var some = utils.some; var keys = utils.keys; var stackFilter = utils.stackTraceFilter(); var stringify = utils.stringify; @@ -846,12 +847,38 @@ Runner.prototype.abort = function() { * @api private */ function filterOnly(suite) { - // If it has `only` tests, run only those - suite.tests = suite.onlyTests ? suite.onlyTests : []; - // Filter the nested suites - suite.suites = filter(suite.suites, filterOnly); + if (suite._onlyTests.length) { + // If the suite contains `only` tests, run those and ignore any nested suites. + suite.tests = suite._onlyTests; + suite.suites = []; + } else { + // Otherwise, do not run any of the tests in this suite. + suite.tests = []; + suite._onlySuites.forEach(function(onlySuite) { + // If there are other `only` tests/suites nested in the current `only` suite, then filter the current suite. + // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. + if (hasOnly(onlySuite)) { + filterOnly(suite); + } + }); + // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. + suite.suites = filter(suite.suites, function(childSuite) { + return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite); + }); + } // Keep the suite only if there is something to run - return suite.suites.length || suite.tests.length; + return suite.tests.length || suite.suites.length; +} + +/** + * Determines whether a suite has an `only` test or suite as a descendant. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function hasOnly(suite) { + return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly); } /** diff --git a/lib/suite.js b/lib/suite.js index 74054dd0c6..bf3e4e9fef 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -61,6 +61,8 @@ function Suite(title, parentContext) { this._slow = 75; this._bail = false; this._retries = -1; + this._onlyTests = []; + this._onlySuites = []; this.delayed = false; } diff --git a/lib/utils.js b/lib/utils.js index 17bd195024..1cfbbae781 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -138,6 +138,23 @@ exports.filter = function(arr, fn) { return ret; }; +/** + * Array#some (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @return {Array} + */ +exports.some = function(arr, fn) { + for (var i = 0, l = arr.length; i < l; i++) { + if (fn(arr[i])) { + return true; + } + } + return false; +}; + /** * Object.keys (<=IE8) * diff --git a/test/integration/fixtures/regression/issue-2406.js b/test/integration/fixtures/regression/issue-2406.js new file mode 100644 index 0000000000..c800228f1e --- /dev/null +++ b/test/integration/fixtures/regression/issue-2406.js @@ -0,0 +1,15 @@ +describe('outer describe', function() { + it('should not run this test', function() {}); + describe('this suite should not run', function() { + it('should not run this test', function() {}); + }); + describe.only('this .only suite should run', function() { + describe('this suite should run', function() { + it('should run this test in a nested suite', function() {}); + }); + it('should run this test', function() {}); + }); + describe('this suite should not run', function() { + it('should not run this test', function() {}); + }); +}); diff --git a/test/integration/regression.js b/test/integration/regression.js index 3d132a6ea2..69925be20d 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -1,7 +1,8 @@ -var assert = require('assert'); -var fs = require('fs'); -var path = require('path'); -var run = require('./helpers').runMocha; +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); +var run = require('./helpers').runMocha; +var runJSON = require('./helpers').runMochaJSON; describe('regressions', function() { it('issue-1327: should run all 3 specs exactly once', function(done) { @@ -60,4 +61,16 @@ describe('regressions', function() { afterWasRun.should.be.ok(); }); }); + + it('issue-2406: should run nested describe.only suites', function(done) { + this.timeout(2000); + runJSON('regression/issue-2406.js', [], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 2); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); }); From 3b967baa7585f9815c25412e335815cd954ebda9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 3 Aug 2016 23:48:29 -0700 Subject: [PATCH 0604/1771] update CHANGELOG.md; rebuild [ci skip] --- CHANGELOG.md | 9 +++++++ mocha.js | 73 ++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 075e2195c3..26cffe5e8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# 3.0.1 / 2016-08-03 + +## :bug: Bug Fix + +- [#2406]: Restore execution of nested `describe.only()` suites ([@not-an-aardvark]) + +[#2406]: https://github.com/mochajs/mocha/issues/2406 +[@not-an-aardvark]: https://github.com/not-an-aardvark + # 3.0.0 / 2016-07-31 ## :boom: Breaking Changes diff --git a/mocha.js b/mocha.js index fc38566c35..f98c2eca50 100644 --- a/mocha.js +++ b/mocha.js @@ -887,15 +887,9 @@ module.exports = function(suites, context, mocha) { suite.pending = Boolean(opts.pending); suite.file = opts.file; suites.unshift(suite); - // I should be pilloried for the following. if (opts.isOnly) { - if (suite.parent && suite.parent.onlyTests) { - suite.onlyTests = suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; - } else { - suite.onlyTests = suite.tests; - } - } else { - suite.onlyTests = suite.parent && suite.parent.onlyTests === suite.parent.tests ? suite.tests : []; + suite.parent._onlySuites = suite.parent._onlySuites.concat(suite); + mocha.options.hasOnly = true; } if (typeof opts.fn === 'function') { opts.fn.call(suite); @@ -916,12 +910,7 @@ module.exports = function(suites, context, mocha) { * @returns {*} */ only: function(mocha, test) { - var suite = test.parent; - if (suite.onlyTests === suite.tests) { - suite.onlyTests = [test]; - } else { - suite.onlyTests = (suite.onlyTests || []).concat(test); - } + test.parent._onlyTests = test.parent._onlyTests.concat(test); mocha.options.hasOnly = true; return test; }, @@ -4417,6 +4406,7 @@ var debug = require('debug')('mocha:runner'); var Runnable = require('./runnable'); var filter = utils.filter; var indexOf = utils.indexOf; +var some = utils.some; var keys = utils.keys; var stackFilter = utils.stackTraceFilter(); var stringify = utils.stringify; @@ -5253,12 +5243,38 @@ Runner.prototype.abort = function() { * @api private */ function filterOnly(suite) { - // If it has `only` tests, run only those - suite.tests = suite.onlyTests ? suite.onlyTests : []; - // Filter the nested suites - suite.suites = filter(suite.suites, filterOnly); + if (suite._onlyTests.length) { + // If the suite contains `only` tests, run those and ignore any nested suites. + suite.tests = suite._onlyTests; + suite.suites = []; + } else { + // Otherwise, do not run any of the tests in this suite. + suite.tests = []; + suite._onlySuites.forEach(function(onlySuite) { + // If there are other `only` tests/suites nested in the current `only` suite, then filter the current suite. + // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. + if (hasOnly(onlySuite)) { + filterOnly(suite); + } + }); + // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. + suite.suites = filter(suite.suites, function(childSuite) { + return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite); + }); + } // Keep the suite only if there is something to run - return suite.suites.length || suite.tests.length; + return suite.tests.length || suite.suites.length; +} + +/** + * Determines whether a suite has an `only` test or suite as a descendant. + * + * @param {Array} suite + * @returns {Boolean} + * @api private + */ +function hasOnly(suite) { + return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly); } /** @@ -5392,6 +5408,8 @@ function Suite(title, parentContext) { this._slow = 75; this._bail = false; this._retries = -1; + this._onlyTests = []; + this._onlySuites = []; this.delayed = false; } @@ -5961,6 +5979,23 @@ exports.filter = function(arr, fn) { return ret; }; +/** + * Array#some (<=IE8) + * + * @api private + * @param {Array} arr + * @param {Function} fn + * @return {Array} + */ +exports.some = function(arr, fn) { + for (var i = 0, l = arr.length; i < l; i++) { + if (fn(arr[i])) { + return true; + } + } + return false; +}; + /** * Object.keys (<=IE8) * From 6a401c74c8f990e9c9d74e826bb56c449e1c1c3b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 3 Aug 2016 23:49:56 -0700 Subject: [PATCH 0605/1771] Release v3.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70befdc4a4..5114f2a3c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.0", + "version": "3.0.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 85315850b28861d7b1e255a86c05f3c3da7bd4af Mon Sep 17 00:00:00 2001 From: not-an-aardvark Date: Fri, 5 Aug 2016 13:57:51 -0400 Subject: [PATCH 0606/1771] fix .only suites nested within each other; closes #2417 --- lib/runner.js | 4 ++-- test/integration/fixtures/regression/issue-2417.js | 7 +++++++ test/integration/regression.js | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 test/integration/fixtures/regression/issue-2417.js diff --git a/lib/runner.js b/lib/runner.js index ef82a33683..f19a4060eb 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -855,10 +855,10 @@ function filterOnly(suite) { // Otherwise, do not run any of the tests in this suite. suite.tests = []; suite._onlySuites.forEach(function(onlySuite) { - // If there are other `only` tests/suites nested in the current `only` suite, then filter the current suite. + // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. if (hasOnly(onlySuite)) { - filterOnly(suite); + filterOnly(onlySuite); } }); // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. diff --git a/test/integration/fixtures/regression/issue-2417.js b/test/integration/fixtures/regression/issue-2417.js new file mode 100644 index 0000000000..e14aab09db --- /dev/null +++ b/test/integration/fixtures/regression/issue-2417.js @@ -0,0 +1,7 @@ +describe('outer describe', function() { + describe.only('outer describe.only', function() { + it.only('inner it.only', function() { + // should run and exit without error + }); + }); +}); diff --git a/test/integration/regression.js b/test/integration/regression.js index 69925be20d..f0762ec0e9 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.js @@ -73,4 +73,14 @@ describe('regressions', function() { done(); }); }); + + it('issue-2417: should not recurse infinitely with .only suites nested within each other', function() { + runJSON('regression/issue-2417.js', [], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 1); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + }); + }); }); From 53344e9b19520a2d91ab0ffa6bc5465d6b590676 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 7 Aug 2016 21:11:33 -0700 Subject: [PATCH 0607/1771] remove references to json-cov and html-cov reporters from executable --- bin/_mocha | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 03faf3fdc5..11d3d0c662 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -144,8 +144,6 @@ program.on('reporters', function(){ console.log(' tap - test-anything-protocol'); console.log(' landing - unicode landing strip'); console.log(' xunit - xunit reporter'); - console.log(' html-cov - HTML test coverage'); - console.log(' json-cov - JSON test coverage'); console.log(' min - minimal reporter (great with --watch)'); console.log(' json-stream - newline delimited json events'); console.log(' markdown - markdown documentation (github flavour)'); From bbc1682525ae539bdff022960b0411eac0f363b6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Aug 2016 00:26:24 -0700 Subject: [PATCH 0608/1771] avoid define() calls in dependencies; closes #2424 (#2425) --- Makefile | 1 + mocha.js | 4 ++-- scripts/dedefine.js | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 scripts/dedefine.js diff --git a/Makefile b/Makefile index 73e941ef13..c4cefe8f2f 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ all: mocha.js mocha.js: $(SRC) browser-entry.js @printf "==> [Browser :: build]\n" $(BROWSERIFY) ./browser-entry \ + --plugin ./scripts/dedefine \ --ignore 'fs' \ --ignore 'glob' \ --ignore 'path' \ diff --git a/mocha.js b/mocha.js index f98c2eca50..51dc5ee017 100644 --- a/mocha.js +++ b/mocha.js @@ -9314,7 +9314,7 @@ function objectToString(o) { /*global module */ if (typeof module !== 'undefined' && module.exports) { module.exports = JsDiff; - } else if (typeof define === 'function' && define.amd) { + } else if (false) { /*global define */ define([], function() { return JsDiff; }); } else if (typeof global.JsDiff === 'undefined') { @@ -10076,7 +10076,7 @@ module.exports = Array.isArray || function (arr) { ;(function () { // Detect the `define` function exposed by asynchronous module loaders. The // strict `define` check is necessary for compatibility with `r.js`. - var isLoader = typeof define === "function" && define.amd; + var isLoader = false; // A set of types used to distinguish objects from primitives. var objectTypes = { diff --git a/scripts/dedefine.js b/scripts/dedefine.js new file mode 100644 index 0000000000..c647c0e083 --- /dev/null +++ b/scripts/dedefine.js @@ -0,0 +1,26 @@ +'use strict'; + +/** + * This is a transform stream we're using to strip AMD calls from + * dependencies in our Browserify bundle. + */ + +var through = require('through2'); +var defineRx = /typeof define === ['"]function['"] && define\.amd/g; + +function createStream() { + return through.obj(function(chunk, enc, next) { + this.push(String(chunk) + .replace(defineRx, 'false')); + next(); + }); +} + +module.exports = function(b) { + function wrap() { + b.pipeline.get('wrap').push(createStream()); + } + + b.on('reset', wrap); + wrap(); +}; From f811d4426ded28eb0abc78ea09c741ba54a778f1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Aug 2016 00:39:07 -0700 Subject: [PATCH 0609/1771] prep release v3.0.2 [ci skip] --- CHANGELOG.md | 11 +++++++++++ mocha.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26cffe5e8a..ebb67eb2ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 3.0.2 / 2016-08-08 + +## :bug: Bug Fix + +- [#2424]: Fix error loading Mocha via Require.js ([@boneskull]) +- [#2417]: Fix execution of *deeply* nested `describe.only()` suites ([@not-an-aardvark]) +- Remove references to `json-cov` and `html-cov` reporters in CLI ([@boneskull]) + +[#2417]: https://github.com/mochajs/mocha/issues/2417 +[#2424]: https://github.com/mochajs/mocha/issues/2424 + # 3.0.1 / 2016-08-03 ## :bug: Bug Fix diff --git a/mocha.js b/mocha.js index 51dc5ee017..c9224e3b92 100644 --- a/mocha.js +++ b/mocha.js @@ -5251,10 +5251,10 @@ function filterOnly(suite) { // Otherwise, do not run any of the tests in this suite. suite.tests = []; suite._onlySuites.forEach(function(onlySuite) { - // If there are other `only` tests/suites nested in the current `only` suite, then filter the current suite. + // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. if (hasOnly(onlySuite)) { - filterOnly(suite); + filterOnly(onlySuite); } }); // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. From 2a510800bd13f095ebea3b5ae6bf6e25206d8628 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Aug 2016 00:39:46 -0700 Subject: [PATCH 0610/1771] Release v3.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5114f2a3c9..5a069ba02d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.1", + "version": "3.0.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From da81e28081a34c655ce6d4006219e95163064474 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Sat, 13 Aug 2016 01:04:31 +1000 Subject: [PATCH 0611/1771] Update favicon Fixes #41. --- favicon.ico | Bin 1150 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/favicon.ico b/favicon.ico index 3abe2ac4f1783dab6d6459d8f8d8683a639a8dd4..360d8fd18db0d17d19a849edc96f18cc29a9af9c 100644 GIT binary patch literal 15086 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 RLdpbuBuEWNEl3YYF8~MhX$}AY From 25c439e920f18ede5dc473ff142f0007d176f69c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 12 Aug 2016 11:41:10 -0700 Subject: [PATCH 0612/1771] update favicon from @Alhadis --- favicon.ico | Bin 15086 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/favicon.ico b/favicon.ico index 360d8fd18db0d17d19a849edc96f18cc29a9af9c..8c773fc0e1008cd3c7ee559bcbf41cf25d3d8a50 100644 GIT binary patch literal 15086 zcmeHNzi(7W5MFauAX0>>kf>~=L?WFFNJDW*NGKKJKQIkSiu?&6JBk$2M2%kW3+KLa&Mhs)@fqh{L3Re5^WV-p_ahcuz#6Eyn;^==@ADyR^WU$(`S~>H z1;}R-bxya5CC3(g_qZPXVZ{A!?NsGWScqGgs<>iKZFSa*4F0s=Gw-bVDy*qo@o5k2y|2^z0WhYu z^MZQ~dD@Fo%w^;4sH-!>HJ#KD>{iu|a!9}Q&)il~Sq$7a?w_5z7UOE|9K*iwD_5!k z`c7-uVkx^;e4JC?Qv8%DCtctlz`iiq{ilD<@ocb`EK$Zet|4~mldJx8rYKW?Z4H0i z&$RZl`~Vm4TimY|5b-h=675n(>?Fq7+H)yvsdm(3l*5sI=DKmj9M~V$G8Xn8)?a!C zbT4nb2e2*t%8~GA_iEY_F_ws%dEp+&F83hYw#|*bhArVwdt{>=(XMRASnPd3=eo`O z+cU;owerlX7{CW0oq^WxW3X-W!!y=6H!<(&{xXKpmuww0xrV*8_q1kTc>veFh4@?P zLB=-wgFRnay>nddjE@yutA2|5)ciObRddn>PkU!;^=W(vzw*?mKQJa^JAFpzqCccQ z8b1da{Aq54pXZ|J>C;}vT&4IM-vh?rKaToo6Tfye){Nw{?ETDC{sVYe+@uiF? zmp@tLc>iYPS9)Q*`?R+}`R>}>I{99~T^PSvb9X6!aZ$)`6 z{(H3Z)VUt@s<`J5^GEpmKZo*nn?t^r@U0()@~yi=zH@TO|B2i$495jujN=Chhv(tn zX)R&nuYiib)570!P5VQgoB%xrvDc3yt~oKSpHxq_z;93RYcbuX9qFbv>yD)legX6s zh(5?SD(ID2!#|a4gaNif9-}YCcLU>j5HVRg8^^-A(ZoM&$+wMt9di1S4`C9&jJaDN z!Dwk zd)j6GQ-2z3Pk8<;&g?yazH&dZmyj#3^d*viaqW}xb}PnIdk>6%#YBn`9r`9IchlB@J!eH7!!G-988JUW9(ORT{cJ#AJ%w0wuIh5` zAFOFu;g&*%72~uOa15gt6DpafA&=7y$#AfzqXD(#x>&B85%inv5weV z!kLa^_B!>5k@b*sJaOOa#3(!9+#Bw-^2%Bd&pvhRG+hH<#eFu$ud`CS&*Wl&Pn`?J z9{Lh<08-sQj(A$hx5ZfEU$H6|#GrFFZ*|+eCJqpNvIgxvmi}ws=bB)mZ|Z{|$$b;M zb#>uawP5e@It#7ueHku;f%oa~j3-&y`mSW~Ins-A{rK1Tyg+)|^L~BL`=8Ev|I4S| zpZU!DrTIXI{q5Dm{^4rbe+QU3=!2XK6h7~SZy)&Q!yn$idjMMZ{yjclykCTn)CWBQ zdC#WF&k{?Z;ycBJ)1y3t^ZyGRCZz9irFCF*FGjuZ!7aVT_#)sG?_s>w&*(qGHHo^^ zA>9Z43VOu#;3F6`20sVldgV&y)58Hv}F zg&d60r+=ICvg>jF>4&+$T0)eQDr?B%!a8E-dg8un=XhQA!#dsrPH_&Lv68+6y^OMn z&m35*Tr$`6{}yy4<}&}185_jT9M-}w{fJdKh(E++=XJfm=p1QxVMu?2@9d1y>y!NM QI;4Xq&VA_PdUZJd4;BRS(>CnY7R=8nxm6r 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 Date: Fri, 12 Aug 2016 11:47:36 -0700 Subject: [PATCH 0613/1771] update formatting for "landing" reporter text --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index cca4475a5e..1a9f1819a4 100644 --- a/index.md +++ b/index.md @@ -968,7 +968,7 @@ The TAP reporter emits lines for a [Test-Anything-Protocol](http://en.wikipedia. ### Landing Strip -The Landing Strip (or "landing") reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw +The Landing Strip (`landing`) reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw ![landing strip plane reporter](images/reporter-landing.png) ![landing strip with failure](images/reporter-landing-fail.png) From b7872665585f77f7bcabb75b3a2007e271f5875e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slobodan=20Mi=C5=A1kovi=C4=87?= Date: Fri, 12 Aug 2016 11:48:19 -0700 Subject: [PATCH 0614/1771] Basic docs for XUnit reporter (#49) * Basic docs for XUnit reporter * better wording for xunit reporter doc --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 1a9f1819a4..1f4fe11297 100644 --- a/index.md +++ b/index.md @@ -1063,7 +1063,7 @@ The "HTML" reporter is currently the only browser reporter supported by Mocha, a ### Undocumented Reporters -The "XUnit" reporter is also available, but someone needs to write the documentation. +The "XUnit" reporter is also available. By default, it will output to the console. To write directly to a file, use `--reporter-options output=filename.xml`. ### Third party reporters From 307c27126e310b8d1f1387d390ddb7113928c05a Mon Sep 17 00:00:00 2001 From: "Philip M. White" Date: Fri, 12 Aug 2016 11:49:04 -0700 Subject: [PATCH 0615/1771] Fix usage of `done()` on error (#46) --- index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 1f4fe11297..b83e093784 100644 --- a/index.md +++ b/index.md @@ -145,8 +145,8 @@ describe('User', function() { it('should save without error', function(done) { var user = new User('Luna'); user.save(function(err) { - if (err) throw err; - done(); + if (err) done(err); + else done(); }); }); }); From f3b58f1e62483801d917804f954a277fc85c0841 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 12 Aug 2016 11:59:37 -0700 Subject: [PATCH 0616/1771] fix bad formatting in CLI options headers; closes #51 --- css/style.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/css/style.css b/css/style.css index 8df06950c7..b271de0b5a 100644 --- a/css/style.css +++ b/css/style.css @@ -52,6 +52,11 @@ h3 { text-transform: uppercase; } +h3 > code { + text-transform: none; + font-size: 14px; +} + #tag { opacity: 0; color: #c29d7f; From 0aa932b67b059e394f22db0062e7cffba09d56f4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 28 Aug 2016 11:45:51 -0700 Subject: [PATCH 0617/1771] adds *.orig to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 99fb76a31b..fa1c0b0ccf 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ lib/browser/diff.js npm-debug.log* .envrc .karma/ +*.orig + From 239d6d257e925b9cffa2a7f58b89c79060587c6f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 28 Aug 2016 12:50:58 -0700 Subject: [PATCH 0618/1771] lints more files; add more files to lint check; closes #2457 --- Makefile | 2 +- bin/_mocha | 228 ++++++++++++++++++++++++++++------------------- bin/mocha | 36 ++++---- browser-entry.js | 56 ++++++++---- mocha.js | 56 ++++++++---- package.json | 4 +- 6 files changed, 233 insertions(+), 149 deletions(-) diff --git a/Makefile b/Makefile index c4cefe8f2f..3627f046ab 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ clean: lint: @printf "==> [Test :: Lint]\n" - $(ESLINT) "lib/**/*.js" + $(ESLINT) browser-entry.js index.js karma.conf.js bin/mocha bin/_mocha "lib/**/*.js" "scripts/**/*.js" test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only diff --git a/bin/_mocha b/bin/_mocha index 11d3d0c662..98cabdbc47 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -1,31 +1,33 @@ #!/usr/bin/env node +/* eslint no-unused-vars: off */ + /** * Module dependencies. */ -var program = require('commander'), - path = require('path'), - fs = require('fs'), - resolve = path.resolve, - exists = fs.existsSync || path.existsSync, - Mocha = require('../'), - utils = Mocha.utils, - interfaceNames = Object.keys(Mocha.interfaces), - join = path.join, - cwd = process.cwd(), - getOptions = require('./options'), - mocha = new Mocha; +var program = require('commander'); +var path = require('path'); +var fs = require('fs'); +var resolve = path.resolve; +var exists = fs.existsSync || path.existsSync; +var Mocha = require('../'); +var utils = Mocha.utils; +var interfaceNames = Object.keys(Mocha.interfaces); +var join = path.join; +var cwd = process.cwd(); +var getOptions = require('./options'); +var mocha = new Mocha(); /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; /** * Files. @@ -50,23 +52,23 @@ var requires = []; */ var images = { - fail: __dirname + '/../images/error.png' - , pass: __dirname + '/../images/ok.png' + fail: path.join(__dirname, '..', 'images', 'error.png'), + pass: path.join(__dirname, '..', 'images', 'ok.png') }; // options program - .version(JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version) + .version(JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')).version) .usage('[debug] [options] [files]') - .option('-A, --async-only', "force all tests to take a callback (async) or return a promise") + .option('-A, --async-only', 'force all tests to take a callback (async) or return a promise') .option('-c, --colors', 'force enabling of colors') .option('-C, --no-colors', 'force disabling of colors') .option('-G, --growl', 'enable growl notification support') .option('-O, --reporter-options ', 'reporter-specific options') .option('-R, --reporter ', 'specify the reporter to use', 'spec') - .option('-S, --sort', "sort test files") - .option('-b, --bail', "bail after first test failure") + .option('-S, --sort', 'sort test files') + .option('-b, --bail', 'bail after first test failure') .option('-d, --debug', "enable node's debugger, synonym for node --debug") .option('-g, --grep ', 'only run tests matching ') .option('-f, --fgrep ', 'only run tests containing ') @@ -103,7 +105,7 @@ program .option('--trace-deprecation', 'show stack traces on deprecations') .option('--use_strict', 'enforce strict mode') .option('--watch-extensions ,...', 'additional extensions to monitor with --watch', list, []) - .option('--delay', 'wait for async suite definition') + .option('--delay', 'wait for async suite definition'); program._name = 'mocha'; @@ -112,7 +114,7 @@ program._name = 'mocha'; program .command('init ') .description('initialize a client-side mocha setup at ') - .action(function(path){ + .action(function(path) { var mkdir = require('mkdirp'); mkdir.sync(path); var css = fs.readFileSync(join(__dirname, '..', 'mocha.css')); @@ -127,13 +129,13 @@ program // --globals -program.on('globals', function(val){ +program.on('globals', function(val) { globals = globals.concat(list(val)); }); // --reporters -program.on('reporters', function(){ +program.on('reporters', function() { console.log(); console.log(' dot - dot matrix'); console.log(' doc - html documentation'); @@ -154,7 +156,7 @@ program.on('reporters', function(){ // --interfaces -program.on('interfaces', function(){ +program.on('interfaces', function() { console.log(''); interfaceNames.forEach(function(interfaceName) { console.log(' ' + interfaceName); @@ -167,9 +169,11 @@ program.on('interfaces', function(){ module.paths.push(cwd, join(cwd, 'node_modules')); -program.on('require', function(mod){ +program.on('require', function(mod) { var abs = exists(mod) || exists(mod + '.js'); - if (abs) mod = resolve(mod); + if (abs) { + mod = resolve(mod); + } requires.push(mod); }); @@ -190,16 +194,16 @@ Error.stackTraceLimit = Infinity; // TODO: config var reporterOptions = {}; if (program.reporterOptions !== undefined) { - program.reporterOptions.split(",").forEach(function(opt) { - var L = opt.split("="); - if (L.length > 2 || L.length === 0) { - throw new Error("invalid reporter option '" + opt + "'"); - } else if (L.length === 2) { - reporterOptions[L[0]] = L[1]; - } else { - reporterOptions[L[0]] = true; - } - }); + program.reporterOptions.split(',').forEach(function(opt) { + var L = opt.split('='); + if (L.length > 2 || L.length === 0) { + throw new Error("invalid reporter option '" + opt + "'"); + } else if (L.length === 2) { + reporterOptions[L[0]] = L[1]; + } else { + reporterOptions[L[0]] = true; + } + }); } // reporter @@ -214,37 +218,46 @@ try { } catch (err) { try { Reporter = require(program.reporter); - } catch (err) { + } catch (err2) { throw new Error('reporter "' + program.reporter + '" does not exist'); } } // --no-colors -if (!program.colors) mocha.useColors(false); +if (!program.colors) { + mocha.useColors(false); +} // --colors -if (~process.argv.indexOf('--colors') || - ~process.argv.indexOf('-c')) { +if (~process.argv.indexOf('--colors') || ~process.argv.indexOf('-c')) { mocha.useColors(true); } // --inline-diffs -if (program.inlineDiffs) mocha.useInlineDiffs(true); +if (program.inlineDiffs) { + mocha.useInlineDiffs(true); +} // --slow -if (program.slow) mocha.suite.slow(program.slow); +if (program.slow) { + mocha.suite.slow(program.slow); +} // --no-timeouts -if (!program.timeouts) mocha.enableTimeouts(false); +if (!program.timeouts) { + mocha.enableTimeouts(false); +} // --timeout -if (program.timeout) mocha.suite.timeout(program.timeout); +if (program.timeout) { + mocha.suite.timeout(program.timeout); +} // --bail @@ -252,35 +265,51 @@ mocha.suite.bail(program.bail); // --grep -if (program.grep) mocha.grep(program.grep); +if (program.grep) { + mocha.grep(program.grep); +} // --fgrep -if (program.fgrep) mocha.fgrep(program.fgrep); +if (program.fgrep) { + mocha.fgrep(program.fgrep); +} // --invert -if (program.invert) mocha.invert(); +if (program.invert) { + mocha.invert(); +} // --check-leaks -if (program.checkLeaks) mocha.checkLeaks(); +if (program.checkLeaks) { + mocha.checkLeaks(); +} // --stack-trace -if(program.fullTrace) mocha.fullTrace(); +if (program.fullTrace) { + mocha.fullTrace(); +} // --growl -if (program.growl) mocha.growl(); +if (program.growl) { + mocha.growl(); +} // --async-only -if (program.asyncOnly) mocha.asyncOnly(); +if (program.asyncOnly) { + mocha.asyncOnly(); +} // --delay -if (program.delay) mocha.delay(); +if (program.delay) { + mocha.delay(); +} // --globals @@ -288,17 +317,21 @@ mocha.globals(globals); // --retries -if (program.retries) mocha.suite.retries(program.retries); +if (program.retries) { + mocha.suite.retries(program.retries); +} // custom compiler support var extensions = ['js']; program.compilers.forEach(function(c) { - var idx = c.indexOf(':') - , ext = c.slice(0, idx) - , mod = c.slice(idx + 1); + var idx = c.indexOf(':'); + var ext = c.slice(0, idx); + var mod = c.slice(idx + 1); - if (mod[0] == '.') mod = join(process.cwd(), mod); + if (mod[0] === '.') { + mod = join(process.cwd(), mod); + } require(mod); extensions.push(ext); program.watchExtensions.push(ext); @@ -314,21 +347,23 @@ requires.forEach(function(mod) { mocha.ui(program.ui); -//args +// args var args = program.args; // default files to test/*.{js,coffee} -if (!args.length) args.push('test'); +if (!args.length) { + args.push('test'); +} -args.forEach(function(arg){ +args.forEach(function(arg) { files = files.concat(utils.lookupFiles(arg, extensions, program.recursive)); }); // resolve -files = files.map(function(path){ +files = files.map(function(path) { return resolve(path); }); @@ -339,54 +374,58 @@ if (program.sort) { // --watch var runner; +var loadAndRun; +var purge; +var rerun; + if (program.watch) { console.log(); hideCursor(); - process.on('SIGINT', function(){ + process.on('SIGINT', function() { showCursor(); console.log('\n'); process.exit(); }); - var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions)); var runAgain = false; - function loadAndRun() { + loadAndRun = function loadAndRun() { try { mocha.files = files; runAgain = false; - runner = mocha.run(function(){ + runner = mocha.run(function() { runner = null; if (runAgain) { rerun(); } }); - } catch(e) { + } catch (e) { console.log(e.stack); } - } + }; - function purge() { - watchFiles.forEach(function(file){ + purge = function purge() { + watchFiles.forEach(function(file) { delete require.cache[file]; }); - } + }; loadAndRun(); - function rerun() { + rerun = function rerun() { purge(); - stop() - if (!program.grep) + stop(); + if (!program.grep) { mocha.grep(null); + } mocha.suite = mocha.suite.clone(); - mocha.suite.ctx = new Mocha.Context; + mocha.suite.ctx = new Mocha.Context(); mocha.ui(program.ui); loadAndRun(); - } + }; - utils.watch(watchFiles, function(){ + utils.watch(watchFiles, function() { runAgain = true; if (runner) { runner.abort(); @@ -394,18 +433,17 @@ if (program.watch) { rerun(); } }); - } else { - // load mocha.files = files; runner = mocha.run(program.exit ? exit : exitLater); - } function exitLater(code) { - process.on('exit', function() { process.exit(code) }) + process.on('exit', function() { + process.exit(code); + }); } function exit(code) { @@ -413,13 +451,15 @@ function exit(code) { // https://github.com/joyent/node/issues/6247 is just one bug example // https://github.com/visionmedia/mocha/issues/333 has a good discussion function done() { - if (!(draining--)) process.exit(code); + if (!(draining--)) { + process.exit(code); + } } var draining = 0; var streams = [process.stdout, process.stderr]; - streams.forEach(function(stream){ + streams.forEach(function(stream) { // submit empty write request and wait for completion draining += 1; stream.write('', done); @@ -428,7 +468,9 @@ function exit(code) { done(); } -process.on('SIGINT', function() { runner.abort(); }) +process.on('SIGINT', function() { + runner.abort(); +}); /** * Parse list. @@ -442,7 +484,7 @@ function list(str) { * Hide the cursor. */ -function hideCursor(){ +function hideCursor() { process.stdout.write('\u001b[?25l'); } @@ -450,7 +492,7 @@ function hideCursor(){ * Show the cursor. */ -function showCursor(){ +function showCursor() { process.stdout.write('\u001b[?25h'); } @@ -468,11 +510,11 @@ function stop() { */ function play(arr, interval) { - var len = arr.length - , interval = interval || 100 - , i = 0; + var len = arr.length; + interval = interval || 100; + var i = 0; - play.timer = setInterval(function(){ + play.timer = setInterval(function() { var str = arr[i++ % len]; process.stdout.write('\u001b[0G' + str); }, interval); diff --git a/bin/mocha b/bin/mocha index 99bc18ae4d..4810d23592 100755 --- a/bin/mocha +++ b/bin/mocha @@ -5,17 +5,16 @@ * when found, before invoking the "real" _mocha(1) executable. */ -var spawn = require('child_process').spawn, - path = require('path'), - fs = require('fs'), - getOptions = require('./options'), - args = [path.join(__dirname, '_mocha')]; +var spawn = require('child_process').spawn; +var path = require('path'); +var getOptions = require('./options'); +var args = [path.join(__dirname, '_mocha')]; // Load mocha.opts into process.argv // Must be loaded here to handle node-specific options getOptions(); -process.argv.slice(2).forEach(function(arg){ +process.argv.slice(2).forEach(function(arg) { var flag = arg.split('=')[0]; switch (flag) { @@ -46,19 +45,26 @@ process.argv.slice(2).forEach(function(arg){ args.unshift(arg); break; default: - if (0 == arg.indexOf('--harmony')) args.unshift(arg); - else if (0 == arg.indexOf('--trace')) args.unshift(arg); - else if (0 == arg.indexOf('--icu-data-dir')) args.unshift(arg); - else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg); - else if (0 == arg.indexOf('--preserve-symlinks')) args.unshift(arg); - else args.push(arg); + if (arg.indexOf('--harmony') === 0) { + args.unshift(arg); + } else if (arg.indexOf('--trace') === 0) { + args.unshift(arg); + } else if (arg.indexOf('--icu-data-dir') === 0) { + args.unshift(arg); + } else if (arg.indexOf('--max-old-space-size') === 0) { + args.unshift(arg); + } else if (arg.indexOf('--preserve-symlinks') === 0) { + args.unshift(arg); + } else { + args.push(arg); + } break; } }); var proc = spawn(process.execPath, args, { stdio: 'inherit' }); -proc.on('exit', function (code, signal) { - process.on('exit', function(){ +proc.on('exit', function(code, signal) { + process.on('exit', function() { if (signal) { process.kill(process.pid, signal); } else { @@ -68,7 +74,7 @@ proc.on('exit', function (code, signal) { }); // terminate children. -process.on('SIGINT', function () { +process.on('SIGINT', function() { proc.kill('SIGINT'); // calls runner.abort() proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. }); diff --git a/browser-entry.js b/browser-entry.js index 341a199914..789e686ae6 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -1,3 +1,5 @@ +/* eslint no-unused-vars: off */ + /** * Shim process.stdout. */ @@ -33,15 +35,17 @@ var originalOnerrorHandler = global.onerror; * Revert to original onerror handler if previously defined. */ -process.removeListener = function(e, fn){ - if ('uncaughtException' == e) { +process.removeListener = function(e, fn) { + if (e === 'uncaughtException') { if (originalOnerrorHandler) { global.onerror = originalOnerrorHandler; } else { global.onerror = function() {}; } var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn); - if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); } + if (i !== -1) { + uncaughtExceptionHandlers.splice(i, 1); + } } }; @@ -49,9 +53,9 @@ process.removeListener = function(e, fn){ * Implements uncaughtException listener. */ -process.on = function(e, fn){ - if ('uncaughtException' == e) { - global.onerror = function(err, url, line){ +process.on = function(e, fn) { + if (e === 'uncaughtException') { + global.onerror = function(err, url, line) { fn(new Error(err + ' (' + url + ':' + line + ')')); return !mocha.allowUncaught; }; @@ -64,8 +68,8 @@ process.on = function(e, fn){ // Ensure that this default UI does not expose its methods to the global scope. mocha.suite.removeAllListeners('pre-require'); -var immediateQueue = [] - , immediateTimeout; +var immediateQueue = []; +var immediateTimeout; function timeslice() { var immediateStart = new Date().getTime(); @@ -96,7 +100,7 @@ Mocha.Runner.immediately = function(callback) { * only receive the 'message' attribute of the Error. */ mocha.throwError = function(err) { - Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) { + Mocha.utils.forEach(uncaughtExceptionHandlers, function(fn) { fn(err); }); throw err; @@ -107,7 +111,7 @@ mocha.throwError = function(err) { * Normally this would happen in Mocha.prototype.loadFiles. */ -mocha.ui = function(ui){ +mocha.ui = function(ui) { Mocha.prototype.ui.call(this, ui); this.suite.emit('pre-require', global, null, this); return this; @@ -117,9 +121,15 @@ mocha.ui = function(ui){ * Setup mocha with the given setting options. */ -mocha.setup = function(opts){ - if ('string' == typeof opts) opts = { ui: opts }; - for (var opt in opts) this[opt](opts[opt]); +mocha.setup = function(opts) { + if (typeof opts === 'string') { + opts = { ui: opts }; + } + for (var opt in opts) { + if (opts.hasOwnProperty(opt)) { + this[opt](opts[opt]); + } + } return this; }; @@ -127,22 +137,30 @@ mocha.setup = function(opts){ * Run mocha, returning the Runner. */ -mocha.run = function(fn){ +mocha.run = function(fn) { var options = mocha.options; mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) mocha.grep(query.grep); - if (query.fgrep) mocha.fgrep(query.fgrep); - if (query.invert) mocha.invert(); + if (query.grep) { + mocha.grep(query.grep); + } + if (query.fgrep) { + mocha.fgrep(query.fgrep); + } + if (query.invert) { + mocha.invert(); + } - return Mocha.prototype.run.call(mocha, function(err){ + return Mocha.prototype.run.call(mocha, function(err) { // The DOM Document is not available in Web Workers. var document = global.document; if (document && document.getElementById('mocha') && options.noHighlighting !== true) { Mocha.utils.highlightTags('code'); } - if (fn) fn(err); + if (fn) { + fn(err); + } }); }; diff --git a/mocha.js b/mocha.js index c9224e3b92..3ca0ae9e67 100644 --- a/mocha.js +++ b/mocha.js @@ -1,5 +1,7 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0.10.x", From 95e524c3ef39bf0a6886cec4e624a2d67754ce0a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 14 Sep 2016 12:51:13 -0700 Subject: [PATCH 0619/1771] disregard function names when testing under Node.js 6.5.0; closes #2467 (#2477) --- test/suite.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/suite.js b/test/suite.js index 7fead0745a..54a1acd667 100644 --- a/test/suite.js +++ b/test/suite.js @@ -136,7 +136,7 @@ describe('Suite', function(){ this.suite._beforeAll.should.have.length(1); var beforeAllItem = this.suite._beforeAll[0]; - beforeAllItem.title.should.equal('"before all" hook'); + beforeAllItem.title.should.match(/^"before all" hook/); beforeAllItem.fn.should.equal(fn); }); @@ -171,7 +171,7 @@ describe('Suite', function(){ this.suite._afterAll.should.have.length(1); var afterAllItem = this.suite._afterAll[0]; - afterAllItem.title.should.equal('"after all" hook'); + afterAllItem.title.should.match(/^"after all" hook/); afterAllItem.fn.should.equal(fn); }); it('appends title to hook', function(){ @@ -205,7 +205,7 @@ describe('Suite', function(){ this.suite._beforeEach.should.have.length(1); var beforeEachItem = this.suite._beforeEach[0]; - beforeEachItem.title.should.equal('"before each" hook'); + beforeEachItem.title.should.match(/^"before each" hook/); beforeEachItem.fn.should.equal(fn); }); @@ -240,7 +240,7 @@ describe('Suite', function(){ this.suite._afterEach.should.have.length(1); var afterEachItem = this.suite._afterEach[0]; - afterEachItem.title.should.equal('"after each" hook'); + afterEachItem.title.should.match(/^"after each" hook/); afterEachItem.fn.should.equal(fn); }); From 772e50f353949812b04164fd210fb104b52ad1ff Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 14 Sep 2016 13:28:13 -0700 Subject: [PATCH 0620/1771] revert accidental change to bin paths --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ffda0eb643..5a069ba02d 100644 --- a/package.json +++ b/package.json @@ -290,8 +290,8 @@ "url": "https://github.com/mochajs/mocha.git" }, "bin": { - "mocha": "./bin/mocha.js", - "_mocha": "./bin/_mocha.js" + "mocha": "./bin/mocha", + "_mocha": "./bin/_mocha" }, "engines": { "node": ">= 0.10.x", From 539255c8a8c8bba5b432156b0f86f57eb13b0ce5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 14 Sep 2016 16:29:30 -0700 Subject: [PATCH 0621/1771] avoid test flake in "delay" test; closes #2469 (#2470) --- test/integration/fixtures/options/delay.js | 5 ----- test/integration/options.js | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/test/integration/fixtures/options/delay.js b/test/integration/fixtures/options/delay.js index 32b8f99383..a8bf2d4112 100644 --- a/test/integration/fixtures/options/delay.js +++ b/test/integration/fixtures/options/delay.js @@ -1,13 +1,8 @@ var assert = require('assert'); var delay = 500; -var start = new Date().getTime(); setTimeout(function() { describe('delayed execution', function() { - it('should have waited ' + delay + 'ms to run this suite', function() { - assert(new Date().getTime() - delay >= start); - }); - it('should have no effect if attempted twice in the same suite', function() { assert(true); run(); diff --git a/test/integration/options.js b/test/integration/options.js index 5e18ac5e71..5371b7a7df 100644 --- a/test/integration/options.js +++ b/test/integration/options.js @@ -85,11 +85,11 @@ describe('options', function() { run('options/delay.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); + assert.equal(res.stats.passes, 1); assert.equal(res.stats.failures, 0); assert.equal(res.passes[0].title, - 'should have waited 500ms to run this suite'); + 'should have no effect if attempted twice in the same suite'); assert.equal(res.code, 0); done(); }); From 5e1cd44c1f4e7301b6368209abf986bd6becca92 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 16 Sep 2016 16:47:17 -0700 Subject: [PATCH 0622/1771] always halt execution when async skip() called; closes #2465 (#2479) - always halt execution when async skip() called; closes #2465 - also fixes lack of support for async `skip()` when `allowUncaught` option is used - adds some debuggability into `this.skip()` calls - avoid double-failure conditions when using this.skip() - fix bad Runner tests; lint & add test/runner.js to check --- .eslintignore | 2 + Makefile | 2 +- lib/runnable.js | 15 ++- lib/runner.js | 10 +- test/runner.js | 319 ++++++++++++++++++++++++++---------------------- 5 files changed, 191 insertions(+), 157 deletions(-) diff --git a/.eslintignore b/.eslintignore index e9067bb70d..2b550ca81d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ lib/to-iso-string/ +test/**/* +!test/runner.js diff --git a/Makefile b/Makefile index 3627f046ab..4cd9692269 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ clean: lint: @printf "==> [Test :: Lint]\n" - $(ESLINT) browser-entry.js index.js karma.conf.js bin/mocha bin/_mocha "lib/**/*.js" "scripts/**/*.js" + $(ESLINT) browser-entry.js index.js karma.conf.js bin/mocha bin/_mocha "lib/**/*.js" "scripts/**/*.js" test test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only diff --git a/lib/runnable.js b/lib/runnable.js index d89a7dd5d7..52ee900b22 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -133,7 +133,7 @@ Runnable.prototype.enableTimeouts = function(enabled) { * @api public */ Runnable.prototype.skip = function() { - throw new Pending(); + throw new Pending('sync skip'); }; /** @@ -298,14 +298,19 @@ Runnable.prototype.run = function(fn) { if (this.async) { this.resetTimeout(); + // allows skip() to be used in an explicit async context + this.skip = function asyncSkip() { + done(new Pending('async skip call')); + // halt execution. the Runnable will be marked pending + // by the previous call, and the uncaught handler will ignore + // the failure. + throw new Pending('async skip; aborting execution'); + }; + if (this.allowUncaught) { return callFnAsync(this.fn); } try { - // allows skip() to be used in an explicit async context - this.skip = function() { - done(new Pending()); - }; callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); diff --git a/lib/runner.js b/lib/runner.js index 8831c8e1cb..22907f570f 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -220,6 +220,10 @@ Runner.prototype.checkGlobals = function(test) { * @param {Error} err */ Runner.prototype.fail = function(test, err) { + if (test.isPending()) { + return; + } + ++this.failures; test.state = 'failed'; @@ -309,6 +313,8 @@ Runner.prototype.hook = function(name, fn) { suite.tests.forEach(function(test) { test.pending = true; }); + // a pending hook won't be executed twice. + hook.pending = true; } } else { self.failHook(hook, err); @@ -695,8 +701,8 @@ Runner.prototype.uncaught = function(err) { runnable.clearTimeout(); - // Ignore errors if complete - if (runnable.state) { + // Ignore errors if complete or pending + if (runnable.state || runnable.isPending()) { return; } this.fail(runnable, err); diff --git a/test/runner.js b/test/runner.js index 6168bb3e34..ffe4d70e8c 100644 --- a/test/runner.js +++ b/test/runner.js @@ -1,55 +1,59 @@ -var mocha = require('../') - , Suite = mocha.Suite - , Runner = mocha.Runner - , Test = mocha.Test; +var mocha = require('../'); +var Suite = mocha.Suite; +var Runner = mocha.Runner; +var Test = mocha.Test; +var Hook = mocha.Hook; -describe('Runner', function(){ - var suite, runner; +function noop() {} - beforeEach(function(){ +describe('Runner', function() { + var suite; + var runner; + + beforeEach(function() { suite = new Suite('Suite', 'root'); runner = new Runner(suite); - }) + }); - describe('.grep()', function(){ - it('should update the runner.total with number of matched tests', function(){ - suite.addTest(new Test('im a test about lions')); - suite.addTest(new Test('im another test about lions')); - suite.addTest(new Test('im a test about bears')); + describe('.grep()', function() { + it('should update the runner.total with number of matched tests', function() { + suite.addTest(new Test('im a test about lions', noop)); + suite.addTest(new Test('im another test about lions', noop)); + suite.addTest(new Test('im a test about bears', noop)); var newRunner = new Runner(suite); newRunner.grep(/lions/); newRunner.total.should.equal(2); - }) + }); - it('should update the runner.total with number of matched tests when inverted', function(){ - suite.addTest(new Test('im a test about lions')); - suite.addTest(new Test('im another test about lions')); - suite.addTest(new Test('im a test about bears')); + it('should update the runner.total with number of matched tests when inverted', function() { + suite.addTest(new Test('im a test about lions', noop)); + suite.addTest(new Test('im another test about lions', noop)); + suite.addTest(new Test('im a test about bears', noop)); var newRunner = new Runner(suite); newRunner.grep(/lions/, true); newRunner.total.should.equal(1); - }) - }) - - describe('.grepTotal()', function(){ - it('should return the total number of matched tests', function(){ - suite.addTest(new Test('im a test about lions')); - suite.addTest(new Test('im another test about lions')); - suite.addTest(new Test('im a test about bears')); + }); + }); + + describe('.grepTotal()', function() { + it('should return the total number of matched tests', function() { + suite.addTest(new Test('im a test about lions', noop)); + suite.addTest(new Test('im another test about lions', noop)); + suite.addTest(new Test('im a test about bears', noop)); runner.grep(/lions/); runner.grepTotal(suite).should.equal(2); - }) + }); - it('should return the total number of matched tests when inverted', function(){ - suite.addTest(new Test('im a test about lions')); - suite.addTest(new Test('im another test about lions')); - suite.addTest(new Test('im a test about bears')); + it('should return the total number of matched tests when inverted', function() { + suite.addTest(new Test('im a test about lions', noop)); + suite.addTest(new Test('im another test about lions', noop)); + suite.addTest(new Test('im a test about bears', noop)); runner.grep(/lions/, true); runner.grepTotal(suite).should.equal(1); - }) - }) + }); + }); - describe('.globalProps()', function(){ + describe('.globalProps()', function() { it('should include common non enumerable globals', function() { var props = runner.globalProps(); props.should.containEql('setTimeout'); @@ -61,19 +65,19 @@ describe('Runner', function(){ }); }); - describe('.globals()', function(){ - it('should default to the known globals', function(){ + describe('.globals()', function() { + it('should default to the known globals', function() { runner.globals().length.should.be.above(16); - }) + }); - it('should white-list globals', function(){ + it('should white-list globals', function() { runner.globals(['foo', 'bar']); runner.globals().should.containEql('foo'); runner.globals().should.containEql('bar'); - }) - }) + }); + }); - describe('.checkGlobals(test)', function(){ + describe('.checkGlobals(test)', function() { it('should allow variables that match a wildcard', function(done) { runner.globals(['foo*', 'giz*']); global.foo = 'baz'; @@ -81,43 +85,44 @@ describe('Runner', function(){ runner.checkGlobals(); delete global.foo; delete global.gizmo; - done() - }) + done(); + }); - it('should emit "fail" when a new global is introduced', function(done){ + it('should emit "fail" when a new global is introduced', function(done) { + var test = new Test('im a test', noop); runner.checkGlobals(); global.foo = 'bar'; - runner.on('fail', function(test, err){ - test.should.equal('im a test'); + runner.on('fail', function(_test, err) { + _test.should.equal(test); err.message.should.equal('global leak detected: foo'); delete global.foo; done(); }); - runner.checkGlobals('im a test'); - }) + runner.checkGlobals(test); + }); it('should emit "fail" when a single new disallowed global is introduced after a single extra global is allowed', function(done) { var doneCalled = false; runner.globals('good'); global.bad = 1; - runner.on('fail', function(test, err) { + runner.on('fail', function() { delete global.bad; done(); doneCalled = true; }); - runner.checkGlobals('test'); + runner.checkGlobals(new Test('yet another test', noop)); if (!doneCalled) { - done(Error("Expected test failure did not occur.")); + done(Error('Expected test failure did not occur.')); } }); - it ('should not fail when a new common global is introduced', function(){ + it('should not fail when a new common global is introduced', function() { // verify that the prop isn't enumerable delete global.XMLHttpRequest; global.propertyIsEnumerable('XMLHttpRequest').should.not.be.ok(); // create a new runner and keep a reference to the test. - var test = new Test('im a test about bears'); + var test = new Test('im a test about bears', noop); suite.addTest(test); var newRunner = new Runner(suite); @@ -133,22 +138,23 @@ describe('Runner', function(){ delete global.XMLHttpRequest; }); - it('should pluralize the error message when several are introduced', function(done){ + it('should pluralize the error message when several are introduced', function(done) { + var test = new Test('im a test', noop); runner.checkGlobals(); global.foo = 'bar'; global.bar = 'baz'; - runner.on('fail', function(test, err){ - test.should.equal('im a test'); + runner.on('fail', function(_test, err) { + _test.should.equal(test); err.message.should.equal('global leaks detected: foo, bar'); delete global.foo; delete global.bar; done(); }); - runner.checkGlobals('im a test'); - }) + runner.checkGlobals(test); + }); it('should respect per test whitelisted globals', function() { - var test = new Test('im a test about lions'); + var test = new Test('im a test about lions', noop); test.globals(['foo']); suite.addTest(test); @@ -161,166 +167,179 @@ describe('Runner', function(){ test.should.not.have.key('state'); delete global.foo; - }) + }); it('should respect per test whitelisted globals but still detect other leaks', function(done) { - var test = new Test('im a test about lions'); + var test = new Test('im a test about lions', noop); test.globals(['foo']); suite.addTest(test); global.foo = 'bar'; global.bar = 'baz'; - runner.on('fail', function(test, err){ + runner.on('fail', function(test, err) { test.title.should.equal('im a test about lions'); err.message.should.equal('global leak detected: bar'); delete global.foo; done(); }); runner.checkGlobals(test); - }) + }); it('should emit "fail" when a global beginning with d is introduced', function(done) { global.derp = 'bar'; - runner.on('fail', function(test, err){ + runner.on('fail', function() { delete global.derp; done(); }); - runner.checkGlobals('im a test'); + runner.checkGlobals(new Test('herp', function() {})); }); - }) + }); - describe('.hook(name, fn)', function(){ - it('should execute hooks after failed test if suite bail is true', function(done){ - runner.fail({}); + describe('.hook(name, fn)', function() { + it('should execute hooks after failed test if suite bail is true', function(done) { + runner.fail(new Test('failed test', noop)); suite.bail(true); - suite.afterEach(function(){ + suite.afterEach(function() { suite.afterAll(function() { done(); - }) + }); }); - runner.hook('afterEach', function(){}); - runner.hook('afterAll', function(){}); - }) - }) + runner.hook('afterEach', function() {}); + runner.hook('afterAll', function() {}); + }); + }); - describe('.fail(test, err)', function(){ - it('should increment .failures', function(){ + describe('.fail(test, err)', function() { + it('should increment .failures', function() { runner.failures.should.equal(0); - runner.fail({}, {}); + runner.fail(new Test('one', noop), {}); runner.failures.should.equal(1); - runner.fail({}, {}); + runner.fail(new Test('two', noop), {}); runner.failures.should.equal(2); - }) + }); - it('should set test.state to "failed"', function(){ - var test = {}; + it('should set test.state to "failed"', function() { + var test = new Test('some test', noop); runner.fail(test, 'some error'); test.state.should.equal('failed'); - }) + }); - it('should emit "fail"', function(done){ - var test = {}, err = {}; - runner.on('fail', function(test, err){ + it('should emit "fail"', function(done) { + var test = new Test('some other test', noop); + var err = {}; + runner.on('fail', function(test, err) { test.should.equal(test); err.should.equal(err); done(); }); runner.fail(test, err); - }) + }); - it('should emit a helpful message when failed with a string', function(done){ - var test = {}, err = 'string'; - runner.on('fail', function(test, err){ + it('should emit a helpful message when failed with a string', function(done) { + var test = new Test('helpful test', noop); + var err = 'string'; + runner.on('fail', function(test, err) { err.message.should.equal('the string "string" was thrown, throw an Error :)'); done(); }); runner.fail(test, err); - }) + }); - it('should emit a the error when failed with an Error instance', function(done){ - var test = {}, err = new Error('an error message'); - runner.on('fail', function(test, err){ + it('should emit a the error when failed with an Error instance', function(done) { + var test = new Test('a test', noop); + var err = new Error('an error message'); + runner.on('fail', function(test, err) { err.message.should.equal('an error message'); done(); }); runner.fail(test, err); - }) + }); - it('should emit the error when failed with an Error-like object', function(done){ - var test = {}, err = {message: 'an error message'}; - runner.on('fail', function(test, err){ + it('should emit the error when failed with an Error-like object', function(done) { + var test = new Test('a test', noop); + var err = { message: 'an error message' }; + runner.on('fail', function(test, err) { err.message.should.equal('an error message'); done(); }); runner.fail(test, err); - }) + }); - it('should emit a helpful message when failed with an Object', function(done){ - var test = {}, err = { x: 1 }; - runner.on('fail', function(test, err){ + it('should emit a helpful message when failed with an Object', function(done) { + var test = new Test('a test', noop); + var err = { x: 1 }; + runner.on('fail', function(test, err) { err.message.should.equal('the object {\n "x": 1\n} was thrown, throw an Error :)'); done(); }); runner.fail(test, err); - }) + }); - it('should emit a helpful message when failed with an Array', function(done){ - var test = {}, err = [1,2]; - runner.on('fail', function(test, err){ + it('should emit a helpful message when failed with an Array', function(done) { + var test = new Test('a test', noop); + var err = [ + 1, + 2 + ]; + runner.on('fail', function(test, err) { err.message.should.equal('the array [\n 1\n 2\n] was thrown, throw an Error :)'); done(); }); runner.fail(test, err); - }) - }) + }); + }); - describe('.failHook(hook, err)', function(){ - it('should increment .failures', function(){ + describe('.failHook(hook, err)', function() { + it('should increment .failures', function() { runner.failures.should.equal(0); - runner.failHook({}, {}); + runner.failHook(new Test('fail hook 1', noop), {}); runner.failures.should.equal(1); - runner.failHook({}, {}); + runner.failHook(new Test('fail hook 2', noop), {}); runner.failures.should.equal(2); - }) + }); + + it('should augment hook title with current test title', function() { + var hook = new Hook('"before each" hook'); + hook.ctx = { currentTest: new Test('should behave', noop) }; - it('should augment hook title with current test title', function(){ - var hook = { - title: '"before each" hook', - ctx: { currentTest: new Test('should behave') } - }; runner.failHook(hook, {}); hook.title.should.equal('"before each" hook for "should behave"'); - hook.ctx.currentTest = new Test('should obey'); + hook.ctx.currentTest = new Test('should obey', noop); runner.failHook(hook, {}); hook.title.should.equal('"before each" hook for "should obey"'); - }) + }); - it('should emit "fail"', function(done){ - var hook = {}, err = {}; - runner.on('fail', function(hook, err){ + it('should emit "fail"', function(done) { + var hook = new Hook(); + var err = {}; + runner.on('fail', function(hook, err) { hook.should.equal(hook); err.should.equal(err); done(); }); runner.failHook(hook, err); - }) + }); - it('should emit "end" if suite bail is true', function(done){ - var hook = {}, err = {}; + it('should emit "end" if suite bail is true', function(done) { + var hook = new Hook(); + var err = {}; suite.bail(true); runner.on('end', done); runner.failHook(hook, err); - }) + }); - it('should not emit "end" if suite bail is not true', function(done){ - var hook = {}, err = {}; + it('should not emit "end" if suite bail is not true', function(done) { + var hook = new Hook(); + var err = {}; suite.bail(false); - runner.on('end', function() { throw new Error('"end" was emit, but the bail is false'); }); + runner.on('end', function() { + throw new Error('"end" was emit, but the bail is false'); + }); runner.failHook(hook, err); done(); - }) + }); }); describe('allowUncaught', function() { @@ -339,27 +358,29 @@ describe('Runner', function(){ }); describe('stackTrace', function() { - var stack = [ 'AssertionError: foo bar' - , 'at EventEmitter. (/usr/local/dev/test.js:16:12)' - , 'at Context. (/usr/local/dev/test.js:19:5)' - , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)' - , 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)' - , '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12' - , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)' - , '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7' - , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' - , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' - , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; + var stack = [ + 'AssertionError: foo bar', + 'at EventEmitter. (/usr/local/dev/test.js:16:12)', + 'at Context. (/usr/local/dev/test.js:19:5)', + 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)', + 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)', + '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12', + 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)', + '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7', + 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)', + 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)', + 'at processImmediate [as _immediateCallback] (timers.js:321:17)' + ]; describe('shortStackTrace', function() { it('should prettify the stack-trace', function(done) { - var hook = {}, - err = new Error(); + var hook = new Hook(); + var err = new Error(); // Fake stack-trace err.stack = stack.join('\n'); - runner.on('fail', function(hook, err){ - err.stack.should.equal(stack.slice(0,3).join('\n')); + runner.on('fail', function(hook, err) { + err.stack.should.equal(stack.slice(0, 3).join('\n')); done(); }); runner.failHook(hook, err); @@ -368,14 +389,14 @@ describe('Runner', function(){ describe('longStackTrace', function() { it('should display the full stack-trace', function(done) { - var hook = {}, - err = new Error(); + var hook = new Hook(); + var err = new Error(); // Fake stack-trace err.stack = stack.join('\n'); // Add --stack-trace option runner.fullStackTrace = true; - runner.on('fail', function(hook, err){ + runner.on('fail', function(hook, err) { err.stack.should.equal(stack.join('\n')); done(); }); From 526dd84b4de9fe89a9febdd5bf9ab8360ffbc4f6 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 15 Aug 2016 22:04:13 +0200 Subject: [PATCH 0623/1771] fix test files not using .spec suffix fix test fixtures not using .fixture suffix --- Makefile | 28 +++++++++---------- karma.conf.js | 8 +++--- scripts/travis-before-install.sh | 2 +- .../{context.js => context.spec.js} | 0 .../{duration.js => duration.spec.js} | 0 test/acceptance/{fs.js => fs.spec.js} | 0 .../acceptance/glob/{glob.js => glob.spec.js} | 0 .../{globals.js => globals.spec.js} | 0 test/acceptance/{http.js => http.spec.js} | 0 .../interfaces/{bdd.js => bdd.spec.js} | 0 .../{exports.js => exports.spec.js} | 0 .../interfaces/{qunit.js => qunit.spec.js} | 0 .../interfaces/{tdd.js => tdd.spec.js} | 0 .../{lookup-files.js => lookup-files.spec.js} | 0 .../acceptance/misc/{exit.js => exit.spec.js} | 0 .../acceptance/misc/{many.js => many.spec.js} | 0 .../misc/{nontty.js => nontty.spec.js} | 0 .../{bdd-require.js => bdd-require.spec.js} | 0 .../misc/only/{bdd.js => bdd.spec.js} | 0 .../misc/only/global/{bdd.js => bdd.spec.js} | 0 .../only/global/{qunit.js => qunit.spec.js} | 0 .../misc/only/global/{tdd.js => tdd.spec.js} | 0 .../misc/only/{qunit.js => qunit.spec.js} | 0 .../misc/only/{tdd.js => tdd.spec.js} | 0 ...d-async.js => overspecified-async.spec.js} | 0 .../require/{require.js => require.spec.js} | 0 ...ired-tokens.js => required-tokens.spec.js} | 0 test/acceptance/{root.js => root.spec.js} | 0 test/acceptance/{throw.js => throw.spec.js} | 0 .../{timeout.js => timeout.spec.js} | 0 test/acceptance/{utils.js => utils.spec.js} | 0 test/browser/{array.js => array.spec.js} | 0 test/browser/{grep.js => grep.spec.js} | 0 test/browser/{large.js => large.spec.js} | 0 ...multiple-done.js => multiple-done.spec.js} | 0 test/browser/{opts.js => opts.spec.js} | 0 .../{stack-trace.js => stack-trace.spec.js} | 0 test/browser/{ui.js => ui.spec.js} | 0 test/{color.js => color.spec.js} | 0 test/{grep.js => grep.spec.js} | 0 test/{hook.async.js => hook-async.spec.js} | 0 ...ync.nested.js => hook-sync-nested.spec.js} | 0 test/{hook.sync.js => hook-sync.spec.js} | 0 .../{hook.timeout.js => hook-timeout.spec.js} | 0 test/{http.meta.2.js => http-meta-2.spec.js} | 0 test/{http.meta.js => http-meta.spec.js} | 0 test/integration/{diffs.js => diffs.spec.js} | 2 +- .../{cascade.js => cascade.fixture.js} | 0 .../diffs/{diffs.js => diffs.fixture.js} | 0 ...r.js => after-hook-async-error.fixture.js} | 0 ...k.error.js => after-hook-error.fixture.js} | 0 ... => afterEach-hook-async-error.fixture.js} | 0 ...ror.js => afterEach-hook-error.fixture.js} | 0 ...=> before-hook-async-error-tip.fixture.js} | 0 ....js => before-hook-async-error.fixture.js} | 0 ...ip.js => before-hook-error-tip.fixture.js} | 0 ....error.js => before-hook-error.fixture.js} | 0 ...=> beforeEach-hook-async-error.fixture.js} | 0 ...or.js => beforeEach-hook-error.fixture.js} | 0 ...s => multiple-hook-async-error.fixture.js} | 0 ...rror.js => multiple-hook-error.fixture.js} | 0 ...ore.js => multiple-done-before.fixture.js} | 0 ...js => multiple-done-beforeEach.fixture.js} | 0 ...pecs.js => multiple-done-specs.fixture.js} | 0 ...tiple.done.js => multiple-done.fixture.js} | 0 ...y.async.js => async-only-async.fixture.js} | 0 ...nly.sync.js => async-only-sync.fixture.js} | 0 .../options/{bail.js => bail.fixture.js} | 0 .../{delay-fail.js => delay-fail.fixture.js} | 0 .../options/{delay.js => delay.fixture.js} | 0 .../options/{grep.js => grep.fixture.js} | 0 .../options/only/{bdd.js => bdd.fixture.js} | 0 .../only/{qunit.js => qunit.fixture.js} | 0 .../options/only/{tdd.js => tdd.fixture.js} | 0 .../{retries.js => retries.fixture.js} | 0 .../{sort.alpha.js => sort-alpha.fixture.js} | 0 .../{sort.beta.js => sort-beta.fixture.js} | 0 .../{passing.js => passing.fixture.js} | 0 ...before.js => skip-async-before.fixture.js} | 0 ...ch.js => skip-async-beforeEach.fixture.js} | 0 ...ync.spec.js => skip-async-spec.fixture.js} | 0 ....before.js => skip-sync-before.fixture.js} | 0 ...ach.js => skip-sync-beforeEach.fixture.js} | 0 ...sync.spec.js => skip-sync-spec.fixture.js} | 0 .../pending/{spec.js => spec.fixture.js} | 0 .../{issue-1794.js => issue-1794.fixture.js} | 0 .../{issue-1327.js => issue-1327.fixture.js} | 0 .../{issue-1991.js => issue-1991.fixture.js} | 0 .../{issue-2406.js => issue-2406.fixture.js} | 0 .../{issue-2417.js => issue-2417.fixture.js} | 0 .../retries/{async.js => async.fixture.js} | 0 .../{early-pass.js => early-pass.fixture.js} | 0 .../retries/{hooks.js => hooks.fixture.js} | 0 .../retries/{nested.js => nested.fixture.js} | 0 .../{timeout.js => timeout.fixture.js} | 0 ...aught.hook.js => uncaught-hook.fixture.js} | 0 .../{uncaught.js => uncaught.fixture.js} | 0 .../{hook.err.js => hook-err.spec.js} | 24 ++++++++-------- test/integration/{hooks.js => hooks.spec.js} | 2 +- ...multiple.done.js => multiple-done.spec.js} | 8 +++--- test/integration/{only.js => only.spec.js} | 6 ++-- .../{options.js => options.spec.js} | 20 ++++++------- .../{pending.js => pending.spec.js} | 14 +++++----- .../{regression.js => regression.spec.js} | 10 +++---- .../{reporters.js => reporters.spec.js} | 4 +-- .../{retries.js => retries.spec.js} | 8 +++--- .../{timeout.js => timeout.spec.js} | 2 +- .../{uncaught.js => uncaught.spec.js} | 4 +-- test/jsapi/index.js | 20 ++++++------- test/{mocha.js => mocha.spec.js} | 0 test/{ms.js => ms.spec.js} | 0 test/reporters/{base.js => base.spec.js} | 0 test/reporters/{json.js => json.spec.js} | 0 test/reporters/{nyan.js => nyan.spec.js} | 0 test/{runnable.js => runnable.spec.js} | 0 test/{runner.js => runner.spec.js} | 0 test/sanity/{sanity.js => sanity.spec.js} | 0 test/{suite.js => suite.spec.js} | 0 test/{test.js => test.spec.js} | 0 test/{utils.js => utils.spec.js} | 0 120 files changed, 81 insertions(+), 81 deletions(-) rename test/acceptance/{context.js => context.spec.js} (100%) rename test/acceptance/{duration.js => duration.spec.js} (100%) rename test/acceptance/{fs.js => fs.spec.js} (100%) rename test/acceptance/glob/{glob.js => glob.spec.js} (100%) rename test/acceptance/{globals.js => globals.spec.js} (100%) rename test/acceptance/{http.js => http.spec.js} (100%) rename test/acceptance/interfaces/{bdd.js => bdd.spec.js} (100%) rename test/acceptance/interfaces/{exports.js => exports.spec.js} (100%) rename test/acceptance/interfaces/{qunit.js => qunit.spec.js} (100%) rename test/acceptance/interfaces/{tdd.js => tdd.spec.js} (100%) rename test/acceptance/{lookup-files.js => lookup-files.spec.js} (100%) rename test/acceptance/misc/{exit.js => exit.spec.js} (100%) rename test/acceptance/misc/{many.js => many.spec.js} (100%) rename test/acceptance/misc/{nontty.js => nontty.spec.js} (100%) rename test/acceptance/misc/only/{bdd-require.js => bdd-require.spec.js} (100%) rename test/acceptance/misc/only/{bdd.js => bdd.spec.js} (100%) rename test/acceptance/misc/only/global/{bdd.js => bdd.spec.js} (100%) rename test/acceptance/misc/only/global/{qunit.js => qunit.spec.js} (100%) rename test/acceptance/misc/only/global/{tdd.js => tdd.spec.js} (100%) rename test/acceptance/misc/only/{qunit.js => qunit.spec.js} (100%) rename test/acceptance/misc/only/{tdd.js => tdd.spec.js} (100%) rename test/acceptance/{overspecified-async.js => overspecified-async.spec.js} (100%) rename test/acceptance/require/{require.js => require.spec.js} (100%) rename test/acceptance/{required-tokens.js => required-tokens.spec.js} (100%) rename test/acceptance/{root.js => root.spec.js} (100%) rename test/acceptance/{throw.js => throw.spec.js} (100%) rename test/acceptance/{timeout.js => timeout.spec.js} (100%) rename test/acceptance/{utils.js => utils.spec.js} (100%) rename test/browser/{array.js => array.spec.js} (100%) rename test/browser/{grep.js => grep.spec.js} (100%) rename test/browser/{large.js => large.spec.js} (100%) rename test/browser/{multiple-done.js => multiple-done.spec.js} (100%) rename test/browser/{opts.js => opts.spec.js} (100%) rename test/browser/{stack-trace.js => stack-trace.spec.js} (100%) rename test/browser/{ui.js => ui.spec.js} (100%) rename test/{color.js => color.spec.js} (100%) rename test/{grep.js => grep.spec.js} (100%) rename test/{hook.async.js => hook-async.spec.js} (100%) rename test/{hook.sync.nested.js => hook-sync-nested.spec.js} (100%) rename test/{hook.sync.js => hook-sync.spec.js} (100%) rename test/{hook.timeout.js => hook-timeout.spec.js} (100%) rename test/{http.meta.2.js => http-meta-2.spec.js} (100%) rename test/{http.meta.js => http-meta.spec.js} (100%) rename test/integration/{diffs.js => diffs.spec.js} (95%) rename test/integration/fixtures/{cascade.js => cascade.fixture.js} (100%) rename test/integration/fixtures/diffs/{diffs.js => diffs.fixture.js} (100%) rename test/integration/fixtures/hooks/{after.hook.async.error.js => after-hook-async-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{after.hook.error.js => after-hook-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{afterEach.hook.async.error.js => afterEach-hook-async-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{afterEach.hook.error.js => afterEach-hook-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{before.hook.async.error.tip.js => before-hook-async-error-tip.fixture.js} (100%) rename test/integration/fixtures/hooks/{before.hook.async.error.js => before-hook-async-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{before.hook.error.tip.js => before-hook-error-tip.fixture.js} (100%) rename test/integration/fixtures/hooks/{before.hook.error.js => before-hook-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{beforeEach.hook.async.error.js => beforeEach-hook-async-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{beforeEach.hook.error.js => beforeEach-hook-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{multiple.hook.async.error.js => multiple-hook-async-error.fixture.js} (100%) rename test/integration/fixtures/hooks/{multiple.hook.error.js => multiple-hook-error.fixture.js} (100%) rename test/integration/fixtures/{multiple.done.before.js => multiple-done-before.fixture.js} (100%) rename test/integration/fixtures/{multiple.done.beforeEach.js => multiple-done-beforeEach.fixture.js} (100%) rename test/integration/fixtures/{multiple.done.specs.js => multiple-done-specs.fixture.js} (100%) rename test/integration/fixtures/{multiple.done.js => multiple-done.fixture.js} (100%) rename test/integration/fixtures/options/{async-only.async.js => async-only-async.fixture.js} (100%) rename test/integration/fixtures/options/{async-only.sync.js => async-only-sync.fixture.js} (100%) rename test/integration/fixtures/options/{bail.js => bail.fixture.js} (100%) rename test/integration/fixtures/options/{delay-fail.js => delay-fail.fixture.js} (100%) rename test/integration/fixtures/options/{delay.js => delay.fixture.js} (100%) rename test/integration/fixtures/options/{grep.js => grep.fixture.js} (100%) rename test/integration/fixtures/options/only/{bdd.js => bdd.fixture.js} (100%) rename test/integration/fixtures/options/only/{qunit.js => qunit.fixture.js} (100%) rename test/integration/fixtures/options/only/{tdd.js => tdd.fixture.js} (100%) rename test/integration/fixtures/options/{retries.js => retries.fixture.js} (100%) rename test/integration/fixtures/options/{sort.alpha.js => sort-alpha.fixture.js} (100%) rename test/integration/fixtures/options/{sort.beta.js => sort-beta.fixture.js} (100%) rename test/integration/fixtures/{passing.js => passing.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.async.before.js => skip-async-before.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.async.beforeEach.js => skip-async-beforeEach.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.async.spec.js => skip-async-spec.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.sync.before.js => skip-sync-before.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.sync.beforeEach.js => skip-sync-beforeEach.fixture.js} (100%) rename test/integration/fixtures/pending/{skip.sync.spec.js => skip-sync-spec.fixture.js} (100%) rename test/integration/fixtures/pending/{spec.js => spec.fixture.js} (100%) rename test/integration/fixtures/regression/1794/{issue-1794.js => issue-1794.fixture.js} (100%) rename test/integration/fixtures/regression/{issue-1327.js => issue-1327.fixture.js} (100%) rename test/integration/fixtures/regression/{issue-1991.js => issue-1991.fixture.js} (100%) rename test/integration/fixtures/regression/{issue-2406.js => issue-2406.fixture.js} (100%) rename test/integration/fixtures/regression/{issue-2417.js => issue-2417.fixture.js} (100%) rename test/integration/fixtures/retries/{async.js => async.fixture.js} (100%) rename test/integration/fixtures/retries/{early-pass.js => early-pass.fixture.js} (100%) rename test/integration/fixtures/retries/{hooks.js => hooks.fixture.js} (100%) rename test/integration/fixtures/retries/{nested.js => nested.fixture.js} (100%) rename test/integration/fixtures/{timeout.js => timeout.fixture.js} (100%) rename test/integration/fixtures/{uncaught.hook.js => uncaught-hook.fixture.js} (100%) rename test/integration/fixtures/{uncaught.js => uncaught.fixture.js} (100%) rename test/integration/{hook.err.js => hook-err.spec.js} (86%) rename test/integration/{hooks.js => hooks.spec.js} (94%) rename test/integration/{multiple.done.js => multiple-done.spec.js} (89%) rename test/integration/{only.js => only.spec.js} (80%) rename test/integration/{options.js => options.spec.js} (87%) rename test/integration/{pending.js => pending.spec.js} (83%) rename test/integration/{regression.js => regression.spec.js} (89%) rename test/integration/{reporters.js => reporters.spec.js} (91%) rename test/integration/{retries.js => retries.spec.js} (88%) rename test/integration/{timeout.js => timeout.spec.js} (87%) rename test/integration/{uncaught.js => uncaught.spec.js} (89%) rename test/{mocha.js => mocha.spec.js} (100%) rename test/{ms.js => ms.spec.js} (100%) rename test/reporters/{base.js => base.spec.js} (100%) rename test/reporters/{json.js => json.spec.js} (100%) rename test/reporters/{nyan.js => nyan.spec.js} (100%) rename test/{runnable.js => runnable.spec.js} (100%) rename test/{runner.js => runner.spec.js} (100%) rename test/sanity/{sanity.js => sanity.spec.js} (100%) rename test/{suite.js => suite.spec.js} (100%) rename test/{test.js => test.spec.js} (100%) rename test/{utils.js => utils.spec.js} (100%) diff --git a/Makefile b/Makefile index 4cd9692269..b05ce6579f 100644 --- a/Makefile +++ b/Makefile @@ -81,31 +81,31 @@ test-requires: --require test/acceptance/require/b.coffee \ --require test/acceptance/require/c.js \ --require test/acceptance/require/d.coffee \ - test/acceptance/require/require.js + test/acceptance/require/require.spec.js test-bdd: @printf "==> [Test :: BDD]\n" $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ - test/acceptance/interfaces/bdd + test/acceptance/interfaces/bdd.spec test-tdd: @printf "==> [Test :: TDD]\n" $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ - test/acceptance/interfaces/tdd + test/acceptance/interfaces/tdd.spec test-qunit: @printf "==> [Test :: QUnit]\n" $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ - test/acceptance/interfaces/qunit + test/acceptance/interfaces/qunit.spec test-exports: @printf "==> [Test :: Exports]\n" $(MOCHA) --reporter $(REPORTER) \ --ui exports \ - test/acceptance/interfaces/exports + test/acceptance/interfaces/exports.spec test-glob: @printf "==> [Test :: Glob]\n" @@ -120,29 +120,29 @@ test-only: @printf "==> [Test :: Only]\n" $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ - test/acceptance/misc/only/tdd + test/acceptance/misc/only/tdd.spec $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ - test/acceptance/misc/only/bdd + test/acceptance/misc/only/bdd.spec $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ - test/acceptance/misc/only/bdd-require + test/acceptance/misc/only/bdd-require.spec test-global-only: @printf "==> [Test :: Global Only]\n" $(MOCHA) --reporter $(REPORTER) \ --ui tdd \ - test/acceptance/misc/only/global/tdd + test/acceptance/misc/only/global/tdd.spec $(MOCHA) --reporter $(REPORTER) \ --ui bdd \ - test/acceptance/misc/only/global/bdd + test/acceptance/misc/only/global/bdd.spec $(MOCHA) --reporter $(REPORTER) \ --ui qunit \ - test/acceptance/misc/only/global/qunit + test/acceptance/misc/only/global/qunit.spec test-mocha: @printf "==> [Test :: Mocha]\n" @@ -152,19 +152,19 @@ test-mocha: non-tty: @printf "==> [Test :: Non-TTY]\n" $(MOCHA) --reporter dot \ - test/acceptance/interfaces/bdd 2>&1 > /tmp/dot.out + test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/dot.out @echo dot: @cat /tmp/dot.out $(MOCHA) --reporter list \ - test/acceptance/interfaces/bdd 2>&1 > /tmp/list.out + test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/list.out @echo list: @cat /tmp/list.out $(MOCHA) --reporter spec \ - test/acceptance/interfaces/bdd 2>&1 > /tmp/spec.out + test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/spec.out @echo spec: @cat /tmp/spec.out diff --git a/karma.conf.js b/karma.conf.js index 76e8ae631c..125aaf4f08 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -18,9 +18,9 @@ module.exports = function(config) { 'test/acceptance/*.js' ], exclude: [ - 'test/acceptance/http.js', - 'test/acceptance/fs.js', - 'test/acceptance/lookup-files.js', + 'test/acceptance/http.spec.js', + 'test/acceptance/fs.spec.js', + 'test/acceptance/lookup-files.spec.js', 'test/acceptance/require/**/*.js', 'test/acceptance/misc/**/*.js' ], @@ -109,7 +109,7 @@ module.exports = function(config) { } cfg.files = [ 'test/browser-fixtures/' + ui + '.js', - 'test/acceptance/interfaces/' + ui + '.js' + 'test/acceptance/interfaces/' + ui + '.spec.js' ]; } else if (cfg.sauceLabs) { cfg.sauceLabs.testName = 'Unit Tests'; diff --git a/scripts/travis-before-install.sh b/scripts/travis-before-install.sh index c725d38948..9913070ae9 100755 --- a/scripts/travis-before-install.sh +++ b/scripts/travis-before-install.sh @@ -2,4 +2,4 @@ npm install --production # this avoids our mocha.opts (and thus devDependencies) in a roundabout way -./bin/mocha --opts /dev/null --reporter spec test/sanity/sanity.js +./bin/mocha --opts /dev/null --reporter spec test/sanity/sanity.spec.js diff --git a/test/acceptance/context.js b/test/acceptance/context.spec.js similarity index 100% rename from test/acceptance/context.js rename to test/acceptance/context.spec.js diff --git a/test/acceptance/duration.js b/test/acceptance/duration.spec.js similarity index 100% rename from test/acceptance/duration.js rename to test/acceptance/duration.spec.js diff --git a/test/acceptance/fs.js b/test/acceptance/fs.spec.js similarity index 100% rename from test/acceptance/fs.js rename to test/acceptance/fs.spec.js diff --git a/test/acceptance/glob/glob.js b/test/acceptance/glob/glob.spec.js similarity index 100% rename from test/acceptance/glob/glob.js rename to test/acceptance/glob/glob.spec.js diff --git a/test/acceptance/globals.js b/test/acceptance/globals.spec.js similarity index 100% rename from test/acceptance/globals.js rename to test/acceptance/globals.spec.js diff --git a/test/acceptance/http.js b/test/acceptance/http.spec.js similarity index 100% rename from test/acceptance/http.js rename to test/acceptance/http.spec.js diff --git a/test/acceptance/interfaces/bdd.js b/test/acceptance/interfaces/bdd.spec.js similarity index 100% rename from test/acceptance/interfaces/bdd.js rename to test/acceptance/interfaces/bdd.spec.js diff --git a/test/acceptance/interfaces/exports.js b/test/acceptance/interfaces/exports.spec.js similarity index 100% rename from test/acceptance/interfaces/exports.js rename to test/acceptance/interfaces/exports.spec.js diff --git a/test/acceptance/interfaces/qunit.js b/test/acceptance/interfaces/qunit.spec.js similarity index 100% rename from test/acceptance/interfaces/qunit.js rename to test/acceptance/interfaces/qunit.spec.js diff --git a/test/acceptance/interfaces/tdd.js b/test/acceptance/interfaces/tdd.spec.js similarity index 100% rename from test/acceptance/interfaces/tdd.js rename to test/acceptance/interfaces/tdd.spec.js diff --git a/test/acceptance/lookup-files.js b/test/acceptance/lookup-files.spec.js similarity index 100% rename from test/acceptance/lookup-files.js rename to test/acceptance/lookup-files.spec.js diff --git a/test/acceptance/misc/exit.js b/test/acceptance/misc/exit.spec.js similarity index 100% rename from test/acceptance/misc/exit.js rename to test/acceptance/misc/exit.spec.js diff --git a/test/acceptance/misc/many.js b/test/acceptance/misc/many.spec.js similarity index 100% rename from test/acceptance/misc/many.js rename to test/acceptance/misc/many.spec.js diff --git a/test/acceptance/misc/nontty.js b/test/acceptance/misc/nontty.spec.js similarity index 100% rename from test/acceptance/misc/nontty.js rename to test/acceptance/misc/nontty.spec.js diff --git a/test/acceptance/misc/only/bdd-require.js b/test/acceptance/misc/only/bdd-require.spec.js similarity index 100% rename from test/acceptance/misc/only/bdd-require.js rename to test/acceptance/misc/only/bdd-require.spec.js diff --git a/test/acceptance/misc/only/bdd.js b/test/acceptance/misc/only/bdd.spec.js similarity index 100% rename from test/acceptance/misc/only/bdd.js rename to test/acceptance/misc/only/bdd.spec.js diff --git a/test/acceptance/misc/only/global/bdd.js b/test/acceptance/misc/only/global/bdd.spec.js similarity index 100% rename from test/acceptance/misc/only/global/bdd.js rename to test/acceptance/misc/only/global/bdd.spec.js diff --git a/test/acceptance/misc/only/global/qunit.js b/test/acceptance/misc/only/global/qunit.spec.js similarity index 100% rename from test/acceptance/misc/only/global/qunit.js rename to test/acceptance/misc/only/global/qunit.spec.js diff --git a/test/acceptance/misc/only/global/tdd.js b/test/acceptance/misc/only/global/tdd.spec.js similarity index 100% rename from test/acceptance/misc/only/global/tdd.js rename to test/acceptance/misc/only/global/tdd.spec.js diff --git a/test/acceptance/misc/only/qunit.js b/test/acceptance/misc/only/qunit.spec.js similarity index 100% rename from test/acceptance/misc/only/qunit.js rename to test/acceptance/misc/only/qunit.spec.js diff --git a/test/acceptance/misc/only/tdd.js b/test/acceptance/misc/only/tdd.spec.js similarity index 100% rename from test/acceptance/misc/only/tdd.js rename to test/acceptance/misc/only/tdd.spec.js diff --git a/test/acceptance/overspecified-async.js b/test/acceptance/overspecified-async.spec.js similarity index 100% rename from test/acceptance/overspecified-async.js rename to test/acceptance/overspecified-async.spec.js diff --git a/test/acceptance/require/require.js b/test/acceptance/require/require.spec.js similarity index 100% rename from test/acceptance/require/require.js rename to test/acceptance/require/require.spec.js diff --git a/test/acceptance/required-tokens.js b/test/acceptance/required-tokens.spec.js similarity index 100% rename from test/acceptance/required-tokens.js rename to test/acceptance/required-tokens.spec.js diff --git a/test/acceptance/root.js b/test/acceptance/root.spec.js similarity index 100% rename from test/acceptance/root.js rename to test/acceptance/root.spec.js diff --git a/test/acceptance/throw.js b/test/acceptance/throw.spec.js similarity index 100% rename from test/acceptance/throw.js rename to test/acceptance/throw.spec.js diff --git a/test/acceptance/timeout.js b/test/acceptance/timeout.spec.js similarity index 100% rename from test/acceptance/timeout.js rename to test/acceptance/timeout.spec.js diff --git a/test/acceptance/utils.js b/test/acceptance/utils.spec.js similarity index 100% rename from test/acceptance/utils.js rename to test/acceptance/utils.spec.js diff --git a/test/browser/array.js b/test/browser/array.spec.js similarity index 100% rename from test/browser/array.js rename to test/browser/array.spec.js diff --git a/test/browser/grep.js b/test/browser/grep.spec.js similarity index 100% rename from test/browser/grep.js rename to test/browser/grep.spec.js diff --git a/test/browser/large.js b/test/browser/large.spec.js similarity index 100% rename from test/browser/large.js rename to test/browser/large.spec.js diff --git a/test/browser/multiple-done.js b/test/browser/multiple-done.spec.js similarity index 100% rename from test/browser/multiple-done.js rename to test/browser/multiple-done.spec.js diff --git a/test/browser/opts.js b/test/browser/opts.spec.js similarity index 100% rename from test/browser/opts.js rename to test/browser/opts.spec.js diff --git a/test/browser/stack-trace.js b/test/browser/stack-trace.spec.js similarity index 100% rename from test/browser/stack-trace.js rename to test/browser/stack-trace.spec.js diff --git a/test/browser/ui.js b/test/browser/ui.spec.js similarity index 100% rename from test/browser/ui.js rename to test/browser/ui.spec.js diff --git a/test/color.js b/test/color.spec.js similarity index 100% rename from test/color.js rename to test/color.spec.js diff --git a/test/grep.js b/test/grep.spec.js similarity index 100% rename from test/grep.js rename to test/grep.spec.js diff --git a/test/hook.async.js b/test/hook-async.spec.js similarity index 100% rename from test/hook.async.js rename to test/hook-async.spec.js diff --git a/test/hook.sync.nested.js b/test/hook-sync-nested.spec.js similarity index 100% rename from test/hook.sync.nested.js rename to test/hook-sync-nested.spec.js diff --git a/test/hook.sync.js b/test/hook-sync.spec.js similarity index 100% rename from test/hook.sync.js rename to test/hook-sync.spec.js diff --git a/test/hook.timeout.js b/test/hook-timeout.spec.js similarity index 100% rename from test/hook.timeout.js rename to test/hook-timeout.spec.js diff --git a/test/http.meta.2.js b/test/http-meta-2.spec.js similarity index 100% rename from test/http.meta.2.js rename to test/http-meta-2.spec.js diff --git a/test/http.meta.js b/test/http-meta.spec.js similarity index 100% rename from test/http.meta.js rename to test/http-meta.spec.js diff --git a/test/integration/diffs.js b/test/integration/diffs.spec.js similarity index 95% rename from test/integration/diffs.js rename to test/integration/diffs.spec.js index 111b6f2042..b779b84ada 100644 --- a/test/integration/diffs.js +++ b/test/integration/diffs.spec.js @@ -17,7 +17,7 @@ describe('diffs', function() { var diffs, expected; before(function(done) { - run('diffs/diffs.js', ['-C'], function(err, res) { + run('diffs/diffs.fixture.js', ['-C'], function(err, res) { expected = getExpectedOutput(); diffs = getDiffs(res.output); done(err); diff --git a/test/integration/fixtures/cascade.js b/test/integration/fixtures/cascade.fixture.js similarity index 100% rename from test/integration/fixtures/cascade.js rename to test/integration/fixtures/cascade.fixture.js diff --git a/test/integration/fixtures/diffs/diffs.js b/test/integration/fixtures/diffs/diffs.fixture.js similarity index 100% rename from test/integration/fixtures/diffs/diffs.js rename to test/integration/fixtures/diffs/diffs.fixture.js diff --git a/test/integration/fixtures/hooks/after.hook.async.error.js b/test/integration/fixtures/hooks/after-hook-async-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/after.hook.async.error.js rename to test/integration/fixtures/hooks/after-hook-async-error.fixture.js diff --git a/test/integration/fixtures/hooks/after.hook.error.js b/test/integration/fixtures/hooks/after-hook-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/after.hook.error.js rename to test/integration/fixtures/hooks/after-hook-error.fixture.js diff --git a/test/integration/fixtures/hooks/afterEach.hook.async.error.js b/test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/afterEach.hook.async.error.js rename to test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js diff --git a/test/integration/fixtures/hooks/afterEach.hook.error.js b/test/integration/fixtures/hooks/afterEach-hook-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/afterEach.hook.error.js rename to test/integration/fixtures/hooks/afterEach-hook-error.fixture.js diff --git a/test/integration/fixtures/hooks/before.hook.async.error.tip.js b/test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/before.hook.async.error.tip.js rename to test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js diff --git a/test/integration/fixtures/hooks/before.hook.async.error.js b/test/integration/fixtures/hooks/before-hook-async-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/before.hook.async.error.js rename to test/integration/fixtures/hooks/before-hook-async-error.fixture.js diff --git a/test/integration/fixtures/hooks/before.hook.error.tip.js b/test/integration/fixtures/hooks/before-hook-error-tip.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/before.hook.error.tip.js rename to test/integration/fixtures/hooks/before-hook-error-tip.fixture.js diff --git a/test/integration/fixtures/hooks/before.hook.error.js b/test/integration/fixtures/hooks/before-hook-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/before.hook.error.js rename to test/integration/fixtures/hooks/before-hook-error.fixture.js diff --git a/test/integration/fixtures/hooks/beforeEach.hook.async.error.js b/test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/beforeEach.hook.async.error.js rename to test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js diff --git a/test/integration/fixtures/hooks/beforeEach.hook.error.js b/test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/beforeEach.hook.error.js rename to test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js diff --git a/test/integration/fixtures/hooks/multiple.hook.async.error.js b/test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/multiple.hook.async.error.js rename to test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js diff --git a/test/integration/fixtures/hooks/multiple.hook.error.js b/test/integration/fixtures/hooks/multiple-hook-error.fixture.js similarity index 100% rename from test/integration/fixtures/hooks/multiple.hook.error.js rename to test/integration/fixtures/hooks/multiple-hook-error.fixture.js diff --git a/test/integration/fixtures/multiple.done.before.js b/test/integration/fixtures/multiple-done-before.fixture.js similarity index 100% rename from test/integration/fixtures/multiple.done.before.js rename to test/integration/fixtures/multiple-done-before.fixture.js diff --git a/test/integration/fixtures/multiple.done.beforeEach.js b/test/integration/fixtures/multiple-done-beforeEach.fixture.js similarity index 100% rename from test/integration/fixtures/multiple.done.beforeEach.js rename to test/integration/fixtures/multiple-done-beforeEach.fixture.js diff --git a/test/integration/fixtures/multiple.done.specs.js b/test/integration/fixtures/multiple-done-specs.fixture.js similarity index 100% rename from test/integration/fixtures/multiple.done.specs.js rename to test/integration/fixtures/multiple-done-specs.fixture.js diff --git a/test/integration/fixtures/multiple.done.js b/test/integration/fixtures/multiple-done.fixture.js similarity index 100% rename from test/integration/fixtures/multiple.done.js rename to test/integration/fixtures/multiple-done.fixture.js diff --git a/test/integration/fixtures/options/async-only.async.js b/test/integration/fixtures/options/async-only-async.fixture.js similarity index 100% rename from test/integration/fixtures/options/async-only.async.js rename to test/integration/fixtures/options/async-only-async.fixture.js diff --git a/test/integration/fixtures/options/async-only.sync.js b/test/integration/fixtures/options/async-only-sync.fixture.js similarity index 100% rename from test/integration/fixtures/options/async-only.sync.js rename to test/integration/fixtures/options/async-only-sync.fixture.js diff --git a/test/integration/fixtures/options/bail.js b/test/integration/fixtures/options/bail.fixture.js similarity index 100% rename from test/integration/fixtures/options/bail.js rename to test/integration/fixtures/options/bail.fixture.js diff --git a/test/integration/fixtures/options/delay-fail.js b/test/integration/fixtures/options/delay-fail.fixture.js similarity index 100% rename from test/integration/fixtures/options/delay-fail.js rename to test/integration/fixtures/options/delay-fail.fixture.js diff --git a/test/integration/fixtures/options/delay.js b/test/integration/fixtures/options/delay.fixture.js similarity index 100% rename from test/integration/fixtures/options/delay.js rename to test/integration/fixtures/options/delay.fixture.js diff --git a/test/integration/fixtures/options/grep.js b/test/integration/fixtures/options/grep.fixture.js similarity index 100% rename from test/integration/fixtures/options/grep.js rename to test/integration/fixtures/options/grep.fixture.js diff --git a/test/integration/fixtures/options/only/bdd.js b/test/integration/fixtures/options/only/bdd.fixture.js similarity index 100% rename from test/integration/fixtures/options/only/bdd.js rename to test/integration/fixtures/options/only/bdd.fixture.js diff --git a/test/integration/fixtures/options/only/qunit.js b/test/integration/fixtures/options/only/qunit.fixture.js similarity index 100% rename from test/integration/fixtures/options/only/qunit.js rename to test/integration/fixtures/options/only/qunit.fixture.js diff --git a/test/integration/fixtures/options/only/tdd.js b/test/integration/fixtures/options/only/tdd.fixture.js similarity index 100% rename from test/integration/fixtures/options/only/tdd.js rename to test/integration/fixtures/options/only/tdd.fixture.js diff --git a/test/integration/fixtures/options/retries.js b/test/integration/fixtures/options/retries.fixture.js similarity index 100% rename from test/integration/fixtures/options/retries.js rename to test/integration/fixtures/options/retries.fixture.js diff --git a/test/integration/fixtures/options/sort.alpha.js b/test/integration/fixtures/options/sort-alpha.fixture.js similarity index 100% rename from test/integration/fixtures/options/sort.alpha.js rename to test/integration/fixtures/options/sort-alpha.fixture.js diff --git a/test/integration/fixtures/options/sort.beta.js b/test/integration/fixtures/options/sort-beta.fixture.js similarity index 100% rename from test/integration/fixtures/options/sort.beta.js rename to test/integration/fixtures/options/sort-beta.fixture.js diff --git a/test/integration/fixtures/passing.js b/test/integration/fixtures/passing.fixture.js similarity index 100% rename from test/integration/fixtures/passing.js rename to test/integration/fixtures/passing.fixture.js diff --git a/test/integration/fixtures/pending/skip.async.before.js b/test/integration/fixtures/pending/skip-async-before.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.async.before.js rename to test/integration/fixtures/pending/skip-async-before.fixture.js diff --git a/test/integration/fixtures/pending/skip.async.beforeEach.js b/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.async.beforeEach.js rename to test/integration/fixtures/pending/skip-async-beforeEach.fixture.js diff --git a/test/integration/fixtures/pending/skip.async.spec.js b/test/integration/fixtures/pending/skip-async-spec.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.async.spec.js rename to test/integration/fixtures/pending/skip-async-spec.fixture.js diff --git a/test/integration/fixtures/pending/skip.sync.before.js b/test/integration/fixtures/pending/skip-sync-before.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.sync.before.js rename to test/integration/fixtures/pending/skip-sync-before.fixture.js diff --git a/test/integration/fixtures/pending/skip.sync.beforeEach.js b/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.sync.beforeEach.js rename to test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js diff --git a/test/integration/fixtures/pending/skip.sync.spec.js b/test/integration/fixtures/pending/skip-sync-spec.fixture.js similarity index 100% rename from test/integration/fixtures/pending/skip.sync.spec.js rename to test/integration/fixtures/pending/skip-sync-spec.fixture.js diff --git a/test/integration/fixtures/pending/spec.js b/test/integration/fixtures/pending/spec.fixture.js similarity index 100% rename from test/integration/fixtures/pending/spec.js rename to test/integration/fixtures/pending/spec.fixture.js diff --git a/test/integration/fixtures/regression/1794/issue-1794.js b/test/integration/fixtures/regression/1794/issue-1794.fixture.js similarity index 100% rename from test/integration/fixtures/regression/1794/issue-1794.js rename to test/integration/fixtures/regression/1794/issue-1794.fixture.js diff --git a/test/integration/fixtures/regression/issue-1327.js b/test/integration/fixtures/regression/issue-1327.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-1327.js rename to test/integration/fixtures/regression/issue-1327.fixture.js diff --git a/test/integration/fixtures/regression/issue-1991.js b/test/integration/fixtures/regression/issue-1991.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-1991.js rename to test/integration/fixtures/regression/issue-1991.fixture.js diff --git a/test/integration/fixtures/regression/issue-2406.js b/test/integration/fixtures/regression/issue-2406.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-2406.js rename to test/integration/fixtures/regression/issue-2406.fixture.js diff --git a/test/integration/fixtures/regression/issue-2417.js b/test/integration/fixtures/regression/issue-2417.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-2417.js rename to test/integration/fixtures/regression/issue-2417.fixture.js diff --git a/test/integration/fixtures/retries/async.js b/test/integration/fixtures/retries/async.fixture.js similarity index 100% rename from test/integration/fixtures/retries/async.js rename to test/integration/fixtures/retries/async.fixture.js diff --git a/test/integration/fixtures/retries/early-pass.js b/test/integration/fixtures/retries/early-pass.fixture.js similarity index 100% rename from test/integration/fixtures/retries/early-pass.js rename to test/integration/fixtures/retries/early-pass.fixture.js diff --git a/test/integration/fixtures/retries/hooks.js b/test/integration/fixtures/retries/hooks.fixture.js similarity index 100% rename from test/integration/fixtures/retries/hooks.js rename to test/integration/fixtures/retries/hooks.fixture.js diff --git a/test/integration/fixtures/retries/nested.js b/test/integration/fixtures/retries/nested.fixture.js similarity index 100% rename from test/integration/fixtures/retries/nested.js rename to test/integration/fixtures/retries/nested.fixture.js diff --git a/test/integration/fixtures/timeout.js b/test/integration/fixtures/timeout.fixture.js similarity index 100% rename from test/integration/fixtures/timeout.js rename to test/integration/fixtures/timeout.fixture.js diff --git a/test/integration/fixtures/uncaught.hook.js b/test/integration/fixtures/uncaught-hook.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught.hook.js rename to test/integration/fixtures/uncaught-hook.fixture.js diff --git a/test/integration/fixtures/uncaught.js b/test/integration/fixtures/uncaught.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught.js rename to test/integration/fixtures/uncaught.fixture.js diff --git a/test/integration/hook.err.js b/test/integration/hook-err.spec.js similarity index 86% rename from test/integration/hook.err.js rename to test/integration/hook-err.spec.js index f3a16c15d1..be18721f31 100644 --- a/test/integration/hook.err.js +++ b/test/integration/hook-err.spec.js @@ -7,7 +7,7 @@ describe('hook error handling', function() { var lines; describe('before hook error', function() { - before(run('hooks/before.hook.error.js')); + before(run('hooks/before-hook-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -17,7 +17,7 @@ describe('hook error handling', function() { }); describe('before hook error tip', function() { - before(run('hooks/before.hook.error.tip.js', onlyErrorTitle)); + before(run('hooks/before-hook-error-tip.fixture.js', onlyErrorTitle)); it('should verify results', function() { assert.deepEqual( lines, @@ -27,7 +27,7 @@ describe('hook error handling', function() { }); describe('before each hook error', function() { - before(run('hooks/beforeEach.hook.error.js')); + before(run('hooks/beforeEach-hook-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -37,7 +37,7 @@ describe('hook error handling', function() { }); describe('after hook error', function() { - before(run('hooks/after.hook.error.js')); + before(run('hooks/after-hook-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -47,7 +47,7 @@ describe('hook error handling', function() { }); describe('after each hook error', function() { - before(run('hooks/afterEach.hook.error.js')); + before(run('hooks/afterEach-hook-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -57,7 +57,7 @@ describe('hook error handling', function() { }); describe('multiple hook errors', function() { - before(run('hooks/multiple.hook.error.js')); + before(run('hooks/multiple-hook-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -95,7 +95,7 @@ describe('hook error handling', function() { }); describe('async - before hook error', function() { - before(run('hooks/before.hook.async.error.js')); + before(run('hooks/before-hook-async-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -105,7 +105,7 @@ describe('hook error handling', function() { }); describe('async - before hook error tip', function() { - before(run('hooks/before.hook.async.error.tip.js', onlyErrorTitle)); + before(run('hooks/before-hook-async-error-tip.fixture.js', onlyErrorTitle)); it('should verify results', function() { assert.deepEqual( lines, @@ -115,7 +115,7 @@ describe('hook error handling', function() { }); describe('async - before each hook error', function() { - before(run('hooks/beforeEach.hook.async.error.js')); + before(run('hooks/beforeEach-hook-async-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -125,7 +125,7 @@ describe('hook error handling', function() { }); describe('async - after hook error', function() { - before(run('hooks/after.hook.async.error.js')); + before(run('hooks/after-hook-async-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -135,7 +135,7 @@ describe('hook error handling', function() { }); describe('async - after each hook error', function() { - before(run('hooks/afterEach.hook.async.error.js')); + before(run('hooks/afterEach-hook-async-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, @@ -145,7 +145,7 @@ describe('hook error handling', function() { }); describe('async - multiple hook errors', function() { - before(run('hooks/multiple.hook.async.error.js')); + before(run('hooks/multiple-hook-async-error.fixture.js')); it('should verify results', function() { assert.deepEqual( lines, diff --git a/test/integration/hooks.js b/test/integration/hooks.spec.js similarity index 94% rename from test/integration/hooks.js rename to test/integration/hooks.spec.js index acd829f7c9..7633cb5630 100644 --- a/test/integration/hooks.js +++ b/test/integration/hooks.spec.js @@ -5,7 +5,7 @@ var args = []; describe('hooks', function() { it('are ran in correct order', function(done) { - run('cascade.js', args, function(err, res) { + run('cascade.fixture.js', args, function(err, res) { var lines, expected; assert(!err); diff --git a/test/integration/multiple.done.js b/test/integration/multiple-done.spec.js similarity index 89% rename from test/integration/multiple.done.js rename to test/integration/multiple-done.spec.js index 0159e90e43..47e82dbebb 100644 --- a/test/integration/multiple.done.js +++ b/test/integration/multiple-done.spec.js @@ -6,7 +6,7 @@ describe('multiple calls to done()', function() { var res; describe('from a spec', function() { before(function(done) { - run('multiple.done.js', args, function(err, result) { + run('multiple-done.fixture.js', args, function(err, result) { res = result; done(err); }); @@ -27,7 +27,7 @@ describe('multiple calls to done()', function() { describe('with multiple specs', function() { before(function(done) { - run('multiple.done.specs.js', args, function(err, result) { + run('multiple-done-specs.fixture.js', args, function(err, result) { res = result; done(err); }); @@ -49,7 +49,7 @@ describe('multiple calls to done()', function() { describe('from a before hook', function() { before(function(done) { - run('multiple.done.before.js', args, function(err, result) { + run('multiple-done-before.fixture.js', args, function(err, result) { res = result; done(err); }); @@ -71,7 +71,7 @@ describe('multiple calls to done()', function() { describe('from a beforeEach hook', function() { before(function(done) { - run('multiple.done.beforeEach.js', args, function(err, result) { + run('multiple-done-beforeEach.fixture.js', args, function(err, result) { res = result; done(err); }); diff --git a/test/integration/only.js b/test/integration/only.spec.js similarity index 80% rename from test/integration/only.js rename to test/integration/only.spec.js index dc7644e5a4..592ea17ec2 100644 --- a/test/integration/only.js +++ b/test/integration/only.spec.js @@ -3,7 +3,7 @@ var assert = require('assert'); describe('.only()', function() { it('should run only tests that marked as `only`', function(done) { - run('options/only/bdd.js', ['--ui', 'bdd'], function(err, res) { + run('options/only/bdd.fixture.js', ['--ui', 'bdd'], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 11); @@ -14,7 +14,7 @@ describe('.only()', function() { }); it('should run only tests that marked as `only`', function(done) { - run('options/only/tdd.js', ['--ui', 'tdd'], function(err, res) { + run('options/only/tdd.fixture.js', ['--ui', 'tdd'], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 8); @@ -25,7 +25,7 @@ describe('.only()', function() { }); it('should run only tests that marked as `only`', function(done) { - run('options/only/qunit.js', ['--ui', 'qunit'], function(err, res) { + run('options/only/qunit.fixture.js', ['--ui', 'qunit'], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 5); diff --git a/test/integration/options.js b/test/integration/options.spec.js similarity index 87% rename from test/integration/options.js rename to test/integration/options.spec.js index 5371b7a7df..4755647f76 100644 --- a/test/integration/options.js +++ b/test/integration/options.spec.js @@ -10,7 +10,7 @@ describe('options', function() { }); it('should fail synchronous specs', function(done) { - run('options/async-only.sync.js', args, function(err, res) { + run('options/async-only-sync.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); @@ -23,7 +23,7 @@ describe('options', function() { }); it('should allow asynchronous specs', function(done) { - run('options/async-only.async.js', args, function(err, res) { + run('options/async-only-async.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 1); @@ -42,7 +42,7 @@ describe('options', function() { }); it('should stop after the first error', function(done) { - run('options/bail.js', args, function(err, res) { + run('options/bail.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 1); @@ -82,7 +82,7 @@ describe('options', function() { }); it('should run the generated test suite', function(done) { - run('options/delay.js', args, function(err, res) { + run('options/delay.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 1); @@ -96,7 +96,7 @@ describe('options', function() { }); it('should throw an error if the test suite failed to run', function(done) { - run('options/delay-fail.js', args, function(err, res) { + run('options/delay-fail.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); @@ -113,7 +113,7 @@ describe('options', function() { describe('--grep', function() { it('runs specs matching a string', function(done) { args = ['--grep', 'match']; - run('options/grep.js', args, function(err, res) { + run('options/grep.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 2); @@ -126,7 +126,7 @@ describe('options', function() { describe('runs specs matching a RegExp', function() { it('with RegExp like strings(pattern follow by flag)', function(done) { args = ['--grep', '/match/i']; - run('options/grep.js', args, function(err, res) { + run('options/grep.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 4); @@ -138,7 +138,7 @@ describe('options', function() { it('string as pattern', function(done) { args = ['--grep', '.*']; - run('options/grep.js', args, function(err, res) { + run('options/grep.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 4); @@ -152,7 +152,7 @@ describe('options', function() { describe('with --invert', function() { it('runs specs that do not match the pattern', function(done) { args = ['--grep', 'fail', '--invert']; - run('options/grep.js', args, function(err, res) { + run('options/grep.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 4); @@ -167,7 +167,7 @@ describe('options', function() { describe('--retries', function() { it('retries after a certain threshold', function (done) { args = ['--retries', '3']; - run('options/retries.js', args, function(err, res) { + run('options/retries.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); diff --git a/test/integration/pending.js b/test/integration/pending.spec.js similarity index 83% rename from test/integration/pending.js rename to test/integration/pending.spec.js index 0c18ab4bc7..4d4beffc2a 100644 --- a/test/integration/pending.js +++ b/test/integration/pending.spec.js @@ -5,7 +5,7 @@ var args = []; describe('pending', function() { describe('pending specs', function() { it('should be created by omitting a function', function(done) { - run('pending/spec.js', args, function(err, res) { + run('pending/spec.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 1); assert.equal(res.stats.passes, 0); @@ -19,7 +19,7 @@ describe('pending', function() { describe('synchronous skip()', function() { describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { - run('pending/skip.sync.spec.js', args, function(err, res) { + run('pending/skip-sync-spec.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 1); assert.equal(res.stats.passes, 1); @@ -32,7 +32,7 @@ describe('pending', function() { describe('in before', function() { it('should skip all suite specs', function(done) { - run('pending/skip.sync.before.js', args, function(err, res) { + run('pending/skip-sync-before.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 2); assert.equal(res.stats.passes, 0); @@ -45,7 +45,7 @@ describe('pending', function() { describe('in beforeEach', function() { it('should skip all suite specs', function(done) { - run('pending/skip.sync.beforeEach.js', args, function(err, res) { + run('pending/skip-sync-beforeEach.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 2); assert.equal(res.stats.passes, 0); @@ -60,7 +60,7 @@ describe('pending', function() { describe('asynchronous skip()', function() { describe('in spec', function() { it('should immediately skip the spec and run all others', function(done) { - run('pending/skip.async.spec.js', args, function(err, res) { + run('pending/skip-async-spec.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 1); assert.equal(res.stats.passes, 1); @@ -73,7 +73,7 @@ describe('pending', function() { describe('in before', function() { it('should skip all suite specs', function(done) { - run('pending/skip.async.before.js', args, function(err, res) { + run('pending/skip-async-before.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 2); assert.equal(res.stats.passes, 0); @@ -86,7 +86,7 @@ describe('pending', function() { describe('in beforeEach', function() { it('should skip all suite specs', function(done) { - run('pending/skip.sync.beforeEach.js', args, function(err, res) { + run('pending/skip-sync-beforeEach.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 2); assert.equal(res.stats.passes, 0); diff --git a/test/integration/regression.js b/test/integration/regression.spec.js similarity index 89% rename from test/integration/regression.js rename to test/integration/regression.spec.js index f0762ec0e9..f9f96d31d6 100644 --- a/test/integration/regression.js +++ b/test/integration/regression.spec.js @@ -7,7 +7,7 @@ var runJSON = require('./helpers').runMochaJSON; describe('regressions', function() { it('issue-1327: should run all 3 specs exactly once', function(done) { var args = []; - run('regression/issue-1327.js', args, function(err, res) { + run('regression/issue-1327.fixture.js', args, function(err, res) { var occurences = function(str) { var pattern = new RegExp(str, 'g'); return (res.output.match(pattern) || []).length; @@ -33,7 +33,7 @@ describe('regressions', function() { it('issue-1794: Can\'t --require custom UI and use it', function(done) { var simpleUiPath = path.join(__dirname, 'fixtures', 'regression', '1794', 'simple-ui.js'); var args = ['--require', simpleUiPath, '--ui', 'simple-ui']; - run('regression/1794/issue-1794.js', args, function(err, res) { + run('regression/1794/issue-1794.fixture.js', args, function(err, res) { assert.equal(res.code, 0, 'Custom UI should be loaded'); done(); }); @@ -43,7 +43,7 @@ describe('regressions', function() { // on a modern MBP takes ±5 seconds on node 4.0, but on older laptops with node 0.12 ±40 seconds. // Could easily take longer on even weaker machines (Travis-CI containers for example). this.timeout(120000); - run('regression/issue-1991.js', [], function(err, res) { + run('regression/issue-1991.fixture.js', [], function(err, res) { assert.equal(/process out of memory/.test(res.output), false, 'fixture\'s process out of memory!'); assert.equal(res.code, 0, 'Runnable fn (it/before[Each]/after[Each]) references should be deleted to avoid memory leaks'); done(); @@ -64,7 +64,7 @@ describe('regressions', function() { it('issue-2406: should run nested describe.only suites', function(done) { this.timeout(2000); - runJSON('regression/issue-2406.js', [], function(err, res) { + runJSON('regression/issue-2406.fixture.js', [], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 2); @@ -75,7 +75,7 @@ describe('regressions', function() { }); it('issue-2417: should not recurse infinitely with .only suites nested within each other', function() { - runJSON('regression/issue-2417.js', [], function(err, res) { + runJSON('regression/issue-2417.fixture.js', [], function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 1); diff --git a/test/integration/reporters.js b/test/integration/reporters.spec.js similarity index 91% rename from test/integration/reporters.js rename to test/integration/reporters.spec.js index c2f022fe29..9595611829 100644 --- a/test/integration/reporters.js +++ b/test/integration/reporters.spec.js @@ -10,7 +10,7 @@ describe('reporters', function() { var res; before(function(done) { - run('passing.js', ['--reporter', 'markdown'], function(err, result) { + run('passing.fixture.js', ['--reporter', 'markdown'], function(err, result) { res = result; done(err); }); @@ -44,7 +44,7 @@ describe('reporters', function() { '' ]; - run('passing.js', args, function(err, result) { + run('passing.fixture.js', args, function(err, result) { if (err) return done(err); var xml = fs.readFileSync(tmpFile, 'utf8'); diff --git a/test/integration/retries.js b/test/integration/retries.spec.js similarity index 88% rename from test/integration/retries.js rename to test/integration/retries.spec.js index 56516b3a92..ce76545b00 100644 --- a/test/integration/retries.js +++ b/test/integration/retries.spec.js @@ -5,7 +5,7 @@ var bang = require('../../lib/reporters/base').symbols.bang; describe('retries', function() { it('are ran in correct order', function(done) { - helpers.runMocha('retries/hooks.js', args, function(err, res) { + helpers.runMocha('retries/hooks.fixture.js', args, function(err, res) { var lines, expected; assert(!err); @@ -46,7 +46,7 @@ describe('retries', function() { }); it('should exit early if test passes', function (done) { - helpers.runMochaJSON('retries/early-pass.js', args, function(err, res) { + helpers.runMochaJSON('retries/early-pass.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.passes, 1); assert.equal(res.stats.failures, 0); @@ -58,7 +58,7 @@ describe('retries', function() { }); it('should let test override', function (done) { - helpers.runMochaJSON('retries/nested.js', args, function(err, res) { + helpers.runMochaJSON('retries/nested.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.passes, 0); assert.equal(res.stats.failures, 1); @@ -70,7 +70,7 @@ describe('retries', function() { }); it('should not hang w/ async test', function (done) { - helpers.runMocha('retries/async.js', args, function(err, res) { + helpers.runMocha('retries/async.fixture.js', args, function(err, res) { var lines, expected; assert(!err); diff --git a/test/integration/timeout.js b/test/integration/timeout.spec.js similarity index 87% rename from test/integration/timeout.js rename to test/integration/timeout.spec.js index b2dfb201f3..33b8e33093 100644 --- a/test/integration/timeout.js +++ b/test/integration/timeout.spec.js @@ -4,7 +4,7 @@ var args = []; describe('this.timeout()', function() { it('is respected by sync and async suites', function(done) { - run('timeout.js', args, function(err, res) { + run('timeout.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); diff --git a/test/integration/uncaught.js b/test/integration/uncaught.spec.js similarity index 89% rename from test/integration/uncaught.js rename to test/integration/uncaught.spec.js index 92a0ce5d35..87dde90902 100644 --- a/test/integration/uncaught.js +++ b/test/integration/uncaught.spec.js @@ -4,7 +4,7 @@ var args = []; describe('uncaught exceptions', function() { it('handles uncaught exceptions from hooks', function(done) { - run('uncaught.hook.js', args, function(err, res) { + run('uncaught-hook.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); @@ -18,7 +18,7 @@ describe('uncaught exceptions', function() { }); it('handles uncaught exceptions from async specs', function(done) { - run('uncaught.js', args, function(err, res) { + run('uncaught.fixture.js', args, function(err, res) { assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 0); diff --git a/test/jsapi/index.js b/test/jsapi/index.js index 2dbbcb0469..a096186b96 100644 --- a/test/jsapi/index.js +++ b/test/jsapi/index.js @@ -11,16 +11,16 @@ var mocha = new Mocha({ // mocha.reporter('spec'); require('should'); -mocha.addFile('test/suite.js'); -mocha.addFile('test/runner.js'); -mocha.addFile('test/runnable.js'); -mocha.addFile('test/hook.sync.js'); -mocha.addFile('test/hook.sync.nested.js'); -mocha.addFile('test/hook.async.js'); -mocha.addFile('test/acceptance/duration.js'); -mocha.addFile('test/acceptance/fs.js'); -mocha.addFile('test/acceptance/globals.js'); -mocha.addFile('test/acceptance/timeout.js'); +mocha.addFile('test/suite.spec.js'); +mocha.addFile('test/runner.spec.js'); +mocha.addFile('test/runnable.spec.js'); +mocha.addFile('test/hook-sync.spec.js'); +mocha.addFile('test/hook-sync-nested.spec.js'); +mocha.addFile('test/hook-async.spec.js'); +mocha.addFile('test/acceptance/duration.spec.js'); +mocha.addFile('test/acceptance/fs.spec.js'); +mocha.addFile('test/acceptance/globals.spec.js'); +mocha.addFile('test/acceptance/timeout.spec.js'); mocha.run(function(){ console.log('done'); diff --git a/test/mocha.js b/test/mocha.spec.js similarity index 100% rename from test/mocha.js rename to test/mocha.spec.js diff --git a/test/ms.js b/test/ms.spec.js similarity index 100% rename from test/ms.js rename to test/ms.spec.js diff --git a/test/reporters/base.js b/test/reporters/base.spec.js similarity index 100% rename from test/reporters/base.js rename to test/reporters/base.spec.js diff --git a/test/reporters/json.js b/test/reporters/json.spec.js similarity index 100% rename from test/reporters/json.js rename to test/reporters/json.spec.js diff --git a/test/reporters/nyan.js b/test/reporters/nyan.spec.js similarity index 100% rename from test/reporters/nyan.js rename to test/reporters/nyan.spec.js diff --git a/test/runnable.js b/test/runnable.spec.js similarity index 100% rename from test/runnable.js rename to test/runnable.spec.js diff --git a/test/runner.js b/test/runner.spec.js similarity index 100% rename from test/runner.js rename to test/runner.spec.js diff --git a/test/sanity/sanity.js b/test/sanity/sanity.spec.js similarity index 100% rename from test/sanity/sanity.js rename to test/sanity/sanity.spec.js diff --git a/test/suite.js b/test/suite.spec.js similarity index 100% rename from test/suite.js rename to test/suite.spec.js diff --git a/test/test.js b/test/test.spec.js similarity index 100% rename from test/test.js rename to test/test.spec.js diff --git a/test/utils.js b/test/utils.spec.js similarity index 100% rename from test/utils.js rename to test/utils.spec.js From 3e22a837929d153656b0f624aa48cb773d79282d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 18 Sep 2016 23:48:15 +0200 Subject: [PATCH 0624/1771] Exit process with correct error codes (#2445) * Exit with code 130 in SIGINT. Refs #2438 * Exit with code 255 if more errors than 255 were returned. Fixes #2438 --- bin/_mocha | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index 98cabdbc47..fe3f67861a 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -384,7 +384,7 @@ if (program.watch) { process.on('SIGINT', function() { showCursor(); console.log('\n'); - process.exit(); + process.exit(130); }); var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions)); @@ -442,7 +442,7 @@ if (program.watch) { function exitLater(code) { process.on('exit', function() { - process.exit(code); + process.exit(Math.min(code, 255)); }); } @@ -452,7 +452,7 @@ function exit(code) { // https://github.com/visionmedia/mocha/issues/333 has a good discussion function done() { if (!(draining--)) { - process.exit(code); + process.exit(Math.min(code, 255)); } } @@ -470,6 +470,11 @@ function exit(code) { process.on('SIGINT', function() { runner.abort(); + + // This is a hack: + // Instead of `process.exit(130)`, set runner.failures to 130 (exit code for SIGINT) + // The amount of failures will be emitted as error code later + runner.failures = 130; }); /** From 1786fe2c2c474d2b649b4c3a0b0a1c71ab8b556b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 19 Sep 2016 00:06:13 +0200 Subject: [PATCH 0625/1771] Report non-match to STDERR and exit if no files are matched (#2450) * Report non-matching patterns to STDERR and exit with non-zero status if no files are matched at all. Fixes #2194 * Code review changes --- bin/_mocha | 19 ++++++++++++++++++- test/acceptance/glob/glob.sh | 15 +++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/bin/_mocha b/bin/_mocha index fe3f67861a..b355e28352 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -358,9 +358,26 @@ if (!args.length) { } args.forEach(function(arg) { - files = files.concat(utils.lookupFiles(arg, extensions, program.recursive)); + var newFiles; + try { + newFiles = utils.lookupFiles(arg, extensions, program.recursive); + } catch (err) { + if (err.message.indexOf('cannot resolve path') === 0) { + console.error('Warning: Could not find any test files matching pattern: ' + arg); + return; + } + + throw err; + } + + files = files.concat(newFiles); }); +if (!files.length) { + console.error('No test files found'); + process.exit(1); +} + // resolve files = files.map(function(path) { diff --git a/test/acceptance/glob/glob.sh b/test/acceptance/glob/glob.sh index a2b8c6fea2..823ba07fb9 100755 --- a/test/acceptance/glob/glob.sh +++ b/test/acceptance/glob/glob.sh @@ -22,11 +22,22 @@ cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"p exit 1 } -cat /tmp/mocha-glob.txt | grep -q -F 'cannot resolve path' || { +cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || { echo Globbing './*-none.js' in `pwd` should match no files and run no tests. exit 1 } +../../../bin/mocha -R json-stream ./*.js ./*-none.js >& /tmp/mocha-glob.txt || { + echo Globbing ./*.js ./*-none.js in `pwd` failed. + exit 1 +} + +cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' && +cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || { + echo Globbing ./*.js ./*-none.js in `pwd` should match glob.js with one test inside and display one warning for the non-existing file. + exit 1 +} + # Globbing in windows command-shell differs completely from unix-style globbing. # In bash, the shell expands globs and passes the result to executables. # In windows, the shell passes globs unexpanded, executables do expansion if they support it. @@ -47,7 +58,7 @@ cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"p exit 1 } -cat /tmp/mocha-glob.txt | grep -q -F 'cannot resolve path' || { +cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || { echo Globbing './*-none.js' in `pwd` should match no files and run no tests. exit 1 } From 93e9fc93c6c91553f02fd2045c176435e0f71f73 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 18 Sep 2016 22:25:13 -0700 Subject: [PATCH 0626/1771] rename more fixtures; closes #2383 --- karma.conf.js | 8 +++++--- test/browser-fixtures/{bdd.js => bdd.fixture.js} | 0 test/browser-fixtures/{exports.js => exports.fixture.js} | 0 test/browser-fixtures/{qunit.js => qunit.fixture.js} | 0 test/browser-fixtures/{tdd.js => tdd.fixture.js} | 0 5 files changed, 5 insertions(+), 3 deletions(-) rename test/browser-fixtures/{bdd.js => bdd.fixture.js} (100%) rename test/browser-fixtures/{exports.js => exports.fixture.js} (100%) rename test/browser-fixtures/{qunit.js => qunit.fixture.js} (100%) rename test/browser-fixtures/{tdd.js => tdd.fixture.js} (100%) diff --git a/karma.conf.js b/karma.conf.js index 125aaf4f08..266fe72b7a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -14,8 +14,10 @@ module.exports = function(config) { 'mocha' ], files: [ - 'test/browser-fixtures/bdd.js', - 'test/acceptance/*.js' + // we use the BDD interface for all of the tests that + // aren't interface-specific. + 'test/browser-fixtures/bdd.fixture.js', + 'test/acceptance/*.spec.js' ], exclude: [ 'test/acceptance/http.spec.js', @@ -108,7 +110,7 @@ module.exports = function(config) { cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests'; } cfg.files = [ - 'test/browser-fixtures/' + ui + '.js', + 'test/browser-fixtures/' + ui + '.fixture.js', 'test/acceptance/interfaces/' + ui + '.spec.js' ]; } else if (cfg.sauceLabs) { diff --git a/test/browser-fixtures/bdd.js b/test/browser-fixtures/bdd.fixture.js similarity index 100% rename from test/browser-fixtures/bdd.js rename to test/browser-fixtures/bdd.fixture.js diff --git a/test/browser-fixtures/exports.js b/test/browser-fixtures/exports.fixture.js similarity index 100% rename from test/browser-fixtures/exports.js rename to test/browser-fixtures/exports.fixture.js diff --git a/test/browser-fixtures/qunit.js b/test/browser-fixtures/qunit.fixture.js similarity index 100% rename from test/browser-fixtures/qunit.js rename to test/browser-fixtures/qunit.fixture.js diff --git a/test/browser-fixtures/tdd.js b/test/browser-fixtures/tdd.fixture.js similarity index 100% rename from test/browser-fixtures/tdd.js rename to test/browser-fixtures/tdd.fixture.js From e22c40751f1aa04058c20025472783c23c295921 Mon Sep 17 00:00:00 2001 From: anton Date: Wed, 22 Jul 2015 11:06:05 +0300 Subject: [PATCH 0627/1771] Fix an issue and add relevant tests when describe and xdescribe fail when not supplied with a callback (issue #1744). --- .../fixtures/suite/describe.callback.js | 1 + .../fixtures/suite/xdescribe.callback.js | 1 + test/integration/suite.js | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 test/integration/fixtures/suite/describe.callback.js create mode 100644 test/integration/fixtures/suite/xdescribe.callback.js create mode 100644 test/integration/suite.js diff --git a/test/integration/fixtures/suite/describe.callback.js b/test/integration/fixtures/suite/describe.callback.js new file mode 100644 index 0000000000..de55b358a3 --- /dev/null +++ b/test/integration/fixtures/suite/describe.callback.js @@ -0,0 +1 @@ +describe('a suite without a callback'); diff --git a/test/integration/fixtures/suite/xdescribe.callback.js b/test/integration/fixtures/suite/xdescribe.callback.js new file mode 100644 index 0000000000..c5bca84a47 --- /dev/null +++ b/test/integration/fixtures/suite/xdescribe.callback.js @@ -0,0 +1 @@ +xdescribe('a pending suite without a callback'); diff --git a/test/integration/suite.js b/test/integration/suite.js new file mode 100644 index 0000000000..369f08a7ba --- /dev/null +++ b/test/integration/suite.js @@ -0,0 +1,29 @@ +var assert = require('assert'); +var run = require('./helpers').runMocha; +var args = []; + +describe('.describe()', function() { + this.timeout(1000); + it('should throw a helpful error message when a callback for describe is not supplied', function(done) { + run('suite/describe.callback.js', args, function(err, res) { + assert(!err); + pattern = new RegExp('TypeError: a callback is not supplied', 'g'); + var result = res.output.match(pattern) || []; + assert.equal(result.length, 1); + done(); + }); + }); +}); + +describe('.xdescribe()', function() { + this.timeout(1000); + it('should not throw an error when a callback for xdescribe is not supplied', function(done) { + run('suite/xdescribe.callback.js', args, function(err, res) { + assert(!err); + pattern = new RegExp("Error", 'g'); + var result = res.output.match(pattern) || []; + assert.equal(result.length, 0); + done(); + }); + }); +}); From 3a2dae8b360bf3ac58f79530c5b35413dd6ed417 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 18 Sep 2016 23:22:53 -0700 Subject: [PATCH 0628/1771] helpful error when necessary suite callback omitted; closes #1744 - works for QUnit as well - renamed some files - fixed unclear "only" tests --- lib/interfaces/common.js | 2 + lib/interfaces/qunit.js | 6 +- ...llback.js => suite-no-callback.fixture.js} | 0 .../suite/suite-skipped-callback.fixture.js | 1 + ...s => suite-skipped-no-callback.fixture.js} | 0 test/integration/only.spec.js | 56 +++++++++++-------- test/integration/suite.js | 29 ---------- test/integration/suite.spec.js | 42 ++++++++++++++ 8 files changed, 81 insertions(+), 55 deletions(-) rename test/integration/fixtures/suite/{describe.callback.js => suite-no-callback.fixture.js} (100%) create mode 100644 test/integration/fixtures/suite/suite-skipped-callback.fixture.js rename test/integration/fixtures/suite/{xdescribe.callback.js => suite-skipped-no-callback.fixture.js} (100%) delete mode 100644 test/integration/suite.js create mode 100644 test/integration/suite.spec.js diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index b367544a3f..447458487b 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -113,6 +113,8 @@ module.exports = function(suites, context, mocha) { if (typeof opts.fn === 'function') { opts.fn.call(suite); suites.shift(); + } else if (typeof opts.fn === 'undefined' && !suite.pending) { + throw new Error('Suite "' + suite.fullTitle() + '" was defined but no callback was supplied. Supply a callback or explicitly skip the suite.'); } return suite; diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index a2d67ef90f..22e8080e2e 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -50,7 +50,8 @@ module.exports = function(suite) { } return common.suite.create({ title: title, - file: file + file: file, + fn: false }); }; @@ -64,7 +65,8 @@ module.exports = function(suite) { } return common.suite.only({ title: title, - file: file + file: file, + fn: false }); }; diff --git a/test/integration/fixtures/suite/describe.callback.js b/test/integration/fixtures/suite/suite-no-callback.fixture.js similarity index 100% rename from test/integration/fixtures/suite/describe.callback.js rename to test/integration/fixtures/suite/suite-no-callback.fixture.js diff --git a/test/integration/fixtures/suite/suite-skipped-callback.fixture.js b/test/integration/fixtures/suite/suite-skipped-callback.fixture.js new file mode 100644 index 0000000000..b30b67ee2e --- /dev/null +++ b/test/integration/fixtures/suite/suite-skipped-callback.fixture.js @@ -0,0 +1 @@ +xdescribe('a pending suite with a callback', function () {}); diff --git a/test/integration/fixtures/suite/xdescribe.callback.js b/test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js similarity index 100% rename from test/integration/fixtures/suite/xdescribe.callback.js rename to test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js diff --git a/test/integration/only.spec.js b/test/integration/only.spec.js index 592ea17ec2..61254ce1d3 100644 --- a/test/integration/only.spec.js +++ b/test/integration/only.spec.js @@ -2,36 +2,44 @@ var run = require('./helpers').runMochaJSON; var assert = require('assert'); describe('.only()', function() { - it('should run only tests that marked as `only`', function(done) { - run('options/only/bdd.fixture.js', ['--ui', 'bdd'], function(err, res) { - assert(!err); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 11); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); - done(); + describe('bdd', function() { + it('should run only tests that marked as `only`', function(done) { + run('options/only/bdd.fixture.js', ['--ui', 'bdd'], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 11); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); }); }); - it('should run only tests that marked as `only`', function(done) { - run('options/only/tdd.fixture.js', ['--ui', 'tdd'], function(err, res) { - assert(!err); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 8); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); - done(); + describe('tdd', function() { + it('should run only tests that marked as `only`', function(done) { + run('options/only/tdd.fixture.js', ['--ui', 'tdd'], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 8); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); }); }); - it('should run only tests that marked as `only`', function(done) { - run('options/only/qunit.fixture.js', ['--ui', 'qunit'], function(err, res) { - assert(!err); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 5); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); - done(); + describe('qunit', function() { + it('should run only tests that marked as `only`', function(done) { + run('options/only/qunit.fixture.js', ['--ui', 'qunit'], function(err, res) { + console.log(err); + + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 5); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); }); }); }); diff --git a/test/integration/suite.js b/test/integration/suite.js deleted file mode 100644 index 369f08a7ba..0000000000 --- a/test/integration/suite.js +++ /dev/null @@ -1,29 +0,0 @@ -var assert = require('assert'); -var run = require('./helpers').runMocha; -var args = []; - -describe('.describe()', function() { - this.timeout(1000); - it('should throw a helpful error message when a callback for describe is not supplied', function(done) { - run('suite/describe.callback.js', args, function(err, res) { - assert(!err); - pattern = new RegExp('TypeError: a callback is not supplied', 'g'); - var result = res.output.match(pattern) || []; - assert.equal(result.length, 1); - done(); - }); - }); -}); - -describe('.xdescribe()', function() { - this.timeout(1000); - it('should not throw an error when a callback for xdescribe is not supplied', function(done) { - run('suite/xdescribe.callback.js', args, function(err, res) { - assert(!err); - pattern = new RegExp("Error", 'g'); - var result = res.output.match(pattern) || []; - assert.equal(result.length, 0); - done(); - }); - }); -}); diff --git a/test/integration/suite.spec.js b/test/integration/suite.spec.js new file mode 100644 index 0000000000..00066a34f4 --- /dev/null +++ b/test/integration/suite.spec.js @@ -0,0 +1,42 @@ +var assert = require('assert'); +var run = require('./helpers').runMocha; +var args = []; + +describe('suite w/no callback', function() { + this.timeout(1000); + it('should throw a helpful error message when a callback for suite is not supplied', function(done) { + run('suite/suite-no-callback.fixture.js', args, function(err, res) { + assert(!err); + var result = res.output.match(/no callback was supplied/) || []; + assert.equal(result.length, 1); + done(); + }); + }); +}); + +describe('skipped suite w/no callback', function() { + this.timeout(1000); + it('should not throw an error when a callback for skipped suite is not supplied', function(done) { + run('suite/suite-skipped-no-callback.fixture.js', args, function(err, res) { + assert(!err); + pattern = new RegExp("Error", 'g'); + var result = res.output.match(pattern) || []; + assert.equal(result.length, 0); + done(); + }); + }); +}); + + +describe('skipped suite w/ callback', function() { + this.timeout(1000); + it('should not throw an error when a callback for skipped suite is supplied', function(done) { + run('suite/suite-skipped-callback.fixture.js', args, function(err, res) { + assert(!err); + pattern = new RegExp("Error", 'g'); + var result = res.output.match(pattern) || []; + assert.equal(result.length, 0); + done(); + }); + }); +}); From f1ac5485f19c15fc50b683bdbf27c666b7940f7e Mon Sep 17 00:00:00 2001 From: Dmitry Sorin Date: Thu, 22 Sep 2016 08:55:53 +0300 Subject: [PATCH 0629/1771] fix: fix uncaught TypeError if error occurs on next tick, closes #2315 (#2439) --- lib/runner.js | 3 +++ test/integration/fixtures/regression/issue-2315.js | 7 +++++++ test/integration/regression.spec.js | 13 ++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/integration/fixtures/regression/issue-2315.js diff --git a/lib/runner.js b/lib/runner.js index 22907f570f..145d990351 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -420,6 +420,9 @@ Runner.prototype.runTest = function(fn) { var self = this; var test = this.test; + if (!test) { + return; + } if (this.asyncOnly) { test.asyncOnly = true; } diff --git a/test/integration/fixtures/regression/issue-2315.js b/test/integration/fixtures/regression/issue-2315.js new file mode 100644 index 0000000000..d3d1f9363c --- /dev/null +++ b/test/integration/fixtures/regression/issue-2315.js @@ -0,0 +1,7 @@ +describe('issue-2315: cannot read property currentRetry of undefined', function () { + before(function () { + require('http').createServer().listen(1); + }); + + it('something', function () {}); +}); diff --git a/test/integration/regression.spec.js b/test/integration/regression.spec.js index f9f96d31d6..f2a435a34c 100644 --- a/test/integration/regression.spec.js +++ b/test/integration/regression.spec.js @@ -1,4 +1,4 @@ -var assert = require('assert'); +var assert = require('assert'); var fs = require('fs'); var path = require('path'); var run = require('./helpers').runMocha; @@ -62,6 +62,17 @@ describe('regressions', function() { }); }); + it('issue-2315: cannot read property currentRetry of undefined', function (done) { + runJSON('regression/issue-2315.js', [], function(err, res) { + assert(!err); + assert.equal(res.stats.pending, 0); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 1); + assert.equal(res.code, 1); + done(); + }); + }); + it('issue-2406: should run nested describe.only suites', function(done) { this.timeout(2000); runJSON('regression/issue-2406.fixture.js', [], function(err, res) { From 96e20df35749136da26f2cbecd057716f23e2a5f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 21 Sep 2016 22:11:23 -0700 Subject: [PATCH 0630/1771] attempt windows-friendly reproducible case for #2315 --- test/integration/fixtures/regression/issue-2315.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/fixtures/regression/issue-2315.js b/test/integration/fixtures/regression/issue-2315.js index d3d1f9363c..cdfb201059 100644 --- a/test/integration/fixtures/regression/issue-2315.js +++ b/test/integration/fixtures/regression/issue-2315.js @@ -1,6 +1,8 @@ describe('issue-2315: cannot read property currentRetry of undefined', function () { before(function () { - require('http').createServer().listen(1); + process.nextTick(function () { + throw new Error(); + }); }); it('something', function () {}); From 8ef51a563582fa788b9092028f9aecffe7c32292 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 26 Sep 2016 21:09:09 -0700 Subject: [PATCH 0631/1771] use HTML reporter and default to autoWatch/singleRun mode - use `--single-run` to execute once and exit (this is done in `Makefile`) --- Makefile | 2 +- karma.conf.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index b05ce6579f..25d84f5c1d 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ test: lint test-node test-browser test-browser-unit: @printf "==> [Test :: Browser]\n" - NODE_PATH=. $(KARMA) start + NODE_PATH=. $(KARMA) start --single-run test-browser-bdd: @printf "==> [Test :: Browser :: BDD]\n" diff --git a/karma.conf.js b/karma.conf.js index 266fe72b7a..4aa108b27d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -49,7 +49,11 @@ module.exports = function(config) { colors: true, browsers: ['PhantomJS'], logLevel: config.LOG_INFO, - singleRun: true + client: { + mocha: { + reporter: 'html' + } + } }; // see https://github.com/saucelabs/karma-sauce-example From 8ccccba817143539f074362f2f95b3f731d23cef Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 26 Sep 2016 23:27:56 -0700 Subject: [PATCH 0632/1771] fix problems with only/skip in IE7/IE8 --- lib/runner.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 145d990351..dc03ec451a 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -310,7 +310,7 @@ Runner.prototype.hook = function(name, fn) { if (name === 'beforeEach' || name === 'afterEach') { self.test.pending = true; } else { - suite.tests.forEach(function(test) { + utils.forEach(suite.tests, function(test) { test.pending = true; }); // a pending hook won't be executed twice. @@ -863,7 +863,7 @@ function filterOnly(suite) { } else { // Otherwise, do not run any of the tests in this suite. suite.tests = []; - suite._onlySuites.forEach(function(onlySuite) { + utils.forEach(suite._onlySuites, function(onlySuite) { // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. if (hasOnly(onlySuite)) { From 8bf1f297142b02128664523ab5a9b3d55b09c365 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 00:01:34 -0700 Subject: [PATCH 0633/1771] ensure windows compat with stack trace filter; closes #2502 (#2503) - also removed component-related cruft - skip stack tests by OS --- lib/utils.js | 19 ++++-- test/runner.spec.js | 13 ++++ test/utils.spec.js | 163 ++++++++++++++++++++++++++++++-------------- 3 files changed, 136 insertions(+), 59 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index 1cfbbae781..bb2c99c48f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -9,7 +9,8 @@ var basename = require('path').basename; var debug = require('debug')('mocha:watch'); var exists = require('fs').existsSync || require('path').existsSync; var glob = require('glob'); -var join = require('path').join; +var path = require('path'); +var join = path.join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; @@ -720,16 +721,20 @@ exports.getError = function(err) { */ exports.stackTraceFilter = function() { // TODO: Replace with `process.browser` - var slash = '/'; var is = typeof document === 'undefined' ? { node: true } : { browser: true }; - var cwd = is.node - ? process.cwd() + slash - : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + var slash = path.sep; + var cwd; + if (is.node) { + cwd = process.cwd() + slash; + } else { + cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + slash = '/'; + } function isMochaInternal(line) { return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) - || (~line.indexOf('components' + slash + 'mochajs' + slash)) - || (~line.indexOf('components' + slash + 'mocha' + slash)) + || (~line.indexOf('node_modules' + slash + 'mocha.js')) + || (~line.indexOf('bower_components' + slash + 'mocha.js')) || (~line.indexOf(slash + 'mocha.js')); } diff --git a/test/runner.spec.js b/test/runner.spec.js index ffe4d70e8c..5392d0077b 100644 --- a/test/runner.spec.js +++ b/test/runner.spec.js @@ -3,6 +3,7 @@ var Suite = mocha.Suite; var Runner = mocha.Runner; var Test = mocha.Test; var Hook = mocha.Hook; +var path = require('path'); function noop() {} @@ -373,6 +374,12 @@ describe('Runner', function() { ]; describe('shortStackTrace', function() { + beforeEach(function() { + if (path.sep !== '/') { + this.skip(); + } + }); + it('should prettify the stack-trace', function(done) { var hook = new Hook(); var err = new Error(); @@ -388,6 +395,12 @@ describe('Runner', function() { }); describe('longStackTrace', function() { + beforeEach(function() { + if (path.sep !== '/') { + this.skip(); + } + }); + it('should display the full stack-trace', function(done) { var hook = new Hook(); var err = new Error(); diff --git a/test/utils.spec.js b/test/utils.spec.js index 501ea7abe8..4683809ae6 100644 --- a/test/utils.spec.js +++ b/test/utils.spec.js @@ -1,5 +1,6 @@ var mocha = require('..'); var utils = mocha.utils; +var path = require('path'); var JSON = require('json3'); describe('utils', function() { @@ -97,62 +98,120 @@ describe('utils', function() { describe('.stackTraceFilter()', function() { describe('on node', function() { var filter = utils.stackTraceFilter(); - it('should get a stack-trace as a string and prettify it', function() { - var stack = [ 'AssertionError: foo bar' - , 'at EventEmitter. (/usr/local/dev/test.js:16:12)' - , 'at Context. (/usr/local/dev/test.js:19:5)' - , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)' - , 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)' - , '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12' - , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)' - , '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7' - , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' - , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' - , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; - filter(stack.join('\n')).should.equal(stack.slice(0,3).join('\n')); - - stack = [ 'AssertionError: bar baz' - , 'at /usr/local/dev/some-test-file.js:25:8' - , 'at tryCatcher (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/util.js:24:31)' - , 'at Promise._resolveFromResolver (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:439:31)' - , 'at new Promise (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:53:37)' - , 'at yourFunction (/usr/local/dev/own/tmp/test1.js:24:13)' - , 'at Context. (/usr/local/dev/some-test-file:30:4)' - , 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:218:15)' - , 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)' - , 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)' - , 'at processImmediate [as _immediateCallback] (timers.js:321:17)']; - filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); - }); + describe('on POSIX OS', function () { + before(function () { + if (path.sep !== '/') { + this.skip(); + } + }); - it('does not ignore other bower_components and components', function() { - var stack = ['Error: failed' - , 'at assert (index.html:11:26)' - , 'at Context. (test.js:17:18)' - , 'at bower_components/should/should.js:4827:7' - , 'at next (file:///.../bower_components/should/should.js:4766:23)' - , 'at components/should/5.0.0/should.js:4827:7' - , 'at next (file:///.../components/should/5.0.0/should.js:4766:23)' - , 'at file:///.../bower_components/mocha/mocha.js:4794:5' - , 'at timeslice (.../components/mocha/mocha.js:6218:27)' - , 'at Test.require.register.Runnable.run (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4463:15)' - , 'at Runner.require.register.Runner.runTest (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4892:10)' - , 'at file:///.../components/mochajs/mocha/2.1.0/mocha.js:4970:12' - , 'at next (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4817:14)']; - filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n')); - }); + it('should get a stack-trace as a string and prettify it', function () { + var stack = [ + 'AssertionError: foo bar', + 'at EventEmitter. (/usr/local/dev/test.js:16:12)', + 'at Context. (/usr/local/dev/test.js:19:5)', + 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)', + 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)', + '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12', + 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)', + '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7', + 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)', + 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)', + 'at processImmediate [as _immediateCallback] (timers.js:321:17)' + ]; + filter(stack.join('\n')) + .should + .equal(stack.slice(0, 3) + .join('\n')); + + stack = [ + 'AssertionError: bar baz', + 'at /usr/local/dev/some-test-file.js:25:8', + 'at tryCatcher (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/util.js:24:31)', + 'at Promise._resolveFromResolver (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:439:31)', + 'at new Promise (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:53:37)', + 'at yourFunction (/usr/local/dev/own/tmp/test1.js:24:13)', + 'at Context. (/usr/local/dev/some-test-file:30:4)', + 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:218:15)', + 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)', + 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)', + 'at processImmediate [as _immediateCallback] (timers.js:321:17)' + ]; + + filter(stack.join('\n')) + .should + .equal(stack.slice(0, 7) + .join('\n')); + }); + + it('does not ignore other bower_components and components', + function () { + var stack = [ + 'Error: failed', + 'at assert (index.html:11:26)', + 'at Context. (test.js:17:18)', + 'at bower_components/should/should.js:4827:7', + 'at next (file:///.../bower_components/should/should.js:4766:23)', + 'at components/should/5.0.0/should.js:4827:7', + 'at next (file:///.../components/should/5.0.0/should.js:4766:23)', + 'at file:///.../bower_components/mocha/mocha.js:4794:5', + 'at timeslice (.../components/mocha/mocha.js:6218:27)', + 'at Test.require.register.Runnable.run (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4463:15)', + 'at Runner.require.register.Runner.runTest (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4892:10)', + 'at file:///.../components/mochajs/mocha/2.1.0/mocha.js:4970:12', + 'at next (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4817:14)' + ]; + filter(stack.join('\n')) + .should + .equal(stack.slice(0, 7) + .join('\n')); + }); - it('should replace absolute with relative paths', function() { - var stack = ['Error: ' + process.cwd() + '/bla.js has a problem' - , 'at foo (' + process.cwd() + '/foo/index.js:13:226)' - , 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)']; + it('should replace absolute with relative paths', function () { + var stack = [ + 'Error: ' + process.cwd() + '/bla.js has a problem', + 'at foo (' + process.cwd() + '/foo/index.js:13:226)', + 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)' + ]; + + var expected = [ + 'Error: ' + process.cwd() + '/bla.js has a problem', + 'at foo (foo/index.js:13:226)', + 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)' + ]; + + filter(stack.join('\n')) + .should + .equal(expected.join('\n')); + }); + }); - var expected = ['Error: ' + process.cwd() + '/bla.js has a problem' - , 'at foo (foo/index.js:13:226)' - , 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)']; + describe('on Windows', function() { + before(function () { + if (path.sep === '/') { + this.skip(); + } + }); - filter(stack.join('\n')).should.equal(expected.join('\n')); + it('should work on Windows', function () { + var stack = [ + 'Error: failed', + 'at Context. (C:\\Users\\ishida\\src\\test\\test\\mytest.js:5:9)', + 'at callFn (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runnable.js:326:21)', + 'at Test.Runnable.run (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runnable.js:319:7)', + 'at Runner.runTest (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:422:10)', + 'at C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:528:12', + 'at next (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:342:14)', + 'at C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:352:7', + 'at next (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:284:14)', + 'at Immediate._onImmediate (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:320:5)' + ]; + filter(stack.join('\n')) + .should + .equal(stack.slice(0, 2) + .join('\n')); + }); }); }); @@ -163,7 +222,7 @@ describe('utils', function() { global.location = { href: 'localhost:3000/foo/bar/index.html' }; filter = utils.stackTraceFilter(); }); - it('does not strip out other bower_components and components', function() { + it('does not strip out other bower_components', function() { var stack = ['Error: failed' , 'at assert (index.html:11:26)' , 'at Context. (test.js:17:18)' From 8431cb3f2337146a671d4291485561b60bde2241 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 00:29:21 -0700 Subject: [PATCH 0634/1771] fix diff output for String objects; closes #2496 (#2499) - rename some exported functions/vars as to use locally - update JSDoc comments - includes IE7/8 support --- lib/utils.js | 63 ++++++++++++++++++++--------------- test/acceptance/utils.spec.js | 4 +++ 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index bb2c99c48f..c7947cb05d 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -90,7 +90,7 @@ exports.map = function(arr, fn, scope) { * @param {number} start * @return {number} */ -exports.indexOf = function(arr, obj, start) { +var indexOf = exports.indexOf = function(arr, obj, start) { for (var i = start || 0, l = arr.length; i < l; i++) { if (arr[i] === obj) { return i; @@ -108,7 +108,7 @@ exports.indexOf = function(arr, obj, start) { * @param {Object} val Initial value. * @return {*} */ -exports.reduce = function(arr, fn, val) { +var reduce = exports.reduce = function(arr, fn, val) { var rval = val; for (var i = 0, l = arr.length; i < l; i++) { @@ -314,7 +314,7 @@ exports.trim = function(str) { * @return {Object} */ exports.parseQuery = function(qs) { - return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair) { + return reduce(qs.replace('?', '').split('&'), function(obj, pair) { var i = pair.indexOf('='); var key = pair.slice(0, i); var val = pair.slice(++i); @@ -367,13 +367,11 @@ exports.highlightTags = function(name) { * * @api private * @param {*} value The value to inspect. - * @param {string} [type] The type of the value, if known. + * @param {string} typeHint The type of the value * @returns {string} */ -function emptyRepresentation(value, type) { - type = type || exports.type(value); - - switch (type) { +function emptyRepresentation(value, typeHint) { + switch (typeHint) { case 'function': return '[Function]'; case 'object': @@ -392,7 +390,7 @@ function emptyRepresentation(value, type) { * @api private * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString * @param {*} value The value to test. - * @returns {string} + * @returns {string} Computed type * @example * type({}) // 'object' * type([]) // 'array' @@ -404,8 +402,9 @@ function emptyRepresentation(value, type) { * type(/foo/) // 'regexp' * type('type') // 'string' * type(global) // 'global' + * type(new String('foo') // 'object' */ -exports.type = function type(value) { +var type = exports.type = function type(value) { if (value === undefined) { return 'undefined'; } else if (value === null) { @@ -434,25 +433,36 @@ exports.type = function type(value) { * @return {string} */ exports.stringify = function(value) { - var type = exports.type(value); + var typeHint = type(value); + + if (!~indexOf(['object', 'array', 'function'], typeHint)) { + if (typeHint === 'buffer') { + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); + } - if (!~exports.indexOf(['object', 'array', 'function'], type)) { - if (type !== 'buffer') { + // IE7/IE8 has a bizarre String constructor; needs to be coerced + // into an array and back to obj. + if (typeHint === 'string' && typeof value === 'object') { + value = reduce(value.split(''), function(acc, char, idx) { + acc[idx] = char; + return acc; + }, {}); + typeHint = 'object'; + } else { return jsonStringify(value); } - var json = value.toJSON(); - // Based on the toJSON result - return jsonStringify(json.data && json.type ? json.data : json, 2) - .replace(/,(\n|$)/g, '$1'); } for (var prop in value) { if (Object.prototype.hasOwnProperty.call(value, prop)) { - return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); + return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1'); } } - return emptyRepresentation(value, type); + return emptyRepresentation(value, typeHint); }; /** @@ -481,7 +491,7 @@ function jsonStringify(object, spaces, depth) { } function _stringify(val) { - switch (exports.type(val)) { + switch (type(val)) { case 'null': case 'undefined': val = '[' + val + ']'; @@ -564,14 +574,15 @@ exports.isBuffer = function(value) { * @see {@link exports.stringify} * @param {*} value Thing to inspect. May or may not have properties. * @param {Array} [stack=[]] Stack of seen values + * @param {string} [typeHint] Type hint * @return {(Object|Array|Function|string|undefined)} */ -exports.canonicalize = function(value, stack) { +exports.canonicalize = function canonicalize(value, stack, typeHint) { var canonicalizedObj; /* eslint-disable no-unused-vars */ var prop; /* eslint-enable no-unused-vars */ - var type = exports.type(value); + typeHint = typeHint || type(value); function withStack(value, fn) { stack.push(value); fn(); @@ -580,11 +591,11 @@ exports.canonicalize = function(value, stack) { stack = stack || []; - if (exports.indexOf(stack, value) !== -1) { + if (indexOf(stack, value) !== -1) { return '[Circular]'; } - switch (type) { + switch (typeHint) { case 'undefined': case 'buffer': case 'null': @@ -605,7 +616,7 @@ exports.canonicalize = function(value, stack) { } /* eslint-enable guard-for-in */ if (!canonicalizedObj) { - canonicalizedObj = emptyRepresentation(value, type); + canonicalizedObj = emptyRepresentation(value, typeHint); break; } /* falls through */ @@ -750,7 +761,7 @@ exports.stackTraceFilter = function() { return function(stack) { stack = stack.split('\n'); - stack = exports.reduce(stack, function(list, line) { + stack = reduce(stack, function(list, line) { if (isMochaInternal(line)) { return list; } diff --git a/test/acceptance/utils.spec.js b/test/acceptance/utils.spec.js index a2383a739f..cab0f42b01 100644 --- a/test/acceptance/utils.spec.js +++ b/test/acceptance/utils.spec.js @@ -77,6 +77,10 @@ describe('lib/utils', function () { var stringify = utils.stringify; + it('should return an object representation of a string created with a String constructor', function() { + expect(stringify(new String('foo'))).to.equal('{\n "0": "f"\n "1": "o"\n "2": "o"\n}'); + }); + it('should return Buffer with .toJSON representation', function() { expect(stringify(new Buffer([0x01]))).to.equal('[\n 1\n]'); expect(stringify(new Buffer([0x01, 0x02]))).to.equal('[\n 1\n 2\n]'); From 44a031ba873db3a2e42d0fa6c174b36d6149c1e4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 00:18:15 -0700 Subject: [PATCH 0635/1771] CHANGELOG for v3.1.0 [ci skip] --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebb67eb2ed..0e70bec01c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +# 3.1.0 / 2016-09-27 + +## :tada: Enhancement + +- [#2357]: Support `--inspect` on command-line ([@simov]) +- [#2194]: Human-friendly error if no files are matched on command-line ([@Munter]) +- [#1744]: Human-friendly error if a Suite has no callback (BDD/TDD only) ([@anton]) + +## :bug: Bug Fix + +- [#2488]: Fix case in which *variables beginning with lowercase "D"* may not have been reported properly as global leaks ([@JustATrick]) :laughing: +- [#2465]: Always halt execution in async function when `this.skip()` is called ([@boneskull]) +- [#2445]: Exits with expected code 130 when `SIGINT` encountered; exit code can no longer rollover at 256 ([@Munter]) +- [#2315]: Fix uncaught TypeError thrown from callback stack ([@1999]) +- Fix broken `only()`/`skip()` in IE7/IE8 ([@boneskull]) +- [#2502]: Fix broken stack trace filter on Node.js under Windows ([@boneskull]) +- [#2496]: Fix diff output for objects instantiated with `String` constructor ([more](https://youtrack.jetbrains.com/issue/WEB-23383)) ([@boneskull]) + +[#2496]: https://github.com/mochajs/mocha/issues/2496 +[#2502]: https://github.com/mochajs/mocha/issues/2502 +[#2315]: https://github.com/mochajs/mocha/issues/2315 +[#2445]: https://github.com/mochajs/mocha/pull/2445 +[#2465]: https://github.com/mochajs/mocha/issues/2465 +[#2488]: https://github.com/mochajs/mocha/issues/2488 +[#1744]: https://github.com/mochajs/mocha/issues/1744 +[#2194]: https://github.com/mochajs/mocha/issues/2194 +[#2357]: https://github.com/mochajs/mocha/issues/2357 +[@1999]: https://github.com/1999 +[@JustATrick]: https://github.com/JustATrick +[@anton]: https://github.com/anton +[@simov]: https://github.com/simov + # 3.0.2 / 2016-08-08 ## :bug: Bug Fix From 037cdae4ec7e41417b2ad8cc9cf09a649080aec6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 00:46:06 -0700 Subject: [PATCH 0636/1771] build dist for v3.1.0 --- mocha.js | 848 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 561 insertions(+), 287 deletions(-) diff --git a/mocha.js b/mocha.js index 3ca0ae9e67..1d5b072aca 100644 --- a/mocha.js +++ b/mocha.js @@ -912,6 +912,8 @@ module.exports = function(suites, context, mocha) { if (typeof opts.fn === 'function') { opts.fn.call(suite); suites.shift(); + } else if (typeof opts.fn === 'undefined' && !suite.pending) { + throw new Error('Suite "' + suite.fullTitle() + '" was defined but no callback was supplied. Supply a callback or explicitly skip the suite.'); } return suite; @@ -1076,7 +1078,8 @@ module.exports = function(suite) { } return common.suite.create({ title: title, - file: file + file: file, + fn: false }); }; @@ -1090,7 +1093,8 @@ module.exports = function(suite) { } return common.suite.only({ title: title, - file: file + file: file, + fn: false }); }; @@ -4168,7 +4172,7 @@ Runnable.prototype.enableTimeouts = function(enabled) { * @api public */ Runnable.prototype.skip = function() { - throw new Pending(); + throw new Pending('sync skip'); }; /** @@ -4333,14 +4337,19 @@ Runnable.prototype.run = function(fn) { if (this.async) { this.resetTimeout(); + // allows skip() to be used in an explicit async context + this.skip = function asyncSkip() { + done(new Pending('async skip call')); + // halt execution. the Runnable will be marked pending + // by the previous call, and the uncaught handler will ignore + // the failure. + throw new Pending('async skip; aborting execution'); + }; + if (this.allowUncaught) { return callFnAsync(this.fn); } try { - // allows skip() to be used in an explicit async context - this.skip = function() { - done(new Pending()); - }; callFnAsync(this.fn); } catch (err) { done(utils.getError(err)); @@ -4634,6 +4643,10 @@ Runner.prototype.checkGlobals = function(test) { * @param {Error} err */ Runner.prototype.fail = function(test, err) { + if (test.isPending()) { + return; + } + ++this.failures; test.state = 'failed'; @@ -4720,9 +4733,11 @@ Runner.prototype.hook = function(name, fn) { if (name === 'beforeEach' || name === 'afterEach') { self.test.pending = true; } else { - suite.tests.forEach(function(test) { + utils.forEach(suite.tests, function(test) { test.pending = true; }); + // a pending hook won't be executed twice. + hook.pending = true; } } else { self.failHook(hook, err); @@ -4828,6 +4843,9 @@ Runner.prototype.runTest = function(fn) { var self = this; var test = this.test; + if (!test) { + return; + } if (this.asyncOnly) { test.asyncOnly = true; } @@ -5109,8 +5127,8 @@ Runner.prototype.uncaught = function(err) { runnable.clearTimeout(); - // Ignore errors if complete - if (runnable.state) { + // Ignore errors if complete or pending + if (runnable.state || runnable.isPending()) { return; } this.fail(runnable, err); @@ -5268,7 +5286,7 @@ function filterOnly(suite) { } else { // Otherwise, do not run any of the tests in this suite. suite.tests = []; - suite._onlySuites.forEach(function(onlySuite) { + utils.forEach(suite._onlySuites, function(onlySuite) { // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. if (hasOnly(onlySuite)) { @@ -5306,7 +5324,7 @@ function hasOnly(suite) { function filterLeaks(ok, globals) { return filter(globals, function(key) { // Firefox and Chrome exposes iframes as index inside the window object - if (/^d+/.test(key)) { + if (/^\d+/.test(key)) { return false; } @@ -5868,7 +5886,8 @@ var basename = require('path').basename; var debug = require('debug')('mocha:watch'); var exists = require('fs').existsSync || require('path').existsSync; var glob = require('glob'); -var join = require('path').join; +var path = require('path'); +var join = path.join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; @@ -5948,7 +5967,7 @@ exports.map = function(arr, fn, scope) { * @param {number} start * @return {number} */ -exports.indexOf = function(arr, obj, start) { +var indexOf = exports.indexOf = function(arr, obj, start) { for (var i = start || 0, l = arr.length; i < l; i++) { if (arr[i] === obj) { return i; @@ -5966,7 +5985,7 @@ exports.indexOf = function(arr, obj, start) { * @param {Object} val Initial value. * @return {*} */ -exports.reduce = function(arr, fn, val) { +var reduce = exports.reduce = function(arr, fn, val) { var rval = val; for (var i = 0, l = arr.length; i < l; i++) { @@ -6172,7 +6191,7 @@ exports.trim = function(str) { * @return {Object} */ exports.parseQuery = function(qs) { - return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair) { + return reduce(qs.replace('?', '').split('&'), function(obj, pair) { var i = pair.indexOf('='); var key = pair.slice(0, i); var val = pair.slice(++i); @@ -6225,13 +6244,11 @@ exports.highlightTags = function(name) { * * @api private * @param {*} value The value to inspect. - * @param {string} [type] The type of the value, if known. + * @param {string} typeHint The type of the value * @returns {string} */ -function emptyRepresentation(value, type) { - type = type || exports.type(value); - - switch (type) { +function emptyRepresentation(value, typeHint) { + switch (typeHint) { case 'function': return '[Function]'; case 'object': @@ -6250,7 +6267,7 @@ function emptyRepresentation(value, type) { * @api private * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString * @param {*} value The value to test. - * @returns {string} + * @returns {string} Computed type * @example * type({}) // 'object' * type([]) // 'array' @@ -6262,8 +6279,9 @@ function emptyRepresentation(value, type) { * type(/foo/) // 'regexp' * type('type') // 'string' * type(global) // 'global' + * type(new String('foo') // 'object' */ -exports.type = function type(value) { +var type = exports.type = function type(value) { if (value === undefined) { return 'undefined'; } else if (value === null) { @@ -6292,25 +6310,36 @@ exports.type = function type(value) { * @return {string} */ exports.stringify = function(value) { - var type = exports.type(value); - - if (!~exports.indexOf(['object', 'array', 'function'], type)) { - if (type !== 'buffer') { + var typeHint = type(value); + + if (!~indexOf(['object', 'array', 'function'], typeHint)) { + if (typeHint === 'buffer') { + var json = value.toJSON(); + // Based on the toJSON result + return jsonStringify(json.data && json.type ? json.data : json, 2) + .replace(/,(\n|$)/g, '$1'); + } + + // IE7/IE8 has a bizarre String constructor; needs to be coerced + // into an array and back to obj. + if (typeHint === 'string' && typeof value === 'object') { + value = reduce(value.split(''), function(acc, char, idx) { + acc[idx] = char; + return acc; + }, {}); + typeHint = 'object'; + } else { return jsonStringify(value); } - var json = value.toJSON(); - // Based on the toJSON result - return jsonStringify(json.data && json.type ? json.data : json, 2) - .replace(/,(\n|$)/g, '$1'); } for (var prop in value) { if (Object.prototype.hasOwnProperty.call(value, prop)) { - return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1'); + return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1'); } } - return emptyRepresentation(value, type); + return emptyRepresentation(value, typeHint); }; /** @@ -6339,7 +6368,7 @@ function jsonStringify(object, spaces, depth) { } function _stringify(val) { - switch (exports.type(val)) { + switch (type(val)) { case 'null': case 'undefined': val = '[' + val + ']'; @@ -6422,14 +6451,15 @@ exports.isBuffer = function(value) { * @see {@link exports.stringify} * @param {*} value Thing to inspect. May or may not have properties. * @param {Array} [stack=[]] Stack of seen values + * @param {string} [typeHint] Type hint * @return {(Object|Array|Function|string|undefined)} */ -exports.canonicalize = function(value, stack) { +exports.canonicalize = function canonicalize(value, stack, typeHint) { var canonicalizedObj; /* eslint-disable no-unused-vars */ var prop; /* eslint-enable no-unused-vars */ - var type = exports.type(value); + typeHint = typeHint || type(value); function withStack(value, fn) { stack.push(value); fn(); @@ -6438,11 +6468,11 @@ exports.canonicalize = function(value, stack) { stack = stack || []; - if (exports.indexOf(stack, value) !== -1) { + if (indexOf(stack, value) !== -1) { return '[Circular]'; } - switch (type) { + switch (typeHint) { case 'undefined': case 'buffer': case 'null': @@ -6463,7 +6493,7 @@ exports.canonicalize = function(value, stack) { } /* eslint-enable guard-for-in */ if (!canonicalizedObj) { - canonicalizedObj = emptyRepresentation(value, type); + canonicalizedObj = emptyRepresentation(value, typeHint); break; } /* falls through */ @@ -6579,16 +6609,20 @@ exports.getError = function(err) { */ exports.stackTraceFilter = function() { // TODO: Replace with `process.browser` - var slash = '/'; var is = typeof document === 'undefined' ? { node: true } : { browser: true }; - var cwd = is.node - ? process.cwd() + slash - : (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + var slash = path.sep; + var cwd; + if (is.node) { + cwd = process.cwd() + slash; + } else { + cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); + slash = '/'; + } function isMochaInternal(line) { return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) - || (~line.indexOf('components' + slash + 'mochajs' + slash)) - || (~line.indexOf('components' + slash + 'mocha' + slash)) + || (~line.indexOf('node_modules' + slash + 'mocha.js')) + || (~line.indexOf('bower_components' + slash + 'mocha.js')) || (~line.indexOf(slash + 'mocha.js')); } @@ -6604,7 +6638,7 @@ exports.stackTraceFilter = function() { return function(stack) { stack = stack.split('\n'); - stack = exports.reduce(stack, function(list, line) { + stack = reduce(stack, function(list, line) { if (isMochaInternal(line)) { return list; } @@ -6637,7 +6671,7 @@ exports.isPromise = function isPromise(value) { }; }).call(this,require('_process'),require("buffer").Buffer) -},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":82}],39:[function(require,module,exports){ +},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":84}],39:[function(require,module,exports){ 'use strict' exports.toByteArray = toByteArray @@ -6779,7 +6813,7 @@ BrowserStdout.prototype._write = function(chunks, encoding, cb) { } }).call(this,require('_process')) -},{"_process":67,"stream":78,"util":82}],42:[function(require,module,exports){ +},{"_process":67,"stream":79,"util":84}],42:[function(require,module,exports){ arguments[4][40][0].apply(exports,arguments) },{"dup":40}],43:[function(require,module,exports){ (function (global){ @@ -7062,6 +7096,8 @@ if (Buffer.TYPED_ARRAY_SUPPORT) { function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') } } @@ -7125,12 +7161,20 @@ function fromString (that, string, encoding) { var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) - that.write(string, encoding) + var actual = that.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual) + } + return that } function fromArrayLike (that, array) { - var length = checked(array.length) | 0 + var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 @@ -7149,7 +7193,9 @@ function fromArrayBuffer (that, array, byteOffset, length) { throw new RangeError('\'length\' is out of bounds') } - if (length === undefined) { + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array) + } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) @@ -7197,7 +7243,7 @@ function fromObject (that, obj) { } function checked (length) { - // Note: cannot use `length < kMaxLength` here because that fails when + // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + @@ -7246,9 +7292,9 @@ Buffer.isEncoding = function isEncoding (encoding) { case 'utf8': case 'utf-8': case 'ascii': + case 'latin1': case 'binary': case 'base64': - case 'raw': case 'ucs2': case 'ucs-2': case 'utf16le': @@ -7309,9 +7355,8 @@ function byteLength (string, encoding) { for (;;) { switch (encoding) { case 'ascii': + case 'latin1': case 'binary': - case 'raw': - case 'raws': return len case 'utf8': case 'utf-8': @@ -7384,8 +7429,9 @@ function slowToString (encoding, start, end) { case 'ascii': return asciiSlice(this, start, end) + case 'latin1': case 'binary': - return binarySlice(this, start, end) + return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) @@ -7437,6 +7483,20 @@ Buffer.prototype.swap32 = function swap32 () { return this } +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' @@ -7519,7 +7579,73 @@ Buffer.prototype.compare = function compare (target, start, end, thisStart, this return 0 } -function arrayIndexOf (arr, val, byteOffset, encoding) { +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length @@ -7546,60 +7672,45 @@ function arrayIndexOf (arr, val, byteOffset, encoding) { } } - var foundIndex = -1 - for (var i = byteOffset; i < arrLength; ++i) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i } } return -1 } -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset >>= 0 - - if (this.length === 0) return -1 - if (byteOffset >= this.length) return -1 - - // Negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) - - if (typeof val === 'string') { - val = Buffer.from(val, encoding) - } - - if (Buffer.isBuffer(val)) { - // special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(this, val, byteOffset, encoding) - } - if (typeof val === 'number') { - if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { - return Uint8Array.prototype.indexOf.call(this, val, byteOffset) - } - return arrayIndexOf(this, [ val ], byteOffset, encoding) - } +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} - throw new TypeError('val must be string, number or Buffer') +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { @@ -7616,7 +7727,7 @@ function hexWrite (buf, string, offset, length) { // must be an even number of digits var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 @@ -7637,7 +7748,7 @@ function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } -function binaryWrite (buf, string, offset, length) { +function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } @@ -7699,8 +7810,9 @@ Buffer.prototype.write = function write (string, offset, length, encoding) { case 'ascii': return asciiWrite(this, string, offset, length) + case 'latin1': case 'binary': - return binaryWrite(this, string, offset, length) + return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write @@ -7841,7 +7953,7 @@ function asciiSlice (buf, start, end) { return ret } -function binarySlice (buf, start, end) { +function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) @@ -10063,22 +10175,26 @@ if (typeof Object.create === 'function') { } },{}],52:[function(require,module,exports){ -/** - * Determine if an object is Buffer - * - * Author: Feross Aboukhadijeh - * License: MIT +/*! + * Determine if an object is a Buffer * - * `npm install is-buffer` + * @author Feross Aboukhadijeh + * @license MIT */ +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually module.exports = function (obj) { - return !!(obj != null && - (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) - (obj.constructor && - typeof obj.constructor.isBuffer === 'function' && - obj.constructor.isBuffer(obj)) - )) + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } },{}],53:[function(require,module,exports){ @@ -11448,12 +11564,12 @@ module.exports = create; },{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){ /** - * lodash 3.0.8 (Custom Build) + * lodash (Custom Build) * Build: `lodash modularize exports="npm" -o ./` - * Copyright 2012-2016 The Dojo Foundation + * Copyright jQuery Foundation and other contributors + * Released under MIT license * Based on Underscore.js 1.8.3 - * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ /** Used as references for various `Number` constants. */ @@ -11471,7 +11587,8 @@ var objectProto = Object.prototype; var hasOwnProperty = objectProto.hasOwnProperty; /** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var objectToString = objectProto.toString; @@ -11479,39 +11596,16 @@ var objectToString = objectProto.toString; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} - -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); - /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ + * @since 0.1.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. * @example * * _.isArguments(function() { return arguments; }()); @@ -11521,7 +11615,7 @@ var getLength = baseProperty('length'); * // => false */ function isArguments(value) { - // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode. + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); } @@ -11533,6 +11627,7 @@ function isArguments(value) { * * @static * @memberOf _ + * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. @@ -11551,7 +11646,7 @@ function isArguments(value) { * // => false */ function isArrayLike(value) { - return value != null && isLength(getLength(value)) && !isFunction(value); + return value != null && isLength(value.length) && !isFunction(value); } /** @@ -11560,9 +11655,11 @@ function isArrayLike(value) { * * @static * @memberOf _ + * @since 4.0.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); @@ -11586,9 +11683,10 @@ function isArrayLikeObject(value) { * * @static * @memberOf _ + * @since 0.1.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); @@ -11599,8 +11697,7 @@ function isArrayLikeObject(value) { */ function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8 which returns 'object' for typed array and weak map constructors, - // and PhantomJS 1.9 which returns 'function' for `NodeList` instances. + // in Safari 8-9 which returns 'object' for typed array and other constructors. var tag = isObject(value) ? objectToString.call(value) : ''; return tag == funcTag || tag == genTag; } @@ -11608,10 +11705,12 @@ function isFunction(value) { /** * Checks if `value` is a valid array-like length. * - * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ + * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. @@ -11635,11 +11734,13 @@ function isLength(value) { } /** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ + * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. @@ -11668,6 +11769,7 @@ function isObject(value) { * * @static * @memberOf _ + * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. @@ -12309,7 +12411,6 @@ function nextTick(fn, arg1, arg2, arg3) { }).call(this,require('_process')) },{"_process":67}],67:[function(require,module,exports){ // shim for using process in browser - var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it @@ -12320,22 +12421,84 @@ var process = module.exports = {}; var cachedSetTimeout; var cachedClearTimeout; +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} (function () { - try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; } - } - try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; } - } } ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} var queue = []; var draining = false; var currentQueue; @@ -12360,7 +12523,7 @@ function drainQueue() { if (draining) { return; } - var timeout = cachedSetTimeout(cleanUpNextTick); + var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -12377,7 +12540,7 @@ function drainQueue() { } currentQueue = null; draining = false; - cachedClearTimeout(timeout); + runClearTimeout(timeout); } process.nextTick = function (fun) { @@ -12389,7 +12552,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - cachedSetTimeout(drainQueue, 0); + runTimeout(drainQueue); } }; @@ -12589,21 +12752,21 @@ if (debugUtil && debugUtil.debuglog) { } /**/ +var BufferList = require('./internal/streams/BufferList'); var StringDecoder; util.inherits(Readable, Stream); -var hasPrependListener = typeof EE.prototype.prependListener === 'function'; - function prependListener(emitter, event, fn) { - if (hasPrependListener) return emitter.prependListener(event, fn); - - // This is a brutally ugly hack to make sure that our error handler - // is attached before any userland ones. NEVER DO THIS. This is here - // only because this code needs to continue to work with older versions - // of Node.js that do not include the prependListener() method. The goal - // is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } } var Duplex; @@ -12627,7 +12790,10 @@ function ReadableState(options, stream) { // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; - this.buffer = []; + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); this.length = 0; this.pipes = null; this.pipesCount = 0; @@ -12790,7 +12956,8 @@ function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { - // Get the next highest power of 2 + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts n--; n |= n >>> 1; n |= n >>> 2; @@ -12802,44 +12969,34 @@ function computeNewHighWaterMark(n) { return n; } +// This function is designed to be inlinable, so please take care when making +// changes to the function body. function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) return 0; - - if (state.objectMode) return n === 0 ? 0 : 1; - - if (n === null || isNaN(n)) { - // only flow one buffer at a time - if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; } - - if (n <= 0) return 0; - - // If we're asking for more than the target buffer level, - // then raise the water mark. Bump up to the next highest - // power of 2, to prevent increasing it excessively in tiny - // amounts. + // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - - // don't have that much. return null, unless we've ended. - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else { - return state.length; - } + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; } - - return n; + return state.length; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); + n = parseInt(n, 10); var state = this._readableState; var nOrig = n; - if (typeof n !== 'number' || n > 0) state.emittedReadable = false; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger @@ -12895,9 +13052,7 @@ Readable.prototype.read = function (n) { if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); - } - - if (doRead) { + } else if (doRead) { debug('do read'); state.reading = true; state.sync = true; @@ -12906,28 +13061,29 @@ Readable.prototype.read = function (n) { // call internal read method this._read(state.highWaterMark); state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); } - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (doRead && !state.reading) n = howMuchToRead(nOrig, state); - var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = true; n = 0; + } else { + state.length -= n; } - state.length -= n; - - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (state.length === 0 && !state.ended) state.needReadable = true; + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended && state.length === 0) endReadable(this); + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } if (ret !== null) this.emit('data', ret); @@ -13075,11 +13231,17 @@ Readable.prototype.pipe = function (dest, pipeOpts) { if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; src.on('data', ondata); function ondata(chunk) { debug('ondata'); + increasedAwaitDrain = false; var ret = dest.write(chunk); - if (false === ret) { + if (false === ret && !increasedAwaitDrain) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. @@ -13087,6 +13249,7 @@ Readable.prototype.pipe = function (dest, pipeOpts) { if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; + increasedAwaitDrain = true; } src.pause(); } @@ -13200,18 +13363,14 @@ Readable.prototype.unpipe = function (dest) { Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); - // If listening to data, and it has not explicitly been paused, - // then call resume to start the flow of data on the next tick. - if (ev === 'data' && false !== this._readableState.flowing) { - this.resume(); - } - - if (ev === 'readable' && !this._readableState.endEmitted) { + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; state.emittedReadable = false; - state.needReadable = true; if (!state.reading) { processNextTick(nReadingNextTick, this); } else if (state.length) { @@ -13255,6 +13414,7 @@ function resume_(stream, state) { } state.resumeScheduled = false; + state.awaitDrain = 0; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); @@ -13273,11 +13433,7 @@ Readable.prototype.pause = function () { function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); - if (state.flowing) { - do { - var chunk = stream.read(); - } while (null !== chunk && state.flowing); - } + while (state.flowing && stream.read() !== null) {} } // wrap an old-style stream as the async data source. @@ -13348,50 +13504,101 @@ Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; - var ret; - - // nothing in the list, definitely empty. - if (list.length === 0) return null; + // nothing buffered + if (state.length === 0) return null; - if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { - // read it all, truncate the array. - if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); - list.length = 0; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); } else { - // read just some of it. - if (n < list[0].length) { - // just take a part of the first list item. - // slice is the same for buffers and strings. - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - // first list is a perfect match - ret = list.shift(); - } else { - // complex case. - // we have enough to cover it, but it spans past the first buffer. - if (stringMode) ret = '';else ret = bufferShim.allocUnsafe(n); - - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var _buf = list[0]; - var cpy = Math.min(n - c, _buf.length); + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } - if (stringMode) ret += _buf.slice(0, cpy);else _buf.copy(ret, c, 0, cpy); + return ret; +} - if (cpy < _buf.length) list[0] = _buf.slice(cpy);else list.shift(); +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} - c += cpy; +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); } + break; } + ++c; } + list.length -= c; + return ret; +} +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = bufferShim.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; return ret; } @@ -13430,7 +13637,7 @@ function indexOf(xs, x) { return -1; } }).call(this,require('_process')) -},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":79,"util":40}],72:[function(require,module,exports){ +},{"./_stream_duplex":69,"./internal/streams/BufferList":74,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":80,"util":40}],72:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -14140,10 +14347,75 @@ function CorkedRequest(state) { }; } }).call(this,require('_process')) -},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":80}],74:[function(require,module,exports){ +},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":81}],74:[function(require,module,exports){ +'use strict'; + +var Buffer = require('buffer').Buffer; +/**/ +var bufferShim = require('buffer-shims'); +/**/ + +module.exports = BufferList; + +function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; +} + +BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; +}; + +BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; +}; + +BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; +}; + +BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; +}; + +BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; +}; + +BufferList.prototype.concat = function (n) { + if (this.length === 0) return bufferShim.alloc(0); + if (this.length === 1) return this.head.data; + var ret = bufferShim.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; +}; +},{"buffer":44,"buffer-shims":43}],75:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") -},{"./lib/_stream_passthrough.js":70}],75:[function(require,module,exports){ +},{"./lib/_stream_passthrough.js":70}],76:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { @@ -14163,13 +14435,13 @@ if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { } }).call(this,require('_process')) -},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],76:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],77:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") -},{"./lib/_stream_transform.js":72}],77:[function(require,module,exports){ +},{"./lib/_stream_transform.js":72}],78:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") -},{"./lib/_stream_writable.js":73}],78:[function(require,module,exports){ +},{"./lib/_stream_writable.js":73}],79:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -14298,7 +14570,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":74,"readable-stream/readable.js":75,"readable-stream/transform.js":76,"readable-stream/writable.js":77}],79:[function(require,module,exports){ +},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":75,"readable-stream/readable.js":76,"readable-stream/transform.js":77,"readable-stream/writable.js":78}],80:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -14521,7 +14793,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":44}],80:[function(require,module,exports){ +},{"buffer":44}],81:[function(require,module,exports){ (function (global){ /** @@ -14592,14 +14864,16 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],81:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ +arguments[4][51][0].apply(exports,arguments) +},{"dup":51}],83:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],82:[function(require,module,exports){ +},{}],84:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -15189,4 +15463,4 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":81,"_process":67,"inherits":51}]},{},[1]); +},{"./support/isBuffer":83,"_process":67,"inherits":82}]},{},[1]); From 9915dfbc671f7f5d3cab55acde7356d839c1170c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 00:52:49 -0700 Subject: [PATCH 0637/1771] Release v3.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5a069ba02d..4ec6546e6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "3.0.2", + "version": "3.1.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 0f0180f5224c8c115581144c5d1c655cda2a798f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 27 Sep 2016 17:45:15 -0700 Subject: [PATCH 0638/1771] remove misinformation about using --require and hooks --- index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/index.md b/index.md index b83e093784..3839636eba 100644 --- a/index.md +++ b/index.md @@ -321,8 +321,6 @@ beforeEach(function() { }); ``` -> This is typically done in Node by placing your hook(s) in a `.js` module, and using the `--require /path/to/module` option on the command-line. - ### Delayed Root Suite If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: From b99e9b3b0b71d623ffe4829fce24cddefc8cfe3a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 9 Oct 2016 17:35:30 -0700 Subject: [PATCH 0639/1771] remove errant debug in test/integration/only.spec.js --- test/integration/only.spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/integration/only.spec.js b/test/integration/only.spec.js index 61254ce1d3..364d24718f 100644 --- a/test/integration/only.spec.js +++ b/test/integration/only.spec.js @@ -31,8 +31,6 @@ describe('.only()', function() { describe('qunit', function() { it('should run only tests that marked as `only`', function(done) { run('options/only/qunit.fixture.js', ['--ui', 'qunit'], function(err, res) { - console.log(err); - assert(!err); assert.equal(res.stats.pending, 0); assert.equal(res.stats.passes, 5); From d62b2b88befa12b74e7c8eb7f4fd9fb98e5eef58 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 30 Sep 2016 14:59:56 +0200 Subject: [PATCH 0640/1771] use semistandard --- .eslintrc | 129 ---------------------------------- .eslintrc.js | 3 + bin/_mocha | 60 ++++++++-------- bin/mocha | 8 +-- browser-entry.js | 24 +++---- karma.conf.js | 12 ++-- lib/browser/debug.js | 4 +- lib/browser/events.js | 18 ++--- lib/browser/progress.js | 14 ++-- lib/browser/tty.js | 4 +- lib/context.js | 18 ++--- lib/hook.js | 4 +- lib/interfaces/bdd.js | 18 ++--- lib/interfaces/common.js | 26 +++---- lib/interfaces/exports.js | 4 +- lib/interfaces/qunit.js | 12 ++-- lib/interfaces/tdd.js | 14 ++-- lib/mocha.js | 68 +++++++++--------- lib/ms.js | 20 +++--- lib/pending.js | 2 +- lib/reporters/base.js | 100 +++++++++++++-------------- lib/reporters/doc.js | 12 ++-- lib/reporters/dot.js | 14 ++-- lib/reporters/html.js | 60 ++++++++-------- lib/reporters/json-stream.js | 12 ++-- lib/reporters/json.js | 18 ++--- lib/reporters/landing.js | 12 ++-- lib/reporters/list.js | 22 +++--- lib/reporters/markdown.js | 20 +++--- lib/reporters/min.js | 4 +- lib/reporters/nyan.js | 40 +++++------ lib/reporters/progress.js | 10 +-- lib/reporters/spec.js | 30 ++++---- lib/reporters/tap.js | 16 ++--- lib/reporters/xunit.js | 22 +++--- lib/runnable.js | 52 +++++++------- lib/runner.js | 114 +++++++++++++++--------------- lib/suite.js | 44 ++++++------ lib/test.js | 4 +- lib/utils.js | 130 +++++++++++++++++------------------ package.json | 4 ++ scripts/dedefine.js | 8 +-- test/.eslintrc | 5 -- test/.eslintrc.js | 8 +++ 44 files changed, 552 insertions(+), 671 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.js delete mode 100644 test/.eslintrc create mode 100644 test/.eslintrc.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index d5c733f79f..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,129 +0,0 @@ ---- -env: - node: true - -rules: - brace-style: [2, 1tbs] - camelcase: 2 - comma-dangle: [2, never] - comma-spacing: [2, {before: false, after: true}] - comma-style: [2, last] - computed-property-spacing: [2, never] - consistent-return: 0 - consistent-this: [1, self] - curly: [2, all] - default-case: 2 - dot-location: [2, property] - dot-notation: [2, { allowKeywords: true, allowPattern: "^long$" }] - eol-last: 2 - eqeqeq: 2 - func-style: [2, declaration] - guard-for-in: 2 # TODO: Change to error - handle-callback-err: [2, ^(err|error)$] - indent: [2, 2, { SwitchCase: 1 }] - key-spacing: [2, { beforeColon: false, afterColon: true }] - max-len: [0, 80, 2] # TODO: Change to error - max-params: [1, 4] - new-cap: 0 # TODO: Change to error - new-parens: 2 - no-alert: 2 - no-array-constructor: 0 - no-bitwise: 0 - no-caller: 2 - no-catch-shadow: 2 - no-cond-assign: [1, except-parens] # TODO: Change to error - no-console: 0 - no-constant-condition: 0 - no-control-regex: 2 - no-debugger: 1 - no-delete-var: 2 - no-dupe-args: 2 - no-dupe-keys: 2 - no-duplicate-case: 2 - no-else-return: 2 - no-empty: 2 - no-empty-character-class: 2 - no-eq-null: 0 - no-eval: 2 - no-ex-assign: 2 - no-extend-native: 2 - no-extra-bind: 2 - no-extra-boolean-cast: 2 - no-extra-semi: 2 - no-fallthrough: 2 - no-floating-decimal: 0 - no-func-assign: 2 - no-implied-eval: 2 - no-inner-declarations: [2, functions] - no-invalid-regexp: 2 - no-irregular-whitespace: 2 - no-iterator: 2 - no-labels: 2 - no-lone-blocks: 2 - no-lonely-if: 2 - no-loop-func: 2 - no-mixed-requires: [0, false] - no-mixed-spaces-and-tabs: [2, false] - no-multi-spaces: 2 - no-multi-str: 2 - no-multiple-empty-lines: [2, { max: 1 }] - no-native-reassign: 2 - no-negated-in-lhs: 2 - no-nested-ternary: 2 - no-new: 2 - no-new-func: 2 - no-new-object: 2 - no-new-require: 2 - no-new-wrappers: 2 - no-obj-calls: 2 - no-octal: 2 - no-octal-escape: 2 - no-path-concat: 2 - no-process-exit: 2 - no-proto: 1 # TODO: Change to error - no-redeclare: 2 - no-regex-spaces: 2 - no-return-assign: 2 - no-script-url: 2 - no-self-compare: 2 - no-sequences: 2 - no-shadow: 0 - no-shadow-restricted-names: 2 - no-spaced-func: 2 - no-sparse-arrays: 2 - no-trailing-spaces: 2 - no-undef: 2 - no-undef-init: 2 - no-underscore-dangle: 0 # TODO: Change to error - no-unneeded-ternary: 2 - no-unreachable: 2 - no-unused-expressions: 0 - no-unused-vars: [2, { vars: all, args: after-used }] - no-use-before-define: 0 - no-void: 2 - no-with: 2 - object-curly-spacing: [2, always] - one-var: [2, never] - operator-assignment: [2, always] - operator-linebreak: [2, before] - padded-blocks: [2, never] - quote-props: [2, as-needed] - quotes: [2, single, avoid-escape] - radix: 2 - semi: [2, always] - semi-spacing: [2, { before: false, after: true }] - space-before-blocks: [2, always] - space-before-function-paren: [2, never] - space-in-parens: [2, never] - space-infix-ops: 2 - keyword-spacing: 2 - space-unary-ops: [2, { words: true, nonwords: false }] - spaced-comment: [2, always, { exceptions: ['!'] }] - strict: [0, global] # TODO: Change to error - use-isnan: 2 - valid-jsdoc: [0, { requireReturn: false }] # TODO: Change to warning - valid-typeof: 2 - vars-on-top: 0 - wrap-iife: 2 - wrap-regex: 2 - yoda: [2, never] diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..71f9d63aa1 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + "extends": "semistandard" +}; diff --git a/bin/_mocha b/bin/_mocha index b355e28352..3b2db1729e 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -114,7 +114,7 @@ program._name = 'mocha'; program .command('init ') .description('initialize a client-side mocha setup at ') - .action(function(path) { + .action(function (path) { var mkdir = require('mkdirp'); mkdir.sync(path); var css = fs.readFileSync(join(__dirname, '..', 'mocha.css')); @@ -129,13 +129,13 @@ program // --globals -program.on('globals', function(val) { +program.on('globals', function (val) { globals = globals.concat(list(val)); }); // --reporters -program.on('reporters', function() { +program.on('reporters', function () { console.log(); console.log(' dot - dot matrix'); console.log(' doc - html documentation'); @@ -156,9 +156,9 @@ program.on('reporters', function() { // --interfaces -program.on('interfaces', function() { +program.on('interfaces', function () { console.log(''); - interfaceNames.forEach(function(interfaceName) { + interfaceNames.forEach(function (interfaceName) { console.log(' ' + interfaceName); }); console.log(''); @@ -169,7 +169,7 @@ program.on('interfaces', function() { module.paths.push(cwd, join(cwd, 'node_modules')); -program.on('require', function(mod) { +program.on('require', function (mod) { var abs = exists(mod) || exists(mod + '.js'); if (abs) { mod = resolve(mod); @@ -194,7 +194,7 @@ Error.stackTraceLimit = Infinity; // TODO: config var reporterOptions = {}; if (program.reporterOptions !== undefined) { - program.reporterOptions.split(',').forEach(function(opt) { + program.reporterOptions.split(',').forEach(function (opt) { var L = opt.split('='); if (L.length > 2 || L.length === 0) { throw new Error("invalid reporter option '" + opt + "'"); @@ -324,7 +324,7 @@ if (program.retries) { // custom compiler support var extensions = ['js']; -program.compilers.forEach(function(c) { +program.compilers.forEach(function (c) { var idx = c.indexOf(':'); var ext = c.slice(0, idx); var mod = c.slice(idx + 1); @@ -339,7 +339,7 @@ program.compilers.forEach(function(c) { // requires -requires.forEach(function(mod) { +requires.forEach(function (mod) { require(mod); }); @@ -357,7 +357,7 @@ if (!args.length) { args.push('test'); } -args.forEach(function(arg) { +args.forEach(function (arg) { var newFiles; try { newFiles = utils.lookupFiles(arg, extensions, program.recursive); @@ -380,7 +380,7 @@ if (!files.length) { // resolve -files = files.map(function(path) { +files = files.map(function (path) { return resolve(path); }); @@ -398,7 +398,7 @@ var rerun; if (program.watch) { console.log(); hideCursor(); - process.on('SIGINT', function() { + process.on('SIGINT', function () { showCursor(); console.log('\n'); process.exit(130); @@ -407,11 +407,11 @@ if (program.watch) { var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions)); var runAgain = false; - loadAndRun = function loadAndRun() { + loadAndRun = function loadAndRun () { try { mocha.files = files; runAgain = false; - runner = mocha.run(function() { + runner = mocha.run(function () { runner = null; if (runAgain) { rerun(); @@ -422,15 +422,15 @@ if (program.watch) { } }; - purge = function purge() { - watchFiles.forEach(function(file) { + purge = function purge () { + watchFiles.forEach(function (file) { delete require.cache[file]; }); }; loadAndRun(); - rerun = function rerun() { + rerun = function rerun () { purge(); stop(); if (!program.grep) { @@ -442,7 +442,7 @@ if (program.watch) { loadAndRun(); }; - utils.watch(watchFiles, function() { + utils.watch(watchFiles, function () { runAgain = true; if (runner) { runner.abort(); @@ -457,17 +457,17 @@ if (program.watch) { runner = mocha.run(program.exit ? exit : exitLater); } -function exitLater(code) { - process.on('exit', function() { +function exitLater (code) { + process.on('exit', function () { process.exit(Math.min(code, 255)); }); } -function exit(code) { +function exit (code) { // flush output for Node.js Windows pipe bug // https://github.com/joyent/node/issues/6247 is just one bug example // https://github.com/visionmedia/mocha/issues/333 has a good discussion - function done() { + function done () { if (!(draining--)) { process.exit(Math.min(code, 255)); } @@ -476,7 +476,7 @@ function exit(code) { var draining = 0; var streams = [process.stdout, process.stderr]; - streams.forEach(function(stream) { + streams.forEach(function (stream) { // submit empty write request and wait for completion draining += 1; stream.write('', done); @@ -485,7 +485,7 @@ function exit(code) { done(); } -process.on('SIGINT', function() { +process.on('SIGINT', function () { runner.abort(); // This is a hack: @@ -498,7 +498,7 @@ process.on('SIGINT', function() { * Parse list. */ -function list(str) { +function list (str) { return str.split(/ *, */); } @@ -506,7 +506,7 @@ function list(str) { * Hide the cursor. */ -function hideCursor() { +function hideCursor () { process.stdout.write('\u001b[?25l'); } @@ -514,7 +514,7 @@ function hideCursor() { * Show the cursor. */ -function showCursor() { +function showCursor () { process.stdout.write('\u001b[?25h'); } @@ -522,7 +522,7 @@ function showCursor() { * Stop play()ing. */ -function stop() { +function stop () { process.stdout.write('\u001b[2K'); clearInterval(play.timer); } @@ -531,12 +531,12 @@ function stop() { * Play the given array of strings. */ -function play(arr, interval) { +function play (arr, interval) { var len = arr.length; interval = interval || 100; var i = 0; - play.timer = setInterval(function() { + play.timer = setInterval(function () { var str = arr[i++ % len]; process.stdout.write('\u001b[0G' + str); }, interval); diff --git a/bin/mocha b/bin/mocha index 0c16f0ee94..1d5c205b06 100755 --- a/bin/mocha +++ b/bin/mocha @@ -14,7 +14,7 @@ var args = [path.join(__dirname, '_mocha')]; // Must be loaded here to handle node-specific options getOptions(); -process.argv.slice(2).forEach(function(arg) { +process.argv.slice(2).forEach(function (arg) { var flag = arg.split('=')[0]; switch (flag) { @@ -64,8 +64,8 @@ process.argv.slice(2).forEach(function(arg) { }); var proc = spawn(process.execPath, args, { stdio: 'inherit' }); -proc.on('exit', function(code, signal) { - process.on('exit', function() { +proc.on('exit', function (code, signal) { + process.on('exit', function () { if (signal) { process.kill(process.pid, signal); } else { @@ -75,7 +75,7 @@ proc.on('exit', function(code, signal) { }); // terminate children. -process.on('SIGINT', function() { +process.on('SIGINT', function () { proc.kill('SIGINT'); // calls runner.abort() proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. }); diff --git a/browser-entry.js b/browser-entry.js index 789e686ae6..5fe416daa8 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -35,12 +35,12 @@ var originalOnerrorHandler = global.onerror; * Revert to original onerror handler if previously defined. */ -process.removeListener = function(e, fn) { +process.removeListener = function (e, fn) { if (e === 'uncaughtException') { if (originalOnerrorHandler) { global.onerror = originalOnerrorHandler; } else { - global.onerror = function() {}; + global.onerror = function () {}; } var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn); if (i !== -1) { @@ -53,9 +53,9 @@ process.removeListener = function(e, fn) { * Implements uncaughtException listener. */ -process.on = function(e, fn) { +process.on = function (e, fn) { if (e === 'uncaughtException') { - global.onerror = function(err, url, line) { + global.onerror = function (err, url, line) { fn(new Error(err + ' (' + url + ':' + line + ')')); return !mocha.allowUncaught; }; @@ -71,7 +71,7 @@ mocha.suite.removeAllListeners('pre-require'); var immediateQueue = []; var immediateTimeout; -function timeslice() { +function timeslice () { var immediateStart = new Date().getTime(); while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { immediateQueue.shift()(); @@ -87,7 +87,7 @@ function timeslice() { * High-performance override of Runner.immediately. */ -Mocha.Runner.immediately = function(callback) { +Mocha.Runner.immediately = function (callback) { immediateQueue.push(callback); if (!immediateTimeout) { immediateTimeout = setTimeout(timeslice, 0); @@ -99,8 +99,8 @@ Mocha.Runner.immediately = function(callback) { * This is useful when running tests in a browser because window.onerror will * only receive the 'message' attribute of the Error. */ -mocha.throwError = function(err) { - Mocha.utils.forEach(uncaughtExceptionHandlers, function(fn) { +mocha.throwError = function (err) { + Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) { fn(err); }); throw err; @@ -111,7 +111,7 @@ mocha.throwError = function(err) { * Normally this would happen in Mocha.prototype.loadFiles. */ -mocha.ui = function(ui) { +mocha.ui = function (ui) { Mocha.prototype.ui.call(this, ui); this.suite.emit('pre-require', global, null, this); return this; @@ -121,7 +121,7 @@ mocha.ui = function(ui) { * Setup mocha with the given setting options. */ -mocha.setup = function(opts) { +mocha.setup = function (opts) { if (typeof opts === 'string') { opts = { ui: opts }; } @@ -137,7 +137,7 @@ mocha.setup = function(opts) { * Run mocha, returning the Runner. */ -mocha.run = function(fn) { +mocha.run = function (fn) { var options = mocha.options; mocha.globals('location'); @@ -152,7 +152,7 @@ mocha.run = function(fn) { mocha.invert(); } - return Mocha.prototype.run.call(mocha, function(err) { + return Mocha.prototype.run.call(mocha, function (err) { // The DOM Document is not available in Web Workers. var document = global.document; if (document && document.getElementById('mocha') && options.noHighlighting !== true) { diff --git a/karma.conf.js b/karma.conf.js index 4aa108b27d..72161a065f 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -5,7 +5,7 @@ var path = require('path'); var mkdirp = require('mkdirp'); var baseBundleDirpath = path.join(__dirname, '.karma'); -module.exports = function(config) { +module.exports = function (config) { var bundleDirpath; var cfg = { frameworks: [ @@ -31,12 +31,12 @@ module.exports = function(config) { }, browserify: { debug: true, - configure: function configure(b) { + configure: function configure (b) { b.ignore('glob') .ignore('fs') .ignore('path') .ignore('supports-color') - .on('bundled', function(err, content) { + .on('bundled', function (err, content) { if (!err && bundleDirpath) { // write bundle to directory for debugging fs.writeFileSync(path.join(bundleDirpath, @@ -70,8 +70,8 @@ module.exports = function(config) { if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis sauceConfig = { - build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER - + ' (' + env.TRAVIS_BUILD_ID + ')', + build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER + + ' (' + env.TRAVIS_BUILD_ID + ')', tunnelIdentifier: env.TRAVIS_JOB_NUMBER }; console.error('Configured SauceLabs'); @@ -124,7 +124,7 @@ module.exports = function(config) { config.set(cfg); }; -function addSauceTests(cfg) { +function addSauceTests (cfg) { cfg.reporters.push('saucelabs'); cfg.customLaunchers = { diff --git a/lib/browser/debug.js b/lib/browser/debug.js index ba232896df..a4b3b3fdff 100644 --- a/lib/browser/debug.js +++ b/lib/browser/debug.js @@ -1,4 +1,4 @@ /* eslint-disable no-unused-vars */ -module.exports = function(type) { - return function() {}; +module.exports = function (type) { + return function () {}; }; diff --git a/lib/browser/events.js b/lib/browser/events.js index b4342f6202..5e410a342f 100644 --- a/lib/browser/events.js +++ b/lib/browser/events.js @@ -16,7 +16,7 @@ var objToString = Object.prototype.toString; * @param {*} val The value to test. * @return {boolean} true if the value is an array, otherwise false. */ -function isArray(val) { +function isArray (val) { return objToString.call(val) === '[object Array]'; } @@ -25,7 +25,7 @@ function isArray(val) { * * @api public */ -function EventEmitter() {} +function EventEmitter () {} /** * Add a listener. @@ -35,7 +35,7 @@ function EventEmitter() {} * @param {Function} fn Event handler. * @return {EventEmitter} Emitter instance. */ -EventEmitter.prototype.on = function(name, fn) { +EventEmitter.prototype.on = function (name, fn) { if (!this.$events) { this.$events = {}; } @@ -61,10 +61,10 @@ EventEmitter.prototype.addListener = EventEmitter.prototype.on; * @param {Function} fn Event handler. * @return {EventEmitter} Emitter instance. */ -EventEmitter.prototype.once = function(name, fn) { +EventEmitter.prototype.once = function (name, fn) { var self = this; - function on() { + function on () { self.removeListener(name, on); fn.apply(this, arguments); } @@ -83,7 +83,7 @@ EventEmitter.prototype.once = function(name, fn) { * @param {Function} fn Event handler. * @return {EventEmitter} Emitter instance. */ -EventEmitter.prototype.removeListener = function(name, fn) { +EventEmitter.prototype.removeListener = function (name, fn) { if (this.$events && this.$events[name]) { var list = this.$events[name]; @@ -121,7 +121,7 @@ EventEmitter.prototype.removeListener = function(name, fn) { * @param {string} name Event name. * @return {EventEmitter} Emitter instance. */ -EventEmitter.prototype.removeAllListeners = function(name) { +EventEmitter.prototype.removeAllListeners = function (name) { if (name === undefined) { this.$events = {}; return this; @@ -141,7 +141,7 @@ EventEmitter.prototype.removeAllListeners = function(name) { * @param {string} name Event name. * @return {EventEmitter} Emitter instance. */ -EventEmitter.prototype.listeners = function(name) { +EventEmitter.prototype.listeners = function (name) { if (!this.$events) { this.$events = {}; } @@ -164,7 +164,7 @@ EventEmitter.prototype.listeners = function(name) { * @param {string} name Event name. * @return {boolean} true if at least one handler was invoked, else false. */ -EventEmitter.prototype.emit = function(name) { +EventEmitter.prototype.emit = function (name) { if (!this.$events) { return false; } diff --git a/lib/browser/progress.js b/lib/browser/progress.js index 3186b6ec50..e71ba440e3 100644 --- a/lib/browser/progress.js +++ b/lib/browser/progress.js @@ -7,7 +7,7 @@ module.exports = Progress; /** * Initialize a new `Progress` indicator. */ -function Progress() { +function Progress () { this.percent = 0; this.size(0); this.fontSize(11); @@ -21,7 +21,7 @@ function Progress() { * @param {number} size * @return {Progress} Progress instance. */ -Progress.prototype.size = function(size) { +Progress.prototype.size = function (size) { this._size = size; return this; }; @@ -33,7 +33,7 @@ Progress.prototype.size = function(size) { * @param {string} text * @return {Progress} Progress instance. */ -Progress.prototype.text = function(text) { +Progress.prototype.text = function (text) { this._text = text; return this; }; @@ -45,7 +45,7 @@ Progress.prototype.text = function(text) { * @param {number} size * @return {Progress} Progress instance. */ -Progress.prototype.fontSize = function(size) { +Progress.prototype.fontSize = function (size) { this._fontSize = size; return this; }; @@ -56,7 +56,7 @@ Progress.prototype.fontSize = function(size) { * @param {string} family * @return {Progress} Progress instance. */ -Progress.prototype.font = function(family) { +Progress.prototype.font = function (family) { this._font = family; return this; }; @@ -67,7 +67,7 @@ Progress.prototype.font = function(family) { * @param {number} n * @return {Progress} Progress instance. */ -Progress.prototype.update = function(n) { +Progress.prototype.update = function (n) { this.percent = n; return this; }; @@ -78,7 +78,7 @@ Progress.prototype.update = function(n) { * @param {CanvasRenderingContext2d} ctx * @return {Progress} Progress instance. */ -Progress.prototype.draw = function(ctx) { +Progress.prototype.draw = function (ctx) { try { var percent = Math.min(this.percent, 100); var size = this._size; diff --git a/lib/browser/tty.js b/lib/browser/tty.js index 840d6699ee..7825e1c91c 100644 --- a/lib/browser/tty.js +++ b/lib/browser/tty.js @@ -1,8 +1,8 @@ -exports.isatty = function isatty() { +exports.isatty = function isatty () { return true; }; -exports.getWindowSize = function getWindowSize() { +exports.getWindowSize = function getWindowSize () { if ('innerHeight' in global) { return [global.innerHeight, global.innerWidth]; } diff --git a/lib/context.js b/lib/context.js index 6d82fcadf4..c049dc5471 100644 --- a/lib/context.js +++ b/lib/context.js @@ -15,7 +15,7 @@ module.exports = Context; * * @api private */ -function Context() {} +function Context () {} /** * Set or get the context `Runnable` to `runnable`. @@ -24,7 +24,7 @@ function Context() {} * @param {Runnable} runnable * @return {Context} */ -Context.prototype.runnable = function(runnable) { +Context.prototype.runnable = function (runnable) { if (!arguments.length) { return this._runnable; } @@ -39,7 +39,7 @@ Context.prototype.runnable = function(runnable) { * @param {number} ms * @return {Context} self */ -Context.prototype.timeout = function(ms) { +Context.prototype.timeout = function (ms) { if (!arguments.length) { return this.runnable().timeout(); } @@ -54,7 +54,7 @@ Context.prototype.timeout = function(ms) { * @param {boolean} enabled * @return {Context} self */ -Context.prototype.enableTimeouts = function(enabled) { +Context.prototype.enableTimeouts = function (enabled) { this.runnable().enableTimeouts(enabled); return this; }; @@ -66,7 +66,7 @@ Context.prototype.enableTimeouts = function(enabled) { * @param {number} ms * @return {Context} self */ -Context.prototype.slow = function(ms) { +Context.prototype.slow = function (ms) { this.runnable().slow(ms); return this; }; @@ -77,7 +77,7 @@ Context.prototype.slow = function(ms) { * @api private * @return {Context} self */ -Context.prototype.skip = function() { +Context.prototype.skip = function () { this.runnable().skip(); return this; }; @@ -89,7 +89,7 @@ Context.prototype.skip = function() { * @param {number} n * @return {Context} self */ -Context.prototype.retries = function(n) { +Context.prototype.retries = function (n) { if (!arguments.length) { return this.runnable().retries(); } @@ -103,8 +103,8 @@ Context.prototype.retries = function(n) { * @api private * @return {string} */ -Context.prototype.inspect = function() { - return JSON.stringify(this, function(key, val) { +Context.prototype.inspect = function () { + return JSON.stringify(this, function (key, val) { return key === 'runnable' || key === 'test' ? undefined : val; }, 2); }; diff --git a/lib/hook.js b/lib/hook.js index 0417e013cd..54260198ac 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -18,7 +18,7 @@ module.exports = Hook; * @param {Function} fn * @api private */ -function Hook(title, fn) { +function Hook (title, fn) { Runnable.call(this, title, fn); this.type = 'hook'; } @@ -35,7 +35,7 @@ inherits(Hook, Runnable); * @return {Error} * @api public */ -Hook.prototype.error = function(err) { +Hook.prototype.error = function (err) { if (!arguments.length) { err = this._error; this._error = null; diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index 830a5fe67a..289f93797d 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -21,10 +21,10 @@ var Test = require('../test'); * * @param {Suite} suite Root suite. */ -module.exports = function(suite) { +module.exports = function (suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha) { + suite.on('pre-require', function (context, file, mocha) { var common = require('./common')(suites, context, mocha); context.before = common.before; @@ -38,7 +38,7 @@ module.exports = function(suite) { * and/or tests. */ - context.describe = context.context = function(title, fn) { + context.describe = context.context = function (title, fn) { return common.suite.create({ title: title, file: file, @@ -50,7 +50,7 @@ module.exports = function(suite) { * Pending describe. */ - context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) { + context.xdescribe = context.xcontext = context.describe.skip = function (title, fn) { return common.suite.skip({ title: title, file: file, @@ -62,7 +62,7 @@ module.exports = function(suite) { * Exclusive suite. */ - context.describe.only = function(title, fn) { + context.describe.only = function (title, fn) { return common.suite.only({ title: title, file: file, @@ -76,7 +76,7 @@ module.exports = function(suite) { * acting as a thunk. */ - context.it = context.specify = function(title, fn) { + context.it = context.specify = function (title, fn) { var suite = suites[0]; if (suite.isPending()) { fn = null; @@ -91,7 +91,7 @@ module.exports = function(suite) { * Exclusive test-case. */ - context.it.only = function(title, fn) { + context.it.only = function (title, fn) { return common.test.only(mocha, context.it(title, fn)); }; @@ -99,14 +99,14 @@ module.exports = function(suite) { * Pending test case. */ - context.xit = context.xspecify = context.it.skip = function(title) { + context.xit = context.xspecify = context.it.skip = function (title) { context.it(title); }; /** * Number of attempts to retry. */ - context.it.retries = function(n) { + context.it.retries = function (n) { context.retries(n); }; }); diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 447458487b..aec6b0d29a 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -10,7 +10,7 @@ var Suite = require('../suite'); * @param {Mocha} mocha * @return {Object} An object containing common functions. */ -module.exports = function(suites, context, mocha) { +module.exports = function (suites, context, mocha) { return { /** * This is only present if flag --delay is passed into Mocha. It triggers @@ -19,8 +19,8 @@ module.exports = function(suites, context, mocha) { * @param {Suite} suite The root wuite. * @return {Function} A function which runs the root suite */ - runWithSuite: function runWithSuite(suite) { - return function run() { + runWithSuite: function runWithSuite (suite) { + return function run () { suite.run(); }; }, @@ -31,7 +31,7 @@ module.exports = function(suites, context, mocha) { * @param {string} name * @param {Function} fn */ - before: function(name, fn) { + before: function (name, fn) { suites[0].beforeAll(name, fn); }, @@ -41,7 +41,7 @@ module.exports = function(suites, context, mocha) { * @param {string} name * @param {Function} fn */ - after: function(name, fn) { + after: function (name, fn) { suites[0].afterAll(name, fn); }, @@ -51,7 +51,7 @@ module.exports = function(suites, context, mocha) { * @param {string} name * @param {Function} fn */ - beforeEach: function(name, fn) { + beforeEach: function (name, fn) { suites[0].beforeEach(name, fn); }, @@ -61,7 +61,7 @@ module.exports = function(suites, context, mocha) { * @param {string} name * @param {Function} fn */ - afterEach: function(name, fn) { + afterEach: function (name, fn) { suites[0].afterEach(name, fn); }, @@ -73,7 +73,7 @@ module.exports = function(suites, context, mocha) { * @param {Object} opts * @returns {Suite} */ - only: function only(opts) { + only: function only (opts) { mocha.options.hasOnly = true; opts.isOnly = true; return this.create(opts); @@ -86,7 +86,7 @@ module.exports = function(suites, context, mocha) { * @param {Object} opts * @returns {Suite} */ - skip: function skip(opts) { + skip: function skip (opts) { opts.pending = true; return this.create(opts); }, @@ -101,7 +101,7 @@ module.exports = function(suites, context, mocha) { * @param {boolean} [opts.isOnly] Is Suite exclusive? * @returns {Suite} */ - create: function create(opts) { + create: function create (opts) { var suite = Suite.create(suites[0], opts.title); suite.pending = Boolean(opts.pending); suite.file = opts.file; @@ -130,7 +130,7 @@ module.exports = function(suites, context, mocha) { * @param {Function} test * @returns {*} */ - only: function(mocha, test) { + only: function (mocha, test) { test.parent._onlyTests = test.parent._onlyTests.concat(test); mocha.options.hasOnly = true; return test; @@ -141,7 +141,7 @@ module.exports = function(suites, context, mocha) { * * @param {string} title */ - skip: function(title) { + skip: function (title) { context.test(title); }, @@ -150,7 +150,7 @@ module.exports = function(suites, context, mocha) { * * @param {number} n */ - retries: function(n) { + retries: function (n) { context.retries(n); } } diff --git a/lib/interfaces/exports.js b/lib/interfaces/exports.js index 7db6e47c97..2bfa3fb4ad 100644 --- a/lib/interfaces/exports.js +++ b/lib/interfaces/exports.js @@ -22,12 +22,12 @@ var Test = require('../test'); * * @param {Suite} suite Root suite. */ -module.exports = function(suite) { +module.exports = function (suite) { var suites = [suite]; suite.on('require', visit); - function visit(obj, file) { + function visit (obj, file) { var suite; for (var key in obj) { if (typeof obj[key] === 'function') { diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index 22e8080e2e..1e567a0af6 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -29,10 +29,10 @@ var Test = require('../test'); * * @param {Suite} suite Root suite. */ -module.exports = function(suite) { +module.exports = function (suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha) { + suite.on('pre-require', function (context, file, mocha) { var common = require('./common')(suites, context, mocha); context.before = common.before; @@ -44,7 +44,7 @@ module.exports = function(suite) { * Describe a "suite" with the given `title`. */ - context.suite = function(title) { + context.suite = function (title) { if (suites.length > 1) { suites.shift(); } @@ -59,7 +59,7 @@ module.exports = function(suite) { * Exclusive Suite. */ - context.suite.only = function(title) { + context.suite.only = function (title) { if (suites.length > 1) { suites.shift(); } @@ -76,7 +76,7 @@ module.exports = function(suite) { * acting as a thunk. */ - context.test = function(title, fn) { + context.test = function (title, fn) { var test = new Test(title, fn); test.file = file; suites[0].addTest(test); @@ -87,7 +87,7 @@ module.exports = function(suite) { * Exclusive test-case. */ - context.test.only = function(title, fn) { + context.test.only = function (title, fn) { return common.test.only(mocha, context.test(title, fn)); }; diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index 445e992213..b9802f85b7 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -29,10 +29,10 @@ var Test = require('../test'); * * @param {Suite} suite Root suite. */ -module.exports = function(suite) { +module.exports = function (suite) { var suites = [suite]; - suite.on('pre-require', function(context, file, mocha) { + suite.on('pre-require', function (context, file, mocha) { var common = require('./common')(suites, context, mocha); context.setup = common.beforeEach; @@ -45,7 +45,7 @@ module.exports = function(suite) { * Describe a "suite" with the given `title` and callback `fn` containing * nested suites and/or tests. */ - context.suite = function(title, fn) { + context.suite = function (title, fn) { return common.suite.create({ title: title, file: file, @@ -56,7 +56,7 @@ module.exports = function(suite) { /** * Pending suite. */ - context.suite.skip = function(title, fn) { + context.suite.skip = function (title, fn) { return common.suite.skip({ title: title, file: file, @@ -67,7 +67,7 @@ module.exports = function(suite) { /** * Exclusive test-case. */ - context.suite.only = function(title, fn) { + context.suite.only = function (title, fn) { return common.suite.only({ title: title, file: file, @@ -79,7 +79,7 @@ module.exports = function(suite) { * Describe a specification or test-case with the given `title` and * callback `fn` acting as a thunk. */ - context.test = function(title, fn) { + context.test = function (title, fn) { var suite = suites[0]; if (suite.isPending()) { fn = null; @@ -94,7 +94,7 @@ module.exports = function(suite) { * Exclusive test-case. */ - context.test.only = function(title, fn) { + context.test.only = function (title, fn) { return common.test.only(mocha, context.test(title, fn)); }; diff --git a/lib/mocha.js b/lib/mocha.js index a649715191..b923227048 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -49,7 +49,7 @@ exports.Test = require('./test'); * @param {string} name * @return {string} */ -function image(name) { +function image (name) { return path.join(__dirname, '../images', name + '.png'); } @@ -72,7 +72,7 @@ function image(name) { * @param {Object} options * @api public */ -function Mocha(options) { +function Mocha (options) { options = options || {}; this.files = []; this.options = options; @@ -107,7 +107,7 @@ function Mocha(options) { * @api public * @param {boolean} [bail] */ -Mocha.prototype.bail = function(bail) { +Mocha.prototype.bail = function (bail) { if (!arguments.length) { bail = true; } @@ -121,7 +121,7 @@ Mocha.prototype.bail = function(bail) { * @api public * @param {string} file */ -Mocha.prototype.addFile = function(file) { +Mocha.prototype.addFile = function (file) { this.files.push(file); return this; }; @@ -135,7 +135,7 @@ Mocha.prototype.addFile = function(file) { * @param {string|Function} reporter name or constructor * @param {Object} reporterOptions optional options */ -Mocha.prototype.reporter = function(reporter, reporterOptions) { +Mocha.prototype.reporter = function (reporter, reporterOptions) { if (typeof reporter === 'function') { this._reporter = reporter; } else { @@ -156,9 +156,9 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { } } if (!_reporter && reporter === 'teamcity') { - console.warn('The Teamcity reporter was moved to a package named ' - + 'mocha-teamcity-reporter ' - + '(https://npmjs.org/package/mocha-teamcity-reporter).'); + console.warn('The Teamcity reporter was moved to a package named ' + + 'mocha-teamcity-reporter ' + + '(https://npmjs.org/package/mocha-teamcity-reporter).'); } if (!_reporter) { throw new Error('invalid reporter "' + reporter + '"'); @@ -175,7 +175,7 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { * @api public * @param {string} bdd */ -Mocha.prototype.ui = function(name) { +Mocha.prototype.ui = function (name) { name = name || 'bdd'; this._ui = exports.interfaces[name]; if (!this._ui) { @@ -187,7 +187,7 @@ Mocha.prototype.ui = function(name) { } this._ui = this._ui(this.suite); - this.suite.on('pre-require', function(context) { + this.suite.on('pre-require', function (context) { exports.afterEach = context.afterEach || context.teardown; exports.after = context.after || context.suiteTeardown; exports.beforeEach = context.beforeEach || context.setup; @@ -211,10 +211,10 @@ Mocha.prototype.ui = function(name) { * * @api private */ -Mocha.prototype.loadFiles = function(fn) { +Mocha.prototype.loadFiles = function (fn) { var self = this; var suite = this.suite; - this.files.forEach(function(file) { + this.files.forEach(function (file) { file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); @@ -228,10 +228,10 @@ Mocha.prototype.loadFiles = function(fn) { * * @api private */ -Mocha.prototype._growl = function(runner, reporter) { +Mocha.prototype._growl = function (runner, reporter) { var notify = require('growl'); - runner.on('end', function() { + runner.on('end', function () { var stats = reporter.stats; if (stats.failures) { var msg = stats.failures + ' of ' + runner.total + ' tests failed'; @@ -253,7 +253,7 @@ Mocha.prototype._growl = function(runner, reporter) { * @param str * @returns {Mocha} */ -Mocha.prototype.fgrep = function(str) { +Mocha.prototype.fgrep = function (str) { return this.grep(new RegExp(escapeRe(str))); }; @@ -266,7 +266,7 @@ Mocha.prototype.fgrep = function(str) { * @param {RegExp|string} re * @return {Mocha} */ -Mocha.prototype.grep = function(re) { +Mocha.prototype.grep = function (re) { if (utils.isString(re)) { // extract args if it's regex-like, i.e: [string, pattern, flag] var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); @@ -282,7 +282,7 @@ Mocha.prototype.grep = function(re) { * @return {Mocha} * @api public */ -Mocha.prototype.invert = function() { +Mocha.prototype.invert = function () { this.options.invert = true; return this; }; @@ -296,7 +296,7 @@ Mocha.prototype.invert = function() { * @param {boolean} ignore * @return {Mocha} */ -Mocha.prototype.ignoreLeaks = function(ignore) { +Mocha.prototype.ignoreLeaks = function (ignore) { this.options.ignoreLeaks = Boolean(ignore); return this; }; @@ -307,7 +307,7 @@ Mocha.prototype.ignoreLeaks = function(ignore) { * @return {Mocha} * @api public */ -Mocha.prototype.checkLeaks = function() { +Mocha.prototype.checkLeaks = function () { this.options.ignoreLeaks = false; return this; }; @@ -318,7 +318,7 @@ Mocha.prototype.checkLeaks = function() { * @return {Mocha} * @api public */ -Mocha.prototype.fullTrace = function() { +Mocha.prototype.fullTrace = function () { this.options.fullStackTrace = true; return this; }; @@ -329,7 +329,7 @@ Mocha.prototype.fullTrace = function() { * @return {Mocha} * @api public */ -Mocha.prototype.growl = function() { +Mocha.prototype.growl = function () { this.options.growl = true; return this; }; @@ -343,7 +343,7 @@ Mocha.prototype.growl = function() { * @param {Array|string} globals * @return {Mocha} */ -Mocha.prototype.globals = function(globals) { +Mocha.prototype.globals = function (globals) { this.options.globals = (this.options.globals || []).concat(globals); return this; }; @@ -357,7 +357,7 @@ Mocha.prototype.globals = function(globals) { * @param {boolean} colors * @return {Mocha} */ -Mocha.prototype.useColors = function(colors) { +Mocha.prototype.useColors = function (colors) { if (colors !== undefined) { this.options.useColors = colors; } @@ -373,7 +373,7 @@ Mocha.prototype.useColors = function(colors) { * @param {boolean} inlineDiffs * @return {Mocha} */ -Mocha.prototype.useInlineDiffs = function(inlineDiffs) { +Mocha.prototype.useInlineDiffs = function (inlineDiffs) { this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; @@ -387,7 +387,7 @@ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { * @param {number} timeout * @return {Mocha} */ -Mocha.prototype.timeout = function(timeout) { +Mocha.prototype.timeout = function (timeout) { this.suite.timeout(timeout); return this; }; @@ -399,7 +399,7 @@ Mocha.prototype.timeout = function(timeout) { * @return {Mocha} * @api public */ -Mocha.prototype.retries = function(n) { +Mocha.prototype.retries = function (n) { this.suite.retries(n); return this; }; @@ -413,7 +413,7 @@ Mocha.prototype.retries = function(n) { * @param {number} slow * @return {Mocha} */ -Mocha.prototype.slow = function(slow) { +Mocha.prototype.slow = function (slow) { this.suite.slow(slow); return this; }; @@ -427,7 +427,7 @@ Mocha.prototype.slow = function(slow) { * @param {boolean} enabled * @return {Mocha} */ -Mocha.prototype.enableTimeouts = function(enabled) { +Mocha.prototype.enableTimeouts = function (enabled) { this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true); return this; }; @@ -438,7 +438,7 @@ Mocha.prototype.enableTimeouts = function(enabled) { * @return {Mocha} * @api public */ -Mocha.prototype.asyncOnly = function() { +Mocha.prototype.asyncOnly = function () { this.options.asyncOnly = true; return this; }; @@ -448,7 +448,7 @@ Mocha.prototype.asyncOnly = function() { * * @api public */ -Mocha.prototype.noHighlighting = function() { +Mocha.prototype.noHighlighting = function () { this.options.noHighlighting = true; return this; }; @@ -459,7 +459,7 @@ Mocha.prototype.noHighlighting = function() { * @return {Mocha} * @api public */ -Mocha.prototype.allowUncaught = function() { +Mocha.prototype.allowUncaught = function () { this.options.allowUncaught = true; return this; }; @@ -468,7 +468,7 @@ Mocha.prototype.allowUncaught = function() { * Delay root suite execution. * @returns {Mocha} */ -Mocha.prototype.delay = function delay() { +Mocha.prototype.delay = function delay () { this.options.delay = true; return this; }; @@ -480,7 +480,7 @@ Mocha.prototype.delay = function delay() { * @param {Function} fn * @return {Runner} */ -Mocha.prototype.run = function(fn) { +Mocha.prototype.run = function (fn) { if (this.files.length) { this.loadFiles(); } @@ -508,7 +508,7 @@ Mocha.prototype.run = function(fn) { } exports.reporters.Base.inlineDiffs = options.useInlineDiffs; - function done(failures) { + function done (failures) { if (reporter.done) { reporter.done(failures, fn); } else { diff --git a/lib/ms.js b/lib/ms.js index 12fddc18ae..fed85f8c14 100644 --- a/lib/ms.js +++ b/lib/ms.js @@ -20,7 +20,7 @@ var y = d * 365.25; * @param {Object} options * @return {string|number} */ -module.exports = function(val, options) { +module.exports = function (val, options) { options = options || {}; if (typeof val === 'string') { return parse(val); @@ -36,7 +36,7 @@ module.exports = function(val, options) { * @param {string} str * @return {number} */ -function parse(str) { +function parse (str) { var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str); if (!match) { return; @@ -78,7 +78,7 @@ function parse(str) { * @param {number} ms * @return {string} */ -function shortFormat(ms) { +function shortFormat (ms) { if (ms >= d) { return Math.round(ms / d) + 'd'; } @@ -101,12 +101,12 @@ function shortFormat(ms) { * @param {number} ms * @return {string} */ -function longFormat(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; +function longFormat (ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; } /** @@ -117,7 +117,7 @@ function longFormat(ms) { * @param {number} n * @param {string} name */ -function plural(ms, n, name) { +function plural (ms, n, name) { if (ms < n) { return; } diff --git a/lib/pending.js b/lib/pending.js index c847e04e3f..47be376928 100644 --- a/lib/pending.js +++ b/lib/pending.js @@ -10,6 +10,6 @@ module.exports = Pending; * * @param {string} message */ -function Pending(message) { +function Pending (message) { this.message = message; } diff --git a/lib/reporters/base.js b/lib/reporters/base.js index c754c5231f..df201ef69a 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -101,7 +101,7 @@ if (process.platform === 'win32') { * @return {string} * @api private */ -var color = exports.color = function(type, str) { +var color = exports.color = function (type, str) { if (!exports.useColors) { return String(str); } @@ -127,23 +127,23 @@ if (isatty) { */ exports.cursor = { - hide: function() { + hide: function () { isatty && process.stdout.write('\u001b[?25l'); }, - show: function() { + show: function () { isatty && process.stdout.write('\u001b[?25h'); }, - deleteLine: function() { + deleteLine: function () { isatty && process.stdout.write('\u001b[2K'); }, - beginningOfLine: function() { + beginningOfLine: function () { isatty && process.stdout.write('\u001b[0G'); }, - CR: function() { + CR: function () { if (isatty) { exports.cursor.deleteLine(); exports.cursor.beginningOfLine(); @@ -160,13 +160,13 @@ exports.cursor = { * @api public */ -exports.list = function(failures) { +exports.list = function (failures) { console.log(); - failures.forEach(function(test, i) { + failures.forEach(function (test, i) { // format - var fmt = color('error title', ' %s) %s:\n') - + color('error message', ' %s') - + color('error stack', '\n%s\n'); + var fmt = color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); // msg var msg; @@ -236,7 +236,7 @@ exports.list = function(failures) { * @api public */ -function Base(runner) { +function Base (runner) { var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; var failures = this.failures = []; @@ -247,21 +247,21 @@ function Base(runner) { runner.stats = stats; - runner.on('start', function() { + runner.on('start', function () { stats.start = new Date(); }); - runner.on('suite', function(suite) { + runner.on('suite', function (suite) { stats.suites = stats.suites || 0; suite.root || stats.suites++; }); - runner.on('test end', function() { + runner.on('test end', function () { stats.tests = stats.tests || 0; stats.tests++; }); - runner.on('pass', function(test) { + runner.on('pass', function (test) { stats.passes = stats.passes || 0; if (test.duration > test.slow()) { @@ -275,19 +275,19 @@ function Base(runner) { stats.passes++; }); - runner.on('fail', function(test, err) { + runner.on('fail', function (test, err) { stats.failures = stats.failures || 0; stats.failures++; test.err = err; failures.push(test); }); - runner.on('end', function() { + runner.on('end', function () { stats.end = new Date(); stats.duration = new Date() - stats.start; }); - runner.on('pending', function() { + runner.on('pending', function () { stats.pending++; }); } @@ -298,16 +298,16 @@ function Base(runner) { * * @api public */ -Base.prototype.epilogue = function() { +Base.prototype.epilogue = function () { var stats = this.stats; var fmt; console.log(); // passes - fmt = color('bright pass', ' ') - + color('green', ' %d passing') - + color('light', ' (%s)'); + fmt = color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); console.log(fmt, stats.passes || 0, @@ -315,8 +315,8 @@ Base.prototype.epilogue = function() { // pending if (stats.pending) { - fmt = color('pending', ' ') - + color('pending', ' %d pending'); + fmt = color('pending', ' ') + + color('pending', ' %d pending'); console.log(fmt, stats.pending); } @@ -342,7 +342,7 @@ Base.prototype.epilogue = function() { * @param {string} len * @return {string} */ -function pad(str, len) { +function pad (str, len) { str = String(str); return Array(len - str.length + 1).join(' ') + str; } @@ -355,26 +355,26 @@ function pad(str, len) { * @param {boolean} escape * @return {string} Diff */ -function inlineDiff(err, escape) { +function inlineDiff (err, escape) { var msg = errorDiff(err, 'WordsWithSpace', escape); // linenos var lines = msg.split('\n'); if (lines.length > 4) { var width = String(lines.length).length; - msg = lines.map(function(str, i) { + msg = lines.map(function (str, i) { return pad(++i, width) + ' |' + ' ' + str; }).join('\n'); } // legend - msg = '\n' - + color('diff removed', 'actual') - + ' ' - + color('diff added', 'expected') - + '\n\n' - + msg - + '\n'; + msg = '\n' + + color('diff removed', 'actual') + + ' ' + + color('diff added', 'expected') + + '\n\n' + + msg + + '\n'; // indent msg = msg.replace(/^/gm, ' '); @@ -389,9 +389,9 @@ function inlineDiff(err, escape) { * @param {boolean} escape * @return {string} The diff. */ -function unifiedDiff(err, escape) { +function unifiedDiff (err, escape) { var indent = ' '; - function cleanUp(line) { + function cleanUp (line) { if (escape) { line = escapeInvisibles(line); } @@ -401,7 +401,7 @@ function unifiedDiff(err, escape) { if (line[0] === '-') { return indent + colorLines('diff removed', line); } - if (line.match(/\@\@/)) { + if (line.match(/@@/)) { return null; } if (line.match(/\\ No newline/)) { @@ -409,16 +409,16 @@ function unifiedDiff(err, escape) { } return indent + line; } - function notBlank(line) { + function notBlank (line) { return typeof line !== 'undefined' && line !== null; } var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); - return '\n ' - + colorLines('diff added', '+ expected') + ' ' - + colorLines('diff removed', '- actual') - + '\n\n' - + lines.map(cleanUp).filter(notBlank).join('\n'); + return '\n ' + + colorLines('diff added', '+ expected') + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n'); } /** @@ -430,10 +430,10 @@ function unifiedDiff(err, escape) { * @param {boolean} escape * @return {string} */ -function errorDiff(err, type, escape) { +function errorDiff (err, type, escape) { var actual = escape ? escapeInvisibles(err.actual) : err.actual; var expected = escape ? escapeInvisibles(err.expected) : err.expected; - return diff['diff' + type](actual, expected).map(function(str) { + return diff['diff' + type](actual, expected).map(function (str) { if (str.added) { return colorLines('diff added', str.value); } @@ -451,7 +451,7 @@ function errorDiff(err, type, escape) { * @param {string} line * @return {string} */ -function escapeInvisibles(line) { +function escapeInvisibles (line) { return line.replace(/\t/g, '') .replace(/\r/g, '') .replace(/\n/g, '\n'); @@ -465,8 +465,8 @@ function escapeInvisibles(line) { * @param {string} str * @return {string} */ -function colorLines(name, str) { - return str.split('\n').map(function(str) { +function colorLines (name, str) { + return str.split('\n').map(function (str) { return color(name, str); }).join('\n'); } @@ -484,6 +484,6 @@ var objToString = Object.prototype.toString; * @param {Object} b * @return {boolean} */ -function sameType(a, b) { +function sameType (a, b) { return objToString.call(a) === objToString.call(b); } diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js index 9f5c3f8a37..506ce6d68d 100644 --- a/lib/reporters/doc.js +++ b/lib/reporters/doc.js @@ -17,16 +17,16 @@ exports = module.exports = Doc; * @param {Runner} runner * @api public */ -function Doc(runner) { +function Doc (runner) { Base.call(this, runner); var indents = 2; - function indent() { + function indent () { return Array(indents).join(' '); } - runner.on('suite', function(suite) { + runner.on('suite', function (suite) { if (suite.root) { return; } @@ -37,7 +37,7 @@ function Doc(runner) { console.log('%s
              ', indent()); }); - runner.on('suite end', function(suite) { + runner.on('suite end', function (suite) { if (suite.root) { return; } @@ -47,13 +47,13 @@ function Doc(runner) { --indents; }); - runner.on('pass', function(test) { + runner.on('pass', function (test) { console.log('%s
              %s
              ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.body)); console.log('%s
              %s
              ', indent(), code); }); - runner.on('fail', function(test, err) { + runner.on('fail', function (test, err) { console.log('%s
              %s
              ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.body)); console.log('%s
              %s
              ', indent(), code); diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index f8b4b41fe0..e2a359ce86 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -18,25 +18,25 @@ exports = module.exports = Dot; * @api public * @param {Runner} runner */ -function Dot(runner) { +function Dot (runner) { Base.call(this, runner); var self = this; - var width = Base.window.width * .75 | 0; + var width = Base.window.width * 0.75 | 0; var n = -1; - runner.on('start', function() { + runner.on('start', function () { process.stdout.write('\n'); }); - runner.on('pending', function() { + runner.on('pending', function () { if (++n % width === 0) { process.stdout.write('\n '); } process.stdout.write(color('pending', Base.symbols.comma)); }); - runner.on('pass', function(test) { + runner.on('pass', function (test) { if (++n % width === 0) { process.stdout.write('\n '); } @@ -47,14 +47,14 @@ function Dot(runner) { } }); - runner.on('fail', function() { + runner.on('fail', function () { if (++n % width === 0) { process.stdout.write('\n '); } process.stdout.write(color('fail', Base.symbols.bang)); }); - runner.on('end', function() { + runner.on('end', function () { console.log(); self.epilogue(); }); diff --git a/lib/reporters/html.js b/lib/reporters/html.js index 51ba1ca722..bf46b5e18b 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -32,12 +32,12 @@ exports = module.exports = HTML; * Stats template. */ -var statsTemplate = '
              '; +var statsTemplate = ''; /** * Initialize a new `HTML` reporter. @@ -45,7 +45,7 @@ var statsTemplate = '
              {{ content }}
              -

              Mocha

              +

              simple, flexible, fun

              diff --git a/docs/css/style.css b/docs/css/style.css index c1632e84e8..5cd4d70a1b 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -3,8 +3,8 @@ html { } body { - color: #2c2c2c; border-top: 2px solid #ddd; + color: #2c2c2c; } @keyframes fadein { @@ -29,8 +29,8 @@ body { header, #content { - max-width: 920px; margin: 0 auto; + max-width: 920px; padding-left: 30px; padding-right: 30px; } @@ -39,27 +39,31 @@ header { padding-top: 20px; } +#mocha-logo { + height: 192px; + width: 192px; +} + #content { padding-bottom: 60px; } #_header h1 { + animation: fadein 1s forwards; margin-top: 0; margin-left: -19px; opacity: 0; - animation: fadein 1s forwards; } #tag { + animation: fadein 1s forwards, slideright 1s forwards; color: #c29d7f; - font-weight: 100; font-size: 30px; + font-weight: 100; + letter-spacing: 2px; margin-top: -158px; margin-left: 185px; margin-bottom: 125px; - letter-spacing: 2px; - - animation: fadein 1s forwards, slideright 1s forwards; } #tag em { @@ -94,29 +98,29 @@ nav.badges a + a { } #_backers a img { - width: 64px; background: url(/images/backer-background.svg?inline) center center no-repeat; + width: 64px; } h2 { - margin-top: 80px; + border-bottom: 1px solid #ddd; font-weight: 400; letter-spacing: 1px; - border-bottom: 1px solid #ddd; + margin-top: 80px; text-transform: uppercase; } h3 { + border-bottom: 1px solid #eee; font-weight: 200; letter-spacing: 1px; - border-bottom: 1px solid #eee; margin-top: 40px; text-transform: uppercase; } h3 > code { - text-transform: none; font-size: 14px; + text-transform: none; } #content > p:first-child { @@ -134,14 +138,14 @@ a:hover { } a.direct-link { + background: url(../images/link-icon.svg) center center no-repeat; + background-size: auto 60%; + opacity: 0; position: absolute; - transform: translateX(-100%); text-decoration: none; text-indent: -60px; + transform: translateX(-100%); width: 30px; - background: url(../images/link-icon.svg) center center no-repeat; - background-size: auto 60%; - opacity: 0; } :hover > a.direct-link { @@ -149,19 +153,19 @@ a.direct-link { } ul { + box-sizing: content-box; + column-count: 2; + column-gap: 30px; margin-top: 20px; padding: 0 15px; - column-gap: 30px; - column-count: 2; - box-sizing: content-box; } ul li { - margin-top: 5px; - list-style: none; border-bottom: 1px solid #eee; - padding: 5px 0; break-inside: avoid; + list-style: none; + margin-top: 5px; + padding: 5px 0; } code { @@ -170,36 +174,54 @@ code { } pre { - margin: 20px 0; - padding: 20px; + background-color: #f3f3f3; border: 1px solid #ddd; border-bottom-color: #ccc; - background-color: #f3f3f3; border-radius: 3px; box-shadow: inset 0 0 10px #ddd; + margin: 20px 0; overflow-x: auto; + padding: 20px; } img.screenshot { - display: block; - margin: 30px auto; border-radius: 3px; box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; + display: block; + margin: 30px auto; max-width: 100%; } footer { background-color: #eee; + border-top: 1px solid #ddd; padding: 50px 0; text-align: right; - border-top: 1px solid #ddd; } -footer span { - display: block; - margin-right: 30px; +footer div { color: #888; font-size: 0.8em; + margin-right: 30px; +} + +.last-modified { + font-style: italic; +} + +.dl-inline dt, +.dl-inline dd { + display: inline; + margin: 0; +} + +.dl-inline dt:after { + content: ': '; +} + +.dl-inline dd + dt:before { + content: ''; + display: block; } @media all and (max-width: 600px) { @@ -214,12 +236,12 @@ footer span { } pre { - padding: 10px; margin: 20px -11px; + padding: 10px; } } blockquote { - padding: 10px; border-left: 1px solid #eee; + padding: 10px; } From a0c03e353afda87580e814b519d9b8011f281d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20I=2E=20Silva?= Date: Wed, 6 Mar 2019 02:13:54 -0800 Subject: [PATCH 1298/1771] set allowUncaught on hooks (#3669); closes #2302 * set allowUncaught on hooks * add test: hooks swallow uncaught exceptions * PR feedback --- lib/runner.js | 2 ++ test/unit/runner.spec.js | 73 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 541506e1d0..a8f8ab882b 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -371,6 +371,8 @@ Runner.prototype.hook = function(name, fn) { hook.ctx.currentTest = self.test; } + hook.allowUncaught = self.allowUncaught; + self.emit(constants.EVENT_HOOK_BEGIN, hook); if (!hook.listeners('error').length) { diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index d524ea9ba2..ec2b8a0f34 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -9,6 +9,7 @@ var Test = Mocha.Test; var Runnable = Mocha.Runnable; var Hook = Mocha.Hook; var noop = Mocha.utils.noop; +var EVENT_HOOK_BEGIN = Runner.constants.EVENT_HOOK_BEGIN; var EVENT_TEST_FAIL = Runner.constants.EVENT_TEST_FAIL; var EVENT_TEST_RETRY = Runner.constants.EVENT_TEST_RETRY; var EVENT_RUN_END = Runner.constants.EVENT_RUN_END; @@ -443,7 +444,7 @@ describe('Runner', function() { }); describe('allowUncaught', function() { - it('should allow unhandled errors to propagate through', function(done) { + it('should allow unhandled errors to propagate through', function() { var newRunner = new Runner(suite); newRunner.allowUncaught = true; newRunner.test = new Test('failing test', function() { @@ -453,7 +454,75 @@ describe('Runner', function() { newRunner.runTest(); } expect(fail, 'to throw', 'allow unhandled errors'); - done(); + }); + + it('should not allow unhandled errors in sync hooks to propagate through', function(done) { + suite.beforeEach(function() { + throw new Error(); + }); + var runner = new Runner(suite); + runner.allowUncaught = false; + + // We are monkey patching here with runner.once and a hook.run wrapper to effectively + // capture thrown errors within the event loop phase where Runner.immediately executes + runner.once(EVENT_HOOK_BEGIN, function(hook) { + var _run = hook.run; + hook.run = function(fn) { + function throwError() { + _run.call(hook, fn); + } + expect(throwError, 'not to throw'); + done(); + }; + }); + + runner.hook('beforeEach', noop); + }); + + it('should allow unhandled errors in sync hooks to propagate through', function(done) { + suite.beforeEach(function() { + throw new Error('allow unhandled errors in sync hooks'); + }); + var runner = new Runner(suite); + runner.allowUncaught = true; + + runner.once(EVENT_HOOK_BEGIN, function(hook) { + var _run = hook.run; + hook.run = function(fn) { + function throwError() { + _run.call(hook, fn); + } + var expected = 'allow unhandled errors in sync hooks'; + expect(throwError, 'to throw', expected); + done(); + }; + }); + + runner.hook('beforeEach', noop); + }); + + it('async - should allow unhandled errors in hooks to propagate through', function(done) { + // the `done` argument, although unused, it triggers the async path + // see this.async in the Runnable constructor + suite.beforeEach(function(done) { + throw new Error('allow unhandled errors in async hooks'); + }); + var runner = new Runner(suite); + runner.allowUncaught = true; + + runner.once(EVENT_HOOK_BEGIN, function(hook) { + var _run = hook.run; + hook.run = function(fn) { + function throwError() { + _run.call(hook, fn); + } + var expected = 'allow unhandled errors in async hooks'; + expect(throwError, 'to throw', expected); + done(); + }; + }); + + runner.hook('beforeEach', noop); }); }); From b27bc60224552b74852161405d15765b9fb59ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Wed, 6 Mar 2019 01:19:24 +0100 Subject: [PATCH 1299/1771] Add autoprefixer to documentation page CSS --- docs/.browserslistrc | 4 + package-lock.json | 265 +++++++++++++++++++++++++------------------ package.json | 1 + 3 files changed, 162 insertions(+), 108 deletions(-) create mode 100644 docs/.browserslistrc diff --git a/docs/.browserslistrc b/docs/.browserslistrc new file mode 100644 index 0000000000..5be642c293 --- /dev/null +++ b/docs/.browserslistrc @@ -0,0 +1,4 @@ +## Browsers support for autoprefixing CSS for the website +last 2 major versions +not dead +Firefox ESR diff --git a/package-lock.json b/package-lock.json index 6697b1aab0..0784b68716 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -1192,6 +1192,20 @@ "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, + "autoprefixer": { + "version": "9.4.10", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.10.tgz", + "integrity": "sha512-XR8XZ09tUrrSzgSlys4+hy5r2/z4Jp7Ag3pHm31U4g/CTccYPOVe19AkaJ4ey/vRd1sfj+5TtuD6I0PXtutjvQ==", + "dev": true, + "requires": { + "browserslist": "^4.4.2", + "caniuse-lite": "^1.0.30000940", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.14", + "postcss-value-parser": "^3.3.1" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1640,7 +1654,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -1840,7 +1854,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" }, "browser-sync": { "version": "2.26.3", @@ -2038,7 +2052,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -2079,7 +2093,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2101,7 +2115,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -2573,9 +2587,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000940", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000940.tgz", - "integrity": "sha512-rp/086IBUfCsNgBpko6DGQv674jRjeXPesDatDB2kxrkmDfD+S5Gesw+uT8YjpRWvLKLMRBy72SLRZ8I0EgQFw==", + "version": "1.0.30000941", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz", + "integrity": "sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA==", "dev": true }, "canvas": { @@ -2589,39 +2603,6 @@ "node-pre-gyp": "^0.11.0" } }, - "canvas-prebuilt": { - "version": "2.0.0-alpha.14", - "resolved": "https://registry.npmjs.org/canvas-prebuilt/-/canvas-prebuilt-2.0.0-alpha.14.tgz", - "integrity": "sha512-b4QydUnFNxpgctSbHnJWsCDaqtq2AMYa9/B7q4+cGnBrEtMIcLcXpKltT/iSB39AHOTDIprYeHuvyy3h2k1ltg==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.3", - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "node-pre-gyp": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - } - } - }, "capitalize": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-2.0.0.tgz", @@ -2802,7 +2783,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4266,7 +4247,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" }, "diffie-hellman": { "version": "5.0.3", @@ -4964,7 +4945,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -4991,7 +4972,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5036,7 +5017,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5330,7 +5311,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6026,13 +6007,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -6302,7 +6283,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -6323,12 +6305,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6343,17 +6327,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6470,7 +6457,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6482,6 +6470,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6496,6 +6485,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6503,12 +6493,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6527,6 +6519,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6607,7 +6600,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6619,6 +6613,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6704,7 +6699,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6740,6 +6736,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6759,6 +6756,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6802,19 +6800,21 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -8054,13 +8054,13 @@ "dev": true }, "histogram": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/histogram/-/histogram-3.0.1.tgz", - "integrity": "sha512-TZ0r/lxWfi0a9Vouh9DceSUy4mE8YnuOIvrv66QrhwuUFXtLUN++vs/A5h0UdfvQLrzpvdVMz7SnM4qhRcj66A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/histogram/-/histogram-3.0.3.tgz", + "integrity": "sha512-KXpWZm99kwSoY5ocS4tx5FVLsbOJFZIiyr1rXruNERxeznCwZY1JC7fPRKEyZ+HSwMaqwThMWYp2iM2WoEfsDw==", "dev": true, "optional": true, "requires": { - "canvas-prebuilt": "2.0.0-alpha.14" + "canvas": "^2.3.1" } }, "hmac-drbg": { @@ -8932,7 +8932,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { "isobject": "^3.0.1" } @@ -9960,7 +9960,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -10087,7 +10087,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -10128,7 +10128,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10149,7 +10149,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10687,7 +10687,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -10770,7 +10770,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -11108,7 +11108,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11217,7 +11217,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "^2.0.4" } @@ -11672,6 +11672,12 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", @@ -12045,6 +12051,12 @@ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", "dev": true }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -12111,7 +12123,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -12152,7 +12164,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -13359,7 +13371,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -15462,13 +15474,15 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "dev": true, + "optional": true }, "archive-type": { "version": "3.2.0", @@ -15549,6 +15563,7 @@ "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", "dev": true, + "optional": true, "requires": { "get-proxy": "^1.0.1", "is-obj": "^1.0.0", @@ -15560,7 +15575,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true + "dev": true, + "optional": true } } }, @@ -15569,6 +15585,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, + "optional": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -15581,7 +15598,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true + "dev": true, + "optional": true }, "decompress": { "version": "3.0.0", @@ -15733,6 +15751,7 @@ "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", "dev": true, + "optional": true, "requires": { "caw": "^1.0.1", "concat-stream": "^1.4.7", @@ -15755,25 +15774,29 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "dev": true, + "optional": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "dev": true, + "optional": true }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15789,6 +15812,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -15798,6 +15822,7 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, + "optional": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -15827,13 +15852,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true + "dev": true, + "optional": true }, "filenamify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", "dev": true, + "optional": true, "requires": { "filename-reserved-regex": "^1.0.0", "strip-outer": "^1.0.0", @@ -15858,6 +15885,7 @@ "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", "dev": true, + "optional": true, "requires": { "rc": "^1.1.2" } @@ -15867,6 +15895,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "dev": true, + "optional": true, "requires": { "create-error-class": "^3.0.1", "duplexer2": "^0.1.4", @@ -15889,19 +15918,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "dev": true, + "optional": true }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15917,6 +15949,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -15928,6 +15961,7 @@ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", "dev": true, + "optional": true, "requires": { "is-relative": "^0.1.0" } @@ -15936,31 +15970,36 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true + "dev": true, + "optional": true }, "is-relative": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true + "dev": true, + "optional": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "dev": true, + "optional": true }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true + "dev": true, + "optional": true }, "os-filter-obj": { "version": "1.0.3", @@ -15974,6 +16013,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -15999,13 +16039,15 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "dev": true, + "optional": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -16015,6 +16057,7 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", "dev": true, + "optional": true, "requires": { "chalk": "^1.0.0", "get-stdin": "^4.0.1", @@ -16028,7 +16071,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "dev": true, + "optional": true }, "tempfile": { "version": "1.1.1", @@ -16046,6 +16090,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, + "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -16055,19 +16100,22 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true + "dev": true, + "optional": true }, "tunnel-agent": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true + "dev": true, + "optional": true }, "unzip-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true + "dev": true, + "optional": true }, "uuid": { "version": "2.0.3", @@ -16081,6 +16129,7 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, + "optional": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" @@ -16117,7 +16166,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -16713,7 +16762,7 @@ }, "pretty-ms": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -16926,7 +16975,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -17162,9 +17211,9 @@ } }, "react-is": { - "version": "16.8.3", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.3.tgz", - "integrity": "sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA==", + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", "dev": true }, "read-all-stream": { @@ -17898,7 +17947,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -19866,7 +19915,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -19915,7 +19964,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -21138,7 +21187,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" diff --git a/package.json b/package.json index b5751b45ae..2b887bfa2d 100644 --- a/package.json +++ b/package.json @@ -521,6 +521,7 @@ "@mocha/contributors": "^1.0.3", "@mocha/docdash": "^2.1.0", "assetgraph-builder": "^6.9.0", + "autoprefixer": "^9.4.10", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", From e6542538aa10c6137babf96d9ddc851fc6595ad3 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Mar 2019 10:14:35 -0800 Subject: [PATCH 1300/1771] update yargs; closes #3742 --- lib/cli/cli.js | 3 +- lib/cli/options.js | 14 ++- package-lock.json | 272 ++++++++++++++++++++++++++++----------------- package.json | 7 +- 4 files changed, 186 insertions(+), 110 deletions(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index dfa3d10da8..c17d68a99d 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -13,7 +13,7 @@ const debug = require('debug')('mocha:cli:cli'); const symbols = require('log-symbols'); const yargs = require('yargs'); const path = require('path'); -const {loadOptions} = require('./options'); +const {loadOptions, YARGS_PARSER_CONFIG} = require('./options'); const commands = require('./commands'); const ansi = require('ansi-colors'); const {repository, homepage, version, gitter} = require('../../package.json'); @@ -59,6 +59,7 @@ exports.main = (argv = process.argv.slice(2)) => { Docs: ${ansi.yellow(homepage)} ` ) + .parserConfiguration(YARGS_PARSER_CONFIG) .parse(argv, loadOptions(argv)); }; diff --git a/lib/cli/options.js b/lib/cli/options.js index 95971fb75a..5ec8ff0ebf 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -11,7 +11,6 @@ const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); const mocharc = require('../mocharc.json'); -const yargsParserConfig = require('../../package.json').yargs; const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findup = require('findup-sync'); @@ -32,6 +31,16 @@ const {isNodeFlag} = require('./node-flags'); * @interface Arguments */ +/** + * Base yargs parser configuration + * @private + */ +const YARGS_PARSER_CONFIG = { + 'combine-arrays': true, + 'short-option-groups': false, + 'dot-notation': false +}; + /** * This is the config pulled from the `yargs` property of Mocha's * `package.json`, but it also disables camel case expansion as to @@ -40,7 +49,7 @@ const {isNodeFlag} = require('./node-flags'); * @private * @ignore */ -const configuration = Object.assign({}, yargsParserConfig, { +const configuration = Object.assign({}, YARGS_PARSER_CONFIG, { 'camel-case-expansion': false }); @@ -335,3 +344,4 @@ const loadOptions = (argv = []) => { }; module.exports.loadOptions = loadOptions; +module.exports.YARGS_PARSER_CONFIG = YARGS_PARSER_CONFIG; diff --git a/package-lock.json b/package-lock.json index 0784b68716..b069e3d436 100644 --- a/package-lock.json +++ b/package-lock.json @@ -214,6 +214,28 @@ "pkg-up": "^2.0.0", "write-pkg": "^3.2.0", "yargs": "^12.0.5" + }, + "dependencies": { + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } } }, "@mocha/docdash": { @@ -706,7 +728,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1123,7 +1145,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1135,7 +1157,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1188,7 +1210,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1631,7 +1653,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1654,7 +1676,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -1765,7 +1787,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -1854,7 +1876,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { "version": "2.26.3", @@ -2226,7 +2248,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2280,7 +2302,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2413,7 +2435,7 @@ }, "uuid": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", "dev": true } @@ -2558,7 +2580,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2783,7 +2805,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -2870,7 +2892,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3063,7 +3085,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3398,7 +3420,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3411,7 +3433,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3478,7 +3500,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -4247,11 +4269,11 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4421,7 +4443,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4552,8 +4574,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "encodeurl": { "version": "1.0.2", @@ -4732,7 +4753,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -4945,7 +4966,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -4972,7 +4993,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5017,7 +5038,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5025,7 +5046,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5283,7 +5304,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5311,7 +5332,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6208,7 +6229,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6814,7 +6835,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -6883,7 +6904,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7168,7 +7189,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -7186,7 +7207,7 @@ }, "through2": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { @@ -7286,7 +7307,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7295,7 +7316,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7330,7 +7351,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7779,7 +7800,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -8140,7 +8161,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8171,7 +8192,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -8872,7 +8893,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8932,7 +8953,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } @@ -9559,7 +9580,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9657,7 +9678,7 @@ }, "lazy-req": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", "dev": true }, @@ -10515,7 +10536,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -10591,7 +10612,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10770,7 +10791,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10820,7 +10841,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10888,7 +10909,7 @@ }, "marked": { "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, @@ -10976,7 +10997,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -11037,7 +11058,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -11055,7 +11076,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -11108,7 +11129,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11169,7 +11190,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -11217,7 +11238,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -11226,7 +11247,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -11351,7 +11372,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -11634,7 +11655,7 @@ }, "node-status-codes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", "dev": true }, @@ -13359,7 +13380,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -14078,7 +14099,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -14100,7 +14121,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -14420,7 +14441,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -14497,7 +14518,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -14582,7 +14603,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14626,7 +14647,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -15460,7 +15481,7 @@ }, "pngquant-bin": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-3.1.1.tgz", + "resolved": "http://registry.npmjs.org/pngquant-bin/-/pngquant-bin-3.1.1.tgz", "integrity": "sha1-0STZinWpSH9AwWQLTb/Lsr1aH9E=", "dev": true, "optional": true, @@ -16166,7 +16187,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { @@ -16641,7 +16662,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -16756,7 +16777,7 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, @@ -17118,7 +17139,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -17204,7 +17225,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -17288,7 +17309,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -17820,7 +17841,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -17890,7 +17911,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { "ret": "~0.1.10" @@ -17947,7 +17968,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -18000,7 +18021,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -18229,7 +18250,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -18263,7 +18284,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -18863,7 +18884,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -18967,7 +18988,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -19095,7 +19116,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -19248,7 +19269,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, "requires": { "ansi-regex": "^4.0.0" }, @@ -19256,8 +19276,7 @@ "ansi-regex": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "dev": true + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" } } }, @@ -19303,7 +19322,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -19385,7 +19404,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -19660,7 +19679,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -19849,7 +19868,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -19964,7 +19983,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -21155,7 +21174,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -21352,22 +21371,52 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "get-caller-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", + "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yargs-parser": { @@ -21387,6 +21436,27 @@ "flat": "^4.1.0", "lodash": "^4.17.11", "yargs": "^12.0.5" + }, + "dependencies": { + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } } }, "yauzl": { diff --git a/package.json b/package.json index 2b887bfa2d..fdd97e7572 100644 --- a/package.json +++ b/package.json @@ -512,7 +512,7 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "12.0.5", + "yargs": "13.2.2", "yargs-parser": "11.1.1", "yargs-unparser": "1.5.0" }, @@ -602,11 +602,6 @@ "bracketSpacing": false, "endOfLine": "auto" }, - "yargs": { - "combine-arrays": true, - "short-option-groups": false, - "dot-notation": false - }, "gitter": "https://gitter.im/mochajs/mocha", "@mocha/contributors": { "exclude": [ From 735161ffdb639cca94665f08c302b680fe199edb Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Thu, 7 Mar 2019 04:49:48 -0600 Subject: [PATCH 1301/1771] MarkdownMagic script updates (#3815) * Quote `child_process.execSync` executable to allow for embedded spaces in pathname. --- scripts/markdown-magic.config.js | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/scripts/markdown-magic.config.js b/scripts/markdown-magic.config.js index ad05067979..f75740a264 100644 --- a/scripts/markdown-magic.config.js +++ b/scripts/markdown-magic.config.js @@ -8,10 +8,10 @@ */ const {execSync} = require('child_process'); -const stripAnsi = require('strip-ansi'); -const markdownToc = require('markdown-toc'); -const path = require('path'); const fs = require('fs'); +const path = require('path'); +const markdownToc = require('markdown-toc'); +const stripAnsi = require('strip-ansi'); exports.transforms = { /** @@ -20,11 +20,11 @@ exports.transforms = { usage: (content, options) => { const {executable} = options; const flag = options.flag || '--help'; - const header = options.header || '\n```plain'; + const header = options.header || '\n```text'; const footer = options.footer || '```\n'; const output = stripAnsi( String( - execSync(`${process.execPath} ${executable} ${flag}`, { + execSync(`"${process.execPath}" ${executable} ${flag}`, { cwd: path.join(__dirname, '..') }) ).trim() @@ -40,18 +40,15 @@ exports.transforms = { */ toc: (content, options, config) => { const IGNORED_HEADINGS_REGEXP = /Features|Table of Contents/i; - return ( - '\n' + - markdownToc(config.outputContent, { - slugify: require('uslug'), - bullets: options.bullets, - firsth1: false, - // if filter is supplied, maxdepth is apparently ignored, - // so we have to do it ourselves. - filter: (str, ele) => ele.lvl < 2 && !IGNORED_HEADINGS_REGEXP.test(str) - }).content + - '\n' - ); + const toc = markdownToc(config.outputContent, { + slugify: require('uslug'), + bullets: options.bullets, + firsth1: false, + // if filter is supplied, maxdepth is apparently ignored, + // so we have to do it ourselves. + filter: (str, ele) => ele.lvl < 2 && !IGNORED_HEADINGS_REGEXP.test(str) + }).content; + return '\n' + toc + '\n'; }, manifest: require('markdown-magic-package-json'), /** From ca9eba6fd7177dc482756d96a058eb4169292bd5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Mar 2019 17:47:25 -0800 Subject: [PATCH 1302/1771] guard against undefined timeout option in constructor; closes #3813 Signed-off-by: Christopher Hiller --- lib/mocha.js | 13 ++++++----- lib/suite.js | 1 + test/unit/mocha.spec.js | 49 +++++++++++++++++++++++++++++++---------- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 63dfdd3c43..aab5604448 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -120,12 +120,15 @@ function Mocha(options) { utils.deprecate( 'enableTimeouts is DEPRECATED and will be removed from a future version of Mocha. Instead, use "timeout: false" to disable timeouts.' ); + if (options.enableTimeouts === false) { + this.timeout(0); + } + } + + // this guard exists because Suite#timeout does not consider `undefined` to be valid input + if (typeof options.timeout !== 'undefined') { + this.timeout(options.timeout === false ? 0 : options.timeout); } - this.timeout( - options.enableTimeouts === false || options.timeout === false - ? 0 - : options.timeout - ); if ('retries' in options) { this.retries(options.retries); diff --git a/lib/suite.js b/lib/suite.js index 13c6ec792a..6d1d0fb56e 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -114,6 +114,7 @@ Suite.prototype.clone = function() { * Set or get timeout `ms` or short-hand such as "2s". * * @private + * @todo Do not attempt to set value if `ms` is undefined * @param {number|string} ms * @return {Suite|number} for chaining */ diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index e9065c03e8..16fbbd7f82 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -20,24 +20,49 @@ describe('Mocha', function() { beforeEach(function() { sandbox.stub(Mocha.prototype, 'useColors').returnsThis(); sandbox.stub(utils, 'deprecate'); + sandbox.stub(Mocha.prototype, 'timeout').returnsThis(); }); - it('should prefer "color" over "useColors"', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true, color: false}); - expect(Mocha.prototype.useColors, 'to have a call satisfying', [false]); + describe('when "useColors" option is defined', function() { + it('should prefer "color" over "useColors"', function() { + // eslint-disable-next-line no-new + new Mocha({useColors: true, color: false}); + expect(Mocha.prototype.useColors, 'to have a call satisfying', [ + false + ]).and('was called once'); + }); + + it('should assign "useColors" to "color"', function() { + // eslint-disable-next-line no-new + new Mocha({useColors: true}); + expect(Mocha.prototype.useColors, 'to have a call satisfying', [ + true + ]).and('was called once'); + }); + + it('should call utils.deprecate()', function() { + // eslint-disable-next-line no-new + new Mocha({useColors: true}); + expect(utils.deprecate, 'was called once'); + }); }); - it('should assign "useColors" to "color"', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true}); - expect(Mocha.prototype.useColors, 'to have a call satisfying', [true]); + describe('when "timeout" option is `undefined`', function() { + it('should not attempt to set timeout', function() { + // eslint-disable-next-line no-new + new Mocha({timeout: undefined}); + expect(Mocha.prototype.timeout, 'was not called'); + }); }); - it('should call utils.deprecate()', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true}); - expect(utils.deprecate, 'was called'); + describe('when "timeout" option is `false`', function() { + it('should set a timeout of 0', function() { + // eslint-disable-next-line no-new + new Mocha({timeout: false}); + expect(Mocha.prototype.timeout, 'to have a call satisfying', [0]).and( + 'was called once' + ); + }); }); }); From 75430ec1b2e9c688503c0aaf198a908eff5b682a Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 11 Mar 2019 00:03:32 -0400 Subject: [PATCH 1303/1771] Upgrade yargs-parser dependency to avoid loading 2 copies of yargs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fdd97e7572..80f2f8df63 100644 --- a/package.json +++ b/package.json @@ -513,7 +513,7 @@ "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.2.2", - "yargs-parser": "11.1.1", + "yargs-parser": "13.0.0", "yargs-unparser": "1.5.0" }, "devDependencies": { From a3089ad7215306bc7fb6db5043f404d6cfbb20bf Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 11 Mar 2019 00:49:47 -0400 Subject: [PATCH 1304/1771] update package-lock --- package-lock.json | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b069e3d436..48d7cff635 100644 --- a/package-lock.json +++ b/package-lock.json @@ -234,6 +234,18 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" + }, + "dependencies": { + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } } } @@ -21420,9 +21432,9 @@ } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -21455,6 +21467,17 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" + }, + "dependencies": { + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } } } From d5ba1214574f68211eb663c8a0b1aab6d79a0148 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 13 Mar 2019 17:06:30 -0400 Subject: [PATCH 1305/1771] Remove "package" flag from sample config file because it can only be passes as CLI arg (#3793) --- example/config/.mocharc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index dbb224c769..1a5f820482 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -29,7 +29,6 @@ inline-diffs: false # needs to be used with grep or fgrep # invert: false opts: './test/mocha.opts' -package: './package.json' recursive: false reporter: spec reporter-option: From 009814704df229b7c38edd0b8c503e701e9bb323 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 13 Mar 2019 18:39:48 -0400 Subject: [PATCH 1306/1771] Replace findup-sync with find-up for faster startup (#3830) * Replace findup-sync with find-up, hopefully to increase startup performance * update package-lock.json --- lib/cli/config.js | 4 +- lib/cli/options.js | 4 +- package-lock.json | 251 +++++++++++++++++------------ package.json | 2 +- test/node-unit/cli/config.spec.js | 4 +- test/node-unit/cli/options.spec.js | 6 +- 6 files changed, 160 insertions(+), 111 deletions(-) diff --git a/lib/cli/config.js b/lib/cli/config.js index dd8f987ca1..3691f0a079 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -9,7 +9,7 @@ */ const fs = require('fs'); -const findUp = require('findup-sync'); +const findUp = require('find-up'); const path = require('path'); const debug = require('debug')('mocha:cli:config'); @@ -72,7 +72,7 @@ exports.loadConfig = filepath => { * @returns {string|null} Filepath to config, if found */ exports.findConfig = (cwd = process.cwd()) => { - const filepath = findUp(exports.CONFIG_FILES, {cwd}); + const filepath = findUp.sync(exports.CONFIG_FILES, {cwd}); if (filepath) { debug(`found config at ${filepath}`); } diff --git a/lib/cli/options.js b/lib/cli/options.js index 5ec8ff0ebf..a033c39ac7 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -13,7 +13,7 @@ const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); const mocharc = require('../mocharc.json'); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); -const findup = require('findup-sync'); +const findUp = require('find-up'); const {deprecate} = require('../utils'); const debug = require('debug')('mocha:cli:options'); const {createMissingArgumentError} = require('../errors'); @@ -255,7 +255,7 @@ const loadPkgRc = (args = {}) => { return result; } result = {}; - const filepath = args.package || findup(mocharc.package); + const filepath = args.package || findUp.sync(mocharc.package); if (filepath) { try { const pkg = JSON.parse(fs.readFileSync(filepath, 'utf8')); diff --git a/package-lock.json b/package-lock.json index 48d7cff635..cce95ce7d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -702,17 +702,20 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-changes": { "version": "3.0.1", @@ -814,7 +817,8 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arraybuffer.slice": { "version": "0.0.7", @@ -1106,7 +1110,8 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "ast-module-types": { "version": "2.5.0", @@ -1212,7 +1217,8 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "author-regex": { "version": "1.0.0", @@ -1311,6 +1317,7 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -1325,6 +1332,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -1333,6 +1341,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1341,6 +1350,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1349,6 +1359,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1774,6 +1785,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -1791,6 +1803,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2475,6 +2488,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -2828,6 +2842,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -2839,6 +2854,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -3027,6 +3043,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -3157,7 +3174,8 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true }, "component-inherit": { "version": "0.0.3", @@ -3350,7 +3368,8 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true }, "core-js": { "version": "2.6.5", @@ -3796,7 +3815,8 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress": { "version": "4.2.0", @@ -3947,6 +3967,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -3956,6 +3977,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3964,6 +3986,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3972,6 +3995,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -4089,11 +4113,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", @@ -5402,6 +5421,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -5416,6 +5436,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -5424,6 +5445,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -5432,6 +5454,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -5439,7 +5462,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -5500,14 +5524,6 @@ "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", "dev": true }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "express-processimage": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-8.0.0.tgz", @@ -5651,6 +5667,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -5660,6 +5677,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -5692,6 +5710,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -5707,6 +5726,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -5715,6 +5735,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -5723,6 +5744,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -5731,6 +5753,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -5739,6 +5762,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -5938,6 +5962,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -5949,6 +5974,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -6052,17 +6078,6 @@ } } }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, "first-chunk-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", @@ -6175,7 +6190,8 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", @@ -6213,6 +6229,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -6984,7 +7001,8 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -7244,28 +7262,6 @@ "ini": "^1.3.4" } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, "globals": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", @@ -8018,6 +8014,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -8028,6 +8025,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -8037,6 +8035,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -8107,14 +8106,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -8480,7 +8471,8 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "inkscape": { "version": "1.2.0", @@ -8629,6 +8621,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -8637,6 +8630,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -8683,7 +8677,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-bzip2": { "version": "1.0.0", @@ -8723,6 +8718,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -8731,6 +8727,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -8752,6 +8749,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -8761,7 +8759,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -8807,12 +8806,14 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-finite": { "version": "1.0.2", @@ -8832,6 +8833,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -8880,6 +8882,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -8888,6 +8891,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -8966,6 +8970,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -9111,7 +9116,8 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "is-word-character": { "version": "1.0.2", @@ -9134,7 +9140,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isbinaryfile": { "version": "3.0.3", @@ -9153,7 +9160,8 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -9643,7 +9651,8 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, "klaw": { "version": "2.0.0", @@ -10614,7 +10623,8 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-obj": { "version": "1.0.1", @@ -10632,6 +10642,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -11122,6 +11133,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -11242,6 +11254,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -11251,6 +11264,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -11424,6 +11438,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -13274,6 +13289,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -13284,6 +13300,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -13292,6 +13309,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -13319,6 +13337,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, "requires": { "isobject": "^3.0.0" } @@ -13357,6 +13376,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -14388,11 +14408,6 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -14426,7 +14441,8 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "passerror": { "version": "1.1.1", @@ -16183,7 +16199,8 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, "postcss": { "version": "7.0.14", @@ -17398,6 +17415,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -17551,12 +17569,14 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -17732,15 +17752,6 @@ "integrity": "sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==", "dev": true }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -17750,7 +17761,8 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, "resp-modifier": { "version": "6.0.2", @@ -17821,7 +17833,8 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "rewiremock": { "version": "3.13.0", @@ -17925,6 +17938,7 @@ "version": "1.1.0", "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, "requires": { "ret": "~0.1.10" } @@ -18231,6 +18245,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -18242,6 +18257,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -18453,6 +18469,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -18468,6 +18485,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -18476,6 +18494,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -18484,6 +18503,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -18491,7 +18511,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -18499,6 +18520,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -18509,6 +18531,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -18517,6 +18540,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -18525,6 +18549,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -18533,6 +18558,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -18545,6 +18571,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -18553,6 +18580,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -18797,12 +18825,14 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -18832,7 +18862,8 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true }, "sparkles": { "version": "1.0.1", @@ -18907,6 +18938,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -19029,6 +19061,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -19038,6 +19071,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -20049,6 +20083,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -20057,6 +20092,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -20067,6 +20103,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -20078,6 +20115,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -20497,6 +20535,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -20508,6 +20547,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -20516,6 +20556,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -20654,6 +20695,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -20663,6 +20705,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -20673,6 +20716,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -20682,7 +20726,8 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, @@ -20740,7 +20785,8 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url": { "version": "0.11.0", @@ -20798,7 +20844,8 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "useragent": { "version": "2.3.0", diff --git a/package.json b/package.json index 80f2f8df63..773bf7bcf8 100644 --- a/package.json +++ b/package.json @@ -497,7 +497,7 @@ "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "findup-sync": "2.0.0", + "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", diff --git a/test/node-unit/cli/config.spec.js b/test/node-unit/cli/config.spec.js index d5d64ee593..eeb4bb2b82 100644 --- a/test/node-unit/cli/config.spec.js +++ b/test/node-unit/cli/config.spec.js @@ -109,12 +109,12 @@ describe('cli/config', function() { let findConfig; beforeEach(function() { - findup = sandbox.stub().returns('/some/path/.mocharc.js'); + findup = {sync: sandbox.stub().returns('/some/path/.mocharc.js')}; rewiremock.enable(); findConfig = rewiremock.proxy( require.resolve('../../../lib/cli/config'), r => ({ - 'findup-sync': r.by(() => findup) + 'find-up': r.by(() => findup) }) ).findConfig; }); diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index b849db5ab3..3438a5564f 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -10,14 +10,16 @@ const configPath = require.resolve('../../../lib/cli/config'); const proxyLoadOptions = ({ readFileSync = {}, - findupSync = {}, + findupSync = null, findConfig = {}, loadConfig = {} } = {}) => rewiremock.proxy(modulePath, r => ({ fs: r.with({readFileSync}).directChildOnly(), [mocharcPath]: defaults, - 'findup-sync': r.by(() => findupSync).directChildOnly(), + 'find-up': r + .by(() => (findupSync ? {sync: findupSync} : {})) + .directChildOnly(), [configPath]: r.with({findConfig, loadConfig}).directChildOnly() })).loadOptions; From ade8b90a46c641345b67c7979f855bcfbda900d5 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 14 Mar 2019 13:01:33 +0100 Subject: [PATCH 1307/1771] runner.js: "self.test" undefined in Browser (#3835) --- lib/runner.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index a8f8ab882b..d13e37677b 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -389,7 +389,9 @@ Runner.prototype.hook = function(name, fn) { if (err) { if (err instanceof Pending) { if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { - self.test.pending = true; + if (self.test) { + self.test.pending = true; + } } else { suite.tests.forEach(function(test) { test.pending = true; From 1d570e0bfa02c1c35e58872e8dc736a9be36e0bc Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Thu, 14 Mar 2019 07:10:40 -0500 Subject: [PATCH 1308/1771] Delete "/docs/example/chai.js" Removed old [chai-1.0.4](https://github.com/chaijs/chai/blob/40b0eb2268702314cb7577fc1b3c8676a955b23e/chai.js) (released 2012-06-03) from our repository. --- docs/example/chai.js | 3403 ------------------------------------------ 1 file changed, 3403 deletions(-) delete mode 100644 docs/example/chai.js diff --git a/docs/example/chai.js b/docs/example/chai.js deleted file mode 100644 index 43fbf644d3..0000000000 --- a/docs/example/chai.js +++ /dev/null @@ -1,3403 +0,0 @@ -!function (name, definition) { - if (typeof define == 'function' && typeof define.amd == 'object') define(definition); - else this[name] = definition(); -}('chai', function () { - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p[0]) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("assertion.js", function(module, exports, require){ -/*! - * chai - * http://chaijs.com - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - - -/*! - * Module dependencies. - */ - -var AssertionError = require('./browser/error') - , toString = Object.prototype.toString - , util = require('./utils') - , flag = util.flag; - -/*! - * Module export. - */ - -module.exports = Assertion; - - -/*! - * Assertion Constructor - * - * Creates object for chaining. - * - * @api private - */ - -function Assertion (obj, msg, stack) { - flag(this, 'ssfi', stack || arguments.callee); - flag(this, 'object', obj); - flag(this, 'message', msg); -} - -/*! - * ### Assertion.includeStack - * - * User configurable property, influences whether stack trace - * is included in Assertion error message. Default of false - * suppresses stack trace in the error message - * - * Assertion.includeStack = true; // enable stack on error - * - * @api public - */ - -Assertion.includeStack = false; - -Assertion.addProperty = function (name, fn) { - util.addProperty(this.prototype, name, fn); -}; - -Assertion.addMethod = function (name, fn) { - util.addMethod(this.prototype, name, fn); -}; - -Assertion.addChainableMethod = function (name, fn, chainingBehavior) { - util.addChainableMethod(this.prototype, name, fn, chainingBehavior); -}; - -Assertion.overwriteProperty = function (name, fn) { - util.overwriteProperty(this.prototype, name, fn); -}; - -Assertion.overwriteMethod = function (name, fn) { - util.overwriteMethod(this.prototype, name, fn); -}; - -/*! - * ### .assert(expression, message, negateMessage, expected, actual) - * - * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. - * - * @name assert - * @param {Philosophical} expression to be tested - * @param {String} message to display if fails - * @param {String} negatedMessage to display if negated expression fails - * @param {Mixed} expected value (remember to check for negation) - * @param {Mixed} actual (optional) will default to `this.obj` - * @api private - */ - -Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual) { - var msg = util.getMessage(this, arguments) - , actual = util.getActual(this, arguments) - , ok = util.test(this, arguments); - - if (!ok) { - throw new AssertionError({ - message: msg - , actual: actual - , expected: expected - , stackStartFunction: (Assertion.includeStack) ? this.assert : flag(this, 'ssfi') - }); - } -}; - -/*! - * - * ### ._obj - * - * Quick reference to stored `actual` value for plugin developers. - * - * @api private - */ - -Object.defineProperty(Assertion.prototype, '_obj', - { get: function () { - return flag(this, 'object'); - } - , set: function (val) { - flag(this, 'object', val); - } -}); - -/** - * ### Language Chains - * - * The following are provide as chainable getters to - * improve the readability of your assertions. They - * do not provide an testing capability unless they - * have been overwritten by a plugin. - * - * **Chains** - * - * - to - * - be - * - been - * - is - * - and - * - have - * - with - * - * @name language chains - * @api public - */ - -[ 'to', 'be', 'been' -, 'is', 'and', 'have' -, 'with' ].forEach(function (chain) { - Object.defineProperty(Assertion.prototype, chain, - { get: function () { - return this; - } - , configurable: true - }); -}); - -/** - * ### .not - * - * Negates any of assertions following in the chain. - * - * expect(foo).to.not.equal('bar'); - * expect(goodFn).to.not.throw(Error); - * expect({ foo: 'baz' }).to.have.property('foo') - * .and.not.equal('bar'); - * - * @name not - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'not', - { get: function () { - flag(this, 'negate', true); - return this; - } - , configurable: true -}); - -/** - * ### .deep - * - * Sets the `deep` flag, later used by the `equal` and - * `property` assertions. - * - * expect(foo).to.deep.equal({ bar: 'baz' }); - * expect({ foo: { bar: { baz: 'quux' } } }) - * .to.have.deep.property('foo.bar.baz', 'quux'); - * - * @name deep - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'deep', - { get: function () { - flag(this, 'deep', true); - return this; - } - , configurable: true -}); - -/** - * ### .a(type) - * - * The `a` and `an` assertions are aliases that can be - * used either as language chains or to assert a value's - * type (as revealed by `Object.prototype.toString`). - * - * // typeof - * expect('test').to.be.a('string'); - * expect({ foo: 'bar' }).to.be.an('object'); - * expect(null).to.be.a('null'); - * expect(undefined).to.be.an('undefined'); - * - * // language chain - * expect(foo).to.be.an.instanceof(Foo); - * - * @name a - * @alias an - * @param {String} type - * @api public - */ - -function an(type) { - var obj = flag(this, 'object') - , klassStart = type.charAt(0).toUpperCase() - , klass = klassStart + type.slice(1) - , article = ~[ 'A', 'E', 'I', 'O', 'U' ].indexOf(klassStart) ? 'an ' : 'a '; - - this.assert( - '[object ' + klass + ']' === toString.call(obj) - , 'expected #{this} to be ' + article + type - , 'expected #{this} not to be ' + article + type - , '[object ' + klass + ']' - , toString.call(obj) - ); -} - -Assertion.addChainableMethod('an', an); -Assertion.addChainableMethod('a', an); - -/** - * ### .include(value) - * - * The `include` and `contain` assertions can be used as either property - * based language chains or as methods to assert the inclusion of an object - * in an array or a substring in a string. When used as language chains, - * they toggle the `contain` flag for the `keys` assertion. - * - * expect([1,2,3]).to.include(2); - * expect('foobar').to.contain('foo'); - * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); - * - * @name include - * @alias contain - * @param {Object|String|Number} obj - * @api public - */ - -function includeChainingBehavior () { - flag(this, 'contains', true); -} - -function include (val) { - var obj = flag(this, 'object') - this.assert( - ~obj.indexOf(val) - , 'expected #{this} to include ' + util.inspect(val) - , 'expected #{this} to not include ' + util.inspect(val)); -} - -Assertion.addChainableMethod('include', include, includeChainingBehavior); -Assertion.addChainableMethod('contain', include, includeChainingBehavior); - -/** - * ### .ok - * - * Asserts that the target is truthy. - * - * expect('everthing').to.be.ok; - * expect(1).to.be.ok; - * expect(false).to.not.be.ok; - * expect(undefined).to.not.be.ok; - * expect(null).to.not.be.ok; - * - * @name ok - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'ok', - { get: function () { - this.assert( - flag(this, 'object') - , 'expected #{this} to be truthy' - , 'expected #{this} to be falsy'); - - return this; - } - , configurable: true -}); - -/** - * ### .true - * - * Asserts that the target is `true`. - * - * expect(true).to.be.true; - * expect(1).to.not.be.true; - * - * @name true - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'true', - { get: function () { - this.assert( - true === flag(this, 'object') - , 'expected #{this} to be true' - , 'expected #{this} to be false' - , this.negate ? false : true - ); - - return this; - } - , configurable: true -}); - -/** - * ### .false - * - * Asserts that the target is `false`. - * - * expect(false).to.be.false; - * expect(0).to.not.be.false; - * - * @name false - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'false', - { get: function () { - this.assert( - false === flag(this, 'object') - , 'expected #{this} to be false' - , 'expected #{this} to be true' - , this.negate ? true : false - ); - - return this; - } - , configurable: true -}); - -/** - * ### .null - * - * Asserts that the target is `null`. - * - * expect(null).to.be.null; - * expect(undefined).not.to.be.null; - * - * @name null - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'null', - { get: function () { - this.assert( - null === flag(this, 'object') - , 'expected #{this} to be null' - , 'expected #{this} not to be null' - , this.negate ? false : true - ); - - return this; - } - , configurable: true -}); - -/** - * ### .undefined - * - * Asserts that the target is `undefined`. - * - * expect(undefined).to.be.undefined; - * expect(null).to.not.be.undefined; - * - * @name undefined - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'undefined', - { get: function () { - this.assert( - undefined === flag(this, 'object') - , 'expected #{this} to be undefined' - , 'expected #{this} not to be undefined' - , this.negate ? false : true - ); - - return this; - } - , configurable: true -}); - -/** - * ### .exist - * - * Asserts that the target is neither `null` nor `undefined`. - * - * var foo = 'hi' - * , bar = null - * , baz; - * - * expect(foo).to.exist; - * expect(bar).to.not.exist; - * expect(baz).to.not.exist; - * - * @name exist - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'exist', - { get: function () { - this.assert( - null != flag(this, 'object') - , 'expected #{this} to exist' - , 'expected #{this} to not exist' - ); - - return this; - } - , configurable: true -}); - -/** - * ### .empty - * - * Asserts that the target's length is `0`. For arrays, it checks - * the `length` property. For objects, it gets the count of - * enumerable keys. - * - * expect([]).to.be.empty; - * expect('').to.be.empty; - * expect({}).to.be.empty; - * - * @name empty - * @api public - */ - -Object.defineProperty(Assertion.prototype, 'empty', - { get: function () { - var obj = flag(this, 'object') - , expected = obj; - - if (Array.isArray(obj) || 'string' === typeof object) { - expected = obj.length; - } else if (typeof obj === 'object') { - expected = Object.keys(obj).length; - } - - this.assert( - !expected - , 'expected #{this} to be empty' - , 'expected #{this} not to be empty'); - - return this; - } - , configurable: true -}); - -/** - * ### .arguments - * - * Asserts that the target is an arguments object. - * - * function test () { - * expect(arguments).to.be.arguments; - * } - * - * @name arguments - * @alias Arguments - * @api public - */ - -function checkArguments () { - var obj = flag(this, 'object') - , type = Object.prototype.toString.call(obj); - this.assert( - '[object Arguments]' === type - , 'expected #{this} to be arguments but got ' + type - , 'expected #{this} to not be arguments' - ); -} - -Assertion.addProperty('arguments', checkArguments); -Assertion.addProperty('Arguments', checkArguments); - -/** - * ### .equal(value) - * - * Asserts that the target is strictly equal (`===`) to `value`. - * Alternately, if the `deep` flag is set, asserts that - * the target is deeply equal to `value`. - * - * expect('hello').to.equal('hello'); - * expect(42).to.equal(42); - * expect(1).to.not.equal(true); - * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' }); - * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); - * - * @name equal - * @param {Mixed} value - * @api public - */ - -Assertion.prototype.equal = function (val) { - var obj = flag(this, 'object'); - if (flag(this, 'deep')) { - return this.eql(val); - } else { - this.assert( - val === obj - , 'expected #{this} to equal #{exp}' - , 'expected #{this} to not equal #{exp}' - , val); - } - - return this; -}; - -/** - * ### .eql(value) - * - * Asserts that the target is deeply equal to `value`. - * - * expect({ foo: 'bar' }).to.eql({ foo: 'bar' }); - * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]); - * - * @name eql - * @param {Mixed} value - * @api public - */ - -Assertion.prototype.eql = function (obj) { - this.assert( - util.eql(obj, flag(this, 'object')) - , 'expected #{this} to deeply equal #{exp}' - , 'expected #{this} to not deeply equal #{exp}' - , obj ); - - return this; -}; - -/** - * ### .above(value) - * - * Asserts that the target is greater than `value`. - * - * expect(10).to.be.above(5); - * - * @name above - * @alias gt - * @param {Number} value - * @api public - */ - -Assertion.prototype.above = function (val) { - this.assert( - flag(this, 'object') > val - , 'expected #{this} to be above ' + val - , 'expected #{this} to be below ' + val); - - return this; -}; - -/** - * ### .below(value) - * - * Asserts that the target is less than `value`. - * - * expect(5).to.be.below(10); - * - * @name below - * @alias lt - * @param {Number} value - * @api public - */ - -Assertion.prototype.below = function (val) { - this.assert( - flag(this, 'object') < val - , 'expected #{this} to be below ' + val - , 'expected #{this} to be above ' + val); - - return this; -}; - -/** - * ### .within(start, finish) - * - * Asserts that the target is within a range. - * - * expect(7).to.be.within(5,10); - * - * @name within - * @param {Number} start lowerbound inclusive - * @param {Number} finish upperbound inclusive - * @api public - */ - -Assertion.prototype.within = function (start, finish) { - var obj = flag(this, 'object') - , range = start + '..' + finish; - - this.assert( - obj >= start && obj <= finish - , 'expected #{this} to be within ' + range - , 'expected #{this} to not be within ' + range); - - return this; -}; - -/** - * ### .instanceof(constructor) - * - * Asserts that the target is an instance of `constructor`. - * - * var Tea = function (name) { this.name = name; } - * , Chai = new Tea('chai'); - * - * expect(Chai).to.be.an.instanceof(Tea); - * expect([ 1, 2, 3 ]).to.be.instanceof(Array); - * - * @name instanceof - * @param {Constructor} constructor - * @alias instanceOf - * @api public - */ - -Assertion.prototype.instanceOf = function (constructor) { - var name = util.getName(constructor); - this.assert( - flag(this, 'object') instanceof constructor - , 'expected #{this} to be an instance of ' + name - , 'expected #{this} to not be an instance of ' + name); - - return this; -}; - -/** - * ### .property(name, [value]) - * - * Asserts that the target has a property `name`, optionally asserting that - * the value of that property is strictly equal to `value`. - * If the `deep` flag is set, you can use dot- and bracket-notation for deep - * references into objects and arrays. - * - * // simple referencing - * var obj = { foo: 'bar' }; - * expect(obj).to.have.property('foo'); - * expect(obj).to.have.property('foo', 'bar'); - * expect(obj).to.have.property('foo').to.be.a('string'); - * - * // deep referencing - * var deepObj = { - * green: { tea: 'matcha' } - * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ] - * }; - - * expect(deepObj).to.have.deep.property('green.tea', 'matcha'); - * expect(deepObj).to.have.deep.property('teas[1]', 'matcha'); - * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha'); - * - * @name property - * @param {String} name - * @param {Mixed} value (optional) - * @returns value of property for chaining - * @api public - */ - -Assertion.prototype.property = function (name, val) { - var obj = flag(this, 'object') - , value = flag(this, 'deep') ? util.getPathValue(name, obj) : obj[name] - , descriptor = flag(this, 'deep') ? 'deep property ' : 'property ' - , negate = flag(this, 'negate'); - - if (negate && undefined !== val) { - if (undefined === value) { - throw new Error(util.inspect(obj) + ' has no ' + descriptor + util.inspect(name)); - } - } else { - this.assert( - undefined !== value - , 'expected #{this} to have a ' + descriptor + util.inspect(name) - , 'expected #{this} to not have ' + descriptor + util.inspect(name)); - } - - if (undefined !== val) { - this.assert( - val === value - , 'expected #{this} to have a ' + descriptor + util.inspect(name) + ' of #{exp}, but got #{act}' - , 'expected #{this} to not have a ' + descriptor + util.inspect(name) + ' of #{act}' - , val - , value - ); - } - - flag(this, 'object', value); - return this; -}; - -/** - * ### .ownProperty(name) - * - * Asserts that the target has an own property `name`. - * - * expect('test').to.have.ownProperty('length'); - * - * @name ownProperty - * @alias haveOwnProperty - * @param {String} name - * @api public - */ - -Assertion.prototype.ownProperty = function (name) { - var obj = flag(this, 'object'); - this.assert( - obj.hasOwnProperty(name) - , 'expected #{this} to have own property ' + util.inspect(name) - , 'expected #{this} to not have own property ' + util.inspect(name)); - return this; -}; - -/** - * ### .length(value) - * - * Asserts that the target's `length` property has the expected value. - * - * expect([1,2,3]).to.have.length(3); - * expect('foobar').to.have.length(6); - * - * @name length - * @alias lengthOf - * @param {Number} length - * @api public - */ - -Assertion.prototype.length = function (n) { - var obj = flag(this, 'object'); - new Assertion(obj).to.have.property('length'); - var len = obj.length; - - this.assert( - len == n - , 'expected #{this} to have a length of #{exp} but got #{act}' - , 'expected #{this} to not have a length of #{act}' - , n - , len - ); - - return this; -}; - -/** - * ### .match(regexp) - * - * Asserts that the target matches a regular expression. - * - * expect('foobar').to.match(/^foo/); - * - * @name match - * @param {RegExp} RegularExpression - * @api public - */ - -Assertion.prototype.match = function (re) { - var obj = flag(this, 'object'); - this.assert( - re.exec(obj) - , 'expected #{this} to match ' + re - , 'expected #{this} not to match ' + re); - - return this; -}; - - -/** - * ### .string(string) - * - * Asserts that the string target contains another string. - * - * expect('foobar').to.have.string('bar'); - * - * @name string - * @param {String} string - * @api public - */ - -Assertion.prototype.string = function (str) { - var obj = flag(this, 'object'); - new Assertion(obj).is.a('string'); - - this.assert( - ~obj.indexOf(str) - , 'expected #{this} to contain ' + util.inspect(str) - , 'expected #{this} to not contain ' + util.inspect(str)); - - return this; -}; - -/** - * ### .keys(key1, [key2], [...]) - * - * Asserts that the target has exactly the given keys, or - * asserts the inclusion of some keys when using the - * `include` or `contain` modifiers. - * - * expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']); - * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.keys('foo', 'bar'); - * - * @name keys - * @alias key - * @param {String...|Array} keys - * @api public - */ - -Assertion.prototype.keys = function(keys) { - var obj = flag(this, 'object') - , str - , ok = true; - - keys = keys instanceof Array - ? keys - : Array.prototype.slice.call(arguments); - - if (!keys.length) throw new Error('keys required'); - - var actual = Object.keys(obj) - , len = keys.length; - - // Inclusion - ok = keys.every(function(key){ - return ~actual.indexOf(key); - }); - - // Strict - if (!flag(this, 'negate') && !flag(this, 'contains')) { - ok = ok && keys.length == actual.length; - } - - // Key string - if (len > 1) { - keys = keys.map(function(key){ - return util.inspect(key); - }); - var last = keys.pop(); - str = keys.join(', ') + ', and ' + last; - } else { - str = util.inspect(keys[0]); - } - - // Form - str = (len > 1 ? 'keys ' : 'key ') + str; - - // Have / include - str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; - - // Assertion - this.assert( - ok - , 'expected #{this} to ' + str - , 'expected #{this} to not ' + str - , keys - , Object.keys(obj) - ); - - return this; -} - -/** - * ### .throw(constructor) - * - * Asserts that the function target will throw a specific error, or specific type of error - * (as determined using `instanceof`), optionally with a RegExp or string inclusion test - * for the error's message. - * - * var err = new ReferenceError('This is a bad function.'); - * var fn = function () { throw err; } - * expect(fn).to.throw(ReferenceError); - * expect(fn).to.throw(Error); - * expect(fn).to.throw(/bad function/); - * expect(fn).to.not.throw('good function'); - * expect(fn).to.throw(ReferenceError, /bad function/); - * expect(fn).to.throw(err); - * expect(fn).to.not.throw(new RangeError('Out of range.')); - * - * Please note that when a throw expectation is negated, it will check each - * parameter independently, starting with error constructor type. The appropriate way - * to check for the existence of a type of error but for a message that does not match - * is to use `and`. - * - * expect(fn).to.throw(ReferenceError) - * .and.not.throw(/good function/); - * - * @name throw - * @alias throws - * @alias Throw - * @param {ErrorConstructor} constructor - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @api public - */ - -Assertion.prototype.Throw = function (constructor, msg) { - var obj = flag(this, 'object'); - new Assertion(obj).is.a('function'); - - var thrown = false - , desiredError = null - , name = null; - - if (arguments.length === 0) { - msg = null; - constructor = null; - } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) { - msg = constructor; - constructor = null; - } else if (constructor && constructor instanceof Error) { - desiredError = constructor; - constructor = null; - msg = null; - } else if (typeof constructor === 'function') { - name = (new constructor()).name; - } else { - constructor = null; - } - - try { - obj(); - } catch (err) { - // first, check desired error - if (desiredError) { - this.assert( - err === desiredError - , 'expected #{this} to throw ' + util.inspect(desiredError) + ' but ' + util.inspect(err) + ' was thrown' - , 'expected #{this} to not throw ' + util.inspect(desiredError) - ); - return this; - } - // next, check constructor - if (constructor) { - this.assert( - err instanceof constructor - , 'expected #{this} to throw ' + name + ' but a ' + err.name + ' was thrown' - , 'expected #{this} to not throw ' + name ); - if (!msg) return this; - } - // next, check message - if (err.message && msg && msg instanceof RegExp) { - this.assert( - msg.exec(err.message) - , 'expected #{this} to throw error matching ' + msg + ' but got ' + util.inspect(err.message) - , 'expected #{this} to throw error not matching ' + msg - ); - return this; - } else if (err.message && msg && 'string' === typeof msg) { - this.assert( - ~err.message.indexOf(msg) - , 'expected #{this} to throw error including #{exp} but got #{act}' - , 'expected #{this} to throw error not including #{act}' - , msg - , err.message - ); - return this; - } else { - thrown = true; - } - } - - var expectedThrown = name ? name : desiredError ? util.inspect(desiredError) : 'an error'; - - this.assert( - thrown === true - , 'expected #{this} to throw ' + expectedThrown - , 'expected #{this} to not throw ' + expectedThrown); - - return this; -}; - -/** - * ### .respondTo(method) - * - * Asserts that the object or class target will respond to a method. - * - * Klass.prototype.bar = function(){}; - * expect(Klass).to.respondTo('bar'); - * expect(obj).to.respondTo('bar'); - * - * To check if a constructor will respond to a static function, - * set the `itself` flag. - * - * Klass.baz = function(){}; - * expect(Klass).itself.to.respondTo('baz'); - * - * @name respondTo - * @param {String} method - * @api public - */ - -Assertion.prototype.respondTo = function (method) { - var obj = flag(this, 'object') - , itself = flag(this, 'itself') - , context = ('function' === typeof obj && !itself) - ? obj.prototype[method] - : obj[method]; - - this.assert( - 'function' === typeof context - , 'expected #{this} to respond to ' + util.inspect(method) - , 'expected #{this} to not respond to ' + util.inspect(method) - , 'function' - , typeof context - ); - - return this; -}; - -/** - * ### .itself - * - * Sets the `itself` flag, later used by the `respondTo` assertion. - * - * function Foo() {} - * Foo.bar = function() {} - * Foo.prototype.baz = function() {} - * - * expect(Foo).itself.to.respondTo('bar'); - * expect(Foo).itself.not.to.respondTo('baz'); - * - * @name itself - * @api public - */ -Object.defineProperty(Assertion.prototype, 'itself', - { get: function () { - flag(this, 'itself', true); - return this; - } - , configurable: true -}); - -/** - * ### .satisfy(method) - * - * Asserts that the target passes a given truth test. - * - * expect(1).to.satisfy(function(num) { return num > 0; }); - * - * @name satisfy - * @param {Function} matcher - * @api public - */ - -Assertion.prototype.satisfy = function (matcher) { - var obj = flag(this, 'object'); - this.assert( - matcher(obj) - , 'expected #{this} to satisfy ' + util.inspect(matcher) - , 'expected #{this} to not satisfy' + util.inspect(matcher) - , this.negate ? false : true - , matcher(obj) - ); - - return this; -}; - -/** - * ### .closeTo(expected, delta) - * - * Asserts that the target is equal `expected`, to within a +/- `delta` range. - * - * expect(1.5).to.be.closeTo(1, 0.5); - * - * @name closeTo - * @param {Number} expected - * @param {Number} delta - * @api public - */ - -Assertion.prototype.closeTo = function (expected, delta) { - var obj = flag(this, 'object'); - this.assert( - (obj - delta === expected) || (obj + delta === expected) - , 'expected #{this} to be close to ' + expected + ' +/- ' + delta - , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta); - - return this; -}; - -/*! - * Aliases. - */ - -(function alias(name, as){ - Assertion.prototype[as] = Assertion.prototype[name]; - return alias; -}) -('equal', 'eq') -('above', 'gt') -('below', 'lt') -('length', 'lengthOf') -('keys', 'key') -('ownProperty', 'haveOwnProperty') -('above', 'greaterThan') -('below', 'lessThan') -('Throw', 'throws') -('Throw', 'throw') -('instanceOf', 'instanceof'); - -}); // module: assertion.js - -require.register("browser/error.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - -module.exports = AssertionError; - -function AssertionError (options) { - options = options || {}; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - - if (options.stackStartFunction && Error.captureStackTrace) { - var stackStartFunction = options.stackStartFunction; - Error.captureStackTrace(this, stackStartFunction); - } -} - -AssertionError.prototype = Object.create(Error.prototype); -AssertionError.prototype.name = 'AssertionError'; -AssertionError.prototype.constructor = AssertionError; - -AssertionError.prototype.toString = function() { - return this.message; -}; - -}); // module: browser/error.js - -require.register("chai.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - -var used = [] - , exports = module.exports = {}; - -/*! - * Chai version - */ - -exports.version = '1.0.4'; - -/*! - * Primary `Assertion` prototype - */ - -exports.Assertion = require('./assertion'); - -/*! - * Assertion Error - */ - -exports.AssertionError = require('./browser/error'); - -/*! - * Utils for plugins (not exported) - */ - -var util = require('./utils'); - -/** - * # .use(function) - * - * Provides a way to extend the internals of Chai - * - * @param {Function} - * @returns {this} for chaining - * @api public - */ - -exports.use = function (fn) { - if (!~used.indexOf(fn)) { - fn(this, util); - used.push(fn); - } - - return this; -}; - -/*! - * Expect interface - */ - -var expect = require('./interface/expect'); -exports.use(expect); - -/*! - * Should interface - */ - -var should = require('./interface/should'); -exports.use(should); - -/*! - * Assert interface - */ - -var assert = require('./interface/assert'); -exports.use(assert); - -}); // module: chai.js - -require.register("interface/assert.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - - -module.exports = function (chai, util) { - - /*! - * Chai dependencies. - */ - - var Assertion = chai.Assertion - , flag = util.flag; - - /*! - * Module export. - */ - - /** - * ### assert(expression, message) - * - * Write your own test expressions. - * - * assert('foo' !== 'bar', 'foo is not bar'); - * assert(Array.isArray([]), 'empty arrays are arrays'); - * - * @param {Mixed} expression to test for truthiness - * @param {String} message to display on error - * @name assert - * @api public - */ - - var assert = chai.assert = function (express, errmsg) { - var test = new Assertion(null); - test.assert( - express - , errmsg - , '[ negation message unavailable ]' - ); - }; - - /** - * ### .fail(actual, expected, [message], [operator]) - * - * Throw a failure. Node.js `assert` module-compatible. - * - * @name fail - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @param {String} operator - * @api public - */ - - assert.fail = function (actual, expected, message, operator) { - throw new chai.AssertionError({ - actual: actual - , expected: expected - , message: message - , operator: operator - , stackStartFunction: assert.fail - }); - }; - - /** - * ### .ok(object, [message]) - * - * Asserts that `object` is truthy. - * - * assert.ok('everything', 'everything is ok'); - * assert.ok(false, 'this will fail'); - * - * @name ok - * @param {Mixed} object to test - * @param {String} message - * @api public - */ - - assert.ok = function (val, msg) { - new Assertion(val, msg).is.ok; - }; - - /** - * ### .equal(actual, expected, [message]) - * - * Asserts non-strict equality (`==`) of `actual` and `expected`. - * - * assert.equal(3, '3', '== coerces values to strings'); - * - * @name equal - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.equal = function (act, exp, msg) { - var test = new Assertion(act, msg); - - test.assert( - exp == flag(test, 'object') - , 'expected #{this} to equal #{exp}' - , 'expected #{this} to not equal #{act}' - , exp - , act - ); - }; - - /** - * ### .notEqual(actual, expected, [message]) - * - * Asserts non-strict inequality (`!=`) of `actual` and `expected`. - * - * assert.notEqual(3, 4, 'these numbers are not equal'); - * - * @name notEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.notEqual = function (act, exp, msg) { - var test = new Assertion(act, msg); - - test.assert( - exp != flag(test, 'object') - , 'expected #{this} to not equal #{exp}' - , 'expected #{this} to equal #{act}' - , exp - , act - ); - }; - - /** - * ### .strictEqual(actual, expected, [message]) - * - * Asserts strict equality (`===`) of `actual` and `expected`. - * - * assert.strictEqual(true, true, 'these booleans are strictly equal'); - * - * @name strictEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.strictEqual = function (act, exp, msg) { - new Assertion(act, msg).to.equal(exp); - }; - - /** - * ### .notStrictEqual(actual, expected, [message]) - * - * Asserts strict inequality (`!==`) of `actual` and `expected`. - * - * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); - * - * @name notStrictEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.notStrictEqual = function (act, exp, msg) { - new Assertion(act, msg).to.not.equal(exp); - }; - - /** - * ### .deepEqual(actual, expected, [message]) - * - * Asserts that `actual` is deeply equal to `expected`. - * - * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); - * - * @name deepEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.deepEqual = function (act, exp, msg) { - new Assertion(act, msg).to.eql(exp); - }; - - /** - * ### .notDeepEqual(actual, expected, [message]) - * - * Assert that `actual` is not deeply equal to `expected`. - * - * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); - * - * @name notDeepEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @api public - */ - - assert.notDeepEqual = function (act, exp, msg) { - new Assertion(act, msg).to.not.eql(exp); - }; - - /** - * ### .isTrue(value, [message]) - * - * Asserts that `value` is true. - * - * var teaServed = true; - * assert.isTrue(teaServed, 'the tea has been served'); - * - * @name isTrue - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isTrue = function (val, msg) { - new Assertion(val, msg).is['true']; - }; - - /** - * ### .isFalse(value, [message]) - * - * Asserts that `value` is false. - * - * var teaServed = false; - * assert.isFalse(teaServed, 'no tea yet? hmm...'); - * - * @name isFalse - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isFalse = function (val, msg) { - new Assertion(val, msg).is['false']; - }; - - /** - * ### .isNull(value, [message]) - * - * Asserts that `value` is null. - * - * assert.isNull(err, 'there was no error'); - * - * @name isNull - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNull = function (val, msg) { - new Assertion(val, msg).to.equal(null); - }; - - /** - * ### .isNotNull(value, [message]) - * - * Asserts that `value` is not null. - * - * var tea = 'tasty chai'; - * assert.isNotNull(tea, 'great, time for tea!'); - * - * @name isNotNull - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotNull = function (val, msg) { - new Assertion(val, msg).to.not.equal(null); - }; - - /** - * ### .isUndefined(value, [message]) - * - * Asserts that `value` is `undefined`. - * - * var tea; - * assert.isUndefined(tea, 'no tea defined'); - * - * @name isUndefined - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isUndefined = function (val, msg) { - new Assertion(val, msg).to.equal(undefined); - }; - - /** - * ### .isDefined(value, [message]) - * - * Asserts that `value` is not `undefined`. - * - * var tea = 'cup of chai'; - * assert.isDefined(tea, 'tea has been defined'); - * - * @name isUndefined - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isDefined = function (val, msg) { - new Assertion(val, msg).to.not.equal(undefined); - }; - - /** - * ### .isFunction(value, [message]) - * - * Asserts that `value` is a function. - * - * function serveTea() { return 'cup of tea'; }; - * assert.isFunction(serveTea, 'great, we can have tea now'); - * - * @name isFunction - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isFunction = function (val, msg) { - new Assertion(val, msg).to.be.a('function'); - }; - - /** - * ### .isNotFunction(value, [message]) - * - * Asserts that `value` is _not_ a function. - * - * var serveTea = [ 'heat', 'pour', 'sip' ]; - * assert.isNotFunction(serveTea, 'great, we have listed the steps'); - * - * @name isNotFunction - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotFunction = function (val, msg) { - new Assertion(val, msg).to.not.be.a('function'); - }; - - /** - * ### .isObject(value, [message]) - * - * Asserts that `value` is an object (as revealed by - * `Object.prototype.toString`). - * - * var selection = { name: 'Chai', serve: 'with spices' }; - * assert.isObject(selection, 'tea selection is an object'); - * - * @name isObject - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isObject = function (val, msg) { - new Assertion(val, msg).to.be.a('object'); - }; - - /** - * ### .isNotObject(value, [message]) - * - * Asserts that `value` is _not_ an object. - * - * var selection = 'chai' - * assert.isObject(selection, 'tea selection is not an object'); - * assert.isObject(null, 'null is not an object'); - * - * @name isNotObject - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotObject = function (val, msg) { - new Assertion(val, msg).to.not.be.a('object'); - }; - - /** - * ### .isArray(value, [message]) - * - * Asserts that `value` is an array. - * - * var menu = [ 'green', 'chai', 'oolong' ]; - * assert.isArray(menu, 'what kind of tea do we want?'); - * - * @name isArray - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isArray = function (val, msg) { - new Assertion(val, msg).to.be.an('array'); - }; - - /** - * ### .isNotArray(value, [message]) - * - * Asserts that `value` is _not_ an array. - * - * var menu = 'green|chai|oolong'; - * assert.isNotArray(menu, 'what kind of tea do we want?'); - * - * @name isNotArray - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotArray = function (val, msg) { - new Assertion(val, msg).to.not.be.an('array'); - }; - - /** - * ### .isString(value, [message]) - * - * Asserts that `value` is a string. - * - * var teaOrder = 'chai'; - * assert.isString(teaOrder, 'order placed'); - * - * @name isString - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isString = function (val, msg) { - new Assertion(val, msg).to.be.a('string'); - }; - - /** - * ### .isNotString(value, [message]) - * - * Asserts that `value` is _not_ a string. - * - * var teaOrder = 4; - * assert.isNotString(teaOrder, 'order placed'); - * - * @name isNotString - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotString = function (val, msg) { - new Assertion(val, msg).to.not.be.a('string'); - }; - - /** - * ### .isNumber(value, [message]) - * - * Asserts that `value` is a number. - * - * var cups = 2; - * assert.isNumber(cups, 'how many cups'); - * - * @name isNumber - * @param {Number} value - * @param {String} message - * @api public - */ - - assert.isNumber = function (val, msg) { - new Assertion(val, msg).to.be.a('number'); - }; - - /** - * ### .isNotNumber(value, [message]) - * - * Asserts that `value` is _not_ a number. - * - * var cups = '2 cups please'; - * assert.isNotNumber(cups, 'how many cups'); - * - * @name isNotNumber - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotNumber = function (val, msg) { - new Assertion(val, msg).to.not.be.a('number'); - }; - - /** - * ### .isBoolean(value, [message]) - * - * Asserts that `value` is a boolean. - * - * var teaReady = true - * , teaServed = false; - * - * assert.isBoolean(teaReady, 'is the tea ready'); - * assert.isBoolean(teaServed, 'has tea been served'); - * - * @name isBoolean - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isBoolean = function (val, msg) { - new Assertion(val, msg).to.be.a('boolean'); - }; - - /** - * ### .isNotBoolean(value, [message]) - * - * Asserts that `value` is _not_ a boolean. - * - * var teaReady = 'yep' - * , teaServed = 'nope'; - * - * assert.isNotBoolean(teaReady, 'is the tea ready'); - * assert.isNotBoolean(teaServed, 'has tea been served'); - * - * @name isNotBoolean - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.isNotBoolean = function (val, msg) { - new Assertion(val, msg).to.not.be.a('boolean'); - }; - - /** - * ### .typeOf(value, name, [message]) - * - * Asserts that `value`'s type is `name`, as determined by - * `Object.prototype.toString`. - * - * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); - * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); - * assert.typeOf('tea', 'string', 'we have a string'); - * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); - * assert.typeOf(null, 'null', 'we have a null'); - * assert.typeOf(undefined, 'undefined', 'we have an undefined'); - * - * @name typeOf - * @param {Mixed} value - * @param {String} name - * @param {String} message - * @api public - */ - - assert.typeOf = function (val, type, msg) { - new Assertion(val, msg).to.be.a(type); - }; - - /** - * ### .notTypeOf(value, name, [message]) - * - * Asserts that `value`'s type is _not_ `name`, as determined by - * `Object.prototype.toString`. - * - * assert.notTypeOf('tea', 'number', 'strings are not numbers'); - * - * @name notTypeOf - * @param {Mixed} value - * @param {String} typeof name - * @param {String} message - * @api public - */ - - assert.notTypeOf = function (val, type, msg) { - new Assertion(val, msg).to.not.be.a(type); - }; - - /** - * ### .instanceOf(object, constructor, [message]) - * - * Asserts that `value` is an instance of `constructor`. - * - * var Tea = function (name) { this.name = name; } - * , chai = new Tea('chai'); - * - * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); - * - * @name instanceOf - * @param {Object} object - * @param {Constructor} constructor - * @param {String} message - * @api public - */ - - assert.instanceOf = function (val, type, msg) { - new Assertion(val, msg).to.be.instanceOf(type); - }; - - /** - * ### .notInstanceOf(object, constructor, [message]) - * - * Asserts `value` is not an instance of `constructor`. - * - * var Tea = function (name) { this.name = name; } - * , chai = new String('chai'); - * - * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); - * - * @name notInstanceOf - * @param {Object} object - * @param {Constructor} constructor - * @param {String} message - * @api public - */ - - assert.notInstanceOf = function (val, type, msg) { - new Assertion(val, msg).to.not.be.instanceOf(type); - }; - - /** - * ### .include(haystack, needle, [message]) - * - * Asserts that `haystack` includes `needle`. Works - * for strings and arrays. - * - * assert.include('foobar', 'bar', 'foobar contains string "bar"'); - * assert.include([ 1, 2, 3 ], 3, 'array contains value'); - * - * @name include - * @param {Array|String} haystack - * @param {Mixed} needle - * @param {String} message - * @api public - */ - - assert.include = function (exp, inc, msg) { - var obj = new Assertion(exp, msg); - - if (Array.isArray(exp)) { - obj.to.include(inc); - } else if ('string' === typeof exp) { - obj.to.contain.string(inc); - } - }; - - /** - * ### .match(value, regexp, [message]) - * - * Asserts that `value` matches the regular expression `regexp`. - * - * assert.match('foobar', /^foo/, 'regexp matches'); - * - * @name match - * @param {Mixed} value - * @param {RegExp} regexp - * @param {String} message - * @api public - */ - - assert.match = function (exp, re, msg) { - new Assertion(exp, msg).to.match(re); - }; - - /** - * ### .notMatch(value, regexp, [message]) - * - * Asserts that `value` does not match the regular expression `regexp`. - * - * assert.notMatch('foobar', /^foo/, 'regexp does not match'); - * - * @name notMatch - * @param {Mixed} value - * @param {RegExp} regexp - * @param {String} message - * @api public - */ - - assert.notMatch = function (exp, re, msg) { - new Assertion(exp, msg).to.not.match(re); - }; - - /** - * ### .property(object, property, [message]) - * - * Asserts that `object` has a property named by `property`. - * - * assert.property({ tea: { green: 'matcha' }}, 'tea'); - * - * @name property - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.property = function (obj, prop, msg) { - new Assertion(obj, msg).to.have.property(prop); - }; - - /** - * ### .notProperty(object, property, [message]) - * - * Asserts that `object` does _not_ have a property named by `property`. - * - * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); - * - * @name notProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.notProperty = function (obj, prop, msg) { - new Assertion(obj, msg).to.not.have.property(prop); - }; - - /** - * ### .deepProperty(object, property, [message]) - * - * Asserts that `object` has a property named by `property`, which can be a - * string using dot- and bracket-notation for deep reference. - * - * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green'); - * - * @name deepProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.deepProperty = function (obj, prop, msg) { - new Assertion(obj, msg).to.have.deep.property(prop); - }; - - /** - * ### .notDeepProperty(object, property, [message]) - * - * Asserts that `object` does _not_ have a property named by `property`, which - * can be a string using dot- and bracket-notation for deep reference. - * - * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); - * - * @name notDeepProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.notDeepProperty = function (obj, prop, msg) { - new Assertion(obj, msg).to.not.have.deep.property(prop); - }; - - /** - * ### .propertyVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property` with value given - * by `value`. - * - * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); - * - * @name propertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.propertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg).to.have.property(prop, val); - }; - - /** - * ### .propertyNotVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property`, but with a value - * different from that given by `value`. - * - * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad'); - * - * @name propertyNotVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.propertyNotVal = function (obj, prop, val, msg) { - new Assertion(obj, msg).to.not.have.property(prop, val); - }; - - /** - * ### .deepPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property` with value given - * by `value`. `property` can use dot- and bracket-notation for deep - * reference. - * - * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); - * - * @name deepPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.deepPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg).to.have.deep.property(prop, val); - }; - - /** - * ### .deepPropertyNotVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property`, but with a value - * different from that given by `value`. `property` can use dot- and - * bracket-notation for deep reference. - * - * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); - * - * @name deepPropertyNotVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.deepPropertyNotVal = function (obj, prop, val, msg) { - new Assertion(obj, msg).to.not.have.deep.property(prop, val); - }; - - /** - * ### .lengthOf(object, length, [message]) - * - * Asserts that `object` has a `length` property with the expected value. - * - * assert.lengthOf([1,2,3], 3, 'array has length of 3'); - * assert.lengthOf('foobar', 5, 'string has length of 6'); - * - * @name lengthOf - * @param {Mixed} object - * @param {Number} length - * @param {String} message - * @api public - */ - - assert.lengthOf = function (exp, len, msg) { - new Assertion(exp, msg).to.have.length(len); - }; - - /** - * ### .throws(function, [constructor/regexp], [message]) - * - * Asserts that `function` will throw an error that is an instance of - * `constructor`, or alternately that it will throw an error with message - * matching `regexp`. - * - * assert.throw(fn, ReferenceError, 'function throws a reference error'); - * - * @name throws - * @alias throw - * @alias Throw - * @param {Function} function - * @param {ErrorConstructor} constructor - * @param {RegExp} regexp - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @api public - */ - - assert.Throw = function (fn, type, msg) { - if ('string' === typeof type) { - msg = type; - type = null; - } - - new Assertion(fn, msg).to.Throw(type); - }; - - /** - * ### .doesNotThrow(function, [constructor/regexp], [message]) - * - * Asserts that `function` will _not_ throw an error that is an instance of - * `constructor`, or alternately that it will not throw an error with message - * matching `regexp`. - * - * assert.doesNotThrow(fn, Error, 'function does not throw'); - * - * @name doesNotThrow - * @param {Function} function - * @param {ErrorConstructor} constructor - * @param {RegExp} regexp - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @api public - */ - - assert.doesNotThrow = function (fn, type, msg) { - if ('string' === typeof type) { - msg = type; - type = null; - } - - new Assertion(fn, msg).to.not.Throw(type); - }; - - /** - * ### .operator(val1, operator, val2, [message]) - * - * Compares two values using `operator`. - * - * assert.operator(1, '<', 2, 'everything is ok'); - * assert.operator(1, '>', 2, 'this will fail'); - * - * @name operator - * @param {Mixed} val1 - * @param {String} operator - * @param {Mixed} val2 - * @param {String} message - * @api public - */ - - assert.operator = function (val, operator, val2, msg) { - if (!~['==', '===', '>', '>=', '<', '<=', '!=', '!=='].indexOf(operator)) { - throw new Error('Invalid operator "' + operator + '"'); - } - var test = new Assertion(eval(val + operator + val2), msg); - test.assert( - true === flag(test, 'object') - , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) - , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); - }; - - /*! - * Undocumented / untested - */ - - assert.ifError = function (val, msg) { - new Assertion(val, msg).to.not.be.ok; - }; - - /*! - * Aliases. - */ - - (function alias(name, as){ - assert[as] = assert[name]; - return alias; - }) - ('Throw', 'throw') - ('Throw', 'throws'); -}; - -}); // module: interface/assert.js - -require.register("interface/expect.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - -module.exports = function (chai, util) { - chai.expect = function (val, message) { - return new chai.Assertion(val, message); - }; -}; - - -}); // module: interface/expect.js - -require.register("interface/should.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011-2012 Jake Luer - * MIT Licensed - */ - -module.exports = function (chai, util) { - var Assertion = chai.Assertion; - - function loadShould () { - // modify Object.prototype to have `should` - Object.defineProperty(Object.prototype, 'should', - { set: function () {} - , get: function(){ - if (this instanceof String || this instanceof Number) { - return new Assertion(this.constructor(this)); - } else if (this instanceof Boolean) { - return new Assertion(this == true); - } - return new Assertion(this); - } - , configurable: true - }); - - var should = {}; - - should.equal = function (val1, val2) { - new Assertion(val1).to.equal(val2); - }; - - should.Throw = function (fn, errt, errs) { - new Assertion(fn).to.Throw(errt, errs); - }; - - should.exist = function (val) { - new Assertion(val).to.exist; - } - - // negation - should.not = {} - - should.not.equal = function (val1, val2) { - new Assertion(val1).to.not.equal(val2); - }; - - should.not.Throw = function (fn, errt, errs) { - new Assertion(fn).to.not.Throw(errt, errs); - }; - - should.not.exist = function (val) { - new Assertion(val).to.not.exist; - } - - should['throw'] = should['Throw']; - should.not['throw'] = should.not['Throw']; - - return should; - }; - - chai.should = loadShould; - chai.Should = loadShould; -}; - -}); // module: interface/should.js - -require.register("utils/addChainableMethod.js", function(module, exports, require){ -/*! - * Chai - addChainingMethod utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/*! - * Module dependencies - */ - -var transferFlags = require('./transferFlags'); - -/** - * ### addChainableMethod (ctx, name, method, chainingBehavior) - * - * Adds a method to an object, such that the method can also be chained. - * - * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.equal(str); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); - * - * The result can then be used as both a method assertion, executing both `method` and - * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. - * - * expect(fooStr).to.be.foo('bar'); - * expect(fooStr).to.be.foo.equal('foo'); - * - * @param {Object} ctx object to which the method is added - * @param {String} name of method to add - * @param {Function} method function to be used for `name`, when called - * @param {Function} chainingBehavior function to be called every time the property is accessed - * @name addChainableMethod - * @api public - */ - -module.exports = function (ctx, name, method, chainingBehavior) { - if (typeof chainingBehavior !== 'function') - chainingBehavior = function () { }; - - Object.defineProperty(ctx, name, - { get: function () { - chainingBehavior.call(this); - - var assert = function () { - var result = method.apply(this, arguments); - return result === undefined ? this : result; - }; - - // Re-enumerate every time to better accomodate plugins. - var asserterNames = Object.getOwnPropertyNames(ctx); - asserterNames.forEach(function (asserterName) { - var pd = Object.getOwnPropertyDescriptor(ctx, asserterName) - , functionProtoPD = Object.getOwnPropertyDescriptor(Function.prototype, asserterName); - // Avoid trying to overwrite things that we can't, like `length` and `arguments`. - if (functionProtoPD && !functionProtoPD.configurable) return; - if (asserterName === 'arguments') return; // @see chaijs/chai/issues/69 - Object.defineProperty(assert, asserterName, pd); - }); - - transferFlags(this, assert); - return assert; - } - , configurable: true - }); -}; - -}); // module: utils/addChainableMethod.js - -require.register("utils/addMethod.js", function(module, exports, require){ -/*! - * Chai - addMethod utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### addMethod (ctx, name, method) - * - * Adds a method to the prototype of an object. - * - * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.equal(str); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addMethod('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(fooStr).to.be.foo('bar'); - * - * @param {Object} ctx object to which the method is added - * @param {String} name of method to add - * @param {Function} method function to be used for name - * @name addMethod - * @api public - */ - -module.exports = function (ctx, name, method) { - ctx[name] = function () { - var result = method.apply(this, arguments); - return result === undefined ? this : result; - }; -}; - -}); // module: utils/addMethod.js - -require.register("utils/addProperty.js", function(module, exports, require){ -/*! - * Chai - addProperty utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### addProperty (ctx, name, getter) - * - * Adds a property to the prototype of an object. - * - * utils.addProperty(chai.Assertion.prototype, 'foo', function () { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.instanceof(Foo); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addProperty('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.be.foo; - * - * @param {Object} ctx object to which the property is added - * @param {String} name of property to add - * @param {Function} getter function to be used for name - * @name addProperty - * @api public - */ - -module.exports = function (ctx, name, getter) { - Object.defineProperty(ctx, name, - { get: function () { - var result = getter.call(this); - return result === undefined ? this : result; - } - , configurable: true - }); -}; - -}); // module: utils/addProperty.js - -require.register("utils/eql.js", function(module, exports, require){ -// This is directly from Node.js assert -// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/assert.js - - -module.exports = _deepEqual; - -// For browser implementation -if (!Buffer) { - var Buffer = { - isBuffer: function () { - return false; - } - }; -} - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - - } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - - return true; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual === expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical 'prototype' property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try { - var ka = Object.keys(a), - kb = Object.keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key])) return false; - } - return true; -} -}); // module: utils/eql.js - -require.register("utils/flag.js", function(module, exports, require){ -/*! - * Chai - flag utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### flag(object ,key, [value]) - * - * Get or set a flag value on an object. If a - * value is provided it will be set, else it will - * return the currently set value or `undefined` if - * the value is not set. - * - * utils.flag(this, 'foo', 'bar'); // setter - * utils.flag(this, 'foo'); // getter, returns `bar` - * - * @param {Object} object (constructed Assertion - * @param {String} key - * @param {Mixed} value (optional) - * @name flag - * @api private - */ - -module.exports = function (obj, key, value) { - var flags = obj.__flags || (obj.__flags = Object.create(null)); - if (arguments.length === 3) { - flags[key] = value; - } else { - return flags[key]; - } -}; - -}); // module: utils/flag.js - -require.register("utils/getActual.js", function(module, exports, require){ -/*! - * Chai - getActual utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * # getActual(object, [actual]) - * - * Returns the `actual` value for an Assertion - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - */ - -module.exports = function (obj, args) { - var actual = args[4]; - return 'undefined' !== actual ? actual : obj.obj; -}; - -}); // module: utils/getActual.js - -require.register("utils/getMessage.js", function(module, exports, require){ -/*! - * Chai - message composition utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/*! - * Module dependancies - */ - -var flag = require('./flag') - , getActual = require('./getActual') - , inspect = require('./inspect'); - -/** - * # getMessage(object, message, negateMessage) - * - * Construct the error message based on flags - * and template tags. Template tags will return - * a stringified inspection of the object referenced. - * - * Messsage template tags: - * - `#{this}` current asserted object - * - `#{act}` actual value - * - `#{exp}` expected value - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - */ - -module.exports = function (obj, args) { - var negate = flag(obj, 'negate') - , val = flag(obj, 'object') - , expected = args[3] - , actual = getActual(obj, args) - , msg = negate ? args[2] : args[1] - , flagMsg = flag(obj, 'message'); - - msg = msg || ''; - msg = msg - .replace(/#{this}/g, inspect(val)) - .replace(/#{act}/g, inspect(actual)) - .replace(/#{exp}/g, inspect(expected)); - - return flagMsg ? flagMsg + ': ' + msg : msg; -}; - -}); // module: utils/getMessage.js - -require.register("utils/getName.js", function(module, exports, require){ -/*! - * Chai - getName utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * # getName(func) - * - * Gets the name of a function, in a cross-browser way. - * - * @param {Function} a function (usually a constructor) - */ - -module.exports = function (func) { - if (func.name) return func.name; - - var match = /^\s?function ([^(]*)\(/.exec(func); - return match && match[1] ? match[1] : ""; -}; - -}); // module: utils/getName.js - -require.register("utils/getPathValue.js", function(module, exports, require){ -/*! - * Chai - getPathValue utility - * Copyright(c) 2012 Jake Luer - * @see https://github.com/logicalparadox/filtr - * MIT Licensed - */ - -/** - * ### .getPathValue(path, object) - * - * This allows the retrieval of values in an - * object given a string path. - * - * var obj = { - * prop1: { - * arr: ['a', 'b', 'c'] - * , str: 'Hello' - * } - * , prop2: { - * arr: [ { nested: 'Universe' } ] - * , str: 'Hello again!' - * } - * } - * - * The following would be the results. - * - * getPathValue('prop1.str', obj); // Hello - * getPathValue('prop1.att[2]', obj); // b - * getPathValue('prop2.arr[0].nested', obj); // Universe - * - * @param {String} path - * @param {Object} object - * @returns {Object} value or `undefined` - * @name getPathValue - * @api public - */ - -var getPathValue = module.exports = function (path, obj) { - var parsed = parsePath(path); - return _getPathValue(parsed, obj); -}; - -/*! - * ## parsePath(path) - * - * Helper function used to parse string object - * paths. Use in conjunction with `_getPathValue`. - * - * var parsed = parsePath('myobject.property.subprop'); - * - * ### Paths: - * - * * Can be as near infinitely deep and nested - * * Arrays are also valid using the formal `myobject.document[3].property`. - * - * @param {String} path - * @returns {Object} parsed - * @api private - */ - -function parsePath (path) { - var parts = path.split('.').filter(Boolean); - return parts.map(function (value) { - var re = /([A-Za-z0-9]+)\[(\d+)\]$/ - , mArr = re.exec(value) - , val; - if (mArr) val = { p: mArr[1], i: parseFloat(mArr[2]) }; - return val || value; - }); -}; - -/*! - * ## _getPathValue(parsed, obj) - * - * Helper companion function for `.parsePath` that returns - * the value located at the parsed address. - * - * var value = getPathValue(parsed, obj); - * - * @param {Object} parsed definition from `parsePath`. - * @param {Object} object to search against - * @returns {Object|Undefined} value - * @api private - */ - -function _getPathValue (parsed, obj) { - var tmp = obj - , res; - for (var i = 0, l = parsed.length; i < l; i++) { - var part = parsed[i]; - if (tmp) { - if ('object' === typeof part && tmp[part.p]) { - tmp = tmp[part.p][part.i]; - } else { - tmp = tmp[part]; - } - if (i == (l - 1)) res = tmp; - } else { - res = undefined; - } - } - return res; -}; - -}); // module: utils/getPathValue.js - -require.register("utils/index.js", function(module, exports, require){ -/*! - * chai - * Copyright(c) 2011 Jake Luer - * MIT Licensed - */ - -/*! - * Main exports - */ - -var exports = module.exports = {}; - -/*! - * test utility - */ - -exports.test = require('./test'); - -/*! - * message utility - */ - -exports.getMessage = require('./getMessage'); - -/*! - * actual utility - */ - -exports.getActual = require('./getActual'); - -/*! - * Inspect util - */ - -exports.inspect = require('./inspect'); - -/*! - * Flag utility - */ - -exports.flag = require('./flag'); - -/*! - * Flag transferring utility - */ - -exports.transferFlags = require('./transferFlags'); - -/*! - * Deep equal utility - */ - -exports.eql = require('./eql'); - -/*! - * Deep path value - */ - -exports.getPathValue = require('./getPathValue'); - -/*! - * Function name - */ - -exports.getName = require('./getName'); - -/*! - * add Property - */ - -exports.addProperty = require('./addProperty'); - -/*! - * add Method - */ - -exports.addMethod = require('./addMethod'); - -/*! - * overwrite Property - */ - -exports.overwriteProperty = require('./overwriteProperty'); - -/*! - * overwrite Method - */ - -exports.overwriteMethod = require('./overwriteMethod'); - -/*! - * Add a chainable method - */ - -exports.addChainableMethod = require('./addChainableMethod'); - - -}); // module: utils/index.js - -require.register("utils/inspect.js", function(module, exports, require){ -// This is (almost) directly from Node.js utils -// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js - -var getName = require('./getName'); - -module.exports = inspect; - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Boolean} showHidden Flag that shows hidden (not enumerable) - * properties of objects. - * @param {Number} depth Depth in which to descend in object. Default is 2. - * @param {Boolean} colors Flag to turn on ANSI escape codes to color the - * output. Default is false (no coloring). - */ -function inspect(obj, showHidden, depth, colors) { - var ctx = { - showHidden: showHidden, - seen: [], - stylize: function (str) { return str; } - }; - return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); -} - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (value && typeof value.inspect === 'function' && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - return value.inspect(recurseTimes); - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var visibleKeys = Object.keys(value); - var keys = ctx.showHidden ? Object.getOwnPropertyNames(value) : visibleKeys; - - // Some type of object without properties can be shortcutted. - // In IE, errors have a single `stack` property, or if they are vanilla `Error`, - // a `stack` plus `description` property; ignore those for consistency. - if (keys.length === 0 || (isError(value) && ( - (keys.length === 1 && keys[0] === 'stack') || - (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') - ))) { - if (typeof value === 'function') { - var name = getName(value); - var nameSuffix = name ? ': ' + name : ''; - return ctx.stylize('[Function' + nameSuffix + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (typeof value === 'function') { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - return formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - switch (typeof value) { - case 'undefined': - return ctx.stylize('undefined', 'undefined'); - - case 'string': - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - - case 'number': - return ctx.stylize('' + value, 'number'); - - case 'boolean': - return ctx.stylize('' + value, 'boolean'); - } - // For some reason typeof null is "object", so special case here. - if (value === null) { - return ctx.stylize('null', 'null'); - } -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (Object.prototype.hasOwnProperty.call(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str; - if (value.__lookupGetter__) { - if (value.__lookupGetter__(key)) { - if (value.__lookupSetter__(key)) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (value.__lookupSetter__(key)) { - str = ctx.stylize('[Setter]', 'special'); - } - } - } - if (visibleKeys.indexOf(key) < 0) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(value[key]) < 0) { - if (recurseTimes === null) { - str = formatValue(ctx, value[key], null); - } else { - str = formatValue(ctx, value[key], recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (typeof name === 'undefined') { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - -function isArray(ar) { - return Array.isArray(ar) || - (typeof ar === 'object' && objectToString(ar) === '[object Array]'); -} - -function isRegExp(re) { - return typeof re === 'object' && objectToString(re) === '[object RegExp]'; -} - -function isDate(d) { - return typeof d === 'object' && objectToString(d) === '[object Date]'; -} - -function isError(e) { - return typeof e === 'object' && objectToString(e) === '[object Error]'; -} - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -}); // module: utils/inspect.js - -require.register("utils/overwriteMethod.js", function(module, exports, require){ -/*! - * Chai - overwriteMethod utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### overwriteMethod (ctx, name, fn) - * - * Overwites an already existing method and provides - * access to previous function. Must return function - * to be used for name. - * - * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { - * return function (str) { - * var obj = utils.flag(this, 'object'); - * if (obj instanceof Foo) { - * new chai.Assertion(obj.value).to.equal(str); - * } else { - * _super.apply(this, arguments); - * } - * } - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.overwriteMethod('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.equal('bar'); - * - * @param {Object} ctx object whose method is to be overwritten - * @param {String} name of method to overwrite - * @param {Function} method function that returns a function to be used for name - * @name overwriteMethod - * @api public - */ - -module.exports = function (ctx, name, method) { - var _method = ctx[name] - , _super = function () { return this; }; - - if (_method && 'function' === typeof _method) - _super = _method; - - ctx[name] = function () { - var result = method(_super).apply(this, arguments); - return result === undefined ? this : result; - } -}; - -}); // module: utils/overwriteMethod.js - -require.register("utils/overwriteProperty.js", function(module, exports, require){ -/*! - * Chai - overwriteProperty utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### overwriteProperty (ctx, name, fn) - * - * Overwites an already existing property getter and provides - * access to previous value. Must return function to use as getter. - * - * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { - * return function () { - * var obj = utils.flag(this, 'object'); - * if (obj instanceof Foo) { - * new chai.Assertion(obj.name).to.equal('bar'); - * } else { - * _super.call(this); - * } - * } - * }); - * - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.overwriteProperty('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.be.ok; - * - * @param {Object} ctx object whose property is to be overwritten - * @param {String} name of property to overwrite - * @param {Function} getter function that returns a getter function to be used for name - * @name overwriteProperty - * @api public - */ - -module.exports = function (ctx, name, getter) { - var _get = Object.getOwnPropertyDescriptor(ctx, name) - , _super = function () {}; - - if (_get && 'function' === typeof _get.get) - _super = _get.get - - Object.defineProperty(ctx, name, - { get: function () { - var result = getter(_super).call(this); - return result === undefined ? this : result; - } - , configurable: true - }); -}; - -}); // module: utils/overwriteProperty.js - -require.register("utils/test.js", function(module, exports, require){ -/*! - * Chai - test utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/*! - * Module dependancies - */ - -var flag = require('./flag'); - -/** - * # test(object, expression) - * - * Test and object for expression. - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - */ - -module.exports = function (obj, args) { - var negate = flag(obj, 'negate') - , expr = args[0]; - return negate ? !expr : expr; -}; - -}); // module: utils/test.js - -require.register("utils/transferFlags.js", function(module, exports, require){ -/*! - * Chai - transferFlags utility - * Copyright(c) 2012 Jake Luer - * MIT Licensed - */ - -/** - * ### transferFlags(assertion, object, includeAll = true) - * - * Transfer all the flags for `assertion` to `object`. If - * `includeAll` is set to `false`, then the base Chai - * assertion flags (namely `object`, `ssfi`, and `message`) - * will not be transferred. - * - * - * var newAssertion = new Assertion(); - * utils.transferFlags(assertion, newAssertion); - * - * var anotherAsseriton = new Assertion(myObj); - * utils.transferFlags(assertion, anotherAssertion, false); - * - * @param {Assertion} assertion the assertion to transfer the flags from - * @param {Object} object the object to transfer the flags too; usually a new assertion - * @param {Boolean} includeAll - * @name getAllFlags - * @api private - */ - -module.exports = function (assertion, object, includeAll) { - var flags = assertion.__flags || (assertion.__flags = Object.create(null)); - - if (!object.__flags) { - object.__flags = Object.create(null); - } - - includeAll = arguments.length === 3 ? includeAll : true; - - for (var flag in flags) { - if (includeAll || - (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) { - object.__flags[flag] = flags[flag]; - } - } -}; - -}); // module: utils/transferFlags.js - - - return require('chai'); -}); \ No newline at end of file From d1024a3ea8298dda76afee2196b5f94472538cff Mon Sep 17 00:00:00 2001 From: DavidLi119 Date: Thu, 14 Mar 2019 08:14:53 -0400 Subject: [PATCH 1309/1771] Update doc examples "tests.html" (#3811) * Converted URLs to reference current package releases --- docs/example/tests.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/example/tests.html b/docs/example/tests.html index b4c8a7354e..77e99ddf2a 100644 --- a/docs/example/tests.html +++ b/docs/example/tests.html @@ -3,13 +3,13 @@ Mocha - +
              - - + + From 586bf78499b23e5f514b534cf93cf31e53fd0a42 Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Sat, 23 Mar 2019 10:22:38 -0500 Subject: [PATCH 1310/1771] Update JS-YAML to address security issue (#3845) https://nodesecurity.io/advisories/788 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cce95ce7d1..b822828a91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9266,9 +9266,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" diff --git a/package.json b/package.json index 773bf7bcf8..c03ce83502 100644 --- a/package.json +++ b/package.json @@ -501,7 +501,7 @@ "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.12.0", + "js-yaml": "3.13.0", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", From 8aa2fc4ceb765b59e2306ae545204dec3b40eb5c Mon Sep 17 00:00:00 2001 From: "James D. Rogers" Date: Thu, 28 Mar 2019 20:55:50 +0900 Subject: [PATCH 1311/1771] Fix issue 3714, hide pound icon showing on hover header on docs page (#3850) --- docs/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/css/style.css b/docs/css/style.css index 5cd4d70a1b..dd60370a30 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -141,6 +141,7 @@ a.direct-link { background: url(../images/link-icon.svg) center center no-repeat; background-size: auto 60%; opacity: 0; + overflow: hidden; position: absolute; text-decoration: none; text-indent: -60px; From 81cfa9072b79fee57ba8fe1b9ddf8d774aa41f2e Mon Sep 17 00:00:00 2001 From: Carl-Erik Kopseng Date: Sun, 31 Mar 2019 18:34:45 +0200 Subject: [PATCH 1312/1771] Copy Suite property "root" when cloning; closes #3847 (#3848) --- lib/suite.js | 1 + test/unit/suite.spec.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/suite.js b/lib/suite.js index 6d1d0fb56e..191d946b50 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -102,6 +102,7 @@ Suite.prototype.clone = function() { var suite = new Suite(this.title); debug('clone'); suite.ctx = this.ctx; + suite.root = this.root; suite.timeout(this.timeout()); suite.retries(this.retries()); suite.enableTimeouts(this.enableTimeouts()); diff --git a/test/unit/suite.spec.js b/test/unit/suite.spec.js index 2a1d639c53..1be948e1c6 100644 --- a/test/unit/suite.spec.js +++ b/test/unit/suite.spec.js @@ -23,7 +23,7 @@ describe('Suite', function() { describe('.clone()', function() { beforeEach(function() { - this.suite = new Suite('To be cloned'); + this.suite = new Suite('To be cloned', {}, true); this.suite._timeout = 3043; this.suite._slow = 101; this.suite._bail = true; @@ -74,6 +74,10 @@ describe('Suite', function() { it('should not copy the values from the _afterAll array', function() { expect(this.suite.clone()._afterAll, 'to be empty'); }); + + it('should copy the root property', function() { + expect(this.suite.clone().root, 'to be', true); + }); }); describe('.timeout()', function() { From e87c689f9c007b7a9a05b246fa271382b8577d39 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 2 Apr 2019 23:55:41 +0200 Subject: [PATCH 1313/1771] Deprecate this.skip() for "after all" hooks (#3719) Print a DeprecationWarning when `this.skip()` is used in `after` hooks. --- docs/index.md | 6 +++-- lib/runner.js | 10 +++++++-- .../pending/skip-sync-after.fixture.js | 18 +++++++++++++++ test/integration/pending.spec.js | 22 +++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 test/integration/fixtures/pending/skip-sync-after.fixture.js diff --git a/docs/index.md b/docs/index.md index 34dd8973a0..0f99a5e39e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -626,7 +626,7 @@ Because this test _does nothing_, it will be reported as _passing_. > _Best practice_: Don't do nothing! A test should make an assertion or use `this.skip()`. -To skip _multiple_ tests in this manner, use `this.skip()` in a "before" hook: +To skip _multiple_ tests in this manner, use `this.skip()` in a "before all" hook: ```js before(function() { @@ -662,6 +662,8 @@ describe('outer', function() { }); ``` +Skipping a test within an "after all" hook is deprecated and will throw an exception in a future version of Mocha. Use a return statement or other means to abort hook execution. + > Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and hooks. ## Retry Tests @@ -910,7 +912,7 @@ Enforce a rule that tests must be written in "async" style, meaning each test pr ### `--bail, -b` -Causes Mocha to stop running tests after the first test failure it encounters. Corresponding `after()` and `afterEach()` hooks are executed for potential cleanup. +Causes Mocha to stop running tests after the first test failure it encounters. Corresponding "after each" and "after all" hooks are executed for potential cleanup. `--bail` does _not_ imply `--exit`. diff --git a/lib/runner.js b/lib/runner.js index d13e37677b..e41f6c5f97 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -363,9 +363,9 @@ Runner.prototype.hook = function(name, fn) { } self.currentRunnable = hook; - if (name === 'beforeAll') { + if (name === HOOK_TYPE_BEFORE_ALL) { hook.ctx.currentTest = hook.parent.tests[0]; - } else if (name === 'afterAll') { + } else if (name === HOOK_TYPE_AFTER_ALL) { hook.ctx.currentTest = hook.parent.tests[hook.parent.tests.length - 1]; } else { hook.ctx.currentTest = self.test; @@ -388,6 +388,12 @@ Runner.prototype.hook = function(name, fn) { } if (err) { if (err instanceof Pending) { + if (name === HOOK_TYPE_AFTER_ALL) { + utils.deprecate( + 'Skipping a test within an "after all" hook is DEPRECATED and will throw an exception in a future version of Mocha. ' + + 'Use a return statement or other means to abort hook execution.' + ); + } if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { if (self.test) { self.test.pending = true; diff --git a/test/integration/fixtures/pending/skip-sync-after.fixture.js b/test/integration/fixtures/pending/skip-sync-after.fixture.js new file mode 100644 index 0000000000..45c6521f3c --- /dev/null +++ b/test/integration/fixtures/pending/skip-sync-after.fixture.js @@ -0,0 +1,18 @@ +'use strict'; + +describe('skip in after', function () { + it('should run this test-1', function () {}); + + after('should print DeprecationWarning', function () { + this.skip(); + throw new Error('never throws this error'); + }); + + describe('inner suite', function () { + it('should run this test-2', function () {}); + }); +}); + +describe('second suite', function () { + it('should run this test-3', function () {}); +}); diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index b6a7039201..7b96d36001 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -71,6 +71,28 @@ describe('pending', function() { }); }); + describe('in after', function() { + it('should run all tests', function(done) { + runMocha( + 'pending/skip-sync-after.fixture.js', + args, + function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have passed').and('to satisfy', { + passing: 3, + failing: 0, + pending: 0, + output: expect.it('to contain', '"after all" hook is DEPRECATED') + }); + done(); + }, + 'pipe' + ); + }); + }); + describe('in before', function() { it('should skip all suite specs', function(done) { run('pending/skip-sync-before.fixture.js', args, function(err, res) { From b079d24161ead240b5f7ec8dbfbe7449d0380b3b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 3 Apr 2019 09:36:14 -0700 Subject: [PATCH 1314/1771] upgrade deps as per npm audit fix; closes #3854 --- package-lock.json | 4525 ++++++--------------------------------------- package.json | 4 +- 2 files changed, 615 insertions(+), 3914 deletions(-) diff --git a/package-lock.json b/package-lock.json index b822828a91..0e0f00f463 100644 --- a/package-lock.json +++ b/package-lock.json @@ -582,15 +582,6 @@ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-red": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", @@ -743,7 +734,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -765,16 +756,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -1071,30 +1052,38 @@ } }, "assetgraph-builder": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.9.0.tgz", - "integrity": "sha512-MF/TKOK/4CDc5dMcMqXe81oamPlDHjvW86HuN81EJDokTKTNP7rFra1UBvImRZheCEjzsXqrLqgk46QWMEuJ3w==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.0.tgz", + "integrity": "sha512-HGpCM92CtNKtk/ijQzIt2icWbHVe05qh4pI8XeEt+/AGy+nkHkAtL9l22aD5bEgsrdiWRbT67+6+4+yxrJj/Iw==", "dev": true, "requires": { "assetgraph": "5.8.1", - "assetgraph-sprite": "^3.1.0", - "bluebird": "^3.5.0", + "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", "chalk": "^2.3.2", "esanimate": "^1.1.0", "estraverse": "^4.2.0", - "express-processimage": "8.0.0", + "express-processimage": "^8.1.0", "extend": "^3.0.0", - "histogram": "^3.0.0", + "histogram": "^3.0.1", "jpegtran": "^1.0.6", "lodash": "^4.14.1", "memoizesync": "^1.1.1", "optimist": "^0.6.1", "optipng": "^2.0.0", + "p-map": "^2.0.0", "passerror": "^1.1.1", "pngcrush": "^2.0.1", "pngquant": "^2.0.1", "urltools": "^0.4.1" + }, + "dependencies": { + "p-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", + "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", + "dev": true + } } }, "assetgraph-sprite": { @@ -1102,7 +1091,6 @@ "resolved": "https://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-3.1.0.tgz", "integrity": "sha512-heagKqj1ii247Wpg86U2+2rohzzq5lmqDSHCSVkCDvs2qyB51Grzd7A3owlVaeHcuNNM5BG5OJdAMLcq9gVSMQ==", "dev": true, - "optional": true, "requires": { "canvas": "^2.3.1" } @@ -1162,7 +1150,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1174,7 +1162,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1401,12 +1389,6 @@ "tweetnacl": "^0.14.3" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1674,9 +1656,18 @@ "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1812,7 +1803,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -2440,32 +2431,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "dev": true, - "requires": { - "file-type": "^3.1.0", - "readable-stream": "^2.0.2", - "uuid": "^2.0.1", - "vinyl": "^1.0.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -2606,7 +2571,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2641,11 +2606,10 @@ "dev": true }, "canvas": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.3.1.tgz", - "integrity": "sha512-jSxwf4V9AGD6t6yBC600xFZKjrfKTR0T0RUNlX/AODs/ifrfJHIQjFEK8iF2euNy6z7K3GNv82DJgTjYZZktqA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.1.tgz", + "integrity": "sha512-SaFomFqDuuuSTScTHQ7nXc5ea71Ieb8ctvwXjR7vzLsBMfp3euTv2xsTY70zIoC5r4sSQZYXv6tiHiORJ4y1vg==", "dev": true, - "optional": true, "requires": { "nan": "^2.12.1", "node-pre-gyp": "^0.11.0" @@ -2999,18 +2963,6 @@ "mimic-response": "^1.0.0" } }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true - }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -3088,12 +3040,6 @@ "simple-swizzle": "^0.2.2" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", @@ -3424,7 +3370,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3531,7 +3477,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -3720,9 +3666,9 @@ "dev": true }, "cssstyle": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", - "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { "cssom": "0.3.x" @@ -3793,12 +3739,6 @@ "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", "dev": true }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -4138,7 +4078,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4325,15 +4265,6 @@ "lodash.omit": "^4.5.0" } }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -4493,28 +4424,6 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "dev": true, - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - } - }, "easy-extender": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", @@ -4954,24 +4863,6 @@ } } }, - "eslint-config-pretty-standard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-pretty-standard/-/eslint-config-pretty-standard-2.0.1.tgz", - "integrity": "sha512-W/LDwjDJfcNqIMAdDbT0E7OJXovGsKAnrEKAR1zxRfRJs+Ii2OtM+0QuBJYZrNNN6z9jYpdgPcau6fQodSJi/w==", - "dev": true, - "requires": { - "eslint-plugin-promise": "3.6.0", - "eslint-plugin-react": "7.10.0" - }, - "dependencies": { - "eslint-plugin-promise": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", - "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", - "dev": true - } - } - }, "eslint-config-semistandard": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-13.0.0.tgz", @@ -5221,18 +5112,6 @@ "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", "dev": true }, - "eslint-plugin-react": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz", - "integrity": "sha512-18rzWn4AtbSUxFKKM7aCVcj5LXOhOKdwBino3KKWy4psxfPW0YtIbE8WNRDUdyHFL50BeLb6qFd4vpvNYyp7hw==", - "dev": true, - "requires": { - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, "eslint-plugin-standard": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", @@ -5370,24 +5249,6 @@ "safe-buffer": "^5.1.1" } }, - "exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", - "dev": true, - "requires": { - "async-each-series": "^1.1.0", - "object-assign": "^4.1.0" - }, - "dependencies": { - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true - } - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -5519,122 +5380,43 @@ } }, "expand-template": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true }, "express-processimage": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-8.0.0.tgz", - "integrity": "sha1-/fFT8ZyrTKFlvjgD0v4ePO6oY1o=", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-8.1.0.tgz", + "integrity": "sha512-jOg7kaokQyppQTBYhyzofyqbDqO3VI/HFew0CeIpWBVyH0by0zi0xWj8PLty+riWmgCIKr40K3uh73Ytv+PROw==", "dev": true, "requires": { "accepts": "^1.3.3", "animated-gif-detector": "^1.2.0", "bluebird": "^3.3.4", "createerror": "^1.1.0", - "eslint-config-pretty-standard": "^2.0.0", "exif-reader-paras20xx": "^1.1.1", "gm-papandreou": "^1.23.0-patch1", - "hijackresponse": "^3.0.0", + "hijackresponse": "^4.0.0", "httperrors": "^2.0.1", "icc": "^1.0.0", - "inkscape": "^1.1.1", - "jpegtran": "^1.0.5", + "inkscape": "^2.0.0", + "jpegtran": "^1.0.6", "mime": "^2.3.1", "optimist": "^0.6.1", - "optipng": "^1.0.0", + "optipng": "^2.0.0", "passerror": "^1.1.1", - "pngcrush": "^1.1.1", - "pngquant": "^1.2.0", - "sharp": "^0.20.4", + "pngcrush": "^2.0.1", + "pngquant": "^2.0.1", + "sharp": "^0.21.0", "underscore": "^1.8.3" }, "dependencies": { - "lru-cache": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", - "dev": true - }, - "memoizeasync": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memoizeasync/-/memoizeasync-1.0.0.tgz", - "integrity": "sha1-ewKjRvOIWrtdw3wKQ8HSAt6MtAo=", - "dev": true, - "requires": { - "lru-cache": "2.5.0", - "passerror": "1.1.1" - } - }, "mime": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true - }, - "optipng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/optipng/-/optipng-1.1.0.tgz", - "integrity": "sha1-LfjVdcU6u9ECU/9/ufrsgvoHPuY=", - "dev": true, - "requires": { - "gettemporaryfilepath": "1.0.0", - "memoizeasync": "1.0.0", - "optipng-bin": "3.1.4", - "which": "1.2.14" - } - }, - "pngcrush": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-1.1.1.tgz", - "integrity": "sha1-k9ZzGAPdLd+hU++UmML2/1Ietss=", - "dev": true, - "requires": { - "gettemporaryfilepath": "^0.0.1", - "memoizeasync": "^0.9.0", - "pngcrush-bin": "3.0.0", - "which": "^1.2.10" - }, - "dependencies": { - "gettemporaryfilepath": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/gettemporaryfilepath/-/gettemporaryfilepath-0.0.1.tgz", - "integrity": "sha1-uKLHAUu1zUFTTpg7XKFgo3RwhGk=", - "dev": true - }, - "memoizeasync": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/memoizeasync/-/memoizeasync-0.9.0.tgz", - "integrity": "sha1-noRlTQ3Pxd79fyUe8QCF0/DFqMY=", - "dev": true, - "requires": { - "lru-cache": "2.5.0", - "passerror": "1.1.1" - } - } - } - }, - "pngquant": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-1.3.0.tgz", - "integrity": "sha1-T/g/C7+zqjcGEVYLWoSh+UuT74s=", - "dev": true, - "requires": { - "memoizeasync": "1.0.0", - "pngquant-bin": "3.1.1", - "which": "1.2.14" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -5803,18 +5585,6 @@ } } }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -5904,6 +5674,12 @@ "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -6078,12 +5854,6 @@ } } }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -6144,9 +5914,9 @@ "dev": true }, "font-tracer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.0.1.tgz", - "integrity": "sha512-mXVDkzy3BcCkkd7qDdogMmd8QXQKyaIhlF3Kzdmo2N8I6PZbgpcPOPAZyN6ntAagZxqZXyWfOQKg6Ce1eE9Mbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.1.0.tgz", + "integrity": "sha512-IfLwFnWbOE0sAmPXzpq8aFyaJzbZniMkM7d5X6GvJG+p8InEmeJFAoZzCDrx67iPWtcifUwxAE/xVu4og8+w/w==", "dev": true, "requires": { "capitalize": "^2.0.0", @@ -6169,9 +5939,9 @@ } }, "fontkit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.7.8.tgz", - "integrity": "sha512-4bo/Sp+Ob/cE5f2aCre/N42mHe6hcIWUYmTRgEqLmJyPRX0m0KBl1jflMM70Vh7qZRoh97BcS3JQGrRvK1Ga7Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz", + "integrity": "sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ==", "dev": true, "requires": { "babel-runtime": "^6.11.6", @@ -6933,7 +6703,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7084,247 +6854,75 @@ "path-dirname": "^1.0.0" } }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" + "ini": "^1.3.4" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "gm-papandreou": { + "version": "1.23.0-patch1", + "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", + "integrity": "sha1-35cO+M+mn7r9wIl+dlOmEP4VVwk=", + "dev": true, + "requires": { + "array-parallel": "~0.1.3", + "array-series": "~0.1.5", + "cross-spawn": "^4.0.0", + "debug": "~2.2.0" }, "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "gm-papandreou": { - "version": "1.23.0-patch1", - "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", - "integrity": "sha1-35cO+M+mn7r9wIl+dlOmEP4VVwk=", - "dev": true, - "requires": { - "array-parallel": "~0.1.3", - "array-series": "~0.1.5", - "cross-spawn": "^4.0.0", - "debug": "~2.2.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" + "ms": "0.7.1" } }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7359,7 +6957,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7419,16 +7017,72 @@ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, - "gulp-decompress": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", + "hamljs": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", + "integrity": "sha1-e3EWz22+cnjkKz9u+HJaM+F3yOM=", + "dev": true + }, + "handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "dev": true, "requires": { - "archive-type": "^3.0.0", - "decompress": "^3.0.0", - "gulp-util": "^3.0.1", - "readable-stream": "^2.0.2" + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -7436,616 +7090,105 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "requires": { - "file-type": "^3.1.0" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "dev": true, - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } } } }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" + "has-symbol-support-x": "^1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "is-buffer": "^1.1.5" } } } }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "hamljs": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", - "integrity": "sha1-e3EWz22+cnjkKz9u+HJaM+F3yOM=", - "dev": true - }, - "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -8080,9 +7223,9 @@ "dev": true }, "hijackresponse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hijackresponse/-/hijackresponse-3.0.0.tgz", - "integrity": "sha1-gZe3B3tymIImS9bh+xddBySeBW0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hijackresponse/-/hijackresponse-4.0.0.tgz", + "integrity": "sha512-ilL2k2/k9NXk4QCx7dz7pV+ZRL8aOX9ZiaVD+5nql1fF5WdKNhXbPh4shyfICpgHoHiD4FKZ1jLgNKYDYhy0Yw==", "dev": true }, "histogram": { @@ -8090,7 +7233,6 @@ "resolved": "https://registry.npmjs.org/histogram/-/histogram-3.0.3.tgz", "integrity": "sha512-KXpWZm99kwSoY5ocS4tx5FVLsbOJFZIiyr1rXruNERxeznCwZY1JC7fPRKEyZ+HSwMaqwThMWYp2iM2WoEfsDw==", "dev": true, - "optional": true, "requires": { "canvas": "^2.3.1" } @@ -8388,7 +7530,6 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, - "optional": true, "requires": { "minimatch": "^3.0.4" } @@ -8475,20 +7616,23 @@ "dev": true }, "inkscape": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/inkscape/-/inkscape-1.2.0.tgz", - "integrity": "sha512-3XbLQjnfEp4hEJI+mTgAWwtKNN10cxu68IIz+dl2wiNvvETyJrZ9fWlXNTx38p28VMdzeVPXaDsCIOmv3yBZUw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inkscape/-/inkscape-2.0.0.tgz", + "integrity": "sha512-HajZYZn6zuytzOq8dPCtfymFBmUy6FE611ftdBy2RypcYrDxqSvDTnyrsqkAFXNtVWi8SScJiYA69Y9PuSFK2w==", "dev": true, "requires": { - "async": "=0.2.9", - "gettemporaryfilepath": "1.0.0" + "async": "^2.6.1", + "gettemporaryfilepath": "^1.0.0" }, "dependencies": { "async": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", - "integrity": "sha1-32MGD789Myhqdqr21Vophtn/hhk=", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } } } }, @@ -8595,12 +7739,6 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -8680,12 +7818,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", - "dev": true - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -8838,12 +7970,6 @@ "is-extglob": "^2.1.0" } }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true - }, "is-hexadecimal": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", @@ -9062,12 +8188,6 @@ "has-symbols": "^1.0.0" } }, - "is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -9095,12 +8215,6 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, "is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -9131,12 +8245,6 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "is-zip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -9475,15 +8583,6 @@ "promise": "^7.0.1" } }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "^3.0.3" - } - }, "jszip": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", @@ -9697,21 +8796,6 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, - "lazy-req": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -10214,60 +9298,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -10292,15 +9328,6 @@ "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", "dev": true }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", @@ -10313,41 +9340,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, "lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -10360,12 +9358,6 @@ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", @@ -10496,15 +9488,6 @@ "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -10557,7 +9540,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -10880,16 +9863,16 @@ } }, "markdownlint-cli": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.14.0.tgz", - "integrity": "sha512-EE2YBEgw7W38eCXeOA79I2pv33Rr5hLAkRqZtXJtEbTHKMQtVaVGLD2Qb4RDekYXgXyuR+LRXFE947WlxOvLXQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.14.1.tgz", + "integrity": "sha512-bHueUEp1NmSFPWvOk3SNWhRRAInrdvmuzlkMrZJptUF6jNXJ32OhPXicRw2xg43+NLiUI01V5sc1VIrRWLKgig==", "dev": true, "requires": { "commander": "~2.9.0", "deep-extend": "~0.5.1", "get-stdin": "~5.0.1", "glob": "~7.1.2", - "js-yaml": "~3.11.0", + "js-yaml": "~3.13.0", "lodash.differencewith": "~4.5.0", "lodash.flatten": "~4.4.0", "markdownlint": "~0.12.0", @@ -10917,16 +9900,6 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true - }, - "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } } } }, @@ -11081,7 +10054,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -11099,7 +10072,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -11114,15 +10087,6 @@ "source-map": "^0.5.6" } }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "merge2": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", @@ -11372,50 +10336,6 @@ "minimatch": "^3.0.4" } }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "mustache": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", @@ -11453,6 +10373,12 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", + "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11464,7 +10390,6 @@ "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, - "optional": true, "requires": { "debug": "^2.1.2", "iconv-lite": "^0.4.4", @@ -11476,7 +10401,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { "ms": "2.0.0" } @@ -11485,8 +10409,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true + "dev": true } } }, @@ -11581,7 +10504,7 @@ "dependencies": { "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -11619,7 +10542,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -11634,7 +10557,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -11648,7 +10571,6 @@ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", "dev": true, - "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", @@ -11680,12 +10602,6 @@ "@babel/parser": "^7.0.0" } }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true - }, "noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", @@ -11742,8 +10658,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true + "dev": true }, "npm-conf": { "version": "1.1.3", @@ -11768,7 +10683,6 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, - "optional": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -12228,9 +11142,9 @@ } }, "nwsapi": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.1.tgz", - "integrity": "sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", + "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", "dev": true }, "nyc": { @@ -13410,12 +12324,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", @@ -13473,645 +12381,17 @@ "memoizeasync": "^1.1.0", "optipng-bin": "^5.0.0", "which": "^1.2.14" - }, - "dependencies": { - "optipng-bin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", - "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", - "dev": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "logalot": "^2.0.0" - } - } } }, "optipng-bin": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", - "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", + "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", "dev": true, "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", "logalot": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "requires": { - "file-type": "^3.1.0" - } - }, - "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "dev": true, - "requires": { - "meow": "^3.1.0" - } - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "dev": true, - "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - } - }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "dev": true, - "requires": { - "rc": "^1.1.2" - } - }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "dev": true, - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" } }, "os-browserify": { @@ -14402,12 +12682,6 @@ "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", "dev": true }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -14547,1642 +12821,345 @@ "pause-stream": { "version": "0.0.11", "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "perfectionist": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/perfectionist/-/perfectionist-2.4.0.tgz", - "integrity": "sha1-wUetNxThJkZ/F2QSnuct+GHUfqA=", - "dev": true, - "requires": { - "comment-regex": "^1.0.0", - "defined": "^1.0.0", - "minimist": "^1.2.0", - "postcss": "^5.0.8", - "postcss-scss": "^0.3.0", - "postcss-value-parser": "^3.3.0", - "read-file-stdin": "^0.2.0", - "string.prototype.repeat": "^0.2.0", - "vendors": "^1.0.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "please-upgrade-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", - "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "pngcrush": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-2.0.1.tgz", - "integrity": "sha512-U78ij8Rg5z3/GarINEMdkp4f5ORmNna5VL9xxKdv5/HpOBYaYUpjKhnXH3mkOOyTCxawqpXvDrs99pzcf8izUw==", - "dev": true, - "requires": { - "gettemporaryfilepath": "^1.0.0", - "memoizeasync": "^1.0.0", - "pngcrush-bin": "^4.0.0", - "which": "^1.2.14" - }, - "dependencies": { - "pngcrush-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pngcrush-bin/-/pngcrush-bin-4.0.0.tgz", - "integrity": "sha512-SFR9a/OgkuFiiksjM6yevTGvOdn+7JrL5r0j/zCVAZTurfRzh2smwDRYKnPMEwxgVOkwWt/tlVWRJUstSH7RcA==", - "dev": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "logalot": "^2.0.0" - } - } - } - }, - "pngcrush-bin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pngcrush-bin/-/pngcrush-bin-3.0.0.tgz", - "integrity": "sha1-tOWWgTnOVjJv7FXurxsU8nMowhM=", - "dev": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "requires": { - "file-type": "^3.1.0" - } - }, - "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "dev": true, - "requires": { - "meow": "^3.1.0" - } - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "dev": true, - "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - } - }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "dev": true, - "requires": { - "rc": "^1.1.2" - } - }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "dev": true, - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" } }, - "pngquant": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-2.0.1.tgz", - "integrity": "sha512-van2S2ZJwr8lCH+LJtRWsi3Mz1b8xJd2ZvLtUMzpsD8EqW12fIZN7ZczQpDcArKlXJE97TunL+PeIxXP6uBt5w==", + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "memoizeasync": "1.1.0", - "pngquant-bin": "^5.0.2", - "which": "1.3.1" - }, - "dependencies": { - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "optional": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "optional": true - }, - "pngquant-bin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", - "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", - "dev": true, - "optional": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.1", - "execa": "^0.10.0", - "logalot": "^2.0.0" - } - } + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "pngquant-bin": { - "version": "3.1.1", - "resolved": "http://registry.npmjs.org/pngquant-bin/-/pngquant-bin-3.1.1.tgz", - "integrity": "sha1-0STZinWpSH9AwWQLTb/Lsr1aH9E=", + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "perfectionist": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/perfectionist/-/perfectionist-2.4.0.tgz", + "integrity": "sha1-wUetNxThJkZ/F2QSnuct+GHUfqA=", "dev": true, - "optional": true, "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" + "comment-regex": "^1.0.0", + "defined": "^1.0.0", + "minimist": "^1.2.0", + "postcss": "^5.0.8", + "postcss-scss": "^0.3.0", + "postcss-value-parser": "^3.3.0", + "read-file-stdin": "^0.2.0", + "string.prototype.repeat": "^0.2.0", + "vendors": "^1.0.0", + "write-file-stdout": "0.0.2" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "optional": true, - "requires": { - "file-type": "^3.1.0" - } - }, - "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "optional": true, - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "optional": true, - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "optional": true, - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "optional": true, - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "optional": true, - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "optional": true, - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true, - "optional": true - } - } + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "optional": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "optional": true, - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "optional": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "optional": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "optional": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" }, "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "optional": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "optional": true, - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "optional": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, - "optional": true, "requires": { - "meow": "^3.1.0" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "optional": true - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true, - "optional": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true, "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" + "ansi-regex": "^2.0.0" } }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, - "optional": true, "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" + "has-flag": "^1.0.0" } - }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", + } + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "optional": true, "requires": { - "rc": "^1.1.2" + "locate-path": "^2.0.0" } }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "optional": true, "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "optional": true, "requires": { - "is-relative": "^0.1.0" + "p-try": "^1.0.0" } }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true, - "optional": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true - }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, - "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "p-limit": "^1.1.0" } }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true, - "optional": true - }, - "semver-regex": { + "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "optional": true + "requires": { + "locate-path": "^2.0.0" + } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "optional": true, "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" + "p-try": "^1.0.0" } }, - "supports-color": { + "p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, - "optional": true, "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" + "p-limit": "^1.1.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pngcrush": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-2.0.1.tgz", + "integrity": "sha512-U78ij8Rg5z3/GarINEMdkp4f5ORmNna5VL9xxKdv5/HpOBYaYUpjKhnXH3mkOOyTCxawqpXvDrs99pzcf8izUw==", + "dev": true, + "requires": { + "gettemporaryfilepath": "^1.0.0", + "memoizeasync": "^1.0.0", + "pngcrush-bin": "^4.0.0", + "which": "^1.2.14" + } + }, + "pngcrush-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pngcrush-bin/-/pngcrush-bin-4.0.0.tgz", + "integrity": "sha512-SFR9a/OgkuFiiksjM6yevTGvOdn+7JrL5r0j/zCVAZTurfRzh2smwDRYKnPMEwxgVOkwWt/tlVWRJUstSH7RcA==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + } + }, + "pngquant": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-2.0.1.tgz", + "integrity": "sha512-van2S2ZJwr8lCH+LJtRWsi3Mz1b8xJd2ZvLtUMzpsD8EqW12fIZN7ZczQpDcArKlXJE97TunL+PeIxXP6uBt5w==", + "dev": true, + "requires": { + "memoizeasync": "1.1.0", + "pngquant-bin": "^5.0.2", + "which": "1.3.1" + } + }, + "pngquant-bin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", + "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "execa": "^0.10.0", + "logalot": "^2.0.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "optional": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true, "optional": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "optional": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } } } }, @@ -16667,22 +13644,23 @@ } }, "prebuild-install": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", - "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", + "integrity": "sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==", "dev": true, "requires": { "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", + "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "node-abi": "^2.2.0", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", "noop-logger": "^0.1.1", "npmlog": "^4.0.1", "os-homedir": "^1.0.1", "pump": "^2.0.1", - "rc": "^1.1.6", + "rc": "^1.2.7", "simple-get": "^2.7.0", "tar-fs": "^1.13.0", "tunnel-agent": "^0.6.0", @@ -16691,7 +13669,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -16704,6 +13682,17 @@ "end-of-stream": "^1.1.0", "once": "^1.3.1" } + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dev": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } } } }, @@ -16806,7 +13795,7 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, @@ -16855,17 +13844,6 @@ "asap": "~2.0.3" } }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "property-expr": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", @@ -17168,7 +14146,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -17254,28 +14232,12 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, - "react-is": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", - "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", - "dev": true - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, "read-file-stdin": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", @@ -17428,9 +14390,9 @@ "dev": true }, "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { "rc": "^1.1.6", @@ -17587,12 +14549,6 @@ "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -17866,7 +14822,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -18047,7 +15003,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -18293,20 +15249,21 @@ "dev": true }, "sharp": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.20.8.tgz", - "integrity": "sha512-A8NaPGWRDKpmHTi8sl2xzozYXhTQWBb/GaJ8ZPU7L/vKW8wVvd4Yq+isJ0c7p9sX5gnjPQcM3eOfHuvvnZ2fOQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.3.tgz", + "integrity": "sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw==", "dev": true, "requires": { - "color": "^3.0.0", + "bindings": "^1.3.1", + "color": "^3.1.0", "detect-libc": "^1.0.3", "fs-copy-file-sync": "^1.1.1", - "nan": "^2.11.0", + "nan": "^2.12.1", "npmlog": "^4.1.2", - "prebuild-install": "^4.0.0", - "semver": "^5.5.1", - "simple-get": "^2.8.1", - "tar": "^4.4.6", + "prebuild-install": "^5.2.2", + "semver": "^5.6.0", + "simple-get": "^3.0.3", + "tar": "^4.4.8", "tunnel-agent": "^0.6.0" } }, @@ -18369,9 +15326,9 @@ "dev": true }, "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz", + "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==", "dev": true, "requires": { "decompress-response": "^3.3.0", @@ -18842,9 +15799,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -18865,12 +15822,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -19036,12 +15987,6 @@ "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, "state-toggle": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", @@ -19192,12 +16137,6 @@ "xtend": "^4.0.0" } }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, "stream-splicer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", @@ -19335,16 +16274,6 @@ "is-utf8": "^0.2.0" } }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -19456,57 +16385,6 @@ } } }, - "sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -19725,7 +16603,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -19808,22 +16686,16 @@ } }, "terser": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", - "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "^2.19.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.9" + "source-map-support": "~0.5.10" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -19927,28 +16799,6 @@ "readable-stream": "2 || 3" } }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "time-require": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", @@ -19986,12 +16836,6 @@ } } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -20035,26 +16879,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -20578,38 +17402,6 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - } - } - }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -20815,15 +17607,6 @@ "prepend-http": "^1.0.1" } }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", @@ -20903,12 +17686,6 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -20983,64 +17760,6 @@ "unist-util-stringify-position": "^1.1.1" } }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "readable-stream": "^2.0.0" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -21069,9 +17788,9 @@ } }, "w3c-xmlserializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", - "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, "requires": { "domexception": "^1.0.1", @@ -21079,15 +17798,6 @@ "xml-name-validator": "^3.0.0" } }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "dev": true, - "requires": { - "wrap-fn": "^0.1.0" - } - }, "watchify": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", @@ -21273,15 +17983,6 @@ } } }, - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "requires": { - "co": "3.1.0" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index c03ce83502..0d17f6831b 100644 --- a/package.json +++ b/package.json @@ -520,7 +520,7 @@ "@11ty/eleventy": "^0.7.1", "@mocha/contributors": "^1.0.3", "@mocha/docdash": "^2.1.0", - "assetgraph-builder": "^6.9.0", + "assetgraph-builder": "^6.10.0", "autoprefixer": "^9.4.10", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", @@ -554,7 +554,7 @@ "markdown-magic": "^0.1.25", "markdown-magic-package-json": "^2.0.0", "markdown-toc": "^1.2.0", - "markdownlint-cli": "^0.14.0", + "markdownlint-cli": "^0.14.1", "nps": "^5.9.4", "nyc": "^13.3.0", "prettier": "^1.16.4", From aaf2b7249a1675fee105c37d1e679145bee7f50c Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Sun, 7 Apr 2019 06:42:21 -0500 Subject: [PATCH 1315/1771] Use cwd-relative pathname to load config file (#3829) --- lib/cli/config.js | 35 ++++++-- test/integration/config.spec.js | 86 ++++++++++++++++++- .../fixtures/config/mocha-config/index.js | 9 ++ .../fixtures/config/mocha-config/package.json | 14 +++ test/node-unit/cli/config.spec.js | 4 +- 5 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 test/integration/fixtures/config/mocha-config/index.js create mode 100644 test/integration/fixtures/config/mocha-config/package.json diff --git a/lib/cli/config.js b/lib/cli/config.js index 3691f0a079..6fa4e2dbca 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -9,9 +9,9 @@ */ const fs = require('fs'); -const findUp = require('find-up'); const path = require('path'); const debug = require('debug')('mocha:cli:config'); +const findUp = require('find-up'); /** * These are the valid config files, in order of precedence; @@ -28,14 +28,31 @@ exports.CONFIG_FILES = [ '.mocharc.json' ]; +const isModuleNotFoundError = err => + err.code !== 'MODULE_NOT_FOUND' || + err.message.indexOf('Cannot find module') !== -1; + /** - * Parsers for various config filetypes. Each accepts a filepath and + * Parsers for various config filetypes. Each accepts a filepath and * returns an object (but could throw) */ const parsers = (exports.parsers = { yaml: filepath => require('js-yaml').safeLoad(fs.readFileSync(filepath, 'utf8')), - js: filepath => require(filepath), + js: filepath => { + const cwdFilepath = path.resolve(filepath); + try { + debug(`parsers: load using cwd-relative path: "${cwdFilepath}"`); + return require(cwdFilepath); + } catch (err) { + if (isModuleNotFoundError(err)) { + debug(`parsers: retry load as module-relative path: "${filepath}"`); + return require(filepath); + } else { + throw err; // rethrow + } + } + }, json: filepath => JSON.parse( require('strip-json-comments')(fs.readFileSync(filepath, 'utf8')) @@ -45,15 +62,18 @@ const parsers = (exports.parsers = { /** * Loads and parses, based on file extension, a config file. * "JSON" files may have comments. + * + * @private * @param {string} filepath - Config file path to load * @returns {Object} Parsed config object - * @private */ exports.loadConfig = filepath => { let config = {}; + debug(`loadConfig: "${filepath}"`); + const ext = path.extname(filepath); try { - if (/\.ya?ml/.test(ext)) { + if (ext === '.yml' || ext === '.yaml') { config = parsers.yaml(filepath); } else if (ext === '.js') { config = parsers.js(filepath); @@ -61,20 +81,21 @@ exports.loadConfig = filepath => { config = parsers.json(filepath); } } catch (err) { - throw new Error(`failed to parse ${filepath}: ${err}`); + throw new Error(`failed to parse config "${filepath}": ${err}`); } return config; }; /** * Find ("find up") config file starting at `cwd` + * * @param {string} [cwd] - Current working directory * @returns {string|null} Filepath to config, if found */ exports.findConfig = (cwd = process.cwd()) => { const filepath = findUp.sync(exports.CONFIG_FILES, {cwd}); if (filepath) { - debug(`found config at ${filepath}`); + debug(`findConfig: found "${filepath}"`); } return filepath; }; diff --git a/test/integration/config.spec.js b/test/integration/config.spec.js index 76a4a718d4..8d81bec9ab 100644 --- a/test/integration/config.spec.js +++ b/test/integration/config.spec.js @@ -1,10 +1,11 @@ 'use strict'; -// this is not a "functional" test; we aren't invoking the mocha executable. -// instead we just avoid test doubles. +// This is not a "functional" test; we aren't invoking the mocha executable. +// Instead we just avoid test doubles. -var loadConfig = require('../../lib/cli/config').loadConfig; +var fs = require('fs'); var path = require('path'); +var loadConfig = require('../../lib/cli/config').loadConfig; describe('config', function() { it('should return the same values for all supported config types', function() { @@ -15,4 +16,83 @@ describe('config', function() { expect(js, 'to equal', json); expect(json, 'to equal', yaml); }); + + describe('when configuring Mocha via a ".js" file', function() { + var projRootDir = path.join(__dirname, '..', '..'); + var configDir = path.join(__dirname, 'fixtures', 'config'); + var json = loadConfig(path.join(configDir, 'mocharc.json')); + + it('should load configuration given absolute path', function() { + var js; + + function _loadConfig() { + js = loadConfig(path.join(configDir, 'mocharc.js')); + } + + expect(_loadConfig, 'not to throw'); + expect(js, 'to equal', json); + }); + + it('should load configuration given cwd-relative path', function() { + var relConfigDir = configDir.substring(projRootDir.length + 1); + var js; + + function _loadConfig() { + js = loadConfig(path.join('.', relConfigDir, 'mocharc.js')); + } + + expect(_loadConfig, 'not to throw'); + expect(js, 'to equal', json); + }); + + // In other words, path does not begin with '/', './', or '../' + describe('when path is neither absolute or relative', function() { + var nodeModulesDir = path.join(projRootDir, 'node_modules'); + var pkgName = 'mocha-config'; + var installedLocally = false; + var symlinkedPkg = false; + + before(function() { + try { + var srcPath = path.join(configDir, pkgName); + var targetPath = path.join(nodeModulesDir, pkgName); + fs.symlinkSync(srcPath, targetPath, 'dir'); + symlinkedPkg = true; + installedLocally = true; + } catch (err) { + if (err.code === 'EEXIST') { + console.log('setup:', 'package already exists in "node_modules"'); + installedLocally = true; + } else { + console.error('setup failed:', err); + } + } + }); + + it('should load configuration given module-relative path', function() { + var js; + + if (!installedLocally) { + return this.skip(); + } + + function _loadConfig() { + js = loadConfig(path.join(pkgName, 'index.js')); + } + + expect(_loadConfig, 'not to throw'); + expect(js, 'to equal', json); + }); + + after(function() { + if (symlinkedPkg) { + try { + fs.unlinkSync(path.join(nodeModulesDir, pkgName)); + } catch (err) { + console.error('teardown failed:', err); + } + } + }); + }); + }); }); diff --git a/test/integration/fixtures/config/mocha-config/index.js b/test/integration/fixtures/config/mocha-config/index.js new file mode 100644 index 0000000000..6bf4e58d03 --- /dev/null +++ b/test/integration/fixtures/config/mocha-config/index.js @@ -0,0 +1,9 @@ +'use strict'; + +// a comment +module.exports = { + require: ['foo', 'bar'], + bail: true, + reporter: 'dot', + slow: 60 +}; diff --git a/test/integration/fixtures/config/mocha-config/package.json b/test/integration/fixtures/config/mocha-config/package.json new file mode 100644 index 0000000000..c6fe4df0f6 --- /dev/null +++ b/test/integration/fixtures/config/mocha-config/package.json @@ -0,0 +1,14 @@ +{ + "name": "mocha-config", + "version": "1.0.0", + "description": "Configure Mocha via package", + "main": "index.js", + "peerDependencies": { + "mocha": "^7.0.0" + }, + "keywords": [ + "mocha", + "config" + ], + "license": "CC0" +} diff --git a/test/node-unit/cli/config.spec.js b/test/node-unit/cli/config.spec.js index eeb4bb2b82..2823cdcd24 100644 --- a/test/node-unit/cli/config.spec.js +++ b/test/node-unit/cli/config.spec.js @@ -82,12 +82,10 @@ describe('cli/config', function() { describe('when supplied a filepath with unsupported extension', function() { beforeEach(function() { - sandbox.stub(parsers, 'yaml').returns(config); sandbox.stub(parsers, 'json').returns(config); - sandbox.stub(parsers, 'js').returns(config); }); - it('should assume JSON', function() { + it('should use the JSON parser', function() { loadConfig('foo.bar'); expect(parsers.json, 'was called'); }); From bd29dbd787145b2e4140da7b6a0a9b24fc9b3eab Mon Sep 17 00:00:00 2001 From: juergba Date: Sat, 6 Apr 2019 10:47:27 +0200 Subject: [PATCH 1316/1771] update CHANGELOG for v6.1.0 [ci skip] --- CHANGELOG.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e96b46d82..e0b5548b5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +# 6.1.0 / 2019-04-07 + +## :lock: Security Fixes + +- #3845: Update dependency "js-yaml" to v3.13.0 per npm security advisory (@plroebuck) + +## :tada: Enhancements + +- #3766: Make reporter constructor support optional `options` parameter (@plroebuck) +- #3760: Add support for config files with `.jsonc` extension (@sstephant) + +## :fax: Deprecations + +These are _soft_-deprecated, and will emit a warning upon use. Support will be removed in (likely) the next major version of Mocha: + +- #3719: Deprecate `this.skip()` for "after all" hooks (@juergba) + +## :bug: Fixes + +- #3829: Use cwd-relative pathname to load config file (@plroebuck) +- #3745: Fix async calls of `this.skip()` in "before each" hooks (@juergba) +- #3669: Enable `--allow-uncaught` for uncaught exceptions thrown inside hooks (@givanse) + +and some regressions: + +- #3848: Fix `Suite` cloning by copying `root` property (@fatso83) +- #3816: Guard against undefined timeout option (@boneskull) +- #3814: Update "yargs" in order to avoid deprecation message (@boneskull) +- #3788: Fix support for multiple node flags (@aginzberg) + +## :book: Documentation + +- [mochajs/mocha-examples](https://github.com/mochajs/mocha-examples): New repository of working examples of common configurations using mocha (@craigtaub) +- #3850: Remove pound icon showing on header hover on docs (@jd2rogers2) +- #3812: Add autoprefixer to documentation page CSS (@Munter) +- #3811: Update doc examples "tests.html" (@DavidLi119) +- #3807: Mocha website HTML tweaks (@plroebuck) +- #3793: Update config file example ".mocharc.yml" (@cspotcode) + +## :nut_and_bolt: Other + +- #3830: Replace dependency "findup-sync" with "find-up" for faster startup (@cspotcode) +- #3799: Update devDependencies to fix many npm vulnerabilities (@XhmikosR) + # 6.0.2 / 2019-02-25 ## :bug: Fixes @@ -158,7 +202,6 @@ Enhancements introduced in [#3556](https://github.com/mochajs/mocha/issues/3556) - [#3570](https://github.com/mochajs/mocha/issues/3570): Long-running tests now respect `SIGINT` ([**@boneskull**](https://github.com/boneskull)) - [#2944](https://github.com/mochajs/mocha/issues/2944): `--forbid-only` and `--forbid-pending` now "fail fast" when encountered on a suite ([**@outsideris**](https://github.com/outsideris)) - [#1652](https://github.com/mochajs/mocha/issues/1652), [#2951](https://github.com/mochajs/mocha/issues/2951): Fix broken clamping of timeout values ([**@plroebuck**](https://github.com/plroebuck)) -- [#2753](https://github.com/mochajs/mocha/issues/2753): `start` and `end` events now emitted properly from `Runner` instance when using Mocha programmatically ([**@outsideris**](https://github.com/outsideris)) - [#2095](https://github.com/mochajs/mocha/issues/2095), [#3521](https://github.com/mochajs/mocha/issues/3521): Do not log `stdout:` prefix in browser console ([**@Bamieh**](https://github.com/Bamieh)) - [#3595](https://github.com/mochajs/mocha/issues/3595): Fix mochajs.org deployment problems ([**@papandreou**](https://github.com/papandreou)) - [#3518](https://github.com/mochajs/mocha/issues/3518): Improve `utils.isPromise()` ([**@fabiosantoscode**](https://github.com/fabiosantoscode)) From f4fc95a94ec6f2348000465be8f15ac2436260d5 Mon Sep 17 00:00:00 2001 From: juergba Date: Sun, 7 Apr 2019 15:00:21 +0200 Subject: [PATCH 1317/1771] Release v6.1.0 --- CHANGELOG.md | 38 ++++++------- package-lock.json | 141 ++++++++++++++++++++-------------------------- package.json | 12 +++- 3 files changed, 91 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b5548b5b..ce17e80457 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,45 +2,45 @@ ## :lock: Security Fixes -- #3845: Update dependency "js-yaml" to v3.13.0 per npm security advisory (@plroebuck) +- [#3845](https://github.com/mochajs/mocha/issues/3845): Update dependency "js-yaml" to v3.13.0 per npm security advisory ([**@plroebuck**](https://github.com/plroebuck)) ## :tada: Enhancements -- #3766: Make reporter constructor support optional `options` parameter (@plroebuck) -- #3760: Add support for config files with `.jsonc` extension (@sstephant) +- [#3766](https://github.com/mochajs/mocha/issues/3766): Make reporter constructor support optional `options` parameter ([**@plroebuck**](https://github.com/plroebuck)) +- [#3760](https://github.com/mochajs/mocha/issues/3760): Add support for config files with `.jsonc` extension ([**@sstephant**](https://github.com/sstephant)) ## :fax: Deprecations These are _soft_-deprecated, and will emit a warning upon use. Support will be removed in (likely) the next major version of Mocha: -- #3719: Deprecate `this.skip()` for "after all" hooks (@juergba) +- [#3719](https://github.com/mochajs/mocha/issues/3719): Deprecate `this.skip()` for "after all" hooks ([**@juergba**](https://github.com/juergba)) ## :bug: Fixes -- #3829: Use cwd-relative pathname to load config file (@plroebuck) -- #3745: Fix async calls of `this.skip()` in "before each" hooks (@juergba) -- #3669: Enable `--allow-uncaught` for uncaught exceptions thrown inside hooks (@givanse) +- [#3829](https://github.com/mochajs/mocha/issues/3829): Use cwd-relative pathname to load config file ([**@plroebuck**](https://github.com/plroebuck)) +- [#3745](https://github.com/mochajs/mocha/issues/3745): Fix async calls of `this.skip()` in "before each" hooks ([**@juergba**](https://github.com/juergba)) +- [#3669](https://github.com/mochajs/mocha/issues/3669): Enable `--allow-uncaught` for uncaught exceptions thrown inside hooks ([**@givanse**](https://github.com/givanse)) and some regressions: -- #3848: Fix `Suite` cloning by copying `root` property (@fatso83) -- #3816: Guard against undefined timeout option (@boneskull) -- #3814: Update "yargs" in order to avoid deprecation message (@boneskull) -- #3788: Fix support for multiple node flags (@aginzberg) +- [#3848](https://github.com/mochajs/mocha/issues/3848): Fix `Suite` cloning by copying `root` property ([**@fatso83**](https://github.com/fatso83)) +- [#3816](https://github.com/mochajs/mocha/issues/3816): Guard against undefined timeout option ([**@boneskull**](https://github.com/boneskull)) +- [#3814](https://github.com/mochajs/mocha/issues/3814): Update "yargs" in order to avoid deprecation message ([**@boneskull**](https://github.com/boneskull)) +- [#3788](https://github.com/mochajs/mocha/issues/3788): Fix support for multiple node flags ([**@aginzberg**](https://github.com/aginzberg)) ## :book: Documentation -- [mochajs/mocha-examples](https://github.com/mochajs/mocha-examples): New repository of working examples of common configurations using mocha (@craigtaub) -- #3850: Remove pound icon showing on header hover on docs (@jd2rogers2) -- #3812: Add autoprefixer to documentation page CSS (@Munter) -- #3811: Update doc examples "tests.html" (@DavidLi119) -- #3807: Mocha website HTML tweaks (@plroebuck) -- #3793: Update config file example ".mocharc.yml" (@cspotcode) +- [mochajs/mocha-examples](https://github.com/mochajs/mocha-examples): New repository of working examples of common configurations using mocha ([**@craigtaub**](https://github.com/craigtaub)) +- [#3850](https://github.com/mochajs/mocha/issues/3850): Remove pound icon showing on header hover on docs ([**@jd2rogers2**](https://github.com/jd2rogers2)) +- [#3812](https://github.com/mochajs/mocha/issues/3812): Add autoprefixer to documentation page CSS ([**@Munter**](https://github.com/Munter)) +- [#3811](https://github.com/mochajs/mocha/issues/3811): Update doc examples "tests.html" ([**@DavidLi119**](https://github.com/DavidLi119)) +- [#3807](https://github.com/mochajs/mocha/issues/3807): Mocha website HTML tweaks ([**@plroebuck**](https://github.com/plroebuck)) +- [#3793](https://github.com/mochajs/mocha/issues/3793): Update config file example ".mocharc.yml" ([**@cspotcode**](https://github.com/cspotcode)) ## :nut_and_bolt: Other -- #3830: Replace dependency "findup-sync" with "find-up" for faster startup (@cspotcode) -- #3799: Update devDependencies to fix many npm vulnerabilities (@XhmikosR) +- [#3830](https://github.com/mochajs/mocha/issues/3830): Replace dependency "findup-sync" with "find-up" for faster startup ([**@cspotcode**](https://github.com/cspotcode)) +- [#3799](https://github.com/mochajs/mocha/issues/3799): Update devDependencies to fix many npm vulnerabilities ([**@XhmikosR**](https://github.com/XhmikosR)) # 6.0.2 / 2019-02-25 diff --git a/package-lock.json b/package-lock.json index 0e0f00f463..46f7a88943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.0.2", + "version": "6.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1150,7 +1150,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1162,7 +1162,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1216,7 +1216,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1803,7 +1803,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -2264,7 +2264,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2318,7 +2318,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2884,7 +2884,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3060,7 +3060,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3370,7 +3370,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3397,7 +3397,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3410,7 +3410,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -4078,7 +4078,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4244,7 +4244,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4405,7 +4405,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4693,7 +4693,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -4968,7 +4968,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -6028,7 +6028,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6103,8 +6103,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -6125,14 +6124,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6147,20 +6144,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -6277,8 +6271,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -6290,7 +6283,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6305,7 +6297,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6313,14 +6304,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6339,7 +6328,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -6420,8 +6408,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -6433,7 +6420,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -6519,8 +6505,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -6556,7 +6541,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6576,7 +6560,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6620,14 +6603,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6703,7 +6684,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -6957,7 +6938,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7306,7 +7287,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -7337,7 +7318,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -8035,7 +8016,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8699,7 +8680,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9540,7 +9521,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -9617,7 +9598,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -9847,7 +9828,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9905,7 +9886,7 @@ }, "marked": { "version": "0.3.19", - "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, @@ -9993,7 +9974,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10178,7 +10159,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10237,7 +10218,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12411,7 +12392,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12433,7 +12414,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12743,7 +12724,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12820,7 +12801,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12949,7 +12930,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13795,7 +13776,7 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, @@ -14146,7 +14127,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14300,7 +14281,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14822,7 +14803,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -14892,7 +14873,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -15234,7 +15215,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15269,7 +15250,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15878,7 +15859,7 @@ }, "split": { "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15983,7 +15964,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -16107,7 +16088,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16297,7 +16278,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -16379,7 +16360,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -16786,7 +16767,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -17943,7 +17924,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", diff --git a/package.json b/package.json index 0d17f6831b..a8177d5bd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.0.2", + "version": "6.1.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -19,6 +19,7 @@ "Aaron Petcoff ", "abrkn ", "Adam Crabtree ", + "Adam Ginzberg ", "Adam Gruber ", "Adrian Ludwig ", "Ahmad Bamieh ", @@ -34,6 +35,8 @@ "Andreas Brekken ", "Andreas Lind ", "Andreas Lind Petersen ", + "Andrew Bradley ", + "Andrew Bradley ", "Andrew Krawchyk <903716+akrawchyk@users.noreply.github.com>", "Andrew Nesbitt ", "Andrey Popp <8mayday@gmail.com>", @@ -85,6 +88,7 @@ "Callum Macrae ", "Can Oztokmak ", "Capacitor Set ", + "Carl-Erik Kopseng ", "Casey Foster ", "Charles Lowell ", "Charles Merriam ", @@ -115,6 +119,7 @@ "David Henderson ", "David M. Lee ", "David Neubauer ", + "DavidLi119 ", "DavNej ", "Denis Bardadym ", "Devin Weaver ", @@ -160,6 +165,7 @@ "Gabriel Silk ", "Gareth Aye ", "Gareth Murphy ", + "Gastón I. Silva ", "Gavin Mogan ", "gaye ", "gigadude ", @@ -197,6 +203,7 @@ "Jakub Nešetřil ", "James Bowes ", "James Carr ", + "James D. Rogers ", "James G. Kim ", "James Lal ", "James Nylen ", @@ -245,6 +252,7 @@ "JP Bochi ", "jsdevel ", "Juerg B <44573692+juergba@users.noreply.github.com>", + "juergba ", "Julien Wajsberg ", "Jupp Müller ", "Jussi Virtanen ", @@ -412,6 +420,7 @@ "Sulabh Bista ", "Sune Simonsen ", "Svetlana <39729453+Lana-Light@users.noreply.github.com>", + "Sylvain ", "Szauka <33459309+Szauka@users.noreply.github.com>", "Tapiwa Kelvin ", "Ted Yavuzkurt ", @@ -453,6 +462,7 @@ "wsw ", "Xavier Antoviaque ", "Xavier Damman ", + "XhmikosR ", "XhmikosR ", "Yanis Wang ", "yehiyam ", From d7de9480b90f1fc9491bdbf76df3d2a23b5e3379 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 7 Apr 2019 22:10:39 +0200 Subject: [PATCH 1318/1771] Set eol for publishing --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 176a458f94..6313b56c57 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -* text=auto +* text=auto eol=lf From 9e138b1bb7174e9fd1043b0e34717a66fc00448c Mon Sep 17 00:00:00 2001 From: juergba Date: Sun, 7 Apr 2019 23:30:49 +0200 Subject: [PATCH 1319/1771] update CHANGELOG for v6.1.1 [ci skip] --- CHANGELOG.md | 6 ++++++ package-lock.json | 41 ++++++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce17e80457..6b060efc66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 6.1.1 / 2019-04-07 + +## :bug: Fixes + +- Fix Windows End-of-Line publishing issue + # 6.1.0 / 2019-04-07 ## :lock: Security Fixes diff --git a/package-lock.json b/package-lock.json index 46f7a88943..86413ef056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6103,7 +6103,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -6124,12 +6125,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6144,17 +6147,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6271,7 +6277,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6283,6 +6290,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6297,6 +6305,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6304,12 +6313,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6328,6 +6339,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6408,7 +6420,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6420,6 +6433,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6505,7 +6519,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6541,6 +6556,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6560,6 +6576,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6603,12 +6620,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, From 9b516bf9238bd61833871123c4cc534ab99b71f7 Mon Sep 17 00:00:00 2001 From: juergba Date: Sun, 7 Apr 2019 23:31:58 +0200 Subject: [PATCH 1320/1771] Release v6.1.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86413ef056..95e61e4ab1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.0", + "version": "6.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a8177d5bd4..2fc70169dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.0", + "version": "6.1.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 2e8f31f3ceef40c7df9f74727d9c57cce7ae9a69 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Apr 2019 11:04:40 -0700 Subject: [PATCH 1321/1771] update CHANGELOG for v6.1.2 Signed-off-by: Christopher Hiller --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b060efc66..92c5460b71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,14 @@ +# 6.1.2 / 2019-04-08 + +## :bug: Fixes + +- #3867: Re-publish v6.1.1 from POSIX OS to avoid dropped executable flags (@boneskull) + # 6.1.1 / 2019-04-07 ## :bug: Fixes -- Fix Windows End-of-Line publishing issue +- #3866: Fix Windows End-of-Line publishing issue (@juergba & @cspotcode) # 6.1.0 / 2019-04-07 From 86cd699cfb6193cbb894433c4bc69c9e60208003 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Apr 2019 11:04:52 -0700 Subject: [PATCH 1322/1771] Release v6.1.2 --- CHANGELOG.md | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92c5460b71..f3d6c7e2a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,13 @@ ## :bug: Fixes -- #3867: Re-publish v6.1.1 from POSIX OS to avoid dropped executable flags (@boneskull) +- [#3867](https://github.com/mochajs/mocha/issues/3867): Re-publish v6.1.1 from POSIX OS to avoid dropped executable flags ([**@boneskull**](https://github.com/boneskull)) # 6.1.1 / 2019-04-07 ## :bug: Fixes -- #3866: Fix Windows End-of-Line publishing issue (@juergba & @cspotcode) +- [#3866](https://github.com/mochajs/mocha/issues/3866): Fix Windows End-of-Line publishing issue ([**@juergba**](https://github.com/juergba) & [**@cspotcode**](https://github.com/cspotcode)) # 6.1.0 / 2019-04-07 diff --git a/package-lock.json b/package-lock.json index 95e61e4ab1..e1e6d8f621 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.1", + "version": "6.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2fc70169dd..57ef0b1505 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.1", + "version": "6.1.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From f05a58f5616b7b184e905231ab25c6162bc268f4 Mon Sep 17 00:00:00 2001 From: Sylvester Keil Date: Fri, 5 Apr 2019 23:22:14 +0200 Subject: [PATCH 1323/1771] Fix yargs global pollution Yargs exports a global singleton by default. Using it directly will most likely break testing apps using yargs themselves. --- lib/cli/cli.js | 4 ++-- test/node-unit/cli/run.spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index c17d68a99d..2a075ca845 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -11,7 +11,7 @@ const debug = require('debug')('mocha:cli:cli'); const symbols = require('log-symbols'); -const yargs = require('yargs'); +const yargs = require('yargs/yargs'); const path = require('path'); const {loadOptions, YARGS_PARSER_CONFIG} = require('./options'); const commands = require('./commands'); @@ -32,7 +32,7 @@ exports.main = (argv = process.argv.slice(2)) => { Error.stackTraceLimit = Infinity; // configurable via --stack-trace-limit? - yargs + yargs(argv) .scriptName('mocha') .command(commands.run) .command(commands.init) diff --git a/test/node-unit/cli/run.spec.js b/test/node-unit/cli/run.spec.js index 6dfe5aaa4f..ed93b09129 100644 --- a/test/node-unit/cli/run.spec.js +++ b/test/node-unit/cli/run.spec.js @@ -7,7 +7,7 @@ describe('command', function() { describe('run', function() { describe('builder', function() { const IGNORED_OPTIONS = new Set(['help', 'version']); - const options = builder(require('yargs')).getOptions(); + const options = builder(require('yargs/yargs')().reset()).getOptions(); ['number', 'string', 'boolean', 'array'].forEach(type => { describe(`${type} type`, function() { Array.from(new Set(options[type])).forEach(option => { From 51212115c8f46d47b57ce9e65f054f83bc7a0acc Mon Sep 17 00:00:00 2001 From: Sylvester Keil Date: Fri, 5 Apr 2019 23:42:35 +0200 Subject: [PATCH 1324/1771] Do not pass argv twice --- lib/cli/cli.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index 2a075ca845..b51c2a1973 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -32,7 +32,7 @@ exports.main = (argv = process.argv.slice(2)) => { Error.stackTraceLimit = Infinity; // configurable via --stack-trace-limit? - yargs(argv) + yargs() .scriptName('mocha') .command(commands.run) .command(commands.init) From e73941a60457a09149e5a212fcc4985de58358e1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 11 Apr 2019 16:10:00 -0700 Subject: [PATCH 1325/1771] upgrade node-environment-flags; closes #3868 --- package-lock.json | 316 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 161 insertions(+), 157 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1e6d8f621..ed8eb9192f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -353,12 +353,6 @@ "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", "dev": true }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true - }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -734,7 +728,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1216,7 +1210,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1667,7 +1661,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -2090,7 +2084,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -2131,7 +2125,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2153,7 +2147,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -2264,7 +2258,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2318,7 +2312,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2571,7 +2565,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2884,7 +2878,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3060,7 +3054,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3370,7 +3364,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3397,7 +3391,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3410,7 +3404,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3477,7 +3471,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -4078,7 +4072,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4107,9 +4101,9 @@ } }, "detective-es6": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.0.0.tgz", - "integrity": "sha512-lo2kHVepcq3v39Q/t5uY6sy3cK1g29Kgi4Sj4KpR/15WGwecwma1yaEzZoofyJg/QyeOz36DZhouJ3eD46efCg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.1.0.tgz", + "integrity": "sha512-QSHqKGOp/YBIfmIqKXaXeq2rlL+bp3bcIQMfZ+0PvKzRlELSOSZxKRvpxVcxlLuocQv4QnOfuWGniGrmPbz8MQ==", "dev": true, "requires": { "node-source-walk": "^4.0.0" @@ -4138,15 +4132,26 @@ } }, "detective-postcss": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-3.0.0.tgz", - "integrity": "sha512-Dq4pza3UAT5gXHmNjinxhTydKGd9m3Tr6d0epP9VBipQfQl/ipe3ml7ybxpHk4TRwT2RPXKRsnCHhXfEdpksAQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-3.0.1.tgz", + "integrity": "sha512-tfTS2GdpUal5NY0aCqI4dpEy8Xfr88AehYKB0iBIZvo8y2g3UsrcDnrp9PR2FbzoW7xD5Rip3NJW7eCSvtqdUw==", "dev": true, "requires": { - "debug": "^3.1.0", + "debug": "^4.1.1", "is-url": "^1.2.4", "postcss": "^7.0.2", "postcss-values-parser": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "detective-sass": { @@ -4244,7 +4249,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4405,7 +4410,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4453,15 +4458,13 @@ } }, "editorconfig": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz", - "integrity": "sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", "dev": true, "requires": { - "@types/node": "^10.11.7", - "@types/semver": "^5.5.0", "commander": "^2.19.0", - "lru-cache": "^4.1.3", + "lru-cache": "^4.1.5", "semver": "^5.6.0", "sigmund": "^1.0.1" } @@ -4693,7 +4696,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -4968,7 +4971,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5612,9 +5615,9 @@ }, "dependencies": { "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -5662,10 +5665,10 @@ "flat-cache": "^2.0.1" } }, - "file-exists": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-exists/-/file-exists-5.0.1.tgz", - "integrity": "sha512-TeBMgeKbdSsQtcY2XqKY/yTa4BciMD/Gw8YcND0XMDZt4CDj87l1Wl4x7K0ravZ80tZcyIGMD0hj2VSRPR8M8Q==", + "file-exists-dazinatorfork": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-exists-dazinatorfork/-/file-exists-dazinatorfork-1.0.2.tgz", + "integrity": "sha512-r70c72ln2YHzQINNfxDp02hAhbGkt1HffZ+Du8oetWDLjDtFja/Lm10lUaSh9e+wD+7VDvPee0b0C9SAy8pWZg==", "dev": true }, "file-type": { @@ -5790,9 +5793,9 @@ } }, "find": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", - "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", "dev": true, "requires": { "traverse-chain": "~0.1.0" @@ -6028,7 +6031,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6913,7 +6916,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -6922,16 +6925,16 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "gonzales-pe": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", - "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.4.tgz", + "integrity": "sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==", "dev": true, "requires": { "minimist": "1.1.x" @@ -7024,26 +7027,17 @@ "dev": true }, "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7306,7 +7300,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -7337,7 +7331,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -8035,7 +8029,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8343,9 +8337,9 @@ "dev": true }, "js-beautify": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.0.tgz", - "integrity": "sha512-P0skmY4IDjfLiVrx+GLDeme8w5G0R1IGXgccVU5HP2VM3lRblH7qN2LTea5vZAxrDjpZBD0Jv+ahpjwVcbz/rw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz", + "integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -8699,7 +8693,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9213,7 +9207,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -9254,7 +9248,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -9275,7 +9269,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -9533,9 +9527,9 @@ } }, "luxon": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.11.4.tgz", - "integrity": "sha512-zTQ1DCShOGHIdNpa56yjDpUCowKDsBqeFVuEG2XBcrAM2udxN0g3N5RTZzbw94OkDiBgECsuDgLNnQTo73yghw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.12.1.tgz", + "integrity": "sha512-Zv/qJb2X1ESTrlniAViWx2aqGwi2cVpeoZFTbPdPiCu4EsadKsmb/QCH8HQjMUpDZKKJIHKHsJxV5Rwpq47HKQ==", "dev": true }, "magic-string": { @@ -9617,7 +9611,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -9847,7 +9841,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9882,7 +9876,7 @@ "dependencies": { "commander": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -9905,7 +9899,7 @@ }, "marked": { "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, @@ -9993,7 +9987,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10019,7 +10013,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10054,7 +10048,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10072,7 +10066,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10178,7 +10172,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10237,16 +10231,16 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "module-definition": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.1.0.tgz", - "integrity": "sha512-XtgUeQUi/4UshwxWlCxCjt4SoJC+LJbjHvhGopOskzZOH3GSy2X6KC96APK3rgA9p9hekHcVP87qdwQpSvhNlQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.2.0.tgz", + "integrity": "sha512-PO6o0BajpdRR+fb3FUSeDISgJpnyxg8UDUEalR8LPQajl0M5+m4jHWhgrMGGSEl6D9+sVl/l1fjOCvpBXIQ+2Q==", "dev": true, "requires": { "ast-module-types": "^2.4.0", @@ -10289,15 +10283,15 @@ } }, "module-lookup-amd": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-6.1.0.tgz", - "integrity": "sha512-XHfR+eeiqsdZgkxIgWg9r2OHyk1QAjJKYCJWv6LJw1mY+lm0LVsftyike3pqlPivsqImiR6f7NBMhgMKnbdtiw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-6.2.0.tgz", + "integrity": "sha512-uxHCj5Pw9psZiC1znjU2qPsubt6haCSsN9m7xmIdoTciEgfxUkE1vhtDvjHPuOXEZrVJhjKgkmkP+w73rRuelQ==", "dev": true, "requires": { "commander": "^2.8.1", "debug": "^4.1.0", - "file-exists": "^5.0.1", - "find": "^0.2.8", + "file-exists-dazinatorfork": "^1.0.2", + "find": "^0.3.0", "requirejs": "^2.3.5", "requirejs-config-file": "^3.1.1" }, @@ -10419,6 +10413,12 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -10464,11 +10464,19 @@ } }, "node-environment-flags": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", - "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "requires": { - "object.getownpropertydescriptors": "^2.0.3" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "node-libs-browser": { @@ -11025,9 +11033,9 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nunjucks": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.1.7.tgz", - "integrity": "sha512-MrjI68cobXQnyMK/LeY7BgYZ+7o4xn1UNGOe1y8ACVo4cn/1FXc1S4ySqHbmzFqxq/qtMWrehysTuXdbTvf7JA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.0.tgz", + "integrity": "sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==", "dev": true, "requires": { "a-sync-waterfall": "^1.0.0", @@ -11085,7 +11093,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -11126,7 +11134,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -12332,7 +12340,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -12411,7 +12419,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12433,7 +12441,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12743,7 +12751,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12820,7 +12828,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12905,7 +12913,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12949,7 +12957,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13669,7 +13677,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -13801,7 +13809,7 @@ }, "pretty-ms": { "version": "0.2.2", - "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -14003,7 +14011,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14232,7 +14240,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -14300,7 +14308,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14638,35 +14646,31 @@ "dev": true }, "requirejs-config-file": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-3.1.1.tgz", - "integrity": "sha512-dGob5UZE5Mvy2Es1Zi6SBbbSDTu8zAQOUSXB5piAEBx9evS2BD2IzPlbj+TMU0/bX5HU6fUK/b7L2wspZlJS0A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-3.1.2.tgz", + "integrity": "sha512-sdLWywcDuNz7EIOhenSbRfT4YF84nItDv90coN2htbokjmU2QeyQuSBZILQUKNksepl8UPVU+hgYySFaDxbJPQ==", "dev": true, "requires": { "esprima": "^4.0.0", - "fs-extra": "^5.0.0", + "make-dir": "^2.1.0", "stringify-object": "^3.2.1" }, "dependencies": { - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, @@ -14892,7 +14896,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -15003,7 +15007,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15234,7 +15238,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15269,7 +15273,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15878,7 +15882,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15983,7 +15987,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -16107,7 +16111,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16297,7 +16301,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -16379,7 +16383,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -16603,7 +16607,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16786,7 +16790,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16830,7 +16834,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -17104,9 +17108,9 @@ "dev": true }, "typescript": { - "version": "3.3.3333", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", - "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", + "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", "dev": true }, "typescript-eslint-parser": { @@ -17943,7 +17947,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", diff --git a/package.json b/package.json index 57ef0b1505..2164e1d167 100644 --- a/package.json +++ b/package.json @@ -516,7 +516,7 @@ "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", - "node-environment-flags": "1.0.4", + "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", From ae3d53f9bf859b6262ecf3ddfb88e8339576cb95 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 11 Apr 2019 16:18:33 -0700 Subject: [PATCH 1326/1771] update CHANGELOG for v6.1.3 [ci skip] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3d6c7e2a0..b77114ee14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 6.1.3 / 2019-04-11 + +## :bug: Fixes + +- #3863: Fix `yargs`-related global scope pollution (@inukshuk) +- #3869: Fix failure when installed w/ `pnpm` (@boneskull) + # 6.1.2 / 2019-04-08 ## :bug: Fixes From f1fe632a5aca224994fa8c1240be6852bec236a8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 11 Apr 2019 16:58:34 -0700 Subject: [PATCH 1327/1771] Release v6.1.3 --- CHANGELOG.md | 4 ++-- package-lock.json | 2 +- package.json | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b77114ee14..bd6f1b4dd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,8 @@ ## :bug: Fixes -- #3863: Fix `yargs`-related global scope pollution (@inukshuk) -- #3869: Fix failure when installed w/ `pnpm` (@boneskull) +- [#3863](https://github.com/mochajs/mocha/issues/3863): Fix `yargs`-related global scope pollution ([**@inukshuk**](https://github.com/inukshuk)) +- [#3869](https://github.com/mochajs/mocha/issues/3869): Fix failure when installed w/ `pnpm` ([**@boneskull**](https://github.com/boneskull)) # 6.1.2 / 2019-04-08 diff --git a/package-lock.json b/package-lock.json index ed8eb9192f..3a519b0618 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.2", + "version": "6.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2164e1d167..650643974b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.2", + "version": "6.1.3", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -421,6 +421,7 @@ "Sune Simonsen ", "Svetlana <39729453+Lana-Light@users.noreply.github.com>", "Sylvain ", + "Sylvester Keil ", "Szauka <33459309+Szauka@users.noreply.github.com>", "Tapiwa Kelvin ", "Ted Yavuzkurt ", From 0d9d4a3e1bdf948adde23819c8816903906e7423 Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Wed, 17 Apr 2019 23:02:37 +0900 Subject: [PATCH 1328/1771] Update js-yaml from 3.13.0 to 3.13.1 (#3877) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a519b0618..f57c9205d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8368,9 +8368,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", - "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" diff --git a/package.json b/package.json index 650643974b..703684c1e1 100644 --- a/package.json +++ b/package.json @@ -512,7 +512,7 @@ "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.0", + "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", From c3d241ecedfafe3ee40329933f719b5fc880b63e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 18 Apr 2019 11:20:39 -0700 Subject: [PATCH 1329/1771] update CHANGELOG.md for v6.1.4 [ci skip] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd6f1b4dd8..d87143b0f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 6.1.4 / 2019-04-18 + +## :lock: Security Fixes + +- [#3877](https://github.com/mochajs/mocha/issues/3877): Upgrade [js-yaml](https://npm.im/js-yaml), addressing [code injection vulnerability](https://www.npmjs.com/advisories/813) ([**@bjornstar**](https://github.com/bjornstar)) + # 6.1.3 / 2019-04-11 ## :bug: Fixes From 31c019e0fffb4e77b7191ac5882edbe15f581c0b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 18 Apr 2019 11:20:49 -0700 Subject: [PATCH 1330/1771] Release v6.1.4 --- package-lock.json | 2 +- package.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f57c9205d8..2aeadf2b21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.3", + "version": "6.1.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 703684c1e1..67f1aae4f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.3", + "version": "6.1.4", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -75,6 +75,7 @@ "Berker Peksag ", "berni ", "Bjørge Næss ", + "Bjorn Stromberg ", "Brendan Nee ", "Brian Beck ", "Brian Lalor ", From 07ea8763c663bdd3fe1f8446cdb62dae233f4916 Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Thu, 18 Apr 2019 14:04:30 -0500 Subject: [PATCH 1331/1771] Remove noise output from JSON reporter test (#3881) --- test/reporters/json.spec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index bf923bb171..5d7a37c564 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -1,5 +1,6 @@ 'use strict'; +var sinon = require('sinon'); var Mocha = require('../../'); var Suite = Mocha.Suite; var Runner = Mocha.Runner; @@ -28,7 +29,9 @@ describe('JSON reporter', function() { }) ); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ @@ -49,7 +52,9 @@ describe('JSON reporter', function() { it('should have 1 test pending', function(done) { suite.addTest(new Test(testTitle)); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { pending: [ @@ -78,7 +83,9 @@ describe('JSON reporter', function() { }) ); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ From 63056f08b412fdb0908a1a829a3f37dd2bdc2ac8 Mon Sep 17 00:00:00 2001 From: Stephen Hess Date: Sat, 20 Apr 2019 00:19:12 -0400 Subject: [PATCH 1332/1771] fixed anchors to configuration section (#3841) --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0f99a5e39e..0117320279 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1055,7 +1055,7 @@ Can be specified as a comma-delimited list. > _New in v6.0.0._ -Specify an explicit path to a [configuration file](#configuring-mocha-node-js). +Specify an explicit path to a [configuration file](#configuring-mocha-nodejs). By default, Mocha will search for a config file if `--config` is not specified; use `--no-config` to suppress this behavior. @@ -1071,7 +1071,7 @@ By default, Mocha looks for a `mocha.opts` in `test/mocha.opts`; use `--no-opts` > _New in v6.0.0._ -Specify an explicit path to a [`package.json` file](#configuring-mocha-node-js) (ostensibly containing configuration in a `mocha` property). +Specify an explicit path to a [`package.json` file](#configuring-mocha-nodejs) (ostensibly containing configuration in a `mocha` property). By default, Mocha looks for a `package.json` in the current working directory or nearest ancestor, and will use the first file found (regardless of whether it contains a `mocha` property); to suppress `package.json` lookup, use `--no-package`. From 59fcf7158ad7a94148e47834d4d32117efcbf182 Mon Sep 17 00:00:00 2001 From: toyjhlee Date: Sat, 20 Apr 2019 16:01:25 +0900 Subject: [PATCH 1333/1771] Broken links in docs --- docs/api-tutorials/custom-reporter.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/api-tutorials/custom-reporter.md b/docs/api-tutorials/custom-reporter.md index 3f0313aac8..1555ce26d0 100644 --- a/docs/api-tutorials/custom-reporter.md +++ b/docs/api-tutorials/custom-reporter.md @@ -112,9 +112,9 @@ The event names are exported from the `constants` property of `Mocha.Runner`: > It's important to understand that all `Suite` callbacks will be run _before_ the [Runner] emits `EVENT_RUN_BEGIN`. Hooks and tests, however, won't run until _after_ the [Runner] emits `EVENT_RUN_BEGIN`. -[runner]: /api/mocha.runner -[test]: /api/mocha.test -[hook]: /api/mocha.hook -[suite]: /api/mocha.suite +[runner]: /api/runner +[test]: /api/test +[hook]: /api/hook +[suite]: /api/suite [base]: /api/mocha.reporters.base [delay]: /#delayed-root-suite From 57a97386109be02e6d665b01bfd5f2aa75b16ab6 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Mon, 22 Apr 2019 14:52:46 -0700 Subject: [PATCH 1334/1771] Use sinon sandbox for reporter tests (#3888) --- test/reporters/landing.spec.js | 55 ++++--------- test/reporters/list.spec.js | 61 +++++---------- test/reporters/nyan.spec.js | 132 ++++++++++++-------------------- test/reporters/progress.spec.js | 72 +++++------------ 4 files changed, 104 insertions(+), 216 deletions(-) diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index e561c23d55..dd73d9e5b3 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -1,5 +1,6 @@ 'use strict'; +var sandbox = require('sinon').createSandbox(); var Mocha = require('../..'); var reporters = Mocha.reporters; var Landing = reporters.Landing; @@ -15,8 +16,6 @@ describe('Landing reporter', function() { var runner; var options = {}; var runReporter = makeRunReporter(Landing); - var useColors; - var windowWidth; var resetCode = '\u001b[0m'; var expectedArray = [ '\u001b[1D\u001b[2A', @@ -30,40 +29,32 @@ describe('Landing reporter', function() { ]; beforeEach(function() { - useColors = Base.useColors; - Base.useColors = false; - windowWidth = Base.window.width; - Base.window.width = 1; + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.window, 'width').value(1); }); afterEach(function() { - Base.useColors = useColors; - Base.window.width = windowWidth; + sandbox.restore(); runner = undefined; }); describe('on start', function() { it('should write new lines', function() { - var cachedCursor = Base.cursor; - Base.cursor.hide = function() {}; + sandbox.stub(Base.cursor, 'hide'); + runner = createMockRunner('start', 'start'); var stdout = runReporter({}, runner, options); expect(stdout[0], 'to equal', '\n\n\n '); - Base.cursor = cachedCursor; }); it('should call cursor hide', function() { - var cachedCursor = Base.cursor; - var calledCursorHide = false; - Base.cursor.hide = function() { - calledCursorHide = true; - }; + sandbox.stub(Base.cursor, 'hide'); + runner = createMockRunner('start', 'start'); runReporter({}, runner, options); - expect(calledCursorHide, 'to be', true); - Base.cursor = cachedCursor; + expect(Base.cursor.hide, 'was called'); }); }); @@ -95,28 +86,16 @@ describe('Landing reporter', function() { }); describe('on end', function() { it('should call cursor show and epilogue', function() { - var cachedCursor = Base.cursor; - var calledCursorShow = false; - Base.cursor.show = function() { - calledCursorShow = true; - }; + var reporterStub = {epilogue: function() {}}; + sandbox.stub(Base.cursor, 'show'); + sandbox.stub(reporterStub, 'epilogue'); + runner = createMockRunner('end', 'end'); - var calledEpilogue = false; - runReporter( - { - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - options - ); - - expect(calledEpilogue, 'to be', true); - expect(calledCursorShow, 'to be', true); - - Base.cursor = cachedCursor; + runReporter(reporterStub, runner, options); + + expect(reporterStub.epilogue, 'was called'); + expect(Base.cursor.show, 'was called'); }); }); }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index 5abbe0bf69..c9eceb87fe 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -1,5 +1,6 @@ 'use strict'; +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; var List = reporters.List; var Base = reporters.Base; @@ -11,7 +12,6 @@ describe('List reporter', function() { var runner; var options = {}; var runReporter = makeRunReporter(List); - var useColors; var expectedTitle = 'some title'; var expectedDuration = 100; var test = { @@ -23,12 +23,11 @@ describe('List reporter', function() { }; beforeEach(function() { - useColors = Base.useColors; - Base.useColors = false; + sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { - Base.useColors = useColors; + sandbox.restore(); runner = undefined; }); @@ -53,24 +52,18 @@ describe('List reporter', function() { }); describe('on pass', function() { it('should call cursor CR', function() { - var calledCursorCR = false; - var cachedCursor = Base.cursor; - Base.cursor.CR = function() { - calledCursorCR = true; - }; + sandbox.stub(Base.cursor, 'CR'); + runner = createMockRunner('pass', 'pass', null, null, test); runReporter({epilogue: function() {}}, runner, options); - expect(calledCursorCR, 'to be', true); - - Base.cursor = cachedCursor; + expect(Base.cursor.CR, 'was called'); }); it('should write expected symbol, title and duration to the console', function() { - var cachedSymbols = Base.symbols; var expectedOkSymbol = 'OK'; - Base.symbols.ok = expectedOkSymbol; - var cachedCursor = Base.cursor; - Base.cursor.CR = function() {}; + sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); + sandbox.stub(Base.cursor, 'CR'); + runner = createMockRunner('pass', 'pass', null, null, test); var stdout = runReporter({epilogue: function() {}}, runner, options); @@ -85,29 +78,21 @@ describe('List reporter', function() { expectedDuration + 'ms\n' ); - - Base.cursor = cachedCursor; - Base.symbols = cachedSymbols; }); }); describe('on fail', function() { it('should call cursor CR', function() { - var calledCursorCR = false; - var cachedCursor = Base.cursor; - Base.cursor.CR = function() { - calledCursorCR = true; - }; + sandbox.stub(Base.cursor, 'CR'); + runner = createMockRunner('fail', 'fail', null, null, test); runReporter({epilogue: function() {}}, runner, options); - expect(calledCursorCR, 'to be', true); - - Base.cursor = cachedCursor; + expect(Base.cursor.CR, 'was called'); }); it('should write expected error number and title', function() { - var cachedCursor = Base.cursor; + sandbox.stub(Base.cursor, 'CR'); + var expectedErrorCount = 1; - Base.cursor.CR = function() {}; runner = createMockRunner('fail', 'fail', null, null, test); var stdout = runReporter({epilogue: function() {}}, runner, options); @@ -116,8 +101,6 @@ describe('List reporter', function() { 'to be', ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' ); - - Base.cursor = cachedCursor; }); it('should immediately construct fail strings', function() { var actual = {a: 'actual'}; @@ -149,19 +132,13 @@ describe('List reporter', function() { describe('on end', function() { it('should call epilogue', function() { - var calledEpilogue = false; + var reporterStub = {epilogue: function() {}}; + sandbox.stub(reporterStub, 'epilogue'); + runner = createMockRunner('end', 'end'); - runReporter( - { - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledEpilogue, 'to be', true); + expect(reporterStub.epilogue, 'was called'); }); }); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index 96bbda6766..b1ad3a22a3 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -1,5 +1,6 @@ 'use strict'; +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; var NyanCat = reporters.Nyan; var Base = reporters.Base; @@ -10,110 +11,90 @@ var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Nyan reporter', function() { describe('events', function() { var runner; - var calledDraw; var options = {}; var runReporter = makeRunReporter(NyanCat); afterEach(function() { + sandbox.restore(); runner = undefined; }); describe('on start', function() { it('should call draw', function() { - calledDraw = false; + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + runner = createMockRunner('start', 'start'); - runReporter( - { - draw: function() { - calledDraw = true; - }, - generateColors: function() {} - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledDraw, 'to be', true); + expect(reporterStub.draw, 'was called'); }); }); describe('on pending', function() { it('should call draw', function() { - calledDraw = false; + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + runner = createMockRunner('pending', 'pending'); - runReporter( - { - draw: function() { - calledDraw = true; - }, - generateColors: function() {} - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledDraw, 'to be', true); + expect(reporterStub.draw, 'was called'); }); }); describe('on pass', function() { it('should call draw', function() { - calledDraw = false; + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + var test = { duration: '', slow: function() {} }; runner = createMockRunner('pass', 'pass', null, null, test); - runReporter( - { - draw: function() { - calledDraw = true; - }, - generateColors: function() {} - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledDraw, 'to be', true); + expect(reporterStub.draw, 'was called'); }); }); describe('on fail', function() { it('should call draw', function() { - calledDraw = false; + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + var test = { err: '' }; runner = createMockRunner('fail', 'fail', null, null, test); - runReporter( - { - draw: function() { - calledDraw = true; - }, - generateColors: function() {} - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledDraw, 'to be', true); + expect(reporterStub.draw, 'was called'); }); }); describe('on end', function() { it('should call epilogue', function() { - var calledEpilogue = false; + var reporterStub = { + draw: function() {}, + generateColors: function() {}, + epilogue: function() {} + }; + sandbox.stub(reporterStub, 'epilogue'); + runner = createMockRunner('end', 'end'); - runReporter( - { - draw: function() {}, - generateColors: function() {}, - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - options - ); + runReporter(reporterStub, runner, options); - expect(calledEpilogue, 'to be', true); + expect(reporterStub.epilogue, 'was called'); }); it('should write numberOfLines amount of new lines', function() { var expectedNumberOfLines = 4; @@ -135,11 +116,8 @@ describe('Nyan reporter', function() { expect(arrayOfNewlines, 'to have length', expectedNumberOfLines); }); it('should call Base show', function() { - var showCalled = false; - var cachedShow = Base.cursor.show; - Base.cursor.show = function() { - showCalled = true; - }; + sandbox.stub(Base.cursor, 'show'); + runner = createMockRunner('end', 'end'); runReporter( { @@ -151,8 +129,7 @@ describe('Nyan reporter', function() { options ); - expect(showCalled, 'to be', true); - Base.cursor.show = cachedShow; + expect(Base.cursor.show, 'was called'); }); }); }); @@ -299,15 +276,8 @@ describe('Nyan reporter', function() { describe('rainbowify', function() { describe('useColors is false', function() { - var useColors; - beforeEach(function() { - useColors = Base.useColors; - Base.useColors = false; - }); - - afterEach(function() { - Base.useColors = useColors; + sandbox.stub(Base, 'useColors').value(false); }); it('should return argument string', function() { @@ -319,16 +289,10 @@ describe('Nyan reporter', function() { }); }); describe('useColors is true', function() { - var useColors; - beforeEach(function() { - useColors = Base.useColors; - Base.useColors = true; + sandbox.stub(Base, 'useColors').value(true); }); - afterEach(function() { - Base.useColors = useColors; - }); it('should return rainbowified string from the given string and predefined codes', function() { var startCode = '\u001b[38;5;'; var endCode = '\u001b[0m'; diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index f19bb3988d..cdea9c643e 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -1,5 +1,6 @@ 'use strict'; +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; var Progress = reporters.Progress; var Base = reporters.Base; @@ -23,34 +24,27 @@ describe('Progress reporter', function() { }); afterEach(function() { + sandbox.restore(); process.stdout.write = stdoutWrite; }); describe('on start', function() { it('should call cursor hide', function() { - var cachedCursor = Base.cursor; - var calledCursorHide = false; - Base.cursor.hide = function() { - calledCursorHide = true; - }; + sandbox.stub(Base.cursor, 'hide'); + runner = createMockRunner('start', 'start'); runReporter({}, runner, {}); - expect(calledCursorHide, 'to be', true); - - Base.cursor = cachedCursor; + expect(Base.cursor.hide, 'was called'); }); }); describe('on test end', function() { describe('if line has not changed', function() { it('should return and not write anything', function() { - var cachedCursor = Base.cursor; - var useColors = Base.useColors; - Base.useColors = false; - Base.cursor.CR = function() {}; - var windowWidth = Base.window.width; - Base.window.width = -3; + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR'); + sandbox.stub(Base.window, 'width').value(-3); var expectedTotal = 1; var expectedOptions = {}; @@ -59,23 +53,13 @@ describe('Progress reporter', function() { var stdout = runReporter({}, runner, expectedOptions); expect(stdout, 'to equal', []); - - Base.cursor = cachedCursor; - Base.useColors = useColors; - Base.window.width = windowWidth; }); }); describe('if line has changed', function() { it('should write expected progress of open and close options', function() { - var calledCursorCR = false; - var cachedCursor = Base.cursor; - var useColors = Base.useColors; - Base.useColors = false; - Base.cursor.CR = function() { - calledCursorCR = true; - }; - var windowWidth = Base.window.width; - Base.window.width = 5; + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR'); + sandbox.stub(Base.window, 'width').value(5); var expectedTotal = 12; var expectedOpen = 'OpEn'; @@ -101,39 +85,23 @@ describe('Progress reporter', function() { expectedIncomplete, expectedClose ]; - expect(calledCursorCR, 'to be', true); + expect(Base.cursor.CR, 'was called'); expect(stdout, 'to equal', expectedArray); - - Base.cursor = cachedCursor; - Base.useColors = useColors; - Base.window.width = windowWidth; }); }); }); describe('on end', function() { it('should call cursor show and epilogue', function() { - var cachedCursor = Base.cursor; - var calledCursorShow = false; - Base.cursor.show = function() { - calledCursorShow = true; - }; + var reporterStub = {epilogue: function() {}}; + sandbox.stub(Base.cursor, 'show'); + sandbox.stub(reporterStub, 'epilogue'); + runner = createMockRunner('end', 'end'); - var calledEpilogue = false; - runReporter( - { - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - {} - ); - - expect(calledEpilogue, 'to be', true); - expect(calledCursorShow, 'to be', true); - - Base.cursor = cachedCursor; + runReporter(reporterStub, runner, {}); + + expect(reporterStub.epilogue, 'was called'); + expect(Base.cursor.show, 'was called'); }); }); }); From f6b8e898526c908294010ccc31a3ce800c426498 Mon Sep 17 00:00:00 2001 From: Paul Roebuck Date: Thu, 25 Apr 2019 08:54:13 -0500 Subject: [PATCH 1335/1771] test(test/reporters): Rework reporter tests Reworked stubs to use sinon. Added logic to (hopefully) rethrow errors when stdout stubbed. Now uses event constants. Various mods for consistency. Now green across the board. --- test/reporters/base.spec.js | 258 +++++---- test/reporters/doc.spec.js | 358 +++++++----- test/reporters/dot.spec.js | 319 +++++++---- test/reporters/helpers.js | 69 ++- test/reporters/json-stream.spec.js | 204 +++---- test/reporters/json.spec.js | 26 +- test/reporters/landing.spec.js | 142 +++-- test/reporters/list.spec.js | 318 +++++++---- test/reporters/markdown.spec.js | 177 +++--- test/reporters/min.spec.js | 66 +-- test/reporters/nyan.spec.js | 597 ++++++++++++-------- test/reporters/progress.spec.js | 168 +++--- test/reporters/spec.spec.js | 215 +++++--- test/reporters/tap.spec.js | 858 ++++++++++++++++------------- test/reporters/xunit.spec.js | 546 ++++++++++-------- 15 files changed, 2528 insertions(+), 1793 deletions(-) diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 40d1374537..739063f32a 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -1,124 +1,138 @@ 'use strict'; var assert = require('assert'); -var chaiExpect = require('chai').expect; -var Base = require('../../lib/reporters/base'); +var chai = require('chai'); +var sinon = require('sinon'); +var helpers = require('./helpers'); +var reporters = require('../../').reporters; + var AssertionError = assert.AssertionError; -var makeTest = require('./helpers').makeTest; -var createElements = require('./helpers').createElements; +var Base = reporters.Base; +var chaiExpect = chai.expect; +var createElements = helpers.createElements; +var makeTest = helpers.makeTest; describe('Base reporter', function() { + var sandbox; var stdout; - var stdoutWrite; - var useColors; - var err; - var errOut; - var test; function list(tests) { - Base.useColors = false; - var retval = Base.list(tests); - Base.useColors = useColors; - return retval; + try { + try { + Base.list(tests); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } } function generateDiff(actual, expected) { - Base.useColors = false; - var retval = Base.generateDiff(actual, expected); - Base.useColors = useColors; - return retval; + var diffStr; + + try { + try { + diffStr = Base.generateDiff(actual, expected); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + + return diffStr; } + var gather = function(chunk, encoding, cb) { + stdout.push(chunk); + }; + beforeEach(function() { - useColors = Base.useColors; + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(process.stdout, 'write').callsFake(gather); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - stdoutWrite.call(process.stdout, string, enc, callback); - }; }); afterEach(function() { - process.stdout.write = stdoutWrite; + sandbox.restore(); }); describe('showDiff', function() { + var err; + beforeEach(function() { err = new AssertionError({actual: 'foo', expected: 'bar'}); }); it('should show diffs by default', function() { - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it('should show diffs if property set to `true`', function() { + it("should show diffs if 'err.showDiff' is true", function() { err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it('should not show diffs when showDiff property set to `false`', function() { + it("should not show diffs if 'err.showDiff' is false", function() { err.showDiff = false; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it('should not show diffs when expected is not defined', function() { - err = new Error('ouch'); - - test = makeTest(err); + it("should not show diffs if 'expected' is not defined", function() { + var _err = new Error('ouch'); + var test = makeTest(_err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it('should not show diffs when hideDiff is set', function() { - test = makeTest(err); + it("should not show diffs if 'hideDiff' is true", function() { + var test = makeTest(err); - Base.hideDiff = true; + sandbox.stub(Base, 'hideDiff').value(true); list([test]); - Base.hideDiff = false; // Revert to original value - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); }); - describe('Getting two strings', function() { + describe('getting two strings', function() { // Fix regression V1.2.1(see: issue #1241) it('should show strings diff as is', function() { - err = new Error('test'); - + var err = new Error('test'); err.actual = 'foo\nbar'; err.expected = 'foo\nbaz'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /"foo\\nbar"/); expect(errOut, 'to match', /foo/).and('to match', /bar/); expect(errOut, 'to match', /test/); @@ -127,26 +141,19 @@ describe('Base reporter', function() { }); }); - describe('Diff generation', function() { - var oldInlineDiffs; - var actual; - var expected; - var output; + describe('diff generation', function() { + var inlineDiffsStub; beforeEach(function() { - oldInlineDiffs = Base.inlineDiffs; - }); - - afterEach(function() { - Base.inlineDiffs = oldInlineDiffs; + inlineDiffsStub = sandbox.stub(Base, 'inlineDiffs'); }); - it('should generate unified diffs if `inlineDiff === false`', function() { - actual = 'a foo unified diff'; - expected = 'a bar unified diff'; + it("should generate unified diffs if 'inlineDiffs' is false", function() { + var actual = 'a foo unified diff'; + var expected = 'a bar unified diff'; - Base.inlineDiffs = false; - output = generateDiff(actual, expected); + inlineDiffsStub.value(false); + var output = generateDiff(actual, expected); expect( output, @@ -155,12 +162,12 @@ describe('Base reporter', function() { ); }); - it('should generate inline diffs if `inlineDiffs === true`', function() { - actual = 'a foo inline diff'; - expected = 'a bar inline diff'; + it("should generate inline diffs if 'inlineDiffs' is true", function() { + var actual = 'a foo inline diff'; + var expected = 'a bar inline diff'; - Base.inlineDiffs = true; - output = generateDiff(actual, expected); + inlineDiffsStub.value(true); + var output = generateDiff(actual, expected); expect( output, @@ -170,39 +177,37 @@ describe('Base reporter', function() { }); }); - describe('Inline strings diff', function() { - it('should show single line diff if property set to `true`', function() { - err = new Error('test'); + describe('inline strings diff', function() { + beforeEach(function() { + sandbox.stub(Base, 'inlineDiffs').value(true); + }); + it("should show single line diff if 'inlineDiffs' is true", function() { + var err = new Error('test'); err.actual = 'a foo inline diff'; err.expected = 'a bar inline diff'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = true; list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'to match', /a foobar inline diff/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /actual/); expect(errOut, 'to match', /expected/); }); - it('should split lines when string has more than 4 line breaks', function() { - err = new Error('test'); - + it('should split lines if string has more than 4 line breaks', function() { + var err = new Error('test'); err.actual = 'a\nfoo\ninline\ndiff\nwith\nmultiple lines'; err.expected = 'a\nbar\ninline\ndiff\nwith\nmultiple lines'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = true; list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'to match', /1 \| a/); expect(errOut, 'to match', /2 \| foobar/); expect(errOut, 'to match', /3 \| inline/); @@ -215,21 +220,21 @@ describe('Base reporter', function() { }); }); - describe('unified diff reporter', function() { + describe('unified diff', function() { beforeEach(function() { - err = new Error('test'); + sandbox.stub(Base, 'inlineDiffs').value(false); }); it('should separate diff hunks by two dashes', function() { + var err = new Error('test'); err.actual = createElements({from: 2, to: 11}); err.expected = createElements({from: 1, to: 10}); err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = false; list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); var regexesToMatch = [ /\[/, @@ -257,16 +262,15 @@ describe('Base reporter', function() { }); it('should stringify objects', function() { - err = new Error('test'); - + var err = new Error('test'); err.actual = {key: 'a1'}; err.expected = {key: 'e1'}; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /"key"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -274,18 +278,18 @@ describe('Base reporter', function() { }); it('should stringify Object.create(null)', function() { - err = new Error('test'); + var err = new Error('test'); err.actual = Object.create(null); err.actual.hasOwnProperty = 1; err.expected = Object.create(null); err.expected.hasOwnProperty = 2; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /"hasOwnProperty"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -299,11 +303,11 @@ describe('Base reporter', function() { err.actual = false; err.expected = true; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /\+true/); expect(errOut, 'to match', /-false/); expect(errOut, 'to match', /- actual/); @@ -311,18 +315,21 @@ describe('Base reporter', function() { } }); - it('should interpret Chai custom error messages', function() { + it("should interpret 'chai' module custom error messages", function() { + var actual = 43; + var expected = 42; + try { - chaiExpect(43, 'custom error message').to.equal(42); + chaiExpect(actual, 'custom error message').to.equal(expected); } catch (err) { - err.actual = 43; - err.expected = 42; + err.actual = actual; + err.expected = expected; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/) .and('to match', /\+42/) .and('to match', /-43/) @@ -331,20 +338,23 @@ describe('Base reporter', function() { } }); - it('should interpret assert module custom error messages', function() { + it("should interpret 'assert' module custom error messages", function() { + var actual = 43; + var expected = 42; + try { - assert.strictEqual(43, 42, 'custom error message'); + assert.strictEqual(actual, expected, 'custom error message'); // AssertionError: custom error message: expected 43 to equal 42. // assert.equal(43, 42, 'custom error message: expected 43 to equal 42.'); } catch (err) { - err.actual = 43; - err.expected = 42; + err.actual = actual; + err.expected = expected; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/); expect(errOut, 'to match', /\+42/); expect(errOut, 'to match', /-43/); @@ -354,53 +364,57 @@ describe('Base reporter', function() { }); it('should remove message from stack', function() { - err = { + var err = { message: 'Error', stack: 'Error\nfoo\nbar', showDiff: false }; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n').trim(); + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); - it('should use the inspect() property if `message` is not set', function() { - err = { + it("should use 'inspect' if 'message' is not set", function() { + var err = { showDiff: false, inspect: function() { return 'an error happened'; } }; - test = makeTest(err); + var test = makeTest(err); + list([test]); - errOut = stdout.join('\n').trim(); + + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n an error happened'); }); - it('should set an empty message if `message` and `inspect()` are not set', function() { - err = { + it("should set an empty message if neither 'message' nor 'inspect' is set", function() { + var err = { showDiff: false }; - test = makeTest(err); + var test = makeTest(err); + list([test]); - errOut = stdout.join('\n').trim(); + + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:'); }); it('should not modify stack if it does not contain message', function() { - err = { + var err = { message: 'Error', stack: 'foo\nbar', showDiff: false }; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n').trim(); + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); }); diff --git a/test/reporters/doc.spec.js b/test/reporters/doc.spec.js index 857922b83e..fb2703f83c 100644 --- a/test/reporters/doc.spec.js +++ b/test/reporters/doc.spec.js @@ -1,10 +1,17 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Doc = reporters.Doc; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers.js').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_SUITE_END = events.EVENT_SUITE_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('Doc reporter', function() { var runner; @@ -12,178 +19,223 @@ describe('Doc reporter', function() { var runReporter = makeRunReporter(Doc); afterEach(function() { - runner = undefined; + runner = null; }); - describe('on suite', function() { - describe('if suite root does not exist', function() { - var expectedTitle = 'expectedTitle'; - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var suite = { - root: false, - title: expectedTitle + describe('event handlers', function() { + describe("on 'suite' event", function() { + describe('when suite root does not exist', function() { + var expectedTitle = 'expectedTitle'; + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var suite = { + root: false, + title: expectedTitle + }; + + it('should log html with indents and expected title', function() { + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + + it('should escape title where necessary', function() { + var suite = { + root: false, + title: unescapedTitle + }; + expectedTitle = + '<div>' + expectedTitle + '</div>'; + + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when suite root exists', function() { + var suite = { + root: true + }; + + it('should not log any html', function() { + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + expect(stdout, 'to be empty'); + }); + }); + }); + + describe("on 'suite end' event", function() { + describe('when suite root does not exist', function() { + var suite = { + root: false + }; + + it('should log expected html with indents', function() { + runner = createMockRunner( + 'suite end', + EVENT_SUITE_END, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = ['
              \n', '
              \n']; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when suite root exists', function() { + var suite = { + root: true + }; + + it('should not log any html', function() { + runner = createMockRunner( + 'suite end', + EVENT_SUITE_END, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + expect(stdout, 'to be empty'); + }); + }); + }); + + describe("on 'pass' event", function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } }; - it('should log html with indents and expected title', function() { - runner = createMockRunner('suite', 'suite', null, null, suite); + + it('should log html with indents, expected title, and body', function() { + runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' + '
              ' + expectedTitle + '
              \n', + '
              ' + expectedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); - it('should escape title where necessary', function() { - var suite = { - root: false, - title: unescapedTitle - }; - expectedTitle = '<div>' + expectedTitle + '</div>'; - runner = createMockRunner('suite', 'suite', null, null, suite); + + it('should escape title and body where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; + + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' + expectedEscapedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); }); - describe('if suite root does exist', function() { - var suite = { - root: true - }; - it('should not log any html', function() { - runner = createMockRunner('suite', 'suite', null, null, suite); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - describe('on suite end', function() { - describe('if suite root does not exist', function() { - var suite = { - root: false + describe("on 'fail' event", function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var expectedError = 'some error'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } }; - it('should log expected html with indents', function() { - runner = createMockRunner('suite end', 'suite end', null, null, suite); + + it('should log html with indents, expected title, body, and error', function() { + runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + test, + expectedError + ); var stdout = runReporter(this, runner, options); - var expectedArray = ['
              \n', '
              \n']; + var expectedArray = [ + '
              ' + expectedTitle + '
              \n', + '
              ' +
              +            expectedBody +
              +            '
              \n', + '
              ' + expectedError + '
              \n' + ]; expect(stdout, 'to equal', expectedArray); }); - }); - describe('if suite root does exist', function() { - var suite = { - root: true - }; - it('should not log any html', function() { - runner = createMockRunner('suite end', 'suite end', null, null, suite); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - describe('on pass', function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } - }; - it('should log html with indents and expected title and body', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' + expectedBody + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - it('should escape title and body where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' + expectedEscapedBody + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + it('should escape title, body, and error where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + var unescapedError = '
              ' + expectedError + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; - describe('on fail', function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var expectedError = 'some error'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } - }; - it('should log html with indents and expected title, body and error', function() { - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - test, - expectedError - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' +
              -          expectedBody +
              -          '
              \n', - '
              ' + expectedError + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - it('should escape title, body and error where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - var unescapedError = '
              ' + expectedError + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - var expectedEscapedError = - '<div>' + expectedError + '</div>'; - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - test, - unescapedError - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' +
              -          expectedEscapedBody +
              -          '
              \n', - '
              ' + expectedEscapedError + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + var expectedEscapedError = + '<div>' + expectedError + '</div>'; + runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + test, + unescapedError + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' +
              +            expectedEscapedBody +
              +            '
              \n', + '
              ' + expectedEscapedError + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); }); diff --git a/test/reporters/dot.spec.js b/test/reporters/dot.spec.js index 472ec63d01..4a23c7951e 100644 --- a/test/reporters/dot.spec.js +++ b/test/reporters/dot.spec.js @@ -1,155 +1,238 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Dot = reporters.Dot; + var Base = reporters.Base; +var Dot = reporters.Dot; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers.js').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Dot reporter', function() { - var runner; - var useColors; - var windowWidth; - var color; - var options = {}; + var sandbox; + var windowWidthStub; var runReporter = makeRunReporter(Dot); + var noop = function() {}; beforeEach(function() { - useColors = Base.useColors; - windowWidth = Base.window.width; - color = Base.color; - Base.useColors = false; - Base.window.width = 0; - Base.color = function(type, str) { + sandbox = sinon.createSandbox(); + windowWidthStub = sandbox.stub(Base.window, 'width').value(0); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base, 'color').callsFake(function(type, str) { return type.replace(/ /g, '-') + '_' + str; - }; + }); }); afterEach(function() { - Base.useColors = useColors; - Base.window.width = windowWidth; - Base.color = color; - runner = undefined; + sandbox.restore(); }); - describe('on start', function() { - it('should write a newline', function() { - runner = createMockRunner('start', 'start'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('on pending', function() { - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; - }); - it('should write a newline followed by a comma', function() { - runner = createMockRunner('pending', 'pending'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('if window width is equal to or less than 1', function() { - it('should write a comma', function() { - runner = createMockRunner('pending', 'pending'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['pending_' + Base.symbols.comma]; + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write a newline', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n']; expect(stdout, 'to equal', expectedArray); }); }); - }); - describe('on pass', function() { - var test = { - duration: 1, - slow: function() { - return 2; - } - }; - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; - }); - describe('if test speed is fast', function() { - it('should write a newline followed by a dot', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; + + describe("on 'pending' event", function() { + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + it('should write a newline followed by a comma', function() { + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); }); }); - }); - describe('if window width is equal to or less than 1', function() { - describe('if test speed is fast', function() { - it('should write a grey dot', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['fast_' + Base.symbols.dot]; + + describe('when window width is less than or equal to 1', function() { + it('should write a comma', function() { + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); }); }); - describe('if test speed is medium', function() { - it('should write a yellow dot', function() { - test.duration = 2; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'medium'); - var expectedArray = ['medium_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); + }); + + describe("on 'pass' event", function() { + var test = { + duration: 1, + slow: function() { + return 2; + } + }; + + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + describe('when test speed is fast', function() { + it('should write a newline followed by a dot', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if test speed is slow', function() { - it('should write a bright yellow dot', function() { - test.duration = 3; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'slow'); - var expectedArray = ['bright-yellow_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); + + describe('when window width is less than or equal to 1', function() { + describe('when test speed is fast', function() { + it('should write a grey dot', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when test speed is medium', function() { + it('should write a yellow dot', function() { + test.duration = 2; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'medium'); + var expectedArray = ['medium_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when test speed is slow', function() { + it('should write a bright yellow dot', function() { + test.duration = 3; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'slow'); + var expectedArray = ['bright-yellow_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); }); }); }); - }); - describe('on fail', function() { - var test = { - test: { - err: 'some error' - } - }; - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; + + describe("on 'fail' event", function() { + var test = { + test: { + err: 'some error' + } + }; + + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + it('should write a newline followed by an exclamation mark', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); + }); }); - it('should write a newline followed by an exclamation mark', function() { - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; - expect(stdout, 'to equal', expectedArray); + + describe('when window width is less than or equal to 1', function() { + it('should write an exclamation mark', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if window width is equal to or less than 1', function() { - it('should write an exclamation mark', function() { - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['fail_' + Base.symbols.bang]; - expect(stdout, 'to equal', expectedArray); + + describe("on 'end' event", function() { + it('should call epilogue', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var fakeThis = { + epilogue: sinon.stub() + }; + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(fakeThis.epilogue.called, 'to be true'); }); }); }); - describe('on end', function() { - it('should call the epilogue', function() { - runner = createMockRunner('end', 'end'); - var epilogueCalled = false; - var epilogue = function() { - epilogueCalled = true; - }; - runReporter({epilogue: epilogue}, runner, options); - expect(epilogueCalled, 'to be', true); - }); - }); }); diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 5cb21a53f2..76b3d79307 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -1,17 +1,22 @@ 'use strict'; +var sinon = require('sinon'); var errors = require('../../lib/errors'); -var createUnsupportedError = errors.createUnsupportedError; -/* - This function prevents the constant use of creating a runnerEvent. - runStr is the argument that defines the runnerEvent. - ifStr1 is one possible reporter argument, as is ifStr2, and ifStr3 - arg1 and arg2 are the possible variables that need to be put into the - scope of this function for the tests to run properly. -*/ - var createStatsCollector = require('../../lib/stats-collector'); +var createUnsupportedError = errors.createUnsupportedError; + +/** + * Creates a mock runner object. + * + * @param {string} runStr - argument that defines the runnerEvent + * @param {string} ifStr1 - runner event + * @param {(string|null)} [ifStr2] - runner event + * @param {(string|null)} [ifStr3] - runner event + * @param {(*|null)} [arg1] - variable to be added to event handler's scope + * @param {(*|null)} [arg2] - variable to be added to event handler's scope + * @return {Object} mock runner instance + */ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var runnerFunction = createRunnerFunction( runStr, @@ -29,6 +34,20 @@ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { return mockRunner; } +/** + * Creates an event handler function to be used by the runner. + * + * @description + * Arguments 'ifStr1', 'ifStr2', and 'ifStr3' should be `Runner.constants`. + * + * @param {string} runStr - argument that defines the runnerEvent + * @param {string} ifStr1 - runner event + * @param {(string|null)} [ifStr2] - runner event + * @param {(string|null)} [ifStr3] - runner event + * @param {(*|null)} [arg1] - variable to be added to event handler's scope + * @param {(*|null)} [arg2] - variable to be added to event handler's scope + * @return {Function} event handler for the requested runner events + */ function createRunnerFunction(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var test = null; switch (runStr) { @@ -178,23 +197,35 @@ function createRunReporterFunction(ctor) { * @return {string[]} Lines of output written to `stdout` */ var runReporter = function(stubSelf, runner, options, tee) { + var origStdoutWrite = process.stdout.write; + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); var stdout = []; - // Reassign stream in order to make a copy of all reporter output - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); + var gather = function(chunk, enc, callback) { + stdout.push(chunk); if (tee) { - stdoutWrite.call(process.stdout, string, enc, callback); + origStdoutWrite.call(process.stdout, chunk); } }; - // Invoke reporter - ctor.call(stubSelf, runner, options); + // Reassign stream in order to make a copy of all reporter output + stdoutWriteStub.callsFake(gather); + + // Give `stubSelf` access to `ctor` prototype chain + Object.setPrototypeOf(stubSelf, ctor.prototype); - // Revert stream reassignment here so reporter output - // can't be corrupted if any test assertions throw - process.stdout.write = stdoutWrite; + try { + try { + // Invoke reporter + ctor.call(stubSelf, runner, options); + } finally { + // Revert stream reassignment here so reporter output + // can't be corrupted if any test assertions throw + stdoutWriteStub.restore(); + } + } catch (err) { + throw err; // Rethrow + } return stdout; }; diff --git a/test/reporters/json-stream.spec.js b/test/reporters/json-stream.spec.js index 8c9fcfff35..de83f861b2 100644 --- a/test/reporters/json-stream.spec.js +++ b/test/reporters/json-stream.spec.js @@ -1,15 +1,22 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; +var utils = require('../../lib/utils'); + var JSONStream = reporters.JSONStream; +var createMockRunner = helpers.createMockRunner; +var dQuote = utils.dQuote; +var makeExpectedTest = helpers.makeExpectedTest; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeExpectedTest = require('./helpers').makeExpectedTest; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('JSON Stream reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(JSONStream); var expectedTitle = 'some title'; var expectedFullTitle = 'full title'; @@ -27,119 +34,126 @@ describe('JSON Stream reporter', function() { message: expectedErrorMessage }; - afterEach(function() { - runner = undefined; - }); - - describe('on start', function() { - it('should write stringified start with expected total', function() { - runner = createMockRunner('start', 'start'); - var expectedTotal = 12; - runner.total = expectedTotal; - var stdout = runReporter({}, runner, options); - - expect( - stdout[0], - 'to equal', - '["start",{"total":' + expectedTotal + '}]\n' - ); - }); - }); - - describe('on pass', function() { - it('should write stringified test data', function() { - runner = createMockRunner('pass', 'pass', null, null, expectedTest); - var stdout = runReporter({}, runner, options); - - expect( - stdout[0], - 'to equal', - '["pass",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - '}]\n' - ); - }); - }); - - describe('on fail', function() { - describe('if error stack exists', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = expectedErrorStack; - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - expectedTest, - expectedError - ); - + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write stringified start with expected total', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var expectedTotal = 12; + runner.total = expectedTotal; + var options = {}; var stdout = runReporter({}, runner, options); expect( stdout[0], 'to equal', - '["fail",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - ',"err":"' + - expectedErrorMessage + - '","stack":"' + - expectedErrorStack + - '"}]\n' + '["start",{"total":' + expectedTotal + '}]\n' ); }); }); - describe('if error stack does not exist', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = null; - runner = createMockRunner( - 'fail two args', - 'fail', + describe("on 'pass' event", function() { + it('should write stringified test data', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, null, null, - expectedTest, - expectedError + expectedTest ); - - var stdout = runReporter(this, runner, options); + var options = {}; + var stdout = runReporter({}, runner, options); expect( stdout[0], 'to equal', - '["fail",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + + '["pass",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + expectedDuration + ',"currentRetry":' + currentRetry + - ',"err":"' + - expectedErrorMessage + - '","stack":null}]\n' + '}]\n' ); }); }); - }); - describe('on end', function() { - it('should write end details', function() { - runner = createMockRunner('end', 'end'); - var stdout = runReporter(this, runner, options); - expect(stdout[0], 'to match', /end/); + describe("on 'fail' event", function() { + describe('when error stack exists', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = expectedErrorStack; + var runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + expectedTest, + expectedError + ); + var options = {}; + var stdout = runReporter({}, runner, options); + + expect( + stdout[0], + 'to equal', + '["fail",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + ',"err":' + + dQuote(expectedErrorMessage) + + ',"stack":' + + dQuote(expectedErrorStack) + + '}]\n' + ); + }); + }); + + describe('when error stack does not exist', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = null; + var runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + expectedTest, + expectedError + ); + var options = {}; + var stdout = runReporter(this, runner, options); + + expect( + stdout[0], + 'to equal', + '["fail",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + ',"err":' + + dQuote(expectedErrorMessage) + + ',"stack":null}]\n' + ); + }); + }); + }); + + describe("on 'end' event", function() { + it('should write summary statistics', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var stdout = runReporter(this, runner, options); + expect(stdout[0], 'to match', /end/); + }); }); }); }); diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index 5d7a37c564..f6299dd134 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -7,8 +7,11 @@ var Runner = Mocha.Runner; var Test = Mocha.Test; describe('JSON reporter', function() { - var suite, runner; + var sandbox; + var suite; + var runner; var testTitle = 'json test 1'; + var noop = function() {}; beforeEach(function() { var mocha = new Mocha({ @@ -16,8 +19,18 @@ describe('JSON reporter', function() { }); suite = new Suite('JSON suite', 'root'); runner = new Runner(suite); + var options = {}; /* eslint no-unused-vars: off */ - var mochaReporter = new mocha._reporter(runner); + var mochaReporter = new mocha._reporter(runner, options); + }); + + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(process.stdout, 'write').callsFake(noop); + }); + + afterEach(function() { + sandbox.restore(); }); it('should have 1 test failure', function(done) { @@ -29,9 +42,8 @@ describe('JSON reporter', function() { }) ); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ @@ -52,9 +64,8 @@ describe('JSON reporter', function() { it('should have 1 test pending', function(done) { suite.addTest(new Test(testTitle)); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { pending: [ @@ -83,9 +94,8 @@ describe('JSON reporter', function() { }) ); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index dd73d9e5b3..acb2ee3ef6 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -1,20 +1,25 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); -var Mocha = require('../..'); -var reporters = Mocha.reporters; -var Landing = reporters.Landing; -var constants = Mocha.Runnable.constants; -var STATE_FAILED = constants.STATE_FAILED; -var STATE_PASSED = constants.STATE_PASSED; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); +var reporters = require('../../').reporters; +var states = require('../../').Runnable.constants; + var Base = reporters.Base; +var Landing = reporters.Landing; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; + +var STATE_FAILED = states.STATE_FAILED; +var STATE_PASSED = states.STATE_PASSED; describe('Landing reporter', function() { - var runner; - var options = {}; + var sandbox; var runReporter = makeRunReporter(Landing); var resetCode = '\u001b[0m'; var expectedArray = [ @@ -29,73 +34,98 @@ describe('Landing reporter', function() { ]; beforeEach(function() { + sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); sandbox.stub(Base.window, 'width').value(1); }); afterEach(function() { sandbox.restore(); - runner = undefined; }); - describe('on start', function() { - it('should write new lines', function() { - sandbox.stub(Base.cursor, 'hide'); - - runner = createMockRunner('start', 'start'); - var stdout = runReporter({}, runner, options); + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write newlines', function() { + sandbox.stub(Base.cursor, 'hide'); - expect(stdout[0], 'to equal', '\n\n\n '); - }); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); - it('should call cursor hide', function() { - sandbox.stub(Base.cursor, 'hide'); + expect(stdout[0], 'to equal', '\n\n\n '); + }); - runner = createMockRunner('start', 'start'); - runReporter({}, runner, options); + it('should call cursor hide', function() { + var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); - expect(Base.cursor.hide, 'was called'); - }); - }); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter({}, runner, options); + sandbox.restore(); - describe('on test end', function() { - describe('if test has failed', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_FAILED - }; - runner = createMockRunner('test end', 'test end', null, null, test); - runner.total = 12; - var stdout = runReporter({}, runner, options); - - expect(stdout, 'to equal', expectedArray); + expect(hideCursorStub.called, 'to be true'); }); }); - describe('if test has not failed', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_PASSED - }; - runner = createMockRunner('test end', 'test end', null, null, test); - var stdout = runReporter({}, runner, options); + describe("on 'test end' event", function() { + describe('when test passes', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_PASSED + }; + var runner = createMockRunner( + 'test end', + EVENT_TEST_END, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', expectedArray); + }); + }); - expect(stdout, 'to equal', expectedArray); + describe('when test fails', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_FAILED + }; + var runner = createMockRunner( + 'test end', + EVENT_TEST_END, + null, + null, + test + ); + runner.total = 12; + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', expectedArray); + }); }); }); - }); - describe('on end', function() { - it('should call cursor show and epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(Base.cursor, 'show'); - sandbox.stub(reporterStub, 'epilogue'); - runner = createMockRunner('end', 'end'); + describe("on 'end' event", function() { + it('should call cursor show and epilogue', function() { + var showCursorStub = sandbox.stub(Base.cursor, 'show'); - runReporter(reporterStub, runner, options); + var fakeThis = { + epilogue: sinon.spy() + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(reporterStub.epilogue, 'was called'); - expect(Base.cursor.show, 'was called'); + expect(fakeThis.epilogue.calledOnce, 'to be true'); + expect(showCursorStub.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index c9eceb87fe..c10272e953 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -1,144 +1,246 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var List = reporters.List; + var Base = reporters.Base; +var List = reporters.List; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_BEGIN = events.EVENT_TEST_BEGIN; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('List reporter', function() { - var runner; - var options = {}; + var sandbox; var runReporter = makeRunReporter(List); var expectedTitle = 'some title'; var expectedDuration = 100; + var noop = function() {}; var test = { fullTitle: function() { return expectedTitle; }, duration: expectedDuration, - slow: function() {} + slow: noop }; beforeEach(function() { + sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { sandbox.restore(); - runner = undefined; }); - describe('on start and test', function() { - it('should write expected new line and title to the console', function() { - runner = createMockRunner('start test', 'start', 'test', null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - var startString = '\n'; - var testString = ' ' + expectedTitle + ': '; - var expectedArray = [startString, testString]; - expect(stdout, 'to equal', expectedArray); + describe('event handlers', function() { + describe("on 'start' and 'test' events", function() { + it('should write expected newline and title', function() { + var runner = createMockRunner( + 'start test', + EVENT_RUN_BEGIN, + EVENT_TEST_BEGIN, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + var startString = '\n'; + var testString = ' ' + expectedTitle + ': '; + var expectedArray = [startString, testString]; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on pending', function() { - it('should write expected title to the console', function() { - runner = createMockRunner('pending test', 'pending', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); + describe("on 'pending' event", function() { + it('should write expected title', function() { + var runner = createMockRunner( + 'pending test', + EVENT_TEST_PENDING, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); + }); }); - }); - describe('on pass', function() { - it('should call cursor CR', function() { - sandbox.stub(Base.cursor, 'CR'); - runner = createMockRunner('pass', 'pass', null, null, test); - runReporter({epilogue: function() {}}, runner, options); - - expect(Base.cursor.CR, 'was called'); - }); - it('should write expected symbol, title and duration to the console', function() { - var expectedOkSymbol = 'OK'; - sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); - sandbox.stub(Base.cursor, 'CR'); - - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - expect( - stdout[0], - 'to be', - ' ' + - expectedOkSymbol + - ' ' + - expectedTitle + - ': ' + - expectedDuration + - 'ms\n' - ); + describe("on 'pass' event", function() { + var crStub; + + beforeEach(function() { + crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + }); + + it('should call cursor CR', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(crStub.called, 'to be true'); + }); + + it('should write expected symbol, title, and duration', function() { + var expectedOkSymbol = 'OK'; + sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); + + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect( + stdout[0], + 'to be', + ' ' + + expectedOkSymbol + + ' ' + + expectedTitle + + ': ' + + expectedDuration + + 'ms\n' + ); + }); }); - }); - describe('on fail', function() { - it('should call cursor CR', function() { - sandbox.stub(Base.cursor, 'CR'); - - runner = createMockRunner('fail', 'fail', null, null, test); - runReporter({epilogue: function() {}}, runner, options); - expect(Base.cursor.CR, 'was called'); - }); - it('should write expected error number and title', function() { - sandbox.stub(Base.cursor, 'CR'); - - var expectedErrorCount = 1; - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - expect( - stdout[0], - 'to be', - ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' - ); - }); - it('should immediately construct fail strings', function() { - var actual = {a: 'actual'}; - var expected = {a: 'expected'}; - var checked = false; - var err; - test = {}; - runner = createMockRunner('fail', 'fail', null, null, test); - runner.on = runner.once = function(event, callback) { - if ( - !checked && - event === 'fail' && - callback.toString().includes('stringifyDiffObjs') // target correct fail event callback - ) { - err = new Error('fake failure object with actual/expected'); - err.actual = actual; - err.expected = expected; - err.showDiff = true; - callback(test, err); - checked = true; - } - }; - runReporter({epilogue: function() {}}, runner, options); - - expect(typeof err.actual, 'to be', 'string'); - expect(typeof err.expected, 'to be', 'string'); + describe("on 'fail' event", function() { + var crStub; + + beforeEach(function() { + crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + }); + + it('should call cursor CR', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(crStub.called, 'to be true'); + }); + + it('should write expected error number and title', function() { + var expectedErrorCount = 1; + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect( + stdout[0], + 'to be', + ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' + ); + }); + + it('should immediately construct fail strings', function() { + var actual = {a: 'actual'}; + var expected = {a: 'expected'}; + var checked = false; + var err; + test = {}; + + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + runner.on = runner.once = function(event, callback) { + if ( + !checked && + event === 'fail' && + callback.toString().includes('stringifyDiffObjs') // target correct fail event callback + ) { + err = new Error('fake failure object with actual/expected'); + err.actual = actual; + err.expected = expected; + err.showDiff = true; + callback(test, err); + checked = true; + } + }; + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(typeof err.actual, 'to be', 'string'); + expect(typeof err.expected, 'to be', 'string'); + }); }); - }); - - describe('on end', function() { - it('should call epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, options); - expect(reporterStub.epilogue, 'was called'); + describe("on 'end' event", function() { + it('should call epilogue', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var fakeThis = { + epilogue: sinon.spy() + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(fakeThis.epilogue.calledOnce, 'to be true'); + }); }); }); }); diff --git a/test/reporters/markdown.spec.js b/test/reporters/markdown.spec.js index 842d7c7643..e068c58cea 100644 --- a/test/reporters/markdown.spec.js +++ b/test/reporters/markdown.spec.js @@ -1,102 +1,115 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Markdown = reporters.Markdown; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_SUITE_END = events.EVENT_SUITE_END; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('Markdown reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Markdown); var expectedTitle = 'expected title'; var expectedFullTitle = 'full title'; var sluggedFullTitle = 'full-title'; + var noop = function() {}; - afterEach(function() { - runner = undefined; - }); - - describe("on 'suite'", function() { - it("should write expected slugged titles on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [ - { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - } - ] - }; - runner = createMockRunner( - 'suite suite end', - 'suite', - 'suite end', - 'end', - expectedSuite - ); - runner.suite = expectedSuite; - var stdout = runReporter({}, runner, options); + describe('event handlers', function() { + describe("on 'suite' event", function() { + it("should write expected slugged titles on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [ + { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + } + ] + }; + var runner = createMockRunner( + 'suite suite end', + EVENT_SUITE_BEGIN, + EVENT_SUITE_END, + EVENT_RUN_END, + expectedSuite + ); + runner.suite = expectedSuite; + var options = {}; + var stdout = runReporter({}, runner, options); - var expectedArray = [ - '# TOC\n', - ' - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n', - '\n ' + expectedTitle + '\n' - ]; + var expectedArray = [ + '# TOC\n', + ' - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n', + '\n ' + expectedTitle + '\n' + ]; - expect(stdout, 'to equal', expectedArray); + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe("on 'pass'", function() { - it("should write test code inside js code block, on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - }; - var expectedDuration = 1000; - var currentRetry = 1; - var expectedBody = 'some body'; - var expectedTest = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - duration: expectedDuration, - currentRetry: function() { - return currentRetry; - }, - slow: function() {}, - body: expectedBody - }; - runner = createMockRunner('pass end', 'pass', 'end', null, expectedTest); - runner.suite = expectedSuite; - var stdout = runReporter({}, runner, options); - var expectedArray = [ - '# TOC\n', - ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', - expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' - ]; + describe("on 'pass' event", function() { + it("should write test code inside js code block, on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + }; + var expectedDuration = 1000; + var currentRetry = 1; + var expectedBody = 'some body'; + var expectedTest = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + duration: expectedDuration, + currentRetry: function() { + return currentRetry; + }, + slow: noop, + body: expectedBody + }; + var runner = createMockRunner( + 'pass end', + EVENT_TEST_PASS, + EVENT_RUN_END, + null, + expectedTest + ); + runner.suite = expectedSuite; + var options = {}; + var stdout = runReporter({}, runner, options); + + var expectedArray = [ + '# TOC\n', + ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', + expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' + ]; - expect(stdout, 'to equal', expectedArray); + expect(stdout, 'to equal', expectedArray); + }); }); }); }); diff --git a/test/reporters/min.spec.js b/test/reporters/min.spec.js index f88adf31d7..1fe46333cf 100644 --- a/test/reporters/min.spec.js +++ b/test/reporters/min.spec.js @@ -1,45 +1,47 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Min = reporters.Min; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; describe('Min reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Min); - - afterEach(function() { - runner = undefined; - }); - - describe('on start', function() { - it('should clear screen then set cursor position', function() { - runner = createMockRunner('start', 'start'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - var expectedArray = ['\u001b[2J', '\u001b[1;3H']; - expect(stdout, 'to equal', expectedArray); + var noop = function() {}; + + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should clear screen then set cursor position', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + + var expectedArray = ['\u001b[2J', '\u001b[1;3H']; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on end', function() { - it('should call epilogue', function() { - var calledEpilogue = false; - runner = createMockRunner('end', 'end'); - runReporter( - { - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - options - ); - - expect(calledEpilogue, 'to be', true); + describe("on 'end' event", function() { + it('should call epilogue', function() { + var fakeThis = { + epilogue: sinon.stub().callsFake(noop) + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + + expect(fakeThis.epilogue.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index b1ad3a22a3..05d2e1bf77 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -1,172 +1,205 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var NyanCat = reporters.Nyan; + var Base = reporters.Base; +var NyanCat = reporters.Nyan; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Nyan reporter', function() { - describe('events', function() { - var runner; - var options = {}; - var runReporter = makeRunReporter(NyanCat); + var sandbox; + var noop = function() {}; - afterEach(function() { - sandbox.restore(); - runner = undefined; - }); + beforeEach(function() { + sandbox = sinon.createSandbox(); + }); - describe('on start', function() { + afterEach(function() { + sandbox.restore(); + }); + + describe('event handlers', function() { + var runReporter = makeRunReporter(NyanCat); + + describe("on 'start' event", function() { it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'draw'); - runner = createMockRunner('start', 'start'); - runReporter(reporterStub, runner, options); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on pending', function() { + + describe("on 'pending' event", function() { it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'draw'); + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + runReporter(fakeThis, runner, options); - runner = createMockRunner('pending', 'pending'); - runReporter(reporterStub, runner, options); - - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on pass', function() { - it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} - }; - sandbox.stub(reporterStub, 'draw'); + describe("on 'pass' event", function() { + it('should call draw', function() { var test = { duration: '', - slow: function() {} + slow: noop }; - runner = createMockRunner('pass', 'pass', null, null, test); - runReporter(reporterStub, runner, options); + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on fail', function() { - it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} - }; - sandbox.stub(reporterStub, 'draw'); + describe("on 'fail' event", function() { + it('should call draw', function() { var test = { err: '' }; - runner = createMockRunner('fail', 'fail', null, null, test); - runReporter(reporterStub, runner, options); + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop + }; + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on end', function() { + + describe("on 'end' event", function() { it('should call epilogue', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} + var fakeThis = { + draw: noop, + epilogue: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, options); + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.epilogue, 'was called'); + expect(fakeThis.epilogue.called, 'to be true'); }); - it('should write numberOfLines amount of new lines', function() { + + it('should write numberOfLines amount of newlines', function() { var expectedNumberOfLines = 4; - runner = createMockRunner('end', 'end'); - var stdout = runReporter( - { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} - }, - runner, - options - ); + var fakeThis = { + draw: noop, + epilogue: noop, + generateColors: noop + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var stdout = runReporter(fakeThis, runner, options); - var arrayOfNewlines = stdout.filter(function(value) { + var isBlankLine = function(value) { return value === '\n'; - }); + }; - expect(arrayOfNewlines, 'to have length', expectedNumberOfLines); + expect( + stdout.filter(isBlankLine), + 'to have length', + expectedNumberOfLines + ); }); + it('should call Base show', function() { - sandbox.stub(Base.cursor, 'show'); - - runner = createMockRunner('end', 'end'); - runReporter( - { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} - }, - runner, - options - ); + var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var fakeThis = { + draw: noop, + epilogue: noop, + generateColors: noop + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(Base.cursor.show, 'was called'); + expect(showCursorStub.called, 'to be true'); }); }); }); - describe('draw', function() { + describe('#draw', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - }; }); - afterEach(function() { - process.stdout.write = stdoutWrite; - }); - - describe('if tick is false', function() { + describe("when 'tick' is false", function() { it('should draw face with expected spaces, _ and ^', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - - nyanCat.draw.call({ + var fakeThis = { tick: false, - appendRainbow: function() {}, - rainbowify: function() {}, - drawScoreboard: function() {}, - drawRainbow: function() {}, + appendRainbow: noop, + rainbowify: noop, + drawScoreboard: noop, + drawRainbow: noop, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: function() {}, - cursorUp: function() {} - }); + face: noop, + cursorUp: noop + }; + + try { + try { + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[0C', @@ -185,23 +218,35 @@ describe('Nyan reporter', function() { expect(stdout, 'to equal', expectedArray); }); }); - describe('if tick is true', function() { + + describe("when 'tick' is true", function() { it('should draw face with expected spaces, _ and ~', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - - nyanCat.draw.call({ + var fakeThis = { tick: true, - appendRainbow: function() {}, - rainbowify: function() {}, - drawScoreboard: function() {}, - drawRainbow: function() {}, + appendRainbow: noop, + rainbowify: noop, + drawScoreboard: noop, + drawRainbow: noop, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: function() {}, - cursorUp: function() {} - }); + face: noop, + cursorUp: noop + }; + + try { + try { + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[0C', @@ -222,102 +267,136 @@ describe('Nyan reporter', function() { }); }); - describe('cursorDown', function() { + describe('#cursorDown', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write cursor down interaction with expected number', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedNumber = 25; - nyanCat.cursorDown(expectedNumber); + try { + try { + nyanCat.cursorDown(expectedNumber); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = ['\u001b[' + expectedNumber + 'B']; expect(stdout, 'to equal', expectedArray); }); }); - describe('cursorUp', function() { + describe('#cursorUp', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write cursor up interaction with expected number', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedNumber = 25; - nyanCat.cursorUp(expectedNumber); + try { + try { + nyanCat.cursorUp(expectedNumber); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = ['\u001b[' + expectedNumber + 'A']; expect(stdout, 'to equal', expectedArray); }); }); - describe('rainbowify', function() { - describe('useColors is false', function() { + describe('#rainbowify', function() { + var useColorsStub; + + beforeEach(function() { + useColorsStub = sandbox.stub(Base, 'useColors'); + }); + + afterEach(function() { + sandbox.restore(); + }); + + describe("when 'useColors' is false", function() { beforeEach(function() { - sandbox.stub(Base, 'useColors').value(false); + useColorsStub.value(false); }); it('should return argument string', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - var expectedString = 'hello'; - var outputString = nyanCat.rainbowify(expectedString); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + + var inputString = 'hello'; + var outputString = nyanCat.rainbowify(inputString); + sandbox.restore(); + var expectedString = inputString; expect(outputString, 'to be', expectedString); }); }); - describe('useColors is true', function() { + + describe("when 'useColors' is true", function() { beforeEach(function() { - sandbox.stub(Base, 'useColors').value(true); + useColorsStub.value(true); }); it('should return rainbowified string from the given string and predefined codes', function() { - var startCode = '\u001b[38;5;'; - var endCode = '\u001b[0m'; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - var expectedString = 'hello'; + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + + var inputString = 'hello'; var colorCode = 'somecode'; - var expectedRainbowifyString = - startCode + colorCode + 'm' + expectedString + endCode; - var outputString = nyanCat.rainbowify.call( - { - rainbowColors: [colorCode], - colorIndex: 0 - }, - expectedString - ); + var fakeThis = { + rainbowColors: [colorCode], + colorIndex: 0 + }; + var outputString = nyanCat.rainbowify.call(fakeThis, inputString); + sandbox.restore(); - expect(outputString, 'to be', expectedRainbowifyString); + var startCode = '\u001b[38;5;'; + var endCode = '\u001b[0m'; + var expectedString = + startCode + colorCode + 'm' + inputString + endCode; + expect(outputString, 'to be', expectedString); }); }); }); - describe('appendRainbow', function() { - describe('if tick is true', function() { - it('should set an _ segment', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + describe('#appendRainbow', function() { + describe("when 'tick' is true", function() { + it('should set an underscore segment', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -333,8 +412,11 @@ describe('Nyan reporter', function() { expect(expectedSegment, 'to be', '_'); }); - it('should shift each trajectory item, if its length is greater of equal to its max width', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + it('should shift each trajectory item if its length is greater than or equal to its max width', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var rainbowifyResult = 'rainbowify'; var inputArray = ['itemToShify']; @@ -359,9 +441,12 @@ describe('Nyan reporter', function() { expect(trajectories, 'to equal', expectedTrajectories); }); }); - describe('if tick is false', function() { - it('should set an - segment', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + describe("when 'tick' is false", function() { + it('should set a dash segment', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -380,42 +465,45 @@ describe('Nyan reporter', function() { }); }); - describe('drawScoreboard', function() { - var stdoutWrite; + describe('#drawScoreboard', function() { var stdout; - var cachedColor; - var showOutput = false; beforeEach(function() { - stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - if (showOutput) { - stdoutWrite.call(process.stdout, string, enc, callback); - } - }; - cachedColor = Base.color; - Base.color = function(type, n) { + sandbox.stub(Base, 'color').callsFake(function(type, n) { return type + n; - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; - Base.color = cachedColor; + }); + var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); + stdout = []; }); it('should write scoreboard with color set with each stat', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var passes = 2; var pending = 1; var failures = 1; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawScoreboard.call({ - cursorUp: function() {}, + + var fakeThis = { + cursorUp: noop, stats: {passes: passes, pending: pending, failures: failures}, numberOfLines: 4 - }); + }; + + try { + try { + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = [ ' ', 'green' + passes, @@ -432,40 +520,40 @@ describe('Nyan reporter', function() { }); it('should call cursorUp with given numberOfLines', function() { - var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawScoreboard.call({ - cursorUp: function(lines) { - expectedCursorArgument = lines; - }, + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { + cursorUp: sinon.spy(), stats: {passes: 0, pending: 0, failures: 0}, numberOfLines: expectedNumberOfLines - }); + }; - expect(expectedCursorArgument, 'to be', expectedNumberOfLines); + try { + try { + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + + expect(fakeThis.cursorUp.calledWith(expectedNumberOfLines), 'to be true'); }); }); - describe('drawRainbow', function() { - var stdoutWrite; + describe('#drawRainbow', function() { var stdout; - var showOutput = false; beforeEach(function() { + var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - if (showOutput) { - stdoutWrite.call(process.stdout, string, enc, callback); - } - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write width, contents and newline for each trajectory', function() { @@ -474,13 +562,25 @@ describe('Nyan reporter', function() { var expectedContents = 'input'; var inputArray = [expectedContents]; var trajectories = [inputArray]; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawRainbow.call({ - cursorUp: function() {}, + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { + cursorUp: noop, trajectories: trajectories, scoreboardWidth: expectedWidth, numberOfLines: 1 - }); + }; + + try { + try { + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[' + expectedWidth + 'C', @@ -494,41 +594,66 @@ describe('Nyan reporter', function() { var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawRainbow.call({ + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { cursorUp: function(lines) { expectedCursorArgument = lines; }, trajectories: [['input']], scoreboardWidth: 1, numberOfLines: expectedNumberOfLines - }); + }; + + try { + try { + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); - describe('face', function() { - it('expected face:(x .x) when "failures" at least one', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + describe('#face', function() { + it('should expect "( x .x)" if any failures', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 1}; + expect(nyanCat.face(), 'to be', '( x .x)'); }); - it('expected face:(x .x) when "pending" at least one and no failing', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( o .o)" if any pending but none failing', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; + expect(nyanCat.face(), 'to be', '( o .o)'); }); - it('expected face:(^ .^) when "passing" only', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( ^ .^)" if all passing', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 1, pending: 0, failures: 0}; + expect(nyanCat.face(), 'to be', '( ^ .^)'); }); - it('expected face:(- .-) when otherwise', function(done) { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( - .-)" otherwise', function(done) { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 0, pending: 0, failures: 0}; + expect(nyanCat.face(), 'to be', '( - .-)'); done(); }); diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index cdea9c643e..0d45abeaf7 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -1,107 +1,117 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Progress = reporters.Progress; + var Base = reporters.Base; +var Progress = reporters.Progress; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; describe('Progress reporter', function() { - var stdout; - var stdoutWrite; - var runner; + var sandbox; var runReporter = makeRunReporter(Progress); + var noop = function() {}; beforeEach(function() { - stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - stdoutWrite.call(process.stdout, string, enc, callback); - }; + sandbox = sinon.createSandbox(); }); afterEach(function() { sandbox.restore(); - process.stdout.write = stdoutWrite; }); - describe('on start', function() { - it('should call cursor hide', function() { - sandbox.stub(Base.cursor, 'hide'); + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should call cursor hide', function() { + var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); - runner = createMockRunner('start', 'start'); - runReporter({}, runner, {}); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter({}, runner, options); + sandbox.restore(); - expect(Base.cursor.hide, 'was called'); + expect(hideCursorStub.called, 'to be true'); + }); }); - }); - - describe('on test end', function() { - describe('if line has not changed', function() { - it('should return and not write anything', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR'); - sandbox.stub(Base.window, 'width').value(-3); - var expectedTotal = 1; - var expectedOptions = {}; - runner = createMockRunner('test end', 'test end'); - runner.total = expectedTotal; - var stdout = runReporter({}, runner, expectedOptions); - - expect(stdout, 'to equal', []); + describe("on 'test end' event", function() { + describe('when line has changed', function() { + it('should write expected progress of open and close options', function() { + var crCursorStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.window, 'width').value(5); + + var expectedTotal = 12; + var expectedOpen = 'OpEn'; + var expectedClose = 'cLoSe'; + var expectedIncomplete = 'iNcOmPlEtE'; + var expectedOptions = { + open: expectedOpen, + complete: 'cOmPlEtE', + incomplete: expectedIncomplete, + close: expectedClose + }; + + var runner = createMockRunner('test end', EVENT_TEST_END); + runner.total = expectedTotal; + var options = { + reporterOptions: expectedOptions + }; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + var expectedArray = [ + '\u001b[J', + ' ' + expectedOpen, + '', + expectedIncomplete, + expectedClose + ]; + + expect(crCursorStub.called, 'to be true'); + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('if line has changed', function() { - it('should write expected progress of open and close options', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR'); - sandbox.stub(Base.window, 'width').value(5); - - var expectedTotal = 12; - var expectedOpen = 'OpEn'; - var expectedClose = 'cLoSe'; - var expectedIncomplete = 'iNcOmPlEtE'; - var expectedOptions = { - open: expectedOpen, - complete: 'cOmPlEtE', - incomplete: expectedIncomplete, - close: expectedClose - }; - var options = { - reporterOptions: expectedOptions - }; - runner = createMockRunner('test end', 'test end'); - runner.total = expectedTotal; - var stdout = runReporter({}, runner, options); - - var expectedArray = [ - '\u001b[J', - ' ' + expectedOpen, - '', - expectedIncomplete, - expectedClose - ]; - expect(Base.cursor.CR, 'was called'); - expect(stdout, 'to equal', expectedArray); + + describe('when line has not changed', function() { + it('should not write anything', function() { + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR').callsFake(noop); + sandbox.stub(Base.window, 'width').value(-3); + + var expectedTotal = 1; + var runner = createMockRunner('test end', EVENT_TEST_END); + runner.total = expectedTotal; + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', []); + }); }); }); - }); - describe('on end', function() { - it('should call cursor show and epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(Base.cursor, 'show'); - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, {}); + describe("on 'end' event", function() { + it('should call cursor show and epilogue', function() { + var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var fakeThis = { + epilogue: sinon.spy() + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(reporterStub.epilogue, 'was called'); - expect(Base.cursor.show, 'was called'); + expect(fakeThis.epilogue.calledOnce, 'to be true'); + expect(showCursorStub.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/spec.spec.js b/test/reporters/spec.spec.js index 5f7584e33e..608bc7f512 100644 --- a/test/reporters/spec.spec.js +++ b/test/reporters/spec.spec.js @@ -1,104 +1,163 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Spec = reporters.Spec; + var Base = reporters.Base; +var Spec = reporters.Spec; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Spec reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Spec); - var useColors; var expectedTitle = 'expectedTitle'; + var noop = function() {}; + var sandbox; beforeEach(function() { - useColors = Base.useColors; - Base.useColors = false; + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { - Base.useColors = useColors; - runner = undefined; + sandbox.restore(); }); - describe('on suite', function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - runner = createMockRunner('suite', 'suite', null, null, suite); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('on pending', function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - runner = createMockRunner('pending test', 'pending', null, null, suite); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [' - ' + expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); + describe('event handlers', function() { + describe("on 'suite' event", function() { + it('should return title', function() { + var suite = { + title: expectedTitle + }; + var runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on pass', function() { - describe('if test speed is slow', function() { - it('should return expected tick, title and duration', function() { - var expectedDuration = 2; - var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 1; - } + + describe("on 'pending' event", function() { + it('should return title', function() { + var suite = { + title: expectedTitle }; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedString = - ' ' + - Base.symbols.ok + - ' ' + - expectedTitle + - ' (' + - expectedDuration + - 'ms)' + - '\n'; - expect(stdout[0], 'to be', expectedString); + var runner = createMockRunner( + 'pending test', + EVENT_TEST_PENDING, + null, + null, + suite + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [' - ' + expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); }); }); - describe('if test speed is fast', function() { - it('should return expected tick, title and without a duration', function() { - var expectedDuration = 1; + + describe("on 'pass' event", function() { + describe('when test speed is slow', function() { + it('should return expected tick, title, and duration', function() { + var expectedDuration = 2; + var test = { + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 1; + } + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedString = + ' ' + + Base.symbols.ok + + ' ' + + expectedTitle + + ' (' + + expectedDuration + + 'ms)' + + '\n'; + expect(stdout[0], 'to be', expectedString); + }); + }); + + describe('when test speed is fast', function() { + it('should return expected tick, title without a duration', function() { + var expectedDuration = 1; + var test = { + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 2; + } + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedString = + ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to be', expectedString); + }); + }); + }); + + describe("on 'fail' event", function() { + it('should return title and function count', function() { + var functionCount = 1; var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 2; - } + title: expectedTitle }; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedString = - ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to be', expectedString); + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [ + ' ' + functionCount + ') ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); }); - describe('on fail', function() { - it('should return title and function count', function() { - var functionCount = 1; - var test = { - title: expectedTitle - }; - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [' ' + functionCount + ') ' + expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); }); diff --git a/test/reporters/tap.spec.js b/test/reporters/tap.spec.js index c0a5419d37..f3bfe8d473 100644 --- a/test/reporters/tap.spec.js +++ b/test/reporters/tap.spec.js @@ -1,246 +1,295 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var TAP = reporters.TAP; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('TAP reporter', function() { - var runner; var runReporter = makeRunReporter(TAP); var expectedTitle = 'some title'; var countAfterTestEnd = 2; - var test; + var noop = function() {}; - beforeEach(function() { - test = { + function createTest() { + return { fullTitle: function() { return expectedTitle; }, - slow: function() {} + slow: noop }; - }); - - afterEach(function() { - runner = undefined; - test = undefined; - }); + } describe('TAP12 spec', function() { - var options = {}; - - describe('on start', function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout; - - before(function() { - runner = createMockRunner('start', 'start'); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - stdout = runReporter({}, runner, options); - }); - - it('should not write the TAP specification version', function() { - expect(stdout, 'not to contain', 'TAP version'); - }); - it('should write the number of tests that it plans to run', function() { - var expectedArray = ['1..' + expectedTotal + '\n']; - expect(stdout, 'to equal', expectedArray); - expect(expectedString, 'to be', expectedSuite); - }); - }); - - describe('on pending', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner( - 'start test', - 'test end', - 'pending', - null, - test - ); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); + var options = { + reporterOptions: { + tapVersion: '12' + } + }; - describe('on pass', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner('start test', 'test end', 'pass', null, test); - runner.suite = ''; - runner.grepTotal = function() {}; + describe('event handlers', function() { + describe("on 'start' event", function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout = []; + + before(function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + stdout = runReporter({}, runner, options); + }); - var stdout = runReporter({}, runner, options); + it('should not write a TAP specification version', function() { + expect(stdout, 'not to contain', 'TAP version'); + }); - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); + it('should write the number of tests that it plans to run', function() { + var expectedArray = ['1..' + expectedTotal + '\n']; + expect(stdout, 'to equal', expectedArray); + expect(expectedString, 'to be', expectedSuite); + }); }); - }); - describe('on fail', function() { - describe('if there is an error message', function() { - it('should write expected message and error message', function() { - var expectedErrorMessage = 'some error'; - var error = { - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pending' event", function() { + var stdout = []; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PENDING, null, - test, - error + test ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var error = { - stack: expectedStack - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pass' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PASS, null, - test, - error + test ); runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack and error message', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var expectedErrorMessage = 'some error'; - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = function() {}; + describe("on 'fail' event", function() { + var expectedErrorMessage = 'some error'; + var expectedStack = 'some stack'; + + describe("when 'error' has only message", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and error message', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var stdout = runReporter({}, runner, options); + describe("when 'error' has only stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + describe("when 'error' has both message and stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message, error message, and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe("when 'error' has neither message nor stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = {}; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message only', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if there is no error stack or error message', function() { - it('should write expected message only', function() { - var error = {}; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error + describe("on 'end' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'fail end pass', + EVENT_TEST_FAIL, + EVENT_RUN_END, + EVENT_TEST_PASS, + test ); - runner.on = runner.once = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + it('should write total tests, passes, and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); - - describe('on end', function() { - it('should write total tests, passes and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var totalTests = numberOfPasses + numberOfFails; - var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); }); describe('TAP13 spec', function() { @@ -250,229 +299,270 @@ describe('TAP reporter', function() { } }; - describe('on start', function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout; - - before(function() { - runner = createMockRunner('start', 'start'); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - - stdout = runReporter({}, runner, options); - }); + describe('event handlers', function() { + describe("on 'start' event", function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout; + + before(function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + stdout = runReporter({}, runner, options); + }); - it('should write the TAP specification version', function() { - var tapVersion = options.reporterOptions.tapVersion; - var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; - expect(stdout[0], 'to equal', expectedFirstLine); - }); - it('should write the number of tests that it plans to run', function() { - var expectedSecondLine = '1..' + expectedTotal + '\n'; - expect(stdout[1], 'to equal', expectedSecondLine); - expect(expectedString, 'to be', expectedSuite); - }); - }); + it('should write the TAP specification version', function() { + var tapVersion = options.reporterOptions.tapVersion; + var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; + expect(stdout[0], 'to equal', expectedFirstLine); + }); - describe('on pending', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner( - 'start test', - 'test end', - 'pending', - null, - test - ); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); + it('should write the number of tests that it plans to run', function() { + var expectedSecondLine = '1..' + expectedTotal + '\n'; + expect(stdout[1], 'to equal', expectedSecondLine); + expect(expectedString, 'to be', expectedSuite); + }); }); - }); - - describe('on pass', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner('start test', 'test end', 'pass', null, test); - runner.suite = ''; - runner.grepTotal = function() {}; - var stdout = runReporter({}, runner, options); + describe("on 'pending' event", function() { + var stdout; - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); - - describe('on fail', function() { - describe('if there is an error message', function() { - it('should write expected message and error message', function() { - var expectedErrorMessage = 'some error'; - var error = { - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PENDING, null, - test, - error + test ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var error = { - stack: expectedStack - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pass' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PASS, null, - test, - error + test ); runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack and error message', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var expectedErrorMessage = 'some error'; - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = function() {}; + describe("on 'fail' event", function() { + var expectedErrorMessage = 'some error'; + var expectedStack = 'some stack'; + + describe("when 'error' has only message", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and error message', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var stdout = runReporter({}, runner, options); + describe("when 'error' has only stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + describe("when 'error' has both message and stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message, error message, and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe("when 'error' has neither message nor stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = {}; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message only', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if there is no error stack or error message', function() { - it('should write expected message only', function() { - var error = {}; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error + describe("on 'end' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'fail end pass', + EVENT_TEST_FAIL, + EVENT_RUN_END, + EVENT_TEST_PASS, + test ); - runner.on = runner.once = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + it('should write total tests, passes, and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); - - describe('on end', function() { - it('should write total tests, passes and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var totalTests = numberOfPasses + numberOfFails; - var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); }); }); diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 35555968a1..26fce4a1c4 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -1,25 +1,34 @@ 'use strict'; +var EventEmitter = require('events').EventEmitter; var fs = require('fs'); -var mkdirp = require('mkdirp'); +var os = require('os'); var path = require('path'); -var assert = require('assert'); +var mkdirp = require('mkdirp'); +var rimraf = require('rimraf'); +var sinon = require('sinon'); var createStatsCollector = require('../../lib/stats-collector'); -var EventEmitter = require('events').EventEmitter; +var events = require('../../').Runner.constants; var reporters = require('../../').reporters; -var constants = require('../../lib/runnable').constants; -var STATE_FAILED = constants.STATE_FAILED; -var STATE_PASSED = constants.STATE_PASSED; +var states = require('../../').Runnable.constants; + +var Base = reporters.Base; var XUnit = reporters.XUnit; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; + +var STATE_FAILED = states.STATE_FAILED; +var STATE_PASSED = states.STATE_PASSED; + describe('XUnit reporter', function() { - var stdout; - var stdoutWrite; - // the runner parameter of the reporter + var sandbox; var runner; + var noop = function() {}; - var callbackArgument = null; - var expectedFailure = 'some-failures'; var expectedLine = 'some-line'; var expectedClassName = 'fullTitle'; var expectedTitle = 'some title'; @@ -27,192 +36,286 @@ describe('XUnit reporter', function() { var expectedDiff = '\n + expected - actual\n\n -foo\n +bar\n '; var expectedStack = 'some-stack'; - var expectedWrite = null; beforeEach(function() { - stdout = []; - runner = {on: function() {}, once: function() {}}; + runner = {on: noop, once: noop}; createStatsCollector(runner); }); - describe('if reporter options output is given', function() { - var expectedOutput = 'some-output'; + describe("when 'reporterOptions.output' is provided", function() { + var expectedOutput = path.join(path.sep, 'path', 'to', 'some-output'); var options = { reporterOptions: { output: expectedOutput } }; - describe('but it cant create a write stream', function() { - it('should throw expected error', function() { - var fsCreateWriteStream = fs.createWriteStream; - fs.createWriteStream = false; - - var boundXUnit = XUnit.bind({}, runner, options); - expect(boundXUnit, 'to throw', 'file output not supported in browser'); - fs.createWriteStream = fsCreateWriteStream; + + describe('when fileStream can be created', function() { + var mkdirpSync; + var fsCreateWriteStream; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + mkdirpSync = sandbox.stub(mkdirp, 'sync'); + fsCreateWriteStream = sandbox.stub(fs, 'createWriteStream'); }); - }); - describe('and it can create a write stream', function() { - it('should locate the output dir, create it, then assign as fileStream', function() { - var expectedDirectory; - var mkdirpSync = mkdirp.sync; - var pathDirname = path.dirname; - var fsCreateWriteStream = fs.createWriteStream; - mkdirp.sync = function(directory) { - expectedDirectory = directory; - }; - path.dirname = function(location) { - return location; - }; - fs.createWriteStream = function(streamDetails) { - return streamDetails; - }; - var contextVariables = { + it('should open given file for writing, recursively creating directories in pathname', function() { + var fakeThis = { fileStream: null }; - XUnit.call(contextVariables, runner, options); + XUnit.call(fakeThis, runner, options); - expect(expectedDirectory, 'to be', expectedOutput); - expect(contextVariables.fileStream, 'to be', expectedOutput); + var expectedDirectory = path.dirname(expectedOutput); + expect(mkdirpSync.calledWith(expectedDirectory), 'to be true'); + expect(fsCreateWriteStream.calledWith(expectedOutput), 'to be true'); + }); - fs.createWriteStream = fsCreateWriteStream; - mkdirp.sync = mkdirpSync; - path.dirname = pathDirname; + afterEach(function() { + sandbox.restore(); }); }); - }); - describe("on 'pending', 'pass' and 'fail' events", function() { - it("should add test to tests called on 'end' event", function() { - var pendingTest = { - name: 'pending', - slow: function() {} - }; - var failTest = { - name: 'fail', - slow: function() {} - }; - var passTest = { - name: 'pass', - slow: function() {} - }; - runner.on = runner.once = function(event, callback) { - if (event === 'pending') { - callback(pendingTest); - } - if (event === 'pass') { - callback(passTest); - } - if (event === 'fail') { - callback(failTest); - } - if (event === 'end') { - callback(); - } - }; + describe('when fileStream cannot be created', function() { + describe('when given an invalid pathname', function() { + var tmpdir; + var invalidPath; - var calledTests = []; - XUnit.call( - { - write: function() {}, - test: function(test) { - calledTests.push(test); + beforeEach(function createInvalidPath() { + tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-test-')); + + function touch(filename) { + fs.closeSync(fs.openSync(filename, 'w')); } - }, - runner - ); - var expectedCalledTests = [pendingTest, passTest, failTest]; - expect(calledTests, 'to equal', expectedCalledTests); + // Create path where file 'some-file' used as directory + invalidPath = path.join( + tmpdir, + 'some-file', + path.basename(expectedOutput) + ); + touch(path.dirname(invalidPath)); + }); + + it('should throw system error', function() { + var options = { + reporterOptions: { + output: invalidPath + } + }; + var boundXUnit = XUnit.bind({}, runner, options); + expect( + boundXUnit, + 'to throw', + expect.it('to be an', Error).and('to satisfy', { + syscall: 'mkdir', + code: 'EEXIST', + path: path.dirname(invalidPath) + }) + ); + }); + + afterEach(function() { + rimraf.sync(tmpdir); + }); + }); + + describe('when run in browser', function() { + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(fs, 'createWriteStream').value(false); + }); + + it('should throw unsupported error', function() { + var boundXUnit = XUnit.bind({}, runner, options); + expect( + boundXUnit, + 'to throw', + 'file output not supported in browser' + ); + }); + + afterEach(function() { + sandbox.restore(); + }); + }); }); }); - describe('done', function() { - describe('if fileStream is truthy', function() { - it('should run callback with failure inside streams end', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var callback = function(failures) { - callbackArgument = failures; + describe('event handlers', function() { + describe("on 'pending', 'pass' and 'fail' events", function() { + it("should add test to tests called on 'end' event", function() { + var pendingTest = { + name: 'pending', + slow: noop + }; + var failTest = { + name: 'fail', + slow: noop + }; + var passTest = { + name: 'pass', + slow: noop }; - var calledEnd = false; - var fileStream = { - end: function(callback) { - calledEnd = true; + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_PENDING) { + callback(pendingTest); + } else if (event === EVENT_TEST_PASS) { + callback(passTest); + } else if (event === EVENT_TEST_FAIL) { + callback(failTest); + } else if (event === EVENT_RUN_END) { callback(); } }; - xunit.done.call({fileStream: fileStream}, expectedFailure, callback); - expect(calledEnd, 'to be', true); - expect(callbackArgument, 'to be', expectedFailure); - }); - }); - describe('if fileStream is falsy', function() { - it('should run callback with failure', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var callback = function(failures) { - callbackArgument = failures; + var calledTests = []; + var fakeThis = { + write: noop, + test: function(test) { + calledTests.push(test); + } }; - xunit.done.call({fileStream: false}, expectedFailure, callback); + XUnit.call(fakeThis, runner); - expect(callbackArgument, 'to be', expectedFailure); + var expectedCalledTests = [pendingTest, passTest, failTest]; + expect(calledTests, 'to equal', expectedCalledTests); }); }); }); - describe('write', function() { - describe('if fileStream is truthy', function() { - it('should call fileStream write with line and new line', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var fileStream = { - write: function(write) { - expectedWrite = write; + describe('#done', function() { + var xunit; + var options = { + reporterOptions: {} + }; + var expectedNFailures = 13; + var callback; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + callback = sandbox.spy(); + }); + + afterEach(function() { + callback = null; + xunit = null; + sandbox.restore(); + }); + + describe('when output directed to file', function() { + var fakeThis; + + beforeEach(function() { + xunit = new XUnit(runner, options); + + fakeThis = { + fileStream: { + end: sinon.stub().callsFake(function(chunk, encoding, cb) { + if (typeof arguments[0] === 'function') { + cb = arguments[0]; + } + cb(); + }), + write: function(chunk, encoding, cb) {} } }; - xunit.write.call({fileStream: fileStream}, expectedLine); + }); - expect(expectedWrite, 'to be', expectedLine + '\n'); + it("should run completion callback via 'fileStream.end'", function() { + xunit.done.call(fakeThis, expectedNFailures, callback); + + expect(fakeThis.fileStream.end.calledOnce, 'to be true'); + expect(callback.calledOnce, 'to be true'); + expect(callback.calledWith(expectedNFailures), 'to be true'); }); }); - describe('if fileStream is falsy and stdout exists', function() { - it('should call write with line and new line', function() { - stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; - var xunit = new XUnit({on: function() {}, once: function() {}}); - xunit.write.call({fileStream: false}, expectedLine); + describe('when output directed to stdout (or console)', function() { + var fakeThis; + + beforeEach(function() { + xunit = new XUnit(runner, options); + fakeThis = {}; + }); - process.stdout.write = stdoutWrite; + it('should run completion callback', function() { + xunit.done.call(fakeThis, expectedNFailures, callback); - expect(stdout[0], 'to be', expectedLine + '\n'); + expect(callback.calledOnce, 'to be true'); + expect(callback.calledWith(expectedNFailures), 'to be true'); }); }); - describe('if fileStream is falsy and stdout does not exist', function() { - it('should call write with line', function() { - stdoutWrite = process; + }); + + describe('#write', function() { + // :TODO: Method should be named 'writeln', not 'write' + describe('when output directed to file', function() { + var fileStream = { + write: sinon.spy() + }; + + it("should call 'fileStream.write' with line and newline", function() { + var xunit = new XUnit(runner); + var fakeThis = {fileStream: fileStream}; + xunit.write.call(fakeThis, expectedLine); + + expect(fileStream.write.calledWith(expectedLine + '\n'), 'to be true'); + }); + }); + + describe('when output directed to stdout', function() { + it("should call 'process.stdout.write' with line and newline", function() { + var xunit = new XUnit(runner); + var fakeThis = {fileStream: false}; + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); + xunit.write.call(fakeThis, expectedLine); + stdoutWriteStub.restore(); + + expect(stdoutWriteStub.calledWith(expectedLine + '\n'), 'to be true'); + }); + }); + + describe('when output directed to console', function() { + it("should call 'console.log' with line", function() { + // :TODO: XUnit needs a trivially testable means to force console.log() + var realProcess = process; process = false; // eslint-disable-line no-native-reassign, no-global-assign - var cachedConsoleLog = console.log; - console.log = function(string) { - stdout.push(string); - }; - var xunit = new XUnit({on: function() {}, once: function() {}}); - xunit.write.call({fileStream: false}, expectedLine); + var xunit = new XUnit(runner); + var fakeThis = {fileStream: false}; + var consoleLogStub = sinon.stub(console, 'log'); + xunit.write.call(fakeThis, expectedLine); + consoleLogStub.restore(); - console.log = cachedConsoleLog; - process = stdoutWrite; // eslint-disable-line no-native-reassign, no-global-assign - expect(stdout[0], 'to be', expectedLine); + process = realProcess; // eslint-disable-line no-native-reassign, no-global-assign + + expect(consoleLogStub.calledWith(expectedLine), 'to be true'); }); }); }); - describe('test', function() { + describe('#test', function() { + var expectedWrite; + var fakeThis = { + write: function(str) { + expectedWrite = str; + } + }; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); + }); + + afterEach(function() { + sandbox.restore(); + expectedWrite = null; + }); + describe('on test failure', function() { it('should write expected tag with error details', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); + var xunit = new XUnit(runner); var expectedTest = { state: STATE_FAILED, title: expectedTitle, @@ -229,14 +332,9 @@ describe('XUnit reporter', function() { stack: expectedStack } }; - xunit.test.call( - { - write: function(string) { - expectedWrite = string; - } - }, - expectedTest - ); + + xunit.test.call(fakeThis, expectedTest); + sandbox.restore(); var expectedTag = ''; - expect(expectedWrite, 'to be', expectedTag); }); }); + describe('on test in any other state', function() { it('should write expected tag', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - + var xunit = new XUnit(runner); var expectedTest = { isPending: function() { return false; @@ -305,14 +396,9 @@ describe('XUnit reporter', function() { }, duration: false }; - xunit.test.call( - { - write: function(string) { - expectedWrite = string; - } - }, - expectedTest - ); + + xunit.test.call(fakeThis, expectedTest); + sandbox.restore(); var expectedTag = ''; - expect(expectedWrite, 'to be', expectedTag); }); }); + it('should write expected summary statistics', function() { - var count = 0; + var numTests = 0; + var numPass = 0; + var numFail = 0; var simpleError = { actual: 'foo', expected: 'bar', @@ -333,8 +421,14 @@ describe('XUnit reporter', function() { stack: expectedStack }; var generateTest = function(passed) { - var t = { - title: expectedTitle + count, + numTests++; + if (passed) { + numPass++; + } else { + numFail++; + } + return { + title: [expectedTitle, numTests].join(': '), state: passed ? STATE_PASSED : STATE_FAILED, isPending: function() { return false; @@ -349,26 +443,36 @@ describe('XUnit reporter', function() { }, duration: 1000 }; - return t; }; var runner = new EventEmitter(); createStatsCollector(runner); var xunit = new XUnit(runner); expectedWrite = ''; - xunit.write = function(string) { - expectedWrite += string; - }; + sandbox.stub(xunit, 'write').callsFake(function(str) { + expectedWrite += str; + }); // 3 tests, no failures (i.e. tests that could not run), and 2 errors - runner.emit('test end'); - runner.emit('pass', generateTest(true)); - runner.emit('test end'); - runner.emit('fail', generateTest(false), simpleError); - runner.emit('test end'); - runner.emit('fail', generateTest(false), simpleError); - runner.emit('end'); + runner.emit(EVENT_TEST_PASS, generateTest(true)); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_RUN_END); + + sandbox.restore(); + + var expectedNumPass = 1; + var expectedNumFail = 2; + var expectedNumTests = 3; + + expect(expectedNumPass, 'to be', numPass); + expect(expectedNumFail, 'to be', numFail); + expect(expectedNumTests, 'to be', numTests); + // :NOTE: Mocha test "fail" is an XUnit "error" var expectedTag = '= 0, - 'it should contain the text "Mocha Tests"' - ); + expect(lines[0], 'to contain', customSuiteName); }); - it('should use the custom suite name as the suite name when provided in the reporter options', function() { - // arrange + it('should use default name otherwise', function() { + var defaultSuiteName = 'Mocha Tests'; var options = { - reporterOptions: { - // this time, with a custom suite name - suiteName: 'Mocha Is Great!' - } + reporterOptions: {} }; var xunit = new XUnit(runner, options); xunit.fileStream = fileStream; - // act (trigger the end event to force xunit reporter to write the output) - events['end'](); + // Trigger end event to force XUnit reporter to write its output + events[EVENT_RUN_END](); - // assert - assert( - lines[0].indexOf(' Date: Thu, 25 Apr 2019 09:43:44 -0500 Subject: [PATCH 1336/1771] Revert "test(test/reporters): Rework reporter tests" This reverts commit f6b8e898526c908294010ccc31a3ce800c426498. --- test/reporters/base.spec.js | 258 ++++----- test/reporters/doc.spec.js | 358 +++++------- test/reporters/dot.spec.js | 319 ++++------- test/reporters/helpers.js | 69 +-- test/reporters/json-stream.spec.js | 204 ++++--- test/reporters/json.spec.js | 26 +- test/reporters/landing.spec.js | 142 ++--- test/reporters/list.spec.js | 318 ++++------- test/reporters/markdown.spec.js | 177 +++--- test/reporters/min.spec.js | 66 ++- test/reporters/nyan.spec.js | 597 ++++++++------------ test/reporters/progress.spec.js | 168 +++--- test/reporters/spec.spec.js | 215 +++----- test/reporters/tap.spec.js | 858 +++++++++++++---------------- test/reporters/xunit.spec.js | 546 ++++++++---------- 15 files changed, 1793 insertions(+), 2528 deletions(-) diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 739063f32a..40d1374537 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -1,138 +1,124 @@ 'use strict'; var assert = require('assert'); -var chai = require('chai'); -var sinon = require('sinon'); -var helpers = require('./helpers'); -var reporters = require('../../').reporters; - +var chaiExpect = require('chai').expect; +var Base = require('../../lib/reporters/base'); var AssertionError = assert.AssertionError; -var Base = reporters.Base; -var chaiExpect = chai.expect; -var createElements = helpers.createElements; -var makeTest = helpers.makeTest; +var makeTest = require('./helpers').makeTest; +var createElements = require('./helpers').createElements; describe('Base reporter', function() { - var sandbox; var stdout; + var stdoutWrite; + var useColors; + var err; + var errOut; + var test; function list(tests) { - try { - try { - Base.list(tests); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + Base.useColors = false; + var retval = Base.list(tests); + Base.useColors = useColors; + return retval; } function generateDiff(actual, expected) { - var diffStr; - - try { - try { - diffStr = Base.generateDiff(actual, expected); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } - - return diffStr; + Base.useColors = false; + var retval = Base.generateDiff(actual, expected); + Base.useColors = useColors; + return retval; } - var gather = function(chunk, encoding, cb) { - stdout.push(chunk); - }; - beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(process.stdout, 'write').callsFake(gather); + useColors = Base.useColors; stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); + }; }); afterEach(function() { - sandbox.restore(); + process.stdout.write = stdoutWrite; }); describe('showDiff', function() { - var err; - beforeEach(function() { err = new AssertionError({actual: 'foo', expected: 'bar'}); }); it('should show diffs by default', function() { - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it("should show diffs if 'err.showDiff' is true", function() { + it('should show diffs if property set to `true`', function() { err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it("should not show diffs if 'err.showDiff' is false", function() { + it('should not show diffs when showDiff property set to `false`', function() { err.showDiff = false; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it("should not show diffs if 'expected' is not defined", function() { - var _err = new Error('ouch'); - var test = makeTest(_err); + it('should not show diffs when expected is not defined', function() { + err = new Error('ouch'); + + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it("should not show diffs if 'hideDiff' is true", function() { - var test = makeTest(err); + it('should not show diffs when hideDiff is set', function() { + test = makeTest(err); - sandbox.stub(Base, 'hideDiff').value(true); + Base.hideDiff = true; list([test]); + Base.hideDiff = false; // Revert to original value - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); }); - describe('getting two strings', function() { + describe('Getting two strings', function() { // Fix regression V1.2.1(see: issue #1241) it('should show strings diff as is', function() { - var err = new Error('test'); + err = new Error('test'); + err.actual = 'foo\nbar'; err.expected = 'foo\nbaz'; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); + expect(errOut, 'not to match', /"foo\\nbar"/); expect(errOut, 'to match', /foo/).and('to match', /bar/); expect(errOut, 'to match', /test/); @@ -141,19 +127,26 @@ describe('Base reporter', function() { }); }); - describe('diff generation', function() { - var inlineDiffsStub; + describe('Diff generation', function() { + var oldInlineDiffs; + var actual; + var expected; + var output; beforeEach(function() { - inlineDiffsStub = sandbox.stub(Base, 'inlineDiffs'); + oldInlineDiffs = Base.inlineDiffs; + }); + + afterEach(function() { + Base.inlineDiffs = oldInlineDiffs; }); - it("should generate unified diffs if 'inlineDiffs' is false", function() { - var actual = 'a foo unified diff'; - var expected = 'a bar unified diff'; + it('should generate unified diffs if `inlineDiff === false`', function() { + actual = 'a foo unified diff'; + expected = 'a bar unified diff'; - inlineDiffsStub.value(false); - var output = generateDiff(actual, expected); + Base.inlineDiffs = false; + output = generateDiff(actual, expected); expect( output, @@ -162,12 +155,12 @@ describe('Base reporter', function() { ); }); - it("should generate inline diffs if 'inlineDiffs' is true", function() { - var actual = 'a foo inline diff'; - var expected = 'a bar inline diff'; + it('should generate inline diffs if `inlineDiffs === true`', function() { + actual = 'a foo inline diff'; + expected = 'a bar inline diff'; - inlineDiffsStub.value(true); - var output = generateDiff(actual, expected); + Base.inlineDiffs = true; + output = generateDiff(actual, expected); expect( output, @@ -177,37 +170,39 @@ describe('Base reporter', function() { }); }); - describe('inline strings diff', function() { - beforeEach(function() { - sandbox.stub(Base, 'inlineDiffs').value(true); - }); + describe('Inline strings diff', function() { + it('should show single line diff if property set to `true`', function() { + err = new Error('test'); - it("should show single line diff if 'inlineDiffs' is true", function() { - var err = new Error('test'); err.actual = 'a foo inline diff'; err.expected = 'a bar inline diff'; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); + Base.inlineDiffs = true; list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); + expect(errOut, 'to match', /a foobar inline diff/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /actual/); expect(errOut, 'to match', /expected/); }); - it('should split lines if string has more than 4 line breaks', function() { - var err = new Error('test'); + it('should split lines when string has more than 4 line breaks', function() { + err = new Error('test'); + err.actual = 'a\nfoo\ninline\ndiff\nwith\nmultiple lines'; err.expected = 'a\nbar\ninline\ndiff\nwith\nmultiple lines'; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); + Base.inlineDiffs = true; list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); + expect(errOut, 'to match', /1 \| a/); expect(errOut, 'to match', /2 \| foobar/); expect(errOut, 'to match', /3 \| inline/); @@ -220,21 +215,21 @@ describe('Base reporter', function() { }); }); - describe('unified diff', function() { + describe('unified diff reporter', function() { beforeEach(function() { - sandbox.stub(Base, 'inlineDiffs').value(false); + err = new Error('test'); }); it('should separate diff hunks by two dashes', function() { - var err = new Error('test'); err.actual = createElements({from: 2, to: 11}); err.expected = createElements({from: 1, to: 10}); err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); + Base.inlineDiffs = false; list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); var regexesToMatch = [ /\[/, @@ -262,15 +257,16 @@ describe('Base reporter', function() { }); it('should stringify objects', function() { - var err = new Error('test'); + err = new Error('test'); + err.actual = {key: 'a1'}; err.expected = {key: 'e1'}; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /"key"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -278,18 +274,18 @@ describe('Base reporter', function() { }); it('should stringify Object.create(null)', function() { - var err = new Error('test'); + err = new Error('test'); err.actual = Object.create(null); err.actual.hasOwnProperty = 1; err.expected = Object.create(null); err.expected.hasOwnProperty = 2; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /"hasOwnProperty"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -303,11 +299,11 @@ describe('Base reporter', function() { err.actual = false; err.expected = true; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /\+true/); expect(errOut, 'to match', /-false/); expect(errOut, 'to match', /- actual/); @@ -315,21 +311,18 @@ describe('Base reporter', function() { } }); - it("should interpret 'chai' module custom error messages", function() { - var actual = 43; - var expected = 42; - + it('should interpret Chai custom error messages', function() { try { - chaiExpect(actual, 'custom error message').to.equal(expected); + chaiExpect(43, 'custom error message').to.equal(42); } catch (err) { - err.actual = actual; - err.expected = expected; + err.actual = 43; + err.expected = 42; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/) .and('to match', /\+42/) .and('to match', /-43/) @@ -338,23 +331,20 @@ describe('Base reporter', function() { } }); - it("should interpret 'assert' module custom error messages", function() { - var actual = 43; - var expected = 42; - + it('should interpret assert module custom error messages', function() { try { - assert.strictEqual(actual, expected, 'custom error message'); + assert.strictEqual(43, 42, 'custom error message'); // AssertionError: custom error message: expected 43 to equal 42. // assert.equal(43, 42, 'custom error message: expected 43 to equal 42.'); } catch (err) { - err.actual = actual; - err.expected = expected; + err.actual = 43; + err.expected = 42; err.showDiff = true; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n'); + errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/); expect(errOut, 'to match', /\+42/); expect(errOut, 'to match', /-43/); @@ -364,57 +354,53 @@ describe('Base reporter', function() { }); it('should remove message from stack', function() { - var err = { + err = { message: 'Error', stack: 'Error\nfoo\nbar', showDiff: false }; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n').trim(); + errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); - it("should use 'inspect' if 'message' is not set", function() { - var err = { + it('should use the inspect() property if `message` is not set', function() { + err = { showDiff: false, inspect: function() { return 'an error happened'; } }; - var test = makeTest(err); - + test = makeTest(err); list([test]); - - var errOut = stdout.join('\n').trim(); + errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n an error happened'); }); - it("should set an empty message if neither 'message' nor 'inspect' is set", function() { - var err = { + it('should set an empty message if `message` and `inspect()` are not set', function() { + err = { showDiff: false }; - var test = makeTest(err); - + test = makeTest(err); list([test]); - - var errOut = stdout.join('\n').trim(); + errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:'); }); it('should not modify stack if it does not contain message', function() { - var err = { + err = { message: 'Error', stack: 'foo\nbar', showDiff: false }; - var test = makeTest(err); + test = makeTest(err); list([test]); - var errOut = stdout.join('\n').trim(); + errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); }); diff --git a/test/reporters/doc.spec.js b/test/reporters/doc.spec.js index fb2703f83c..857922b83e 100644 --- a/test/reporters/doc.spec.js +++ b/test/reporters/doc.spec.js @@ -1,17 +1,10 @@ 'use strict'; -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - var Doc = reporters.Doc; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; -var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = events.EVENT_SUITE_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var createMockRunner = require('./helpers.js').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Doc reporter', function() { var runner; @@ -19,223 +12,178 @@ describe('Doc reporter', function() { var runReporter = makeRunReporter(Doc); afterEach(function() { - runner = null; + runner = undefined; }); - describe('event handlers', function() { - describe("on 'suite' event", function() { - describe('when suite root does not exist', function() { - var expectedTitle = 'expectedTitle'; - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var suite = { - root: false, - title: expectedTitle - }; - - it('should log html with indents and expected title', function() { - runner = createMockRunner( - 'suite', - EVENT_SUITE_BEGIN, - null, - null, - suite - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - - it('should escape title where necessary', function() { - var suite = { - root: false, - title: unescapedTitle - }; - expectedTitle = - '<div>' + expectedTitle + '</div>'; - - runner = createMockRunner( - 'suite', - EVENT_SUITE_BEGIN, - null, - null, - suite - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); - - describe('when suite root exists', function() { - var suite = { - root: true - }; - - it('should not log any html', function() { - runner = createMockRunner( - 'suite', - EVENT_SUITE_BEGIN, - null, - null, - suite - ); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - - describe("on 'suite end' event", function() { - describe('when suite root does not exist', function() { - var suite = { - root: false - }; - - it('should log expected html with indents', function() { - runner = createMockRunner( - 'suite end', - EVENT_SUITE_END, - null, - null, - suite - ); - var stdout = runReporter(this, runner, options); - var expectedArray = ['
              \n', '
              \n']; - expect(stdout, 'to equal', expectedArray); - }); - }); - - describe('when suite root exists', function() { - var suite = { - root: true - }; - - it('should not log any html', function() { - runner = createMockRunner( - 'suite end', - EVENT_SUITE_END, - null, - null, - suite - ); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - - describe("on 'pass' event", function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } + describe('on suite', function() { + describe('if suite root does not exist', function() { + var expectedTitle = 'expectedTitle'; + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var suite = { + root: false, + title: expectedTitle }; - - it('should log html with indents, expected title, and body', function() { - runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); + it('should log html with indents and expected title', function() { + runner = createMockRunner('suite', 'suite', null, null, suite); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' + expectedBody + '
              \n' + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); - - it('should escape title and body where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); + it('should escape title where necessary', function() { + var suite = { + root: false, + title: unescapedTitle + }; + expectedTitle = '<div>' + expectedTitle + '</div>'; + runner = createMockRunner('suite', 'suite', null, null, suite); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' + expectedEscapedBody + '
              \n' + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); }); - - describe("on 'fail' event", function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var expectedError = 'some error'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } + describe('if suite root does exist', function() { + var suite = { + root: true }; - - it('should log html with indents, expected title, body, and error', function() { - runner = createMockRunner( - 'fail two args', - EVENT_TEST_FAIL, - null, - null, - test, - expectedError - ); + it('should not log any html', function() { + runner = createMockRunner('suite', 'suite', null, null, suite); var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' +
              -            expectedBody +
              -            '
              \n', - '
              ' + expectedError + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); + expect(stdout, 'to be empty'); }); + }); + }); - it('should escape title, body, and error where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - var unescapedError = '
              ' + expectedError + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - var expectedEscapedError = - '<div>' + expectedError + '</div>'; - runner = createMockRunner( - 'fail two args', - EVENT_TEST_FAIL, - null, - null, - test, - unescapedError - ); + describe('on suite end', function() { + describe('if suite root does not exist', function() { + var suite = { + root: false + }; + it('should log expected html with indents', function() { + runner = createMockRunner('suite end', 'suite end', null, null, suite); var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' +
              -            expectedEscapedBody +
              -            '
              \n', - '
              ' + expectedEscapedError + '
              \n' - ]; + var expectedArray = ['
              \n', '
              \n']; expect(stdout, 'to equal', expectedArray); }); }); + describe('if suite root does exist', function() { + var suite = { + root: true + }; + it('should not log any html', function() { + runner = createMockRunner('suite end', 'suite end', null, null, suite); + var stdout = runReporter(this, runner, options); + expect(stdout, 'to be empty'); + }); + }); + }); + + describe('on pass', function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } + }; + it('should log html with indents and expected title and body', function() { + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedTitle + '
              \n', + '
              ' + expectedBody + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + it('should escape title and body where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; + + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' + expectedEscapedBody + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('on fail', function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var expectedError = 'some error'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } + }; + it('should log html with indents and expected title, body and error', function() { + runner = createMockRunner( + 'fail two args', + 'fail', + null, + null, + test, + expectedError + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedTitle + '
              \n', + '
              ' +
              +          expectedBody +
              +          '
              \n', + '
              ' + expectedError + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + it('should escape title, body and error where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + var unescapedError = '
              ' + expectedError + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; + + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + var expectedEscapedError = + '<div>' + expectedError + '</div>'; + runner = createMockRunner( + 'fail two args', + 'fail', + null, + null, + test, + unescapedError + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' +
              +          expectedEscapedBody +
              +          '
              \n', + '
              ' + expectedEscapedError + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); diff --git a/test/reporters/dot.spec.js b/test/reporters/dot.spec.js index 4a23c7951e..472ec63d01 100644 --- a/test/reporters/dot.spec.js +++ b/test/reporters/dot.spec.js @@ -1,238 +1,155 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - -var Base = reporters.Base; var Dot = reporters.Dot; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; +var Base = reporters.Base; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; +var createMockRunner = require('./helpers.js').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Dot reporter', function() { - var sandbox; - var windowWidthStub; + var runner; + var useColors; + var windowWidth; + var color; + var options = {}; var runReporter = makeRunReporter(Dot); - var noop = function() {}; beforeEach(function() { - sandbox = sinon.createSandbox(); - windowWidthStub = sandbox.stub(Base.window, 'width').value(0); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base, 'color').callsFake(function(type, str) { + useColors = Base.useColors; + windowWidth = Base.window.width; + color = Base.color; + Base.useColors = false; + Base.window.width = 0; + Base.color = function(type, str) { return type.replace(/ /g, '-') + '_' + str; - }); + }; }); afterEach(function() { - sandbox.restore(); + Base.useColors = useColors; + Base.window.width = windowWidth; + Base.color = color; + runner = undefined; }); - describe('event handlers', function() { - describe("on 'start' event", function() { - it('should write a newline', function() { - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = ['\n']; + describe('on start', function() { + it('should write a newline', function() { + runner = createMockRunner('start', 'start'); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = ['\n']; + expect(stdout, 'to equal', expectedArray); + }); + }); + describe('on pending', function() { + describe('if window width is greater than 1', function() { + beforeEach(function() { + Base.window.width = 2; + }); + it('should write a newline followed by a comma', function() { + runner = createMockRunner('pending', 'pending'); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); }); }); - - describe("on 'pending' event", function() { - describe('when window width is greater than 1', function() { - beforeEach(function() { - windowWidthStub.value(2); - }); - - it('should write a newline followed by a comma', function() { - var runner = createMockRunner('pending', EVENT_TEST_PENDING); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; - expect(stdout, 'to equal', expectedArray); - }); - }); - - describe('when window width is less than or equal to 1', function() { - it('should write a comma', function() { - var runner = createMockRunner('pending', EVENT_TEST_PENDING); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = ['pending_' + Base.symbols.comma]; - expect(stdout, 'to equal', expectedArray); - }); + describe('if window width is equal to or less than 1', function() { + it('should write a comma', function() { + runner = createMockRunner('pending', 'pending'); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = ['pending_' + Base.symbols.comma]; + expect(stdout, 'to equal', expectedArray); }); }); - - describe("on 'pass' event", function() { - var test = { - duration: 1, - slow: function() { - return 2; - } - }; - - describe('when window width is greater than 1', function() { - beforeEach(function() { - windowWidthStub.value(2); - }); - - describe('when test speed is fast', function() { - it('should write a newline followed by a dot', function() { - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); - }); - }); + }); + describe('on pass', function() { + var test = { + duration: 1, + slow: function() { + return 2; + } + }; + describe('if window width is greater than 1', function() { + beforeEach(function() { + Base.window.width = 2; }); - - describe('when window width is less than or equal to 1', function() { - describe('when test speed is fast', function() { - it('should write a grey dot', function() { - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['fast_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); - }); - }); - - describe('when test speed is medium', function() { - it('should write a yellow dot', function() { - test.duration = 2; - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - expect(test.speed, 'to equal', 'medium'); - var expectedArray = ['medium_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); - }); - }); - - describe('when test speed is slow', function() { - it('should write a bright yellow dot', function() { - test.duration = 3; - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - expect(test.speed, 'to equal', 'slow'); - var expectedArray = ['bright-yellow_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); - }); + describe('if test speed is fast', function() { + it('should write a newline followed by a dot', function() { + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); }); }); }); - - describe("on 'fail' event", function() { - var test = { - test: { - err: 'some error' - } - }; - - describe('when window width is greater than 1', function() { - beforeEach(function() { - windowWidthStub.value(2); + describe('if window width is equal to or less than 1', function() { + describe('if test speed is fast', function() { + it('should write a grey dot', function() { + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); }); - - it('should write a newline followed by an exclamation mark', function() { - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; + }); + describe('if test speed is medium', function() { + it('should write a yellow dot', function() { + test.duration = 2; + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + expect(test.speed, 'to equal', 'medium'); + var expectedArray = ['medium_' + Base.symbols.dot]; expect(stdout, 'to equal', expectedArray); }); }); - - describe('when window width is less than or equal to 1', function() { - it('should write an exclamation mark', function() { - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = ['fail_' + Base.symbols.bang]; + describe('if test speed is slow', function() { + it('should write a bright yellow dot', function() { + test.duration = 3; + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + expect(test.speed, 'to equal', 'slow'); + var expectedArray = ['bright-yellow_' + Base.symbols.dot]; expect(stdout, 'to equal', expectedArray); }); }); }); - - describe("on 'end' event", function() { - it('should call epilogue', function() { - var runner = createMockRunner('end', EVENT_RUN_END); - var fakeThis = { - epilogue: sinon.stub() - }; - var options = {}; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(fakeThis.epilogue.called, 'to be true'); + }); + describe('on fail', function() { + var test = { + test: { + err: 'some error' + } + }; + describe('if window width is greater than 1', function() { + beforeEach(function() { + Base.window.width = 2; + }); + it('should write a newline followed by an exclamation mark', function() { + runner = createMockRunner('fail', 'fail', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); + }); + }); + describe('if window width is equal to or less than 1', function() { + it('should write an exclamation mark', function() { + runner = createMockRunner('fail', 'fail', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = ['fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); }); }); }); + describe('on end', function() { + it('should call the epilogue', function() { + runner = createMockRunner('end', 'end'); + var epilogueCalled = false; + var epilogue = function() { + epilogueCalled = true; + }; + runReporter({epilogue: epilogue}, runner, options); + expect(epilogueCalled, 'to be', true); + }); + }); }); diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 76b3d79307..5cb21a53f2 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -1,22 +1,17 @@ 'use strict'; -var sinon = require('sinon'); var errors = require('../../lib/errors'); -var createStatsCollector = require('../../lib/stats-collector'); - var createUnsupportedError = errors.createUnsupportedError; +/* + This function prevents the constant use of creating a runnerEvent. + runStr is the argument that defines the runnerEvent. + ifStr1 is one possible reporter argument, as is ifStr2, and ifStr3 + arg1 and arg2 are the possible variables that need to be put into the + scope of this function for the tests to run properly. +*/ + +var createStatsCollector = require('../../lib/stats-collector'); -/** - * Creates a mock runner object. - * - * @param {string} runStr - argument that defines the runnerEvent - * @param {string} ifStr1 - runner event - * @param {(string|null)} [ifStr2] - runner event - * @param {(string|null)} [ifStr3] - runner event - * @param {(*|null)} [arg1] - variable to be added to event handler's scope - * @param {(*|null)} [arg2] - variable to be added to event handler's scope - * @return {Object} mock runner instance - */ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var runnerFunction = createRunnerFunction( runStr, @@ -34,20 +29,6 @@ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { return mockRunner; } -/** - * Creates an event handler function to be used by the runner. - * - * @description - * Arguments 'ifStr1', 'ifStr2', and 'ifStr3' should be `Runner.constants`. - * - * @param {string} runStr - argument that defines the runnerEvent - * @param {string} ifStr1 - runner event - * @param {(string|null)} [ifStr2] - runner event - * @param {(string|null)} [ifStr3] - runner event - * @param {(*|null)} [arg1] - variable to be added to event handler's scope - * @param {(*|null)} [arg2] - variable to be added to event handler's scope - * @return {Function} event handler for the requested runner events - */ function createRunnerFunction(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var test = null; switch (runStr) { @@ -197,35 +178,23 @@ function createRunReporterFunction(ctor) { * @return {string[]} Lines of output written to `stdout` */ var runReporter = function(stubSelf, runner, options, tee) { - var origStdoutWrite = process.stdout.write; - var stdoutWriteStub = sinon.stub(process.stdout, 'write'); var stdout = []; - var gather = function(chunk, enc, callback) { - stdout.push(chunk); + // Reassign stream in order to make a copy of all reporter output + var stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); if (tee) { - origStdoutWrite.call(process.stdout, chunk); + stdoutWrite.call(process.stdout, string, enc, callback); } }; - // Reassign stream in order to make a copy of all reporter output - stdoutWriteStub.callsFake(gather); - - // Give `stubSelf` access to `ctor` prototype chain - Object.setPrototypeOf(stubSelf, ctor.prototype); + // Invoke reporter + ctor.call(stubSelf, runner, options); - try { - try { - // Invoke reporter - ctor.call(stubSelf, runner, options); - } finally { - // Revert stream reassignment here so reporter output - // can't be corrupted if any test assertions throw - stdoutWriteStub.restore(); - } - } catch (err) { - throw err; // Rethrow - } + // Revert stream reassignment here so reporter output + // can't be corrupted if any test assertions throw + process.stdout.write = stdoutWrite; return stdout; }; diff --git a/test/reporters/json-stream.spec.js b/test/reporters/json-stream.spec.js index de83f861b2..8c9fcfff35 100644 --- a/test/reporters/json-stream.spec.js +++ b/test/reporters/json-stream.spec.js @@ -1,22 +1,15 @@ 'use strict'; -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; -var utils = require('../../lib/utils'); - var JSONStream = reporters.JSONStream; -var createMockRunner = helpers.createMockRunner; -var dQuote = utils.dQuote; -var makeExpectedTest = helpers.makeExpectedTest; -var makeRunReporter = helpers.createRunReporterFunction; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var createMockRunner = require('./helpers').createMockRunner; +var makeExpectedTest = require('./helpers').makeExpectedTest; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('JSON Stream reporter', function() { + var runner; + var options = {}; var runReporter = makeRunReporter(JSONStream); var expectedTitle = 'some title'; var expectedFullTitle = 'full title'; @@ -34,126 +27,119 @@ describe('JSON Stream reporter', function() { message: expectedErrorMessage }; - describe('event handlers', function() { - describe("on 'start' event", function() { - it('should write stringified start with expected total', function() { - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var expectedTotal = 12; - runner.total = expectedTotal; - var options = {}; - var stdout = runReporter({}, runner, options); + afterEach(function() { + runner = undefined; + }); - expect( - stdout[0], - 'to equal', - '["start",{"total":' + expectedTotal + '}]\n' - ); - }); + describe('on start', function() { + it('should write stringified start with expected total', function() { + runner = createMockRunner('start', 'start'); + var expectedTotal = 12; + runner.total = expectedTotal; + var stdout = runReporter({}, runner, options); + + expect( + stdout[0], + 'to equal', + '["start",{"total":' + expectedTotal + '}]\n' + ); + }); + }); + + describe('on pass', function() { + it('should write stringified test data', function() { + runner = createMockRunner('pass', 'pass', null, null, expectedTest); + var stdout = runReporter({}, runner, options); + + expect( + stdout[0], + 'to equal', + '["pass",{"title":"' + + expectedTitle + + '","fullTitle":"' + + expectedFullTitle + + '","duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + '}]\n' + ); }); + }); - describe("on 'pass' event", function() { - it('should write stringified test data', function() { - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, + describe('on fail', function() { + describe('if error stack exists', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = expectedErrorStack; + runner = createMockRunner( + 'fail two args', + 'fail', null, null, - expectedTest + expectedTest, + expectedError ); - var options = {}; + var stdout = runReporter({}, runner, options); expect( stdout[0], 'to equal', - '["pass",{"title":' + - dQuote(expectedTitle) + - ',"fullTitle":' + - dQuote(expectedFullTitle) + - ',"duration":' + + '["fail",{"title":"' + + expectedTitle + + '","fullTitle":"' + + expectedFullTitle + + '","duration":' + expectedDuration + ',"currentRetry":' + currentRetry + - '}]\n' + ',"err":"' + + expectedErrorMessage + + '","stack":"' + + expectedErrorStack + + '"}]\n' ); }); }); - describe("on 'fail' event", function() { - describe('when error stack exists', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = expectedErrorStack; - var runner = createMockRunner( - 'fail two args', - EVENT_TEST_FAIL, - null, - null, - expectedTest, - expectedError - ); - var options = {}; - var stdout = runReporter({}, runner, options); - - expect( - stdout[0], - 'to equal', - '["fail",{"title":' + - dQuote(expectedTitle) + - ',"fullTitle":' + - dQuote(expectedFullTitle) + - ',"duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - ',"err":' + - dQuote(expectedErrorMessage) + - ',"stack":' + - dQuote(expectedErrorStack) + - '}]\n' - ); - }); - }); + describe('if error stack does not exist', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = null; + runner = createMockRunner( + 'fail two args', + 'fail', + null, + null, + expectedTest, + expectedError + ); - describe('when error stack does not exist', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = null; - var runner = createMockRunner( - 'fail two args', - EVENT_TEST_FAIL, - null, - null, - expectedTest, - expectedError - ); - var options = {}; - var stdout = runReporter(this, runner, options); + var stdout = runReporter(this, runner, options); - expect( - stdout[0], - 'to equal', - '["fail",{"title":' + - dQuote(expectedTitle) + - ',"fullTitle":' + - dQuote(expectedFullTitle) + - ',"duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - ',"err":' + - dQuote(expectedErrorMessage) + - ',"stack":null}]\n' - ); - }); + expect( + stdout[0], + 'to equal', + '["fail",{"title":"' + + expectedTitle + + '","fullTitle":"' + + expectedFullTitle + + '","duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + ',"err":"' + + expectedErrorMessage + + '","stack":null}]\n' + ); }); }); + }); - describe("on 'end' event", function() { - it('should write summary statistics', function() { - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - var stdout = runReporter(this, runner, options); - expect(stdout[0], 'to match', /end/); - }); + describe('on end', function() { + it('should write end details', function() { + runner = createMockRunner('end', 'end'); + var stdout = runReporter(this, runner, options); + expect(stdout[0], 'to match', /end/); }); }); }); diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index f6299dd134..5d7a37c564 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -7,11 +7,8 @@ var Runner = Mocha.Runner; var Test = Mocha.Test; describe('JSON reporter', function() { - var sandbox; - var suite; - var runner; + var suite, runner; var testTitle = 'json test 1'; - var noop = function() {}; beforeEach(function() { var mocha = new Mocha({ @@ -19,18 +16,8 @@ describe('JSON reporter', function() { }); suite = new Suite('JSON suite', 'root'); runner = new Runner(suite); - var options = {}; /* eslint no-unused-vars: off */ - var mochaReporter = new mocha._reporter(runner, options); - }); - - beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(process.stdout, 'write').callsFake(noop); - }); - - afterEach(function() { - sandbox.restore(); + var mochaReporter = new mocha._reporter(runner); }); it('should have 1 test failure', function(done) { @@ -42,8 +29,9 @@ describe('JSON reporter', function() { }) ); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - sandbox.restore(); + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ @@ -64,8 +52,9 @@ describe('JSON reporter', function() { it('should have 1 test pending', function(done) { suite.addTest(new Test(testTitle)); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - sandbox.restore(); + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { pending: [ @@ -94,8 +83,9 @@ describe('JSON reporter', function() { }) ); + var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - sandbox.restore(); + stdoutWrite.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index acb2ee3ef6..dd73d9e5b3 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -1,25 +1,20 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); -var reporters = require('../../').reporters; -var states = require('../../').Runnable.constants; - -var Base = reporters.Base; +var sandbox = require('sinon').createSandbox(); +var Mocha = require('../..'); +var reporters = Mocha.reporters; var Landing = reporters.Landing; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; - -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_END = events.EVENT_TEST_END; +var constants = Mocha.Runnable.constants; +var STATE_FAILED = constants.STATE_FAILED; +var STATE_PASSED = constants.STATE_PASSED; +var Base = reporters.Base; -var STATE_FAILED = states.STATE_FAILED; -var STATE_PASSED = states.STATE_PASSED; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Landing reporter', function() { - var sandbox; + var runner; + var options = {}; var runReporter = makeRunReporter(Landing); var resetCode = '\u001b[0m'; var expectedArray = [ @@ -34,98 +29,73 @@ describe('Landing reporter', function() { ]; beforeEach(function() { - sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); sandbox.stub(Base.window, 'width').value(1); }); afterEach(function() { sandbox.restore(); + runner = undefined; }); - describe('event handlers', function() { - describe("on 'start' event", function() { - it('should write newlines', function() { - sandbox.stub(Base.cursor, 'hide'); + describe('on start', function() { + it('should write new lines', function() { + sandbox.stub(Base.cursor, 'hide'); - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - var stdout = runReporter({}, runner, options); - sandbox.restore(); + runner = createMockRunner('start', 'start'); + var stdout = runReporter({}, runner, options); - expect(stdout[0], 'to equal', '\n\n\n '); - }); + expect(stdout[0], 'to equal', '\n\n\n '); + }); - it('should call cursor hide', function() { - var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); + it('should call cursor hide', function() { + sandbox.stub(Base.cursor, 'hide'); - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - runReporter({}, runner, options); - sandbox.restore(); + runner = createMockRunner('start', 'start'); + runReporter({}, runner, options); - expect(hideCursorStub.called, 'to be true'); - }); + expect(Base.cursor.hide, 'was called'); }); + }); - describe("on 'test end' event", function() { - describe('when test passes', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_PASSED - }; - var runner = createMockRunner( - 'test end', - EVENT_TEST_END, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({}, runner, options); - sandbox.restore(); - - expect(stdout, 'to equal', expectedArray); - }); + describe('on test end', function() { + describe('if test has failed', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_FAILED + }; + runner = createMockRunner('test end', 'test end', null, null, test); + runner.total = 12; + var stdout = runReporter({}, runner, options); + + expect(stdout, 'to equal', expectedArray); }); + }); + describe('if test has not failed', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_PASSED + }; + runner = createMockRunner('test end', 'test end', null, null, test); - describe('when test fails', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_FAILED - }; - var runner = createMockRunner( - 'test end', - EVENT_TEST_END, - null, - null, - test - ); - runner.total = 12; - var options = {}; - var stdout = runReporter({}, runner, options); - sandbox.restore(); - - expect(stdout, 'to equal', expectedArray); - }); + var stdout = runReporter({}, runner, options); + + expect(stdout, 'to equal', expectedArray); }); }); + }); + describe('on end', function() { + it('should call cursor show and epilogue', function() { + var reporterStub = {epilogue: function() {}}; + sandbox.stub(Base.cursor, 'show'); + sandbox.stub(reporterStub, 'epilogue'); - describe("on 'end' event", function() { - it('should call cursor show and epilogue', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); + runner = createMockRunner('end', 'end'); - var fakeThis = { - epilogue: sinon.spy() - }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - runReporter(fakeThis, runner, options); - sandbox.restore(); + runReporter(reporterStub, runner, options); - expect(fakeThis.epilogue.calledOnce, 'to be true'); - expect(showCursorStub.called, 'to be true'); - }); + expect(reporterStub.epilogue, 'was called'); + expect(Base.cursor.show, 'was called'); }); }); }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index c10272e953..c9eceb87fe 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -1,246 +1,144 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; - -var Base = reporters.Base; var List = reporters.List; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; +var Base = reporters.Base; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_BEGIN = events.EVENT_TEST_BEGIN; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('List reporter', function() { - var sandbox; + var runner; + var options = {}; var runReporter = makeRunReporter(List); var expectedTitle = 'some title'; var expectedDuration = 100; - var noop = function() {}; var test = { fullTitle: function() { return expectedTitle; }, duration: expectedDuration, - slow: noop + slow: function() {} }; beforeEach(function() { - sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { sandbox.restore(); + runner = undefined; }); - describe('event handlers', function() { - describe("on 'start' and 'test' events", function() { - it('should write expected newline and title', function() { - var runner = createMockRunner( - 'start test', - EVENT_RUN_BEGIN, - EVENT_TEST_BEGIN, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); - - var startString = '\n'; - var testString = ' ' + expectedTitle + ': '; - var expectedArray = [startString, testString]; - expect(stdout, 'to equal', expectedArray); - }); + describe('on start and test', function() { + it('should write expected new line and title to the console', function() { + runner = createMockRunner('start test', 'start', 'test', null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + + var startString = '\n'; + var testString = ' ' + expectedTitle + ': '; + var expectedArray = [startString, testString]; + expect(stdout, 'to equal', expectedArray); }); + }); + describe('on pending', function() { + it('should write expected title to the console', function() { + runner = createMockRunner('pending test', 'pending', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); - describe("on 'pending' event", function() { - it('should write expected title', function() { - var runner = createMockRunner( - 'pending test', - EVENT_TEST_PENDING, - null, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); - }); + expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); }); + }); + describe('on pass', function() { + it('should call cursor CR', function() { + sandbox.stub(Base.cursor, 'CR'); - describe("on 'pass' event", function() { - var crStub; - - beforeEach(function() { - crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); - }); - - it('should call cursor CR', function() { - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(crStub.called, 'to be true'); - }); - - it('should write expected symbol, title, and duration', function() { - var expectedOkSymbol = 'OK'; - sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); - - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect( - stdout[0], - 'to be', - ' ' + - expectedOkSymbol + - ' ' + - expectedTitle + - ': ' + - expectedDuration + - 'ms\n' - ); - }); + runner = createMockRunner('pass', 'pass', null, null, test); + runReporter({epilogue: function() {}}, runner, options); + + expect(Base.cursor.CR, 'was called'); + }); + it('should write expected symbol, title and duration to the console', function() { + var expectedOkSymbol = 'OK'; + sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); + sandbox.stub(Base.cursor, 'CR'); + + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + + expect( + stdout[0], + 'to be', + ' ' + + expectedOkSymbol + + ' ' + + expectedTitle + + ': ' + + expectedDuration + + 'ms\n' + ); }); + }); + describe('on fail', function() { + it('should call cursor CR', function() { + sandbox.stub(Base.cursor, 'CR'); + + runner = createMockRunner('fail', 'fail', null, null, test); + runReporter({epilogue: function() {}}, runner, options); - describe("on 'fail' event", function() { - var crStub; - - beforeEach(function() { - crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); - }); - - it('should call cursor CR', function() { - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(crStub.called, 'to be true'); - }); - - it('should write expected error number and title', function() { - var expectedErrorCount = 1; - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - var fakeThis = { - epilogue: noop - }; - var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect( - stdout[0], - 'to be', - ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' - ); - }); - - it('should immediately construct fail strings', function() { - var actual = {a: 'actual'}; - var expected = {a: 'expected'}; - var checked = false; - var err; - test = {}; - - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - runner.on = runner.once = function(event, callback) { - if ( - !checked && - event === 'fail' && - callback.toString().includes('stringifyDiffObjs') // target correct fail event callback - ) { - err = new Error('fake failure object with actual/expected'); - err.actual = actual; - err.expected = expected; - err.showDiff = true; - callback(test, err); - checked = true; - } - }; - var options = {}; - var fakeThis = { - epilogue: noop - }; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(typeof err.actual, 'to be', 'string'); - expect(typeof err.expected, 'to be', 'string'); - }); + expect(Base.cursor.CR, 'was called'); + }); + it('should write expected error number and title', function() { + sandbox.stub(Base.cursor, 'CR'); + + var expectedErrorCount = 1; + runner = createMockRunner('fail', 'fail', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + + expect( + stdout[0], + 'to be', + ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' + ); + }); + it('should immediately construct fail strings', function() { + var actual = {a: 'actual'}; + var expected = {a: 'expected'}; + var checked = false; + var err; + test = {}; + runner = createMockRunner('fail', 'fail', null, null, test); + runner.on = runner.once = function(event, callback) { + if ( + !checked && + event === 'fail' && + callback.toString().includes('stringifyDiffObjs') // target correct fail event callback + ) { + err = new Error('fake failure object with actual/expected'); + err.actual = actual; + err.expected = expected; + err.showDiff = true; + callback(test, err); + checked = true; + } + }; + runReporter({epilogue: function() {}}, runner, options); + + expect(typeof err.actual, 'to be', 'string'); + expect(typeof err.expected, 'to be', 'string'); }); + }); + + describe('on end', function() { + it('should call epilogue', function() { + var reporterStub = {epilogue: function() {}}; + sandbox.stub(reporterStub, 'epilogue'); + + runner = createMockRunner('end', 'end'); + runReporter(reporterStub, runner, options); - describe("on 'end' event", function() { - it('should call epilogue', function() { - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - var fakeThis = { - epilogue: sinon.spy() - }; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(fakeThis.epilogue.calledOnce, 'to be true'); - }); + expect(reporterStub.epilogue, 'was called'); }); }); }); diff --git a/test/reporters/markdown.spec.js b/test/reporters/markdown.spec.js index e068c58cea..842d7c7643 100644 --- a/test/reporters/markdown.spec.js +++ b/test/reporters/markdown.spec.js @@ -1,115 +1,102 @@ 'use strict'; -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - var Markdown = reporters.Markdown; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; -var EVENT_SUITE_END = events.EVENT_SUITE_END; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Markdown reporter', function() { + var runner; + var options = {}; var runReporter = makeRunReporter(Markdown); var expectedTitle = 'expected title'; var expectedFullTitle = 'full title'; var sluggedFullTitle = 'full-title'; - var noop = function() {}; - describe('event handlers', function() { - describe("on 'suite' event", function() { - it("should write expected slugged titles on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [ - { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - } - ] - }; - var runner = createMockRunner( - 'suite suite end', - EVENT_SUITE_BEGIN, - EVENT_SUITE_END, - EVENT_RUN_END, - expectedSuite - ); - runner.suite = expectedSuite; - var options = {}; - var stdout = runReporter({}, runner, options); + afterEach(function() { + runner = undefined; + }); - var expectedArray = [ - '# TOC\n', - ' - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n', - '\n ' + expectedTitle + '\n' - ]; + describe("on 'suite'", function() { + it("should write expected slugged titles on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [ + { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + } + ] + }; + runner = createMockRunner( + 'suite suite end', + 'suite', + 'suite end', + 'end', + expectedSuite + ); + runner.suite = expectedSuite; + var stdout = runReporter({}, runner, options); - expect(stdout, 'to equal', expectedArray); - }); - }); + var expectedArray = [ + '# TOC\n', + ' - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n', + '\n ' + expectedTitle + '\n' + ]; - describe("on 'pass' event", function() { - it("should write test code inside js code block, on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - }; - var expectedDuration = 1000; - var currentRetry = 1; - var expectedBody = 'some body'; - var expectedTest = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - duration: expectedDuration, - currentRetry: function() { - return currentRetry; - }, - slow: noop, - body: expectedBody - }; - var runner = createMockRunner( - 'pass end', - EVENT_TEST_PASS, - EVENT_RUN_END, - null, - expectedTest - ); - runner.suite = expectedSuite; - var options = {}; - var stdout = runReporter({}, runner, options); + expect(stdout, 'to equal', expectedArray); + }); + }); + describe("on 'pass'", function() { + it("should write test code inside js code block, on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + }; + var expectedDuration = 1000; + var currentRetry = 1; + var expectedBody = 'some body'; + var expectedTest = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + duration: expectedDuration, + currentRetry: function() { + return currentRetry; + }, + slow: function() {}, + body: expectedBody + }; + runner = createMockRunner('pass end', 'pass', 'end', null, expectedTest); + runner.suite = expectedSuite; + var stdout = runReporter({}, runner, options); - var expectedArray = [ - '# TOC\n', - ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', - expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' - ]; + var expectedArray = [ + '# TOC\n', + ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', + expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' + ]; - expect(stdout, 'to equal', expectedArray); - }); + expect(stdout, 'to equal', expectedArray); }); }); }); diff --git a/test/reporters/min.spec.js b/test/reporters/min.spec.js index 1fe46333cf..f88adf31d7 100644 --- a/test/reporters/min.spec.js +++ b/test/reporters/min.spec.js @@ -1,47 +1,45 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - var Min = reporters.Min; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Min reporter', function() { + var runner; + var options = {}; var runReporter = makeRunReporter(Min); - var noop = function() {}; - - describe('event handlers', function() { - describe("on 'start' event", function() { - it('should clear screen then set cursor position', function() { - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - var fakeThis = { - epilogue: noop - }; - var stdout = runReporter(fakeThis, runner, options); - - var expectedArray = ['\u001b[2J', '\u001b[1;3H']; - expect(stdout, 'to equal', expectedArray); - }); + + afterEach(function() { + runner = undefined; + }); + + describe('on start', function() { + it('should clear screen then set cursor position', function() { + runner = createMockRunner('start', 'start'); + var stdout = runReporter({epilogue: function() {}}, runner, options); + + var expectedArray = ['\u001b[2J', '\u001b[1;3H']; + expect(stdout, 'to equal', expectedArray); }); + }); - describe("on 'end' event", function() { - it('should call epilogue', function() { - var fakeThis = { - epilogue: sinon.stub().callsFake(noop) - }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - runReporter(fakeThis, runner, options); - - expect(fakeThis.epilogue.called, 'to be true'); - }); + describe('on end', function() { + it('should call epilogue', function() { + var calledEpilogue = false; + runner = createMockRunner('end', 'end'); + runReporter( + { + epilogue: function() { + calledEpilogue = true; + } + }, + runner, + options + ); + + expect(calledEpilogue, 'to be', true); }); }); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index 05d2e1bf77..b1ad3a22a3 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -1,205 +1,172 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; - -var Base = reporters.Base; var NyanCat = reporters.Nyan; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; +var Base = reporters.Base; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Nyan reporter', function() { - var sandbox; - var noop = function() {}; - - beforeEach(function() { - sandbox = sinon.createSandbox(); - }); - - afterEach(function() { - sandbox.restore(); - }); - - describe('event handlers', function() { + describe('events', function() { + var runner; + var options = {}; var runReporter = makeRunReporter(NyanCat); - describe("on 'start' event", function() { + afterEach(function() { + sandbox.restore(); + runner = undefined; + }); + + describe('on start', function() { it('should call draw', function() { - var fakeThis = { - draw: sinon.stub().callsFake(noop), - generateColors: noop + var reporterStub = { + draw: function() {}, + generateColors: function() {} }; + sandbox.stub(reporterStub, 'draw'); - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - runReporter(fakeThis, runner, options); + runner = createMockRunner('start', 'start'); + runReporter(reporterStub, runner, options); - expect(fakeThis.draw.called, 'to be true'); + expect(reporterStub.draw, 'was called'); }); }); - - describe("on 'pending' event", function() { + describe('on pending', function() { it('should call draw', function() { - var fakeThis = { - draw: sinon.stub().callsFake(noop), - generateColors: noop + var reporterStub = { + draw: function() {}, + generateColors: function() {} }; - var runner = createMockRunner('pending', EVENT_TEST_PENDING); - var options = {}; - runReporter(fakeThis, runner, options); + sandbox.stub(reporterStub, 'draw'); - expect(fakeThis.draw.called, 'to be true'); + runner = createMockRunner('pending', 'pending'); + runReporter(reporterStub, runner, options); + + expect(reporterStub.draw, 'was called'); }); }); - - describe("on 'pass' event", function() { + describe('on pass', function() { it('should call draw', function() { + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + var test = { duration: '', - slow: noop + slow: function() {} }; - var fakeThis = { - draw: sinon.stub().callsFake(noop), - generateColors: noop - }; - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - runReporter(fakeThis, runner, options); + runner = createMockRunner('pass', 'pass', null, null, test); + runReporter(reporterStub, runner, options); - expect(fakeThis.draw.called, 'to be true'); + expect(reporterStub.draw, 'was called'); }); }); - - describe("on 'fail' event", function() { + describe('on fail', function() { it('should call draw', function() { + var reporterStub = { + draw: function() {}, + generateColors: function() {} + }; + sandbox.stub(reporterStub, 'draw'); + var test = { err: '' }; - var fakeThis = { - draw: sinon.stub().callsFake(noop), - generateColors: noop - }; - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - runReporter(fakeThis, runner, options); + runner = createMockRunner('fail', 'fail', null, null, test); + runReporter(reporterStub, runner, options); - expect(fakeThis.draw.called, 'to be true'); + expect(reporterStub.draw, 'was called'); }); }); - - describe("on 'end' event", function() { + describe('on end', function() { it('should call epilogue', function() { - var fakeThis = { - draw: noop, - epilogue: sinon.stub().callsFake(noop), - generateColors: noop + var reporterStub = { + draw: function() {}, + generateColors: function() {}, + epilogue: function() {} }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - runReporter(fakeThis, runner, options); + sandbox.stub(reporterStub, 'epilogue'); - expect(fakeThis.epilogue.called, 'to be true'); - }); + runner = createMockRunner('end', 'end'); + runReporter(reporterStub, runner, options); - it('should write numberOfLines amount of newlines', function() { + expect(reporterStub.epilogue, 'was called'); + }); + it('should write numberOfLines amount of new lines', function() { var expectedNumberOfLines = 4; - var fakeThis = { - draw: noop, - epilogue: noop, - generateColors: noop - }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - var stdout = runReporter(fakeThis, runner, options); + runner = createMockRunner('end', 'end'); + var stdout = runReporter( + { + draw: function() {}, + generateColors: function() {}, + epilogue: function() {} + }, + runner, + options + ); - var isBlankLine = function(value) { + var arrayOfNewlines = stdout.filter(function(value) { return value === '\n'; - }; + }); - expect( - stdout.filter(isBlankLine), - 'to have length', - expectedNumberOfLines - ); + expect(arrayOfNewlines, 'to have length', expectedNumberOfLines); }); - it('should call Base show', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); - var fakeThis = { - draw: noop, - epilogue: noop, - generateColors: noop - }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - runReporter(fakeThis, runner, options); - sandbox.restore(); + sandbox.stub(Base.cursor, 'show'); + + runner = createMockRunner('end', 'end'); + runReporter( + { + draw: function() {}, + generateColors: function() {}, + epilogue: function() {} + }, + runner, + options + ); - expect(showCursorStub.called, 'to be true'); + expect(Base.cursor.show, 'was called'); }); }); }); - describe('#draw', function() { - var stdoutWriteStub; + describe('draw', function() { var stdout; + var stdoutWrite; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); - stdoutWriteStub.callsFake(function(chunk, encoding, cb) { - stdout.push(chunk); - }); stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + }; }); - describe("when 'tick' is false", function() { + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + + describe('if tick is false', function() { it('should draw face with expected spaces, _ and ^', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - var fakeThis = { + + nyanCat.draw.call({ tick: false, - appendRainbow: noop, - rainbowify: noop, - drawScoreboard: noop, - drawRainbow: noop, + appendRainbow: function() {}, + rainbowify: function() {}, + drawScoreboard: function() {}, + drawRainbow: function() {}, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: noop, - cursorUp: noop - }; - - try { - try { - nyanCat.draw.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + face: function() {}, + cursorUp: function() {} + }); var expectedArray = [ '\u001b[0C', @@ -218,35 +185,23 @@ describe('Nyan reporter', function() { expect(stdout, 'to equal', expectedArray); }); }); - - describe("when 'tick' is true", function() { + describe('if tick is true', function() { it('should draw face with expected spaces, _ and ~', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - var fakeThis = { + + nyanCat.draw.call({ tick: true, - appendRainbow: noop, - rainbowify: noop, - drawScoreboard: noop, - drawRainbow: noop, + appendRainbow: function() {}, + rainbowify: function() {}, + drawScoreboard: function() {}, + drawRainbow: function() {}, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: noop, - cursorUp: noop - }; - - try { - try { - nyanCat.draw.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + face: function() {}, + cursorUp: function() {} + }); var expectedArray = [ '\u001b[0C', @@ -267,136 +222,102 @@ describe('Nyan reporter', function() { }); }); - describe('#cursorDown', function() { - var stdoutWriteStub; + describe('cursorDown', function() { var stdout; + var stdoutWrite; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); - stdoutWriteStub.callsFake(function(chunk, encoding, cb) { - stdout.push(chunk); - }); stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string) { + stdout.push(string); + }; + }); + + afterEach(function() { + process.stdout.write = stdoutWrite; }); it('should write cursor down interaction with expected number', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedNumber = 25; - try { - try { - nyanCat.cursorDown(expectedNumber); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } - + nyanCat.cursorDown(expectedNumber); var expectedArray = ['\u001b[' + expectedNumber + 'B']; expect(stdout, 'to equal', expectedArray); }); }); - describe('#cursorUp', function() { - var stdoutWriteStub; + describe('cursorUp', function() { var stdout; + var stdoutWrite; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); - stdoutWriteStub.callsFake(function(chunk, encoding, cb) { - stdout.push(chunk); - }); stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + }; + }); + + afterEach(function() { + process.stdout.write = stdoutWrite; }); it('should write cursor up interaction with expected number', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedNumber = 25; - try { - try { - nyanCat.cursorUp(expectedNumber); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } - + nyanCat.cursorUp(expectedNumber); var expectedArray = ['\u001b[' + expectedNumber + 'A']; expect(stdout, 'to equal', expectedArray); }); }); - describe('#rainbowify', function() { - var useColorsStub; - - beforeEach(function() { - useColorsStub = sandbox.stub(Base, 'useColors'); - }); - - afterEach(function() { - sandbox.restore(); - }); - - describe("when 'useColors' is false", function() { + describe('rainbowify', function() { + describe('useColors is false', function() { beforeEach(function() { - useColorsStub.value(false); + sandbox.stub(Base, 'useColors').value(false); }); it('should return argument string', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); - - var inputString = 'hello'; - var outputString = nyanCat.rainbowify(inputString); - sandbox.restore(); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var expectedString = 'hello'; + var outputString = nyanCat.rainbowify(expectedString); - var expectedString = inputString; expect(outputString, 'to be', expectedString); }); }); - - describe("when 'useColors' is true", function() { + describe('useColors is true', function() { beforeEach(function() { - useColorsStub.value(true); + sandbox.stub(Base, 'useColors').value(true); }); it('should return rainbowified string from the given string and predefined codes', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); - - var inputString = 'hello'; - var colorCode = 'somecode'; - var fakeThis = { - rainbowColors: [colorCode], - colorIndex: 0 - }; - var outputString = nyanCat.rainbowify.call(fakeThis, inputString); - sandbox.restore(); - var startCode = '\u001b[38;5;'; var endCode = '\u001b[0m'; - var expectedString = - startCode + colorCode + 'm' + inputString + endCode; - expect(outputString, 'to be', expectedString); + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var expectedString = 'hello'; + var colorCode = 'somecode'; + var expectedRainbowifyString = + startCode + colorCode + 'm' + expectedString + endCode; + var outputString = nyanCat.rainbowify.call( + { + rainbowColors: [colorCode], + colorIndex: 0 + }, + expectedString + ); + + expect(outputString, 'to be', expectedRainbowifyString); }); }); }); - describe('#appendRainbow', function() { - describe("when 'tick' is true", function() { - it('should set an underscore segment', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + describe('appendRainbow', function() { + describe('if tick is true', function() { + it('should set an _ segment', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -412,11 +333,8 @@ describe('Nyan reporter', function() { expect(expectedSegment, 'to be', '_'); }); - - it('should shift each trajectory item if its length is greater than or equal to its max width', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + it('should shift each trajectory item, if its length is greater of equal to its max width', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var rainbowifyResult = 'rainbowify'; var inputArray = ['itemToShify']; @@ -441,12 +359,9 @@ describe('Nyan reporter', function() { expect(trajectories, 'to equal', expectedTrajectories); }); }); - - describe("when 'tick' is false", function() { - it('should set a dash segment', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + describe('if tick is false', function() { + it('should set an - segment', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -465,45 +380,42 @@ describe('Nyan reporter', function() { }); }); - describe('#drawScoreboard', function() { + describe('drawScoreboard', function() { + var stdoutWrite; var stdout; + var cachedColor; + var showOutput = false; beforeEach(function() { - sandbox.stub(Base, 'color').callsFake(function(type, n) { - return type + n; - }); - var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); - stdoutWriteStub.callsFake(function(chunk, encoding, cb) { - stdout.push(chunk); - }); stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + if (showOutput) { + stdoutWrite.call(process.stdout, string, enc, callback); + } + }; + cachedColor = Base.color; + Base.color = function(type, n) { + return type + n; + }; }); - it('should write scoreboard with color set with each stat', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + afterEach(function() { + process.stdout.write = stdoutWrite; + Base.color = cachedColor; + }); + it('should write scoreboard with color set with each stat', function() { var passes = 2; var pending = 1; var failures = 1; - - var fakeThis = { - cursorUp: noop, + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + nyanCat.drawScoreboard.call({ + cursorUp: function() {}, stats: {passes: passes, pending: pending, failures: failures}, numberOfLines: 4 - }; - - try { - try { - nyanCat.drawScoreboard.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } - + }); var expectedArray = [ ' ', 'green' + passes, @@ -520,40 +432,40 @@ describe('Nyan reporter', function() { }); it('should call cursorUp with given numberOfLines', function() { + var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); - var fakeThis = { - cursorUp: sinon.spy(), + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + nyanCat.drawScoreboard.call({ + cursorUp: function(lines) { + expectedCursorArgument = lines; + }, stats: {passes: 0, pending: 0, failures: 0}, numberOfLines: expectedNumberOfLines - }; - - try { - try { - nyanCat.drawScoreboard.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + }); - expect(fakeThis.cursorUp.calledWith(expectedNumberOfLines), 'to be true'); + expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); - describe('#drawRainbow', function() { + describe('drawRainbow', function() { + var stdoutWrite; var stdout; + var showOutput = false; beforeEach(function() { - var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); - stdoutWriteStub.callsFake(function(chunk, encoding, cb) { - stdout.push(chunk); - }); stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + if (showOutput) { + stdoutWrite.call(process.stdout, string, enc, callback); + } + }; + }); + + afterEach(function() { + process.stdout.write = stdoutWrite; }); it('should write width, contents and newline for each trajectory', function() { @@ -562,25 +474,13 @@ describe('Nyan reporter', function() { var expectedContents = 'input'; var inputArray = [expectedContents]; var trajectories = [inputArray]; - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); - var fakeThis = { - cursorUp: noop, + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + nyanCat.drawRainbow.call({ + cursorUp: function() {}, trajectories: trajectories, scoreboardWidth: expectedWidth, numberOfLines: 1 - }; - - try { - try { - nyanCat.drawRainbow.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + }); var expectedArray = [ '\u001b[' + expectedWidth + 'C', @@ -594,66 +494,41 @@ describe('Nyan reporter', function() { var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); - var fakeThis = { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + nyanCat.drawRainbow.call({ cursorUp: function(lines) { expectedCursorArgument = lines; }, trajectories: [['input']], scoreboardWidth: 1, numberOfLines: expectedNumberOfLines - }; - - try { - try { - nyanCat.drawRainbow.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow - } + }); expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); - - describe('#face', function() { - it('should expect "( x .x)" if any failures', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + describe('face', function() { + it('expected face:(x .x) when "failures" at least one', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 1}; - expect(nyanCat.face(), 'to be', '( x .x)'); }); - it('should expect "( o .o)" if any pending but none failing', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + it('expected face:(x .x) when "pending" at least one and no failing', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - expect(nyanCat.face(), 'to be', '( o .o)'); }); - it('should expect "( ^ .^)" if all passing', function() { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + it('expected face:(^ .^) when "passing" only', function() { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 1, pending: 0, failures: 0}; - expect(nyanCat.face(), 'to be', '( ^ .^)'); }); - it('should expect "( - .-)" otherwise', function(done) { - var runner = {on: noop, once: noop}; - var options = {}; - var nyanCat = new NyanCat(runner, options); + it('expected face:(- .-) when otherwise', function(done) { + var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 0, pending: 0, failures: 0}; - expect(nyanCat.face(), 'to be', '( - .-)'); done(); }); diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index 0d45abeaf7..cdea9c643e 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -1,117 +1,107 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); +var sandbox = require('sinon').createSandbox(); var reporters = require('../../').reporters; - -var Base = reporters.Base; var Progress = reporters.Progress; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; +var Base = reporters.Base; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_END = events.EVENT_TEST_END; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Progress reporter', function() { - var sandbox; + var stdout; + var stdoutWrite; + var runner; var runReporter = makeRunReporter(Progress); - var noop = function() {}; beforeEach(function() { - sandbox = sinon.createSandbox(); + stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); + }; }); afterEach(function() { sandbox.restore(); + process.stdout.write = stdoutWrite; }); - describe('event handlers', function() { - describe("on 'start' event", function() { - it('should call cursor hide', function() { - var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); + describe('on start', function() { + it('should call cursor hide', function() { + sandbox.stub(Base.cursor, 'hide'); - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - var options = {}; - runReporter({}, runner, options); - sandbox.restore(); + runner = createMockRunner('start', 'start'); + runReporter({}, runner, {}); - expect(hideCursorStub.called, 'to be true'); - }); + expect(Base.cursor.hide, 'was called'); }); + }); - describe("on 'test end' event", function() { - describe('when line has changed', function() { - it('should write expected progress of open and close options', function() { - var crCursorStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.window, 'width').value(5); - - var expectedTotal = 12; - var expectedOpen = 'OpEn'; - var expectedClose = 'cLoSe'; - var expectedIncomplete = 'iNcOmPlEtE'; - var expectedOptions = { - open: expectedOpen, - complete: 'cOmPlEtE', - incomplete: expectedIncomplete, - close: expectedClose - }; - - var runner = createMockRunner('test end', EVENT_TEST_END); - runner.total = expectedTotal; - var options = { - reporterOptions: expectedOptions - }; - var stdout = runReporter({}, runner, options); - sandbox.restore(); - - var expectedArray = [ - '\u001b[J', - ' ' + expectedOpen, - '', - expectedIncomplete, - expectedClose - ]; - - expect(crCursorStub.called, 'to be true'); - expect(stdout, 'to equal', expectedArray); - }); - }); + describe('on test end', function() { + describe('if line has not changed', function() { + it('should return and not write anything', function() { + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR'); + sandbox.stub(Base.window, 'width').value(-3); - describe('when line has not changed', function() { - it('should not write anything', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR').callsFake(noop); - sandbox.stub(Base.window, 'width').value(-3); - - var expectedTotal = 1; - var runner = createMockRunner('test end', EVENT_TEST_END); - runner.total = expectedTotal; - var options = {}; - var stdout = runReporter({}, runner, options); - sandbox.restore(); - - expect(stdout, 'to equal', []); - }); + var expectedTotal = 1; + var expectedOptions = {}; + runner = createMockRunner('test end', 'test end'); + runner.total = expectedTotal; + var stdout = runReporter({}, runner, expectedOptions); + + expect(stdout, 'to equal', []); }); }); - - describe("on 'end' event", function() { - it('should call cursor show and epilogue', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); - var fakeThis = { - epilogue: sinon.spy() + describe('if line has changed', function() { + it('should write expected progress of open and close options', function() { + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR'); + sandbox.stub(Base.window, 'width').value(5); + + var expectedTotal = 12; + var expectedOpen = 'OpEn'; + var expectedClose = 'cLoSe'; + var expectedIncomplete = 'iNcOmPlEtE'; + var expectedOptions = { + open: expectedOpen, + complete: 'cOmPlEtE', + incomplete: expectedIncomplete, + close: expectedClose }; - var runner = createMockRunner('end', EVENT_RUN_END); - var options = {}; - runReporter(fakeThis, runner, options); - sandbox.restore(); - - expect(fakeThis.epilogue.calledOnce, 'to be true'); - expect(showCursorStub.called, 'to be true'); + var options = { + reporterOptions: expectedOptions + }; + runner = createMockRunner('test end', 'test end'); + runner.total = expectedTotal; + var stdout = runReporter({}, runner, options); + + var expectedArray = [ + '\u001b[J', + ' ' + expectedOpen, + '', + expectedIncomplete, + expectedClose + ]; + expect(Base.cursor.CR, 'was called'); + expect(stdout, 'to equal', expectedArray); }); }); }); + + describe('on end', function() { + it('should call cursor show and epilogue', function() { + var reporterStub = {epilogue: function() {}}; + sandbox.stub(Base.cursor, 'show'); + sandbox.stub(reporterStub, 'epilogue'); + + runner = createMockRunner('end', 'end'); + runReporter(reporterStub, runner, {}); + + expect(reporterStub.epilogue, 'was called'); + expect(Base.cursor.show, 'was called'); + }); + }); }); diff --git a/test/reporters/spec.spec.js b/test/reporters/spec.spec.js index 608bc7f512..5f7584e33e 100644 --- a/test/reporters/spec.spec.js +++ b/test/reporters/spec.spec.js @@ -1,163 +1,104 @@ 'use strict'; -var sinon = require('sinon'); -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - -var Base = reporters.Base; var Spec = reporters.Spec; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; +var Base = reporters.Base; -var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('Spec reporter', function() { + var runner; + var options = {}; var runReporter = makeRunReporter(Spec); + var useColors; var expectedTitle = 'expectedTitle'; - var noop = function() {}; - var sandbox; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); + useColors = Base.useColors; + Base.useColors = false; }); afterEach(function() { - sandbox.restore(); + Base.useColors = useColors; + runner = undefined; }); - describe('event handlers', function() { - describe("on 'suite' event", function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - var runner = createMockRunner( - 'suite', - EVENT_SUITE_BEGIN, - null, - null, - suite - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = [expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); + describe('on suite', function() { + it('should return title', function() { + var suite = { + title: expectedTitle + }; + runner = createMockRunner('suite', 'suite', null, null, suite); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = [expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); }); - - describe("on 'pending' event", function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - var runner = createMockRunner( - 'pending test', - EVENT_TEST_PENDING, - null, - null, - suite - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = [' - ' + expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); + }); + describe('on pending', function() { + it('should return title', function() { + var suite = { + title: expectedTitle + }; + runner = createMockRunner('pending test', 'pending', null, null, suite); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = [' - ' + expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); }); - - describe("on 'pass' event", function() { - describe('when test speed is slow', function() { - it('should return expected tick, title, and duration', function() { - var expectedDuration = 2; - var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 1; - } - }; - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedString = - ' ' + - Base.symbols.ok + - ' ' + - expectedTitle + - ' (' + - expectedDuration + - 'ms)' + - '\n'; - expect(stdout[0], 'to be', expectedString); - }); - }); - - describe('when test speed is fast', function() { - it('should return expected tick, title without a duration', function() { - var expectedDuration = 1; - var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 2; - } - }; - var runner = createMockRunner( - 'pass', - EVENT_TEST_PASS, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedString = - ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to be', expectedString); - }); + }); + describe('on pass', function() { + describe('if test speed is slow', function() { + it('should return expected tick, title and duration', function() { + var expectedDuration = 2; + var test = { + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 1; + } + }; + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedString = + ' ' + + Base.symbols.ok + + ' ' + + expectedTitle + + ' (' + + expectedDuration + + 'ms)' + + '\n'; + expect(stdout[0], 'to be', expectedString); }); }); - - describe("on 'fail' event", function() { - it('should return title and function count', function() { - var functionCount = 1; + describe('if test speed is fast', function() { + it('should return expected tick, title and without a duration', function() { + var expectedDuration = 1; var test = { - title: expectedTitle + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 2; + } }; - var runner = createMockRunner( - 'fail', - EVENT_TEST_FAIL, - null, - null, - test - ); - var options = {}; - var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); - - var expectedArray = [ - ' ' + functionCount + ') ' + expectedTitle + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + runner = createMockRunner('pass', 'pass', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedString = + ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to be', expectedString); }); }); }); + describe('on fail', function() { + it('should return title and function count', function() { + var functionCount = 1; + var test = { + title: expectedTitle + }; + runner = createMockRunner('fail', 'fail', null, null, test); + var stdout = runReporter({epilogue: function() {}}, runner, options); + var expectedArray = [' ' + functionCount + ') ' + expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); + }); + }); }); diff --git a/test/reporters/tap.spec.js b/test/reporters/tap.spec.js index f3bfe8d473..c0a5419d37 100644 --- a/test/reporters/tap.spec.js +++ b/test/reporters/tap.spec.js @@ -1,295 +1,246 @@ 'use strict'; -var events = require('../../').Runner.constants; -var helpers = require('./helpers'); var reporters = require('../../').reporters; - var TAP = reporters.TAP; -var createMockRunner = helpers.createMockRunner; -var makeRunReporter = helpers.createRunReporterFunction; -var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_END = events.EVENT_TEST_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; +var createMockRunner = require('./helpers').createMockRunner; +var makeRunReporter = require('./helpers.js').createRunReporterFunction; describe('TAP reporter', function() { + var runner; var runReporter = makeRunReporter(TAP); var expectedTitle = 'some title'; var countAfterTestEnd = 2; - var noop = function() {}; + var test; - function createTest() { - return { + beforeEach(function() { + test = { fullTitle: function() { return expectedTitle; }, - slow: noop + slow: function() {} }; - } + }); - describe('TAP12 spec', function() { - var options = { - reporterOptions: { - tapVersion: '12' - } - }; + afterEach(function() { + runner = undefined; + test = undefined; + }); - describe('event handlers', function() { - describe("on 'start' event", function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout = []; - - before(function() { - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - stdout = runReporter({}, runner, options); - }); + describe('TAP12 spec', function() { + var options = {}; + + describe('on start', function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout; + + before(function() { + runner = createMockRunner('start', 'start'); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + stdout = runReporter({}, runner, options); + }); - it('should not write a TAP specification version', function() { - expect(stdout, 'not to contain', 'TAP version'); - }); + it('should not write the TAP specification version', function() { + expect(stdout, 'not to contain', 'TAP version'); + }); + it('should write the number of tests that it plans to run', function() { + var expectedArray = ['1..' + expectedTotal + '\n']; + expect(stdout, 'to equal', expectedArray); + expect(expectedString, 'to be', expectedSuite); + }); + }); - it('should write the number of tests that it plans to run', function() { - var expectedArray = ['1..' + expectedTotal + '\n']; - expect(stdout, 'to equal', expectedArray); - expect(expectedString, 'to be', expectedSuite); - }); + describe('on pending', function() { + it('should write expected message including count and title', function() { + runner = createMockRunner( + 'start test', + 'test end', + 'pending', + null, + test + ); + runner.suite = ''; + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); + + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); + }); + + describe('on pass', function() { + it('should write expected message including count and title', function() { + runner = createMockRunner('start test', 'test end', 'pass', null, test); + runner.suite = ''; + runner.grepTotal = function() {}; - describe("on 'pending' event", function() { - var stdout = []; + var stdout = runReporter({}, runner, options); - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'start test', - EVENT_TEST_END, - EVENT_TEST_PENDING, + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); + }); + }); + + describe('on fail', function() { + describe('if there is an error message', function() { + it('should write expected message and error message', function() { + var expectedErrorMessage = 'some error'; + var error = { + message: expectedErrorMessage + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', null, - test + test, + error ); + runner.on = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; - it('should write expected message including count and title', function() { - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); + var stdout = runReporter({}, runner, options); + + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); - describe("on 'pass' event", function() { - var stdout; - - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'start test', - EVENT_TEST_END, - EVENT_TEST_PASS, + describe('if there is an error stack', function() { + it('should write expected message and stack', function() { + var expectedStack = 'some stack'; + var error = { + stack: expectedStack + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', null, - test + test, + error ); runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; - it('should write expected message including count and title', function() { - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); + var stdout = runReporter({}, runner, options); - describe("on 'fail' event", function() { - var expectedErrorMessage = 'some error'; - var expectedStack = 'some stack'; - - describe("when 'error' has only message", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - message: expectedErrorMessage - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message and error message', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); }); + }); - describe("when 'error' has only stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - stack: expectedStack - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message and stack', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + describe('if there is an error stack and error message', function() { + it('should write expected message and stack', function() { + var expectedStack = 'some stack'; + var expectedErrorMessage = 'some error'; + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = function() {}; - describe("when 'error' has both message and stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message, error message, and stack', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + var stdout = runReporter({}, runner, options); - describe("when 'error' has neither message nor stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = {}; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = runner.once = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message only', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); - describe("on 'end' event", function() { - var stdout; - - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'fail end pass', - EVENT_TEST_FAIL, - EVENT_RUN_END, - EVENT_TEST_PASS, - test + describe('if there is no error stack or error message', function() { + it('should write expected message only', function() { + var error = {}; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', + null, + test, + error ); + runner.on = runner.once = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); - it('should write total tests, passes, and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); + + describe('on end', function() { + it('should write total tests, passes and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); + runner.suite = ''; + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); + + var totalTests = numberOfPasses + numberOfFails; + var expectedArray = [ + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); }); describe('TAP13 spec', function() { @@ -299,270 +250,229 @@ describe('TAP reporter', function() { } }; - describe('event handlers', function() { - describe("on 'start' event", function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout; - - before(function() { - var runner = createMockRunner('start', EVENT_RUN_BEGIN); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - stdout = runReporter({}, runner, options); - }); + describe('on start', function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout; + + before(function() { + runner = createMockRunner('start', 'start'); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + + stdout = runReporter({}, runner, options); + }); - it('should write the TAP specification version', function() { - var tapVersion = options.reporterOptions.tapVersion; - var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; - expect(stdout[0], 'to equal', expectedFirstLine); - }); + it('should write the TAP specification version', function() { + var tapVersion = options.reporterOptions.tapVersion; + var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; + expect(stdout[0], 'to equal', expectedFirstLine); + }); + it('should write the number of tests that it plans to run', function() { + var expectedSecondLine = '1..' + expectedTotal + '\n'; + expect(stdout[1], 'to equal', expectedSecondLine); + expect(expectedString, 'to be', expectedSuite); + }); + }); - it('should write the number of tests that it plans to run', function() { - var expectedSecondLine = '1..' + expectedTotal + '\n'; - expect(stdout[1], 'to equal', expectedSecondLine); - expect(expectedString, 'to be', expectedSuite); - }); + describe('on pending', function() { + it('should write expected message including count and title', function() { + runner = createMockRunner( + 'start test', + 'test end', + 'pending', + null, + test + ); + runner.suite = ''; + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); + + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); + }); + + describe('on pass', function() { + it('should write expected message including count and title', function() { + runner = createMockRunner('start test', 'test end', 'pass', null, test); + runner.suite = ''; + runner.grepTotal = function() {}; - describe("on 'pending' event", function() { - var stdout; + var stdout = runReporter({}, runner, options); - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'start test', - EVENT_TEST_END, - EVENT_TEST_PENDING, + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); + }); + }); + + describe('on fail', function() { + describe('if there is an error message', function() { + it('should write expected message and error message', function() { + var expectedErrorMessage = 'some error'; + var error = { + message: expectedErrorMessage + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', null, - test + test, + error ); + runner.on = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); - it('should write expected message including count and title', function() { - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); - describe("on 'pass' event", function() { - var stdout; - - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'start test', - EVENT_TEST_END, - EVENT_TEST_PASS, + describe('if there is an error stack', function() { + it('should write expected message and stack', function() { + var expectedStack = 'some stack'; + var error = { + stack: expectedStack + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', null, - test + test, + error ); runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; - it('should write expected message including count and title', function() { - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); + var stdout = runReporter({}, runner, options); - describe("on 'fail' event", function() { - var expectedErrorMessage = 'some error'; - var expectedStack = 'some stack'; - - describe("when 'error' has only message", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - message: expectedErrorMessage - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message and error message', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); }); + }); - describe("when 'error' has only stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - stack: expectedStack - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message and stack', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + describe('if there is an error stack and error message', function() { + it('should write expected message and stack', function() { + var expectedStack = 'some stack'; + var expectedErrorMessage = 'some error'; + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = function() {}; - describe("when 'error' has both message and stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message, error message, and stack', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + var stdout = runReporter({}, runner, options); - describe("when 'error' has neither message nor stack", function() { - var stdout; - - before(function() { - var test = createTest(); - var error = {}; - var runner = createMockRunner( - 'test end fail', - EVENT_TEST_END, - EVENT_TEST_FAIL, - null, - test, - error - ); - runner.on = runner.once = function(event, callback) { - if (event === EVENT_TEST_END) { - callback(); - } else if (event === EVENT_TEST_FAIL) { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); - - it('should write expected message only', function() { - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); - describe("on 'end' event", function() { - var stdout; - - before(function() { - var test = createTest(); - var runner = createMockRunner( - 'fail end pass', - EVENT_TEST_FAIL, - EVENT_RUN_END, - EVENT_TEST_PASS, - test + describe('if there is no error stack or error message', function() { + it('should write expected message only', function() { + var error = {}; + runner = createMockRunner( + 'test end fail', + 'test end', + 'fail', + null, + test, + error ); + runner.on = runner.once = function(event, callback) { + if (event === 'test end') { + callback(); + } else if (event === 'fail') { + callback(test, error); + } + }; runner.suite = ''; - runner.grepTotal = noop; - stdout = runReporter({}, runner, options); - }); + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); - it('should write total tests, passes, and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); + + describe('on end', function() { + it('should write total tests, passes and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); + runner.suite = ''; + runner.grepTotal = function() {}; + + var stdout = runReporter({}, runner, options); + + var totalTests = numberOfPasses + numberOfFails; + var expectedArray = [ + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); }); }); diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 26fce4a1c4..35555968a1 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -1,34 +1,25 @@ 'use strict'; -var EventEmitter = require('events').EventEmitter; var fs = require('fs'); -var os = require('os'); -var path = require('path'); var mkdirp = require('mkdirp'); -var rimraf = require('rimraf'); -var sinon = require('sinon'); +var path = require('path'); +var assert = require('assert'); var createStatsCollector = require('../../lib/stats-collector'); -var events = require('../../').Runner.constants; +var EventEmitter = require('events').EventEmitter; var reporters = require('../../').reporters; -var states = require('../../').Runnable.constants; - -var Base = reporters.Base; +var constants = require('../../lib/runnable').constants; +var STATE_FAILED = constants.STATE_FAILED; +var STATE_PASSED = constants.STATE_PASSED; var XUnit = reporters.XUnit; -var EVENT_RUN_END = events.EVENT_RUN_END; -var EVENT_TEST_END = events.EVENT_TEST_END; -var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; -var EVENT_TEST_PASS = events.EVENT_TEST_PASS; -var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; - -var STATE_FAILED = states.STATE_FAILED; -var STATE_PASSED = states.STATE_PASSED; - describe('XUnit reporter', function() { - var sandbox; + var stdout; + var stdoutWrite; + // the runner parameter of the reporter var runner; - var noop = function() {}; + var callbackArgument = null; + var expectedFailure = 'some-failures'; var expectedLine = 'some-line'; var expectedClassName = 'fullTitle'; var expectedTitle = 'some title'; @@ -36,286 +27,192 @@ describe('XUnit reporter', function() { var expectedDiff = '\n + expected - actual\n\n -foo\n +bar\n '; var expectedStack = 'some-stack'; + var expectedWrite = null; beforeEach(function() { - runner = {on: noop, once: noop}; + stdout = []; + runner = {on: function() {}, once: function() {}}; createStatsCollector(runner); }); - describe("when 'reporterOptions.output' is provided", function() { - var expectedOutput = path.join(path.sep, 'path', 'to', 'some-output'); + describe('if reporter options output is given', function() { + var expectedOutput = 'some-output'; var options = { reporterOptions: { output: expectedOutput } }; - - describe('when fileStream can be created', function() { - var mkdirpSync; - var fsCreateWriteStream; - - beforeEach(function() { - sandbox = sinon.createSandbox(); - mkdirpSync = sandbox.stub(mkdirp, 'sync'); - fsCreateWriteStream = sandbox.stub(fs, 'createWriteStream'); + describe('but it cant create a write stream', function() { + it('should throw expected error', function() { + var fsCreateWriteStream = fs.createWriteStream; + fs.createWriteStream = false; + + var boundXUnit = XUnit.bind({}, runner, options); + expect(boundXUnit, 'to throw', 'file output not supported in browser'); + fs.createWriteStream = fsCreateWriteStream; }); + }); + describe('and it can create a write stream', function() { + it('should locate the output dir, create it, then assign as fileStream', function() { + var expectedDirectory; + var mkdirpSync = mkdirp.sync; + var pathDirname = path.dirname; + var fsCreateWriteStream = fs.createWriteStream; + mkdirp.sync = function(directory) { + expectedDirectory = directory; + }; + path.dirname = function(location) { + return location; + }; + fs.createWriteStream = function(streamDetails) { + return streamDetails; + }; - it('should open given file for writing, recursively creating directories in pathname', function() { - var fakeThis = { + var contextVariables = { fileStream: null }; - XUnit.call(fakeThis, runner, options); + XUnit.call(contextVariables, runner, options); - var expectedDirectory = path.dirname(expectedOutput); - expect(mkdirpSync.calledWith(expectedDirectory), 'to be true'); - expect(fsCreateWriteStream.calledWith(expectedOutput), 'to be true'); - }); + expect(expectedDirectory, 'to be', expectedOutput); + expect(contextVariables.fileStream, 'to be', expectedOutput); - afterEach(function() { - sandbox.restore(); + fs.createWriteStream = fsCreateWriteStream; + mkdirp.sync = mkdirpSync; + path.dirname = pathDirname; }); }); + }); - describe('when fileStream cannot be created', function() { - describe('when given an invalid pathname', function() { - var tmpdir; - var invalidPath; - - beforeEach(function createInvalidPath() { - tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-test-')); + describe("on 'pending', 'pass' and 'fail' events", function() { + it("should add test to tests called on 'end' event", function() { + var pendingTest = { + name: 'pending', + slow: function() {} + }; + var failTest = { + name: 'fail', + slow: function() {} + }; + var passTest = { + name: 'pass', + slow: function() {} + }; + runner.on = runner.once = function(event, callback) { + if (event === 'pending') { + callback(pendingTest); + } + if (event === 'pass') { + callback(passTest); + } + if (event === 'fail') { + callback(failTest); + } + if (event === 'end') { + callback(); + } + }; - function touch(filename) { - fs.closeSync(fs.openSync(filename, 'w')); + var calledTests = []; + XUnit.call( + { + write: function() {}, + test: function(test) { + calledTests.push(test); } + }, + runner + ); - // Create path where file 'some-file' used as directory - invalidPath = path.join( - tmpdir, - 'some-file', - path.basename(expectedOutput) - ); - touch(path.dirname(invalidPath)); - }); - - it('should throw system error', function() { - var options = { - reporterOptions: { - output: invalidPath - } - }; - var boundXUnit = XUnit.bind({}, runner, options); - expect( - boundXUnit, - 'to throw', - expect.it('to be an', Error).and('to satisfy', { - syscall: 'mkdir', - code: 'EEXIST', - path: path.dirname(invalidPath) - }) - ); - }); - - afterEach(function() { - rimraf.sync(tmpdir); - }); - }); - - describe('when run in browser', function() { - beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(fs, 'createWriteStream').value(false); - }); - - it('should throw unsupported error', function() { - var boundXUnit = XUnit.bind({}, runner, options); - expect( - boundXUnit, - 'to throw', - 'file output not supported in browser' - ); - }); - - afterEach(function() { - sandbox.restore(); - }); - }); + var expectedCalledTests = [pendingTest, passTest, failTest]; + expect(calledTests, 'to equal', expectedCalledTests); }); }); - describe('event handlers', function() { - describe("on 'pending', 'pass' and 'fail' events", function() { - it("should add test to tests called on 'end' event", function() { - var pendingTest = { - name: 'pending', - slow: noop - }; - var failTest = { - name: 'fail', - slow: noop - }; - var passTest = { - name: 'pass', - slow: noop + describe('done', function() { + describe('if fileStream is truthy', function() { + it('should run callback with failure inside streams end', function() { + var xunit = new XUnit({on: function() {}, once: function() {}}); + var callback = function(failures) { + callbackArgument = failures; }; - runner.on = runner.once = function(event, callback) { - if (event === EVENT_TEST_PENDING) { - callback(pendingTest); - } else if (event === EVENT_TEST_PASS) { - callback(passTest); - } else if (event === EVENT_TEST_FAIL) { - callback(failTest); - } else if (event === EVENT_RUN_END) { + var calledEnd = false; + var fileStream = { + end: function(callback) { + calledEnd = true; callback(); } }; + xunit.done.call({fileStream: fileStream}, expectedFailure, callback); - var calledTests = []; - var fakeThis = { - write: noop, - test: function(test) { - calledTests.push(test); - } + expect(calledEnd, 'to be', true); + expect(callbackArgument, 'to be', expectedFailure); + }); + }); + describe('if fileStream is falsy', function() { + it('should run callback with failure', function() { + var xunit = new XUnit({on: function() {}, once: function() {}}); + var callback = function(failures) { + callbackArgument = failures; }; - XUnit.call(fakeThis, runner); + xunit.done.call({fileStream: false}, expectedFailure, callback); - var expectedCalledTests = [pendingTest, passTest, failTest]; - expect(calledTests, 'to equal', expectedCalledTests); + expect(callbackArgument, 'to be', expectedFailure); }); }); }); - describe('#done', function() { - var xunit; - var options = { - reporterOptions: {} - }; - var expectedNFailures = 13; - var callback; - - beforeEach(function() { - sandbox = sinon.createSandbox(); - callback = sandbox.spy(); - }); - - afterEach(function() { - callback = null; - xunit = null; - sandbox.restore(); - }); - - describe('when output directed to file', function() { - var fakeThis; - - beforeEach(function() { - xunit = new XUnit(runner, options); - - fakeThis = { - fileStream: { - end: sinon.stub().callsFake(function(chunk, encoding, cb) { - if (typeof arguments[0] === 'function') { - cb = arguments[0]; - } - cb(); - }), - write: function(chunk, encoding, cb) {} + describe('write', function() { + describe('if fileStream is truthy', function() { + it('should call fileStream write with line and new line', function() { + var xunit = new XUnit({on: function() {}, once: function() {}}); + var fileStream = { + write: function(write) { + expectedWrite = write; } }; - }); - - it("should run completion callback via 'fileStream.end'", function() { - xunit.done.call(fakeThis, expectedNFailures, callback); - - expect(fakeThis.fileStream.end.calledOnce, 'to be true'); - expect(callback.calledOnce, 'to be true'); - expect(callback.calledWith(expectedNFailures), 'to be true'); - }); - }); - - describe('when output directed to stdout (or console)', function() { - var fakeThis; + xunit.write.call({fileStream: fileStream}, expectedLine); - beforeEach(function() { - xunit = new XUnit(runner, options); - fakeThis = {}; - }); - - it('should run completion callback', function() { - xunit.done.call(fakeThis, expectedNFailures, callback); - - expect(callback.calledOnce, 'to be true'); - expect(callback.calledWith(expectedNFailures), 'to be true'); + expect(expectedWrite, 'to be', expectedLine + '\n'); }); }); - }); - - describe('#write', function() { - // :TODO: Method should be named 'writeln', not 'write' - describe('when output directed to file', function() { - var fileStream = { - write: sinon.spy() - }; + describe('if fileStream is falsy and stdout exists', function() { + it('should call write with line and new line', function() { + stdoutWrite = process.stdout.write; + process.stdout.write = function(string) { + stdout.push(string); + }; - it("should call 'fileStream.write' with line and newline", function() { - var xunit = new XUnit(runner); - var fakeThis = {fileStream: fileStream}; - xunit.write.call(fakeThis, expectedLine); + var xunit = new XUnit({on: function() {}, once: function() {}}); + xunit.write.call({fileStream: false}, expectedLine); - expect(fileStream.write.calledWith(expectedLine + '\n'), 'to be true'); - }); - }); + process.stdout.write = stdoutWrite; - describe('when output directed to stdout', function() { - it("should call 'process.stdout.write' with line and newline", function() { - var xunit = new XUnit(runner); - var fakeThis = {fileStream: false}; - var stdoutWriteStub = sinon.stub(process.stdout, 'write'); - xunit.write.call(fakeThis, expectedLine); - stdoutWriteStub.restore(); - - expect(stdoutWriteStub.calledWith(expectedLine + '\n'), 'to be true'); + expect(stdout[0], 'to be', expectedLine + '\n'); }); }); - - describe('when output directed to console', function() { - it("should call 'console.log' with line", function() { - // :TODO: XUnit needs a trivially testable means to force console.log() - var realProcess = process; + describe('if fileStream is falsy and stdout does not exist', function() { + it('should call write with line', function() { + stdoutWrite = process; process = false; // eslint-disable-line no-native-reassign, no-global-assign + var cachedConsoleLog = console.log; + console.log = function(string) { + stdout.push(string); + }; - var xunit = new XUnit(runner); - var fakeThis = {fileStream: false}; - var consoleLogStub = sinon.stub(console, 'log'); - xunit.write.call(fakeThis, expectedLine); - consoleLogStub.restore(); - - process = realProcess; // eslint-disable-line no-native-reassign, no-global-assign + var xunit = new XUnit({on: function() {}, once: function() {}}); + xunit.write.call({fileStream: false}, expectedLine); - expect(consoleLogStub.calledWith(expectedLine), 'to be true'); + console.log = cachedConsoleLog; + process = stdoutWrite; // eslint-disable-line no-native-reassign, no-global-assign + expect(stdout[0], 'to be', expectedLine); }); }); }); - describe('#test', function() { - var expectedWrite; - var fakeThis = { - write: function(str) { - expectedWrite = str; - } - }; - - beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); - }); - - afterEach(function() { - sandbox.restore(); - expectedWrite = null; - }); - + describe('test', function() { describe('on test failure', function() { it('should write expected tag with error details', function() { - var xunit = new XUnit(runner); + var xunit = new XUnit({on: function() {}, once: function() {}}); var expectedTest = { state: STATE_FAILED, title: expectedTitle, @@ -332,9 +229,14 @@ describe('XUnit reporter', function() { stack: expectedStack } }; - - xunit.test.call(fakeThis, expectedTest); - sandbox.restore(); + xunit.test.call( + { + write: function(string) { + expectedWrite = string; + } + }, + expectedTest + ); var expectedTag = ''; + expect(expectedWrite, 'to be', expectedTag); }); }); - describe('on test in any other state', function() { it('should write expected tag', function() { - var xunit = new XUnit(runner); + var xunit = new XUnit({on: function() {}, once: function() {}}); + var expectedTest = { isPending: function() { return false; @@ -396,9 +305,14 @@ describe('XUnit reporter', function() { }, duration: false }; - - xunit.test.call(fakeThis, expectedTest); - sandbox.restore(); + xunit.test.call( + { + write: function(string) { + expectedWrite = string; + } + }, + expectedTest + ); var expectedTag = ''; + expect(expectedWrite, 'to be', expectedTag); }); }); - it('should write expected summary statistics', function() { - var numTests = 0; - var numPass = 0; - var numFail = 0; + var count = 0; var simpleError = { actual: 'foo', expected: 'bar', @@ -421,14 +333,8 @@ describe('XUnit reporter', function() { stack: expectedStack }; var generateTest = function(passed) { - numTests++; - if (passed) { - numPass++; - } else { - numFail++; - } - return { - title: [expectedTitle, numTests].join(': '), + var t = { + title: expectedTitle + count, state: passed ? STATE_PASSED : STATE_FAILED, isPending: function() { return false; @@ -443,36 +349,26 @@ describe('XUnit reporter', function() { }, duration: 1000 }; + return t; }; var runner = new EventEmitter(); createStatsCollector(runner); var xunit = new XUnit(runner); expectedWrite = ''; - sandbox.stub(xunit, 'write').callsFake(function(str) { - expectedWrite += str; - }); + xunit.write = function(string) { + expectedWrite += string; + }; // 3 tests, no failures (i.e. tests that could not run), and 2 errors - runner.emit(EVENT_TEST_PASS, generateTest(true)); - runner.emit(EVENT_TEST_END); - runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); - runner.emit(EVENT_TEST_END); - runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); - runner.emit(EVENT_TEST_END); - runner.emit(EVENT_RUN_END); - - sandbox.restore(); - - var expectedNumPass = 1; - var expectedNumFail = 2; - var expectedNumTests = 3; - - expect(expectedNumPass, 'to be', numPass); - expect(expectedNumFail, 'to be', numFail); - expect(expectedNumTests, 'to be', numTests); + runner.emit('test end'); + runner.emit('pass', generateTest(true)); + runner.emit('test end'); + runner.emit('fail', generateTest(false), simpleError); + runner.emit('test end'); + runner.emit('fail', generateTest(false), simpleError); + runner.emit('end'); - // :NOTE: Mocha test "fail" is an XUnit "error" var expectedTag = '= 0, + 'it should contain the text "Mocha Tests"' + ); }); - it('should use default name otherwise', function() { - var defaultSuiteName = 'Mocha Tests'; + it('should use the custom suite name as the suite name when provided in the reporter options', function() { + // arrange var options = { - reporterOptions: {} + reporterOptions: { + // this time, with a custom suite name + suiteName: 'Mocha Is Great!' + } }; var xunit = new XUnit(runner, options); xunit.fileStream = fileStream; - // Trigger end event to force XUnit reporter to write its output - events[EVENT_RUN_END](); + // act (trigger the end event to force xunit reporter to write the output) + events['end'](); - expect(lines[0], 'to contain', defaultSuiteName); + // assert + assert( + lines[0].indexOf(' Date: Thu, 25 Apr 2019 20:03:38 +0100 Subject: [PATCH 1337/1771] Adds doc links for mocha-examples (#3889) * add links * link tidy --- docs/index.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0117320279..4c41381b05 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1116,7 +1116,7 @@ Require a module before loading the user interface or test files. This is useful - Test harnesses - Assertion libraries that augment built-ins or global scope (such as [should.js][npm-should.js]) - Instant ECMAScript modules via [esm][npm-esm] -- Compilers such as Babel via [@babel/register][npm-babel-register] or TypeScript via [ts-node][npm-ts-node] (using `--require ts-node/register`) +- Compilers such as Babel via [@babel/register][npm-babel-register] or TypeScript via [ts-node][npm-ts-node] (using `--require ts-node/register`). See [Babel][example-babel] or [TypeScript][example-typescript] working examples. Modules required in this manner are expected to do work synchronously; Mocha won't wait for async tasks in a required module to finish. @@ -1469,7 +1469,12 @@ By default, it will output to the console. To write directly to a file, use `--r ### Third-Party Reporters -Mocha allows you to define custom reporters. For more information see the [wiki][mocha-wiki-more-reporters]. An example is the [TeamCity reporter][mocha-teamcity-reporter]. +Mocha allows you to define custom reporters. For more information see the [wiki][mocha-wiki-more-reporters]. + +Examples: + +- the [TeamCity reporter][mocha-teamcity-reporter] +- our [working example][example-third-party-reporter] ### HTML Reporter @@ -1803,11 +1808,12 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl Real live example code: +- [Mocha examples][mocha-examples] - [Express][example-express-test] - [Connect][example-connect-test] - [SuperAgent][example-superagent-test] - [WebSocket.io][example-websocket.io-test] -- [Mocha][example-mocha-test] +- [Mocha tests][example-mocha-test] ## Testing Mocha @@ -1837,12 +1843,15 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [connect-test-output]: https://github.com/senchalabs/connect/blob/90a725343c2945aaee637e799b1cd11e065b2bff/tests.md [emacs]: https://www.gnu.org/software/emacs/ [emacs-mocha.el]: https://github.com/scottaj/mocha.el -[example-express-test]: https://github.com/visionmedia/express/tree/master/test +[example-babel]: https://github.com/mochajs/mocha-examples/tree/master/babel [example-connect-test]: https://github.com/senchalabs/connect/tree/master/test -[example-superagent-test]: https://github.com/visionmedia/superagent/tree/master/test/node -[example-websocket.io-test]: https://github.com/LearnBoost/websocket.io/tree/master/test +[example-express-test]: https://github.com/visionmedia/express/tree/master/test [example-mocha-test]: https://github.com/mochajs/mocha/tree/master/test [example-mocha-config]: https://github.com/mochajs/mocha/tree/master/example/config +[example-superagent-test]: https://github.com/visionmedia/superagent/tree/master/test/node +[example-third-party-reporter]: https://github.com/mochajs/mocha-examples/tree/master/third-party-reporter +[example-typescript]: https://github.com/mochajs/mocha-examples/tree/master/typescript +[example-websocket.io-test]: https://github.com/LearnBoost/websocket.io/tree/master/test [expect.js]: https://github.com/LearnBoost/expect.js [expresso]: https://github.com/tj/expresso [fish-globbing]: https://fishshell.com/docs/current/#expand-wildcard @@ -1860,6 +1869,7 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [mdn-promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise [mdn-regexp]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Regexp [mdn-settimeout-maxdelay]: https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value +[mocha-examples]: https://github.com/mochajs/mocha-examples [mocha-teamcity-reporter]: https://github.com/travisjeffery/mocha-teamcity-reporter [mocha-website]: https://mochajs.org/ [mocha-wiki]: https://github.com/mochajs/mocha/wiki From 109f05e48abbfe8c6bb3f975b653631b80fca599 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 29 Apr 2019 17:47:27 +0200 Subject: [PATCH 1338/1771] Fix parsing of config files with "_mocha" (#3894) --- lib/cli/cli.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index b51c2a1973..8e82983af4 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -32,6 +32,8 @@ exports.main = (argv = process.argv.slice(2)) => { Error.stackTraceLimit = Infinity; // configurable via --stack-trace-limit? + var args = loadOptions(argv); + yargs() .scriptName('mocha') .command(commands.run) @@ -60,7 +62,8 @@ exports.main = (argv = process.argv.slice(2)) => { ` ) .parserConfiguration(YARGS_PARSER_CONFIG) - .parse(argv, loadOptions(argv)); + .config(args) + .parse(args._); }; // allow direct execution From ef69b73941a54456e0551893ac2e686cd5ee47b6 Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Tue, 30 Apr 2019 14:22:22 -0500 Subject: [PATCH 1339/1771] Rework reporter tests (#3892) Reworked stubs to use "sinon" package. Added logic to (hopefully) rethrow errors when stdout stubbed. Tests now use event constants. Noise reduction. Various mods for consistency. Now green across the board. --- test/reporters/base.spec.js | 258 +++++---- test/reporters/doc.spec.js | 358 +++++++----- test/reporters/dot.spec.js | 319 +++++++---- test/reporters/helpers.js | 69 ++- test/reporters/json-stream.spec.js | 204 +++---- test/reporters/json.spec.js | 26 +- test/reporters/landing.spec.js | 142 +++-- test/reporters/list.spec.js | 318 +++++++---- test/reporters/markdown.spec.js | 177 +++--- test/reporters/min.spec.js | 66 +-- test/reporters/nyan.spec.js | 597 ++++++++++++-------- test/reporters/progress.spec.js | 168 +++--- test/reporters/spec.spec.js | 215 +++++--- test/reporters/tap.spec.js | 858 ++++++++++++++++------------- test/reporters/xunit.spec.js | 546 ++++++++++-------- 15 files changed, 2528 insertions(+), 1793 deletions(-) diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 40d1374537..739063f32a 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -1,124 +1,138 @@ 'use strict'; var assert = require('assert'); -var chaiExpect = require('chai').expect; -var Base = require('../../lib/reporters/base'); +var chai = require('chai'); +var sinon = require('sinon'); +var helpers = require('./helpers'); +var reporters = require('../../').reporters; + var AssertionError = assert.AssertionError; -var makeTest = require('./helpers').makeTest; -var createElements = require('./helpers').createElements; +var Base = reporters.Base; +var chaiExpect = chai.expect; +var createElements = helpers.createElements; +var makeTest = helpers.makeTest; describe('Base reporter', function() { + var sandbox; var stdout; - var stdoutWrite; - var useColors; - var err; - var errOut; - var test; function list(tests) { - Base.useColors = false; - var retval = Base.list(tests); - Base.useColors = useColors; - return retval; + try { + try { + Base.list(tests); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } } function generateDiff(actual, expected) { - Base.useColors = false; - var retval = Base.generateDiff(actual, expected); - Base.useColors = useColors; - return retval; + var diffStr; + + try { + try { + diffStr = Base.generateDiff(actual, expected); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + + return diffStr; } + var gather = function(chunk, encoding, cb) { + stdout.push(chunk); + }; + beforeEach(function() { - useColors = Base.useColors; + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(process.stdout, 'write').callsFake(gather); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - stdoutWrite.call(process.stdout, string, enc, callback); - }; }); afterEach(function() { - process.stdout.write = stdoutWrite; + sandbox.restore(); }); describe('showDiff', function() { + var err; + beforeEach(function() { err = new AssertionError({actual: 'foo', expected: 'bar'}); }); it('should show diffs by default', function() { - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it('should show diffs if property set to `true`', function() { + it("should show diffs if 'err.showDiff' is true", function() { err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /- actual/); expect(errOut, 'to match', /\+ expected/); }); - it('should not show diffs when showDiff property set to `false`', function() { + it("should not show diffs if 'err.showDiff' is false", function() { err.showDiff = false; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it('should not show diffs when expected is not defined', function() { - err = new Error('ouch'); - - test = makeTest(err); + it("should not show diffs if 'expected' is not defined", function() { + var _err = new Error('ouch'); + var test = makeTest(_err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); - it('should not show diffs when hideDiff is set', function() { - test = makeTest(err); + it("should not show diffs if 'hideDiff' is true", function() { + var test = makeTest(err); - Base.hideDiff = true; + sandbox.stub(Base, 'hideDiff').value(true); list([test]); - Base.hideDiff = false; // Revert to original value - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /- actual/); expect(errOut, 'not to match', /\+ expected/); }); }); - describe('Getting two strings', function() { + describe('getting two strings', function() { // Fix regression V1.2.1(see: issue #1241) it('should show strings diff as is', function() { - err = new Error('test'); - + var err = new Error('test'); err.actual = 'foo\nbar'; err.expected = 'foo\nbaz'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'not to match', /"foo\\nbar"/); expect(errOut, 'to match', /foo/).and('to match', /bar/); expect(errOut, 'to match', /test/); @@ -127,26 +141,19 @@ describe('Base reporter', function() { }); }); - describe('Diff generation', function() { - var oldInlineDiffs; - var actual; - var expected; - var output; + describe('diff generation', function() { + var inlineDiffsStub; beforeEach(function() { - oldInlineDiffs = Base.inlineDiffs; - }); - - afterEach(function() { - Base.inlineDiffs = oldInlineDiffs; + inlineDiffsStub = sandbox.stub(Base, 'inlineDiffs'); }); - it('should generate unified diffs if `inlineDiff === false`', function() { - actual = 'a foo unified diff'; - expected = 'a bar unified diff'; + it("should generate unified diffs if 'inlineDiffs' is false", function() { + var actual = 'a foo unified diff'; + var expected = 'a bar unified diff'; - Base.inlineDiffs = false; - output = generateDiff(actual, expected); + inlineDiffsStub.value(false); + var output = generateDiff(actual, expected); expect( output, @@ -155,12 +162,12 @@ describe('Base reporter', function() { ); }); - it('should generate inline diffs if `inlineDiffs === true`', function() { - actual = 'a foo inline diff'; - expected = 'a bar inline diff'; + it("should generate inline diffs if 'inlineDiffs' is true", function() { + var actual = 'a foo inline diff'; + var expected = 'a bar inline diff'; - Base.inlineDiffs = true; - output = generateDiff(actual, expected); + inlineDiffsStub.value(true); + var output = generateDiff(actual, expected); expect( output, @@ -170,39 +177,37 @@ describe('Base reporter', function() { }); }); - describe('Inline strings diff', function() { - it('should show single line diff if property set to `true`', function() { - err = new Error('test'); + describe('inline strings diff', function() { + beforeEach(function() { + sandbox.stub(Base, 'inlineDiffs').value(true); + }); + it("should show single line diff if 'inlineDiffs' is true", function() { + var err = new Error('test'); err.actual = 'a foo inline diff'; err.expected = 'a bar inline diff'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = true; list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'to match', /a foobar inline diff/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /actual/); expect(errOut, 'to match', /expected/); }); - it('should split lines when string has more than 4 line breaks', function() { - err = new Error('test'); - + it('should split lines if string has more than 4 line breaks', function() { + var err = new Error('test'); err.actual = 'a\nfoo\ninline\ndiff\nwith\nmultiple lines'; err.expected = 'a\nbar\ninline\ndiff\nwith\nmultiple lines'; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = true; list([test]); - errOut = stdout.join('\n'); - + var errOut = stdout.join('\n'); expect(errOut, 'to match', /1 \| a/); expect(errOut, 'to match', /2 \| foobar/); expect(errOut, 'to match', /3 \| inline/); @@ -215,21 +220,21 @@ describe('Base reporter', function() { }); }); - describe('unified diff reporter', function() { + describe('unified diff', function() { beforeEach(function() { - err = new Error('test'); + sandbox.stub(Base, 'inlineDiffs').value(false); }); it('should separate diff hunks by two dashes', function() { + var err = new Error('test'); err.actual = createElements({from: 2, to: 11}); err.expected = createElements({from: 1, to: 10}); err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); - Base.inlineDiffs = false; list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); var regexesToMatch = [ /\[/, @@ -257,16 +262,15 @@ describe('Base reporter', function() { }); it('should stringify objects', function() { - err = new Error('test'); - + var err = new Error('test'); err.actual = {key: 'a1'}; err.expected = {key: 'e1'}; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /"key"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -274,18 +278,18 @@ describe('Base reporter', function() { }); it('should stringify Object.create(null)', function() { - err = new Error('test'); + var err = new Error('test'); err.actual = Object.create(null); err.actual.hasOwnProperty = 1; err.expected = Object.create(null); err.expected.hasOwnProperty = 2; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /"hasOwnProperty"/); expect(errOut, 'to match', /test/); expect(errOut, 'to match', /- actual/); @@ -299,11 +303,11 @@ describe('Base reporter', function() { err.actual = false; err.expected = true; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /\+true/); expect(errOut, 'to match', /-false/); expect(errOut, 'to match', /- actual/); @@ -311,18 +315,21 @@ describe('Base reporter', function() { } }); - it('should interpret Chai custom error messages', function() { + it("should interpret 'chai' module custom error messages", function() { + var actual = 43; + var expected = 42; + try { - chaiExpect(43, 'custom error message').to.equal(42); + chaiExpect(actual, 'custom error message').to.equal(expected); } catch (err) { - err.actual = 43; - err.expected = 42; + err.actual = actual; + err.expected = expected; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/) .and('to match', /\+42/) .and('to match', /-43/) @@ -331,20 +338,23 @@ describe('Base reporter', function() { } }); - it('should interpret assert module custom error messages', function() { + it("should interpret 'assert' module custom error messages", function() { + var actual = 43; + var expected = 42; + try { - assert.strictEqual(43, 42, 'custom error message'); + assert.strictEqual(actual, expected, 'custom error message'); // AssertionError: custom error message: expected 43 to equal 42. // assert.equal(43, 42, 'custom error message: expected 43 to equal 42.'); } catch (err) { - err.actual = 43; - err.expected = 42; + err.actual = actual; + err.expected = expected; err.showDiff = true; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n'); + var errOut = stdout.join('\n'); expect(errOut, 'to match', /custom error message\n/); expect(errOut, 'to match', /\+42/); expect(errOut, 'to match', /-43/); @@ -354,53 +364,57 @@ describe('Base reporter', function() { }); it('should remove message from stack', function() { - err = { + var err = { message: 'Error', stack: 'Error\nfoo\nbar', showDiff: false }; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n').trim(); + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); - it('should use the inspect() property if `message` is not set', function() { - err = { + it("should use 'inspect' if 'message' is not set", function() { + var err = { showDiff: false, inspect: function() { return 'an error happened'; } }; - test = makeTest(err); + var test = makeTest(err); + list([test]); - errOut = stdout.join('\n').trim(); + + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n an error happened'); }); - it('should set an empty message if `message` and `inspect()` are not set', function() { - err = { + it("should set an empty message if neither 'message' nor 'inspect' is set", function() { + var err = { showDiff: false }; - test = makeTest(err); + var test = makeTest(err); + list([test]); - errOut = stdout.join('\n').trim(); + + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:'); }); it('should not modify stack if it does not contain message', function() { - err = { + var err = { message: 'Error', stack: 'foo\nbar', showDiff: false }; - test = makeTest(err); + var test = makeTest(err); list([test]); - errOut = stdout.join('\n').trim(); + var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); }); diff --git a/test/reporters/doc.spec.js b/test/reporters/doc.spec.js index 857922b83e..fb2703f83c 100644 --- a/test/reporters/doc.spec.js +++ b/test/reporters/doc.spec.js @@ -1,10 +1,17 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Doc = reporters.Doc; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers.js').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_SUITE_END = events.EVENT_SUITE_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('Doc reporter', function() { var runner; @@ -12,178 +19,223 @@ describe('Doc reporter', function() { var runReporter = makeRunReporter(Doc); afterEach(function() { - runner = undefined; + runner = null; }); - describe('on suite', function() { - describe('if suite root does not exist', function() { - var expectedTitle = 'expectedTitle'; - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var suite = { - root: false, - title: expectedTitle + describe('event handlers', function() { + describe("on 'suite' event", function() { + describe('when suite root does not exist', function() { + var expectedTitle = 'expectedTitle'; + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var suite = { + root: false, + title: expectedTitle + }; + + it('should log html with indents and expected title', function() { + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + + it('should escape title where necessary', function() { + var suite = { + root: false, + title: unescapedTitle + }; + expectedTitle = + '<div>' + expectedTitle + '</div>'; + + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              \n', + '

              ' + expectedTitle + '

              \n', + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when suite root exists', function() { + var suite = { + root: true + }; + + it('should not log any html', function() { + runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + expect(stdout, 'to be empty'); + }); + }); + }); + + describe("on 'suite end' event", function() { + describe('when suite root does not exist', function() { + var suite = { + root: false + }; + + it('should log expected html with indents', function() { + runner = createMockRunner( + 'suite end', + EVENT_SUITE_END, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + var expectedArray = ['
              \n', '
              \n']; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when suite root exists', function() { + var suite = { + root: true + }; + + it('should not log any html', function() { + runner = createMockRunner( + 'suite end', + EVENT_SUITE_END, + null, + null, + suite + ); + var stdout = runReporter(this, runner, options); + expect(stdout, 'to be empty'); + }); + }); + }); + + describe("on 'pass' event", function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } }; - it('should log html with indents and expected title', function() { - runner = createMockRunner('suite', 'suite', null, null, suite); + + it('should log html with indents, expected title, and body', function() { + runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' + '
              ' + expectedTitle + '
              \n', + '
              ' + expectedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); - it('should escape title where necessary', function() { - var suite = { - root: false, - title: unescapedTitle - }; - expectedTitle = '<div>' + expectedTitle + '</div>'; - runner = createMockRunner('suite', 'suite', null, null, suite); + + it('should escape title and body where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; + + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); var stdout = runReporter(this, runner, options); var expectedArray = [ - '
              \n', - '

              ' + expectedTitle + '

              \n', - '
              \n' + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' + expectedEscapedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); }); }); - describe('if suite root does exist', function() { - var suite = { - root: true - }; - it('should not log any html', function() { - runner = createMockRunner('suite', 'suite', null, null, suite); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - describe('on suite end', function() { - describe('if suite root does not exist', function() { - var suite = { - root: false + describe("on 'fail' event", function() { + var expectedTitle = 'some tite'; + var expectedBody = 'some body'; + var expectedError = 'some error'; + var test = { + title: expectedTitle, + body: expectedBody, + slow: function() { + return ''; + } }; - it('should log expected html with indents', function() { - runner = createMockRunner('suite end', 'suite end', null, null, suite); + + it('should log html with indents, expected title, body, and error', function() { + runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + test, + expectedError + ); var stdout = runReporter(this, runner, options); - var expectedArray = ['
              \n', '
              \n']; + var expectedArray = [ + '
              ' + expectedTitle + '
              \n', + '
              ' +
              +            expectedBody +
              +            '
              \n', + '
              ' + expectedError + '
              \n' + ]; expect(stdout, 'to equal', expectedArray); }); - }); - describe('if suite root does exist', function() { - var suite = { - root: true - }; - it('should not log any html', function() { - runner = createMockRunner('suite end', 'suite end', null, null, suite); - var stdout = runReporter(this, runner, options); - expect(stdout, 'to be empty'); - }); - }); - }); - describe('on pass', function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } - }; - it('should log html with indents and expected title and body', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' + expectedBody + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - it('should escape title and body where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' + expectedEscapedBody + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); + it('should escape title, body, and error where necessary', function() { + var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedBody = '
              ' + expectedBody + '
              '; + var unescapedError = '
              ' + expectedError + '
              '; + test.title = unescapedTitle; + test.body = unescapedBody; - describe('on fail', function() { - var expectedTitle = 'some tite'; - var expectedBody = 'some body'; - var expectedError = 'some error'; - var test = { - title: expectedTitle, - body: expectedBody, - slow: function() { - return ''; - } - }; - it('should log html with indents and expected title, body and error', function() { - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - test, - expectedError - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedTitle + '
              \n', - '
              ' +
              -          expectedBody +
              -          '
              \n', - '
              ' + expectedError + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - it('should escape title, body and error where necessary', function() { - var unescapedTitle = '
              ' + expectedTitle + '
              '; - var unescapedBody = '
              ' + expectedBody + '
              '; - var unescapedError = '
              ' + expectedError + '
              '; - test.title = unescapedTitle; - test.body = unescapedBody; - - var expectedEscapedTitle = - '<div>' + expectedTitle + '</div>'; - var expectedEscapedBody = - '<div>' + expectedBody + '</div>'; - var expectedEscapedError = - '<div>' + expectedError + '</div>'; - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - test, - unescapedError - ); - var stdout = runReporter(this, runner, options); - var expectedArray = [ - '
              ' + expectedEscapedTitle + '
              \n', - '
              ' +
              -          expectedEscapedBody +
              -          '
              \n', - '
              ' + expectedEscapedError + '
              \n' - ]; - expect(stdout, 'to equal', expectedArray); + var expectedEscapedTitle = + '<div>' + expectedTitle + '</div>'; + var expectedEscapedBody = + '<div>' + expectedBody + '</div>'; + var expectedEscapedError = + '<div>' + expectedError + '</div>'; + runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + test, + unescapedError + ); + var stdout = runReporter(this, runner, options); + var expectedArray = [ + '
              ' + expectedEscapedTitle + '
              \n', + '
              ' +
              +            expectedEscapedBody +
              +            '
              \n', + '
              ' + expectedEscapedError + '
              \n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); }); diff --git a/test/reporters/dot.spec.js b/test/reporters/dot.spec.js index 472ec63d01..4a23c7951e 100644 --- a/test/reporters/dot.spec.js +++ b/test/reporters/dot.spec.js @@ -1,155 +1,238 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Dot = reporters.Dot; + var Base = reporters.Base; +var Dot = reporters.Dot; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers.js').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Dot reporter', function() { - var runner; - var useColors; - var windowWidth; - var color; - var options = {}; + var sandbox; + var windowWidthStub; var runReporter = makeRunReporter(Dot); + var noop = function() {}; beforeEach(function() { - useColors = Base.useColors; - windowWidth = Base.window.width; - color = Base.color; - Base.useColors = false; - Base.window.width = 0; - Base.color = function(type, str) { + sandbox = sinon.createSandbox(); + windowWidthStub = sandbox.stub(Base.window, 'width').value(0); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base, 'color').callsFake(function(type, str) { return type.replace(/ /g, '-') + '_' + str; - }; + }); }); afterEach(function() { - Base.useColors = useColors; - Base.window.width = windowWidth; - Base.color = color; - runner = undefined; + sandbox.restore(); }); - describe('on start', function() { - it('should write a newline', function() { - runner = createMockRunner('start', 'start'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('on pending', function() { - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; - }); - it('should write a newline followed by a comma', function() { - runner = createMockRunner('pending', 'pending'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('if window width is equal to or less than 1', function() { - it('should write a comma', function() { - runner = createMockRunner('pending', 'pending'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['pending_' + Base.symbols.comma]; + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write a newline', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n']; expect(stdout, 'to equal', expectedArray); }); }); - }); - describe('on pass', function() { - var test = { - duration: 1, - slow: function() { - return 2; - } - }; - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; - }); - describe('if test speed is fast', function() { - it('should write a newline followed by a dot', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; + + describe("on 'pending' event", function() { + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + it('should write a newline followed by a comma', function() { + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); }); }); - }); - describe('if window width is equal to or less than 1', function() { - describe('if test speed is fast', function() { - it('should write a grey dot', function() { - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'fast'); - var expectedArray = ['fast_' + Base.symbols.dot]; + + describe('when window width is less than or equal to 1', function() { + it('should write a comma', function() { + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); }); }); - describe('if test speed is medium', function() { - it('should write a yellow dot', function() { - test.duration = 2; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'medium'); - var expectedArray = ['medium_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); + }); + + describe("on 'pass' event", function() { + var test = { + duration: 1, + slow: function() { + return 2; + } + }; + + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + describe('when test speed is fast', function() { + it('should write a newline followed by a dot', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if test speed is slow', function() { - it('should write a bright yellow dot', function() { - test.duration = 3; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(test.speed, 'to equal', 'slow'); - var expectedArray = ['bright-yellow_' + Base.symbols.dot]; - expect(stdout, 'to equal', expectedArray); + + describe('when window width is less than or equal to 1', function() { + describe('when test speed is fast', function() { + it('should write a grey dot', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'fast'); + var expectedArray = ['fast_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when test speed is medium', function() { + it('should write a yellow dot', function() { + test.duration = 2; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'medium'); + var expectedArray = ['medium_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe('when test speed is slow', function() { + it('should write a bright yellow dot', function() { + test.duration = 3; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + expect(test.speed, 'to equal', 'slow'); + var expectedArray = ['bright-yellow_' + Base.symbols.dot]; + expect(stdout, 'to equal', expectedArray); + }); }); }); }); - }); - describe('on fail', function() { - var test = { - test: { - err: 'some error' - } - }; - describe('if window width is greater than 1', function() { - beforeEach(function() { - Base.window.width = 2; + + describe("on 'fail' event", function() { + var test = { + test: { + err: 'some error' + } + }; + + describe('when window width is greater than 1', function() { + beforeEach(function() { + windowWidthStub.value(2); + }); + + it('should write a newline followed by an exclamation mark', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); + }); }); - it('should write a newline followed by an exclamation mark', function() { - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; - expect(stdout, 'to equal', expectedArray); + + describe('when window width is less than or equal to 1', function() { + it('should write an exclamation mark', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = ['fail_' + Base.symbols.bang]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if window width is equal to or less than 1', function() { - it('should write an exclamation mark', function() { - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = ['fail_' + Base.symbols.bang]; - expect(stdout, 'to equal', expectedArray); + + describe("on 'end' event", function() { + it('should call epilogue', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var fakeThis = { + epilogue: sinon.stub() + }; + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(fakeThis.epilogue.called, 'to be true'); }); }); }); - describe('on end', function() { - it('should call the epilogue', function() { - runner = createMockRunner('end', 'end'); - var epilogueCalled = false; - var epilogue = function() { - epilogueCalled = true; - }; - runReporter({epilogue: epilogue}, runner, options); - expect(epilogueCalled, 'to be', true); - }); - }); }); diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 5cb21a53f2..76b3d79307 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -1,17 +1,22 @@ 'use strict'; +var sinon = require('sinon'); var errors = require('../../lib/errors'); -var createUnsupportedError = errors.createUnsupportedError; -/* - This function prevents the constant use of creating a runnerEvent. - runStr is the argument that defines the runnerEvent. - ifStr1 is one possible reporter argument, as is ifStr2, and ifStr3 - arg1 and arg2 are the possible variables that need to be put into the - scope of this function for the tests to run properly. -*/ - var createStatsCollector = require('../../lib/stats-collector'); +var createUnsupportedError = errors.createUnsupportedError; + +/** + * Creates a mock runner object. + * + * @param {string} runStr - argument that defines the runnerEvent + * @param {string} ifStr1 - runner event + * @param {(string|null)} [ifStr2] - runner event + * @param {(string|null)} [ifStr3] - runner event + * @param {(*|null)} [arg1] - variable to be added to event handler's scope + * @param {(*|null)} [arg2] - variable to be added to event handler's scope + * @return {Object} mock runner instance + */ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var runnerFunction = createRunnerFunction( runStr, @@ -29,6 +34,20 @@ function createMockRunner(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { return mockRunner; } +/** + * Creates an event handler function to be used by the runner. + * + * @description + * Arguments 'ifStr1', 'ifStr2', and 'ifStr3' should be `Runner.constants`. + * + * @param {string} runStr - argument that defines the runnerEvent + * @param {string} ifStr1 - runner event + * @param {(string|null)} [ifStr2] - runner event + * @param {(string|null)} [ifStr3] - runner event + * @param {(*|null)} [arg1] - variable to be added to event handler's scope + * @param {(*|null)} [arg2] - variable to be added to event handler's scope + * @return {Function} event handler for the requested runner events + */ function createRunnerFunction(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { var test = null; switch (runStr) { @@ -178,23 +197,35 @@ function createRunReporterFunction(ctor) { * @return {string[]} Lines of output written to `stdout` */ var runReporter = function(stubSelf, runner, options, tee) { + var origStdoutWrite = process.stdout.write; + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); var stdout = []; - // Reassign stream in order to make a copy of all reporter output - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); + var gather = function(chunk, enc, callback) { + stdout.push(chunk); if (tee) { - stdoutWrite.call(process.stdout, string, enc, callback); + origStdoutWrite.call(process.stdout, chunk); } }; - // Invoke reporter - ctor.call(stubSelf, runner, options); + // Reassign stream in order to make a copy of all reporter output + stdoutWriteStub.callsFake(gather); + + // Give `stubSelf` access to `ctor` prototype chain + Object.setPrototypeOf(stubSelf, ctor.prototype); - // Revert stream reassignment here so reporter output - // can't be corrupted if any test assertions throw - process.stdout.write = stdoutWrite; + try { + try { + // Invoke reporter + ctor.call(stubSelf, runner, options); + } finally { + // Revert stream reassignment here so reporter output + // can't be corrupted if any test assertions throw + stdoutWriteStub.restore(); + } + } catch (err) { + throw err; // Rethrow + } return stdout; }; diff --git a/test/reporters/json-stream.spec.js b/test/reporters/json-stream.spec.js index 8c9fcfff35..de83f861b2 100644 --- a/test/reporters/json-stream.spec.js +++ b/test/reporters/json-stream.spec.js @@ -1,15 +1,22 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; +var utils = require('../../lib/utils'); + var JSONStream = reporters.JSONStream; +var createMockRunner = helpers.createMockRunner; +var dQuote = utils.dQuote; +var makeExpectedTest = helpers.makeExpectedTest; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeExpectedTest = require('./helpers').makeExpectedTest; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('JSON Stream reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(JSONStream); var expectedTitle = 'some title'; var expectedFullTitle = 'full title'; @@ -27,119 +34,126 @@ describe('JSON Stream reporter', function() { message: expectedErrorMessage }; - afterEach(function() { - runner = undefined; - }); - - describe('on start', function() { - it('should write stringified start with expected total', function() { - runner = createMockRunner('start', 'start'); - var expectedTotal = 12; - runner.total = expectedTotal; - var stdout = runReporter({}, runner, options); - - expect( - stdout[0], - 'to equal', - '["start",{"total":' + expectedTotal + '}]\n' - ); - }); - }); - - describe('on pass', function() { - it('should write stringified test data', function() { - runner = createMockRunner('pass', 'pass', null, null, expectedTest); - var stdout = runReporter({}, runner, options); - - expect( - stdout[0], - 'to equal', - '["pass",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - '}]\n' - ); - }); - }); - - describe('on fail', function() { - describe('if error stack exists', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = expectedErrorStack; - runner = createMockRunner( - 'fail two args', - 'fail', - null, - null, - expectedTest, - expectedError - ); - + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write stringified start with expected total', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var expectedTotal = 12; + runner.total = expectedTotal; + var options = {}; var stdout = runReporter({}, runner, options); expect( stdout[0], 'to equal', - '["fail",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + - expectedDuration + - ',"currentRetry":' + - currentRetry + - ',"err":"' + - expectedErrorMessage + - '","stack":"' + - expectedErrorStack + - '"}]\n' + '["start",{"total":' + expectedTotal + '}]\n' ); }); }); - describe('if error stack does not exist', function() { - it('should write stringified test data with error data', function() { - expectedError.stack = null; - runner = createMockRunner( - 'fail two args', - 'fail', + describe("on 'pass' event", function() { + it('should write stringified test data', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, null, null, - expectedTest, - expectedError + expectedTest ); - - var stdout = runReporter(this, runner, options); + var options = {}; + var stdout = runReporter({}, runner, options); expect( stdout[0], 'to equal', - '["fail",{"title":"' + - expectedTitle + - '","fullTitle":"' + - expectedFullTitle + - '","duration":' + + '["pass",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + expectedDuration + ',"currentRetry":' + currentRetry + - ',"err":"' + - expectedErrorMessage + - '","stack":null}]\n' + '}]\n' ); }); }); - }); - describe('on end', function() { - it('should write end details', function() { - runner = createMockRunner('end', 'end'); - var stdout = runReporter(this, runner, options); - expect(stdout[0], 'to match', /end/); + describe("on 'fail' event", function() { + describe('when error stack exists', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = expectedErrorStack; + var runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + expectedTest, + expectedError + ); + var options = {}; + var stdout = runReporter({}, runner, options); + + expect( + stdout[0], + 'to equal', + '["fail",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + ',"err":' + + dQuote(expectedErrorMessage) + + ',"stack":' + + dQuote(expectedErrorStack) + + '}]\n' + ); + }); + }); + + describe('when error stack does not exist', function() { + it('should write stringified test data with error data', function() { + expectedError.stack = null; + var runner = createMockRunner( + 'fail two args', + EVENT_TEST_FAIL, + null, + null, + expectedTest, + expectedError + ); + var options = {}; + var stdout = runReporter(this, runner, options); + + expect( + stdout[0], + 'to equal', + '["fail",{"title":' + + dQuote(expectedTitle) + + ',"fullTitle":' + + dQuote(expectedFullTitle) + + ',"duration":' + + expectedDuration + + ',"currentRetry":' + + currentRetry + + ',"err":' + + dQuote(expectedErrorMessage) + + ',"stack":null}]\n' + ); + }); + }); + }); + + describe("on 'end' event", function() { + it('should write summary statistics', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var stdout = runReporter(this, runner, options); + expect(stdout[0], 'to match', /end/); + }); }); }); }); diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index 5d7a37c564..f6299dd134 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -7,8 +7,11 @@ var Runner = Mocha.Runner; var Test = Mocha.Test; describe('JSON reporter', function() { - var suite, runner; + var sandbox; + var suite; + var runner; var testTitle = 'json test 1'; + var noop = function() {}; beforeEach(function() { var mocha = new Mocha({ @@ -16,8 +19,18 @@ describe('JSON reporter', function() { }); suite = new Suite('JSON suite', 'root'); runner = new Runner(suite); + var options = {}; /* eslint no-unused-vars: off */ - var mochaReporter = new mocha._reporter(runner); + var mochaReporter = new mocha._reporter(runner, options); + }); + + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(process.stdout, 'write').callsFake(noop); + }); + + afterEach(function() { + sandbox.restore(); }); it('should have 1 test failure', function(done) { @@ -29,9 +42,8 @@ describe('JSON reporter', function() { }) ); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ @@ -52,9 +64,8 @@ describe('JSON reporter', function() { it('should have 1 test pending', function(done) { suite.addTest(new Test(testTitle)); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { pending: [ @@ -83,9 +94,8 @@ describe('JSON reporter', function() { }) ); - var stdoutWrite = sinon.stub(process.stdout, 'write'); runner.run(function(failureCount) { - stdoutWrite.restore(); + sandbox.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index dd73d9e5b3..acb2ee3ef6 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -1,20 +1,25 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); -var Mocha = require('../..'); -var reporters = Mocha.reporters; -var Landing = reporters.Landing; -var constants = Mocha.Runnable.constants; -var STATE_FAILED = constants.STATE_FAILED; -var STATE_PASSED = constants.STATE_PASSED; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); +var reporters = require('../../').reporters; +var states = require('../../').Runnable.constants; + var Base = reporters.Base; +var Landing = reporters.Landing; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; + +var STATE_FAILED = states.STATE_FAILED; +var STATE_PASSED = states.STATE_PASSED; describe('Landing reporter', function() { - var runner; - var options = {}; + var sandbox; var runReporter = makeRunReporter(Landing); var resetCode = '\u001b[0m'; var expectedArray = [ @@ -29,73 +34,98 @@ describe('Landing reporter', function() { ]; beforeEach(function() { + sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); sandbox.stub(Base.window, 'width').value(1); }); afterEach(function() { sandbox.restore(); - runner = undefined; }); - describe('on start', function() { - it('should write new lines', function() { - sandbox.stub(Base.cursor, 'hide'); - - runner = createMockRunner('start', 'start'); - var stdout = runReporter({}, runner, options); + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should write newlines', function() { + sandbox.stub(Base.cursor, 'hide'); - expect(stdout[0], 'to equal', '\n\n\n '); - }); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); - it('should call cursor hide', function() { - sandbox.stub(Base.cursor, 'hide'); + expect(stdout[0], 'to equal', '\n\n\n '); + }); - runner = createMockRunner('start', 'start'); - runReporter({}, runner, options); + it('should call cursor hide', function() { + var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); - expect(Base.cursor.hide, 'was called'); - }); - }); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter({}, runner, options); + sandbox.restore(); - describe('on test end', function() { - describe('if test has failed', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_FAILED - }; - runner = createMockRunner('test end', 'test end', null, null, test); - runner.total = 12; - var stdout = runReporter({}, runner, options); - - expect(stdout, 'to equal', expectedArray); + expect(hideCursorStub.called, 'to be true'); }); }); - describe('if test has not failed', function() { - it('should write expected landing strip', function() { - var test = { - state: STATE_PASSED - }; - runner = createMockRunner('test end', 'test end', null, null, test); - var stdout = runReporter({}, runner, options); + describe("on 'test end' event", function() { + describe('when test passes', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_PASSED + }; + var runner = createMockRunner( + 'test end', + EVENT_TEST_END, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', expectedArray); + }); + }); - expect(stdout, 'to equal', expectedArray); + describe('when test fails', function() { + it('should write expected landing strip', function() { + var test = { + state: STATE_FAILED + }; + var runner = createMockRunner( + 'test end', + EVENT_TEST_END, + null, + null, + test + ); + runner.total = 12; + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', expectedArray); + }); }); }); - }); - describe('on end', function() { - it('should call cursor show and epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(Base.cursor, 'show'); - sandbox.stub(reporterStub, 'epilogue'); - runner = createMockRunner('end', 'end'); + describe("on 'end' event", function() { + it('should call cursor show and epilogue', function() { + var showCursorStub = sandbox.stub(Base.cursor, 'show'); - runReporter(reporterStub, runner, options); + var fakeThis = { + epilogue: sinon.spy() + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(reporterStub.epilogue, 'was called'); - expect(Base.cursor.show, 'was called'); + expect(fakeThis.epilogue.calledOnce, 'to be true'); + expect(showCursorStub.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index c9eceb87fe..c10272e953 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -1,144 +1,246 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var List = reporters.List; + var Base = reporters.Base; +var List = reporters.List; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_BEGIN = events.EVENT_TEST_BEGIN; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('List reporter', function() { - var runner; - var options = {}; + var sandbox; var runReporter = makeRunReporter(List); var expectedTitle = 'some title'; var expectedDuration = 100; + var noop = function() {}; var test = { fullTitle: function() { return expectedTitle; }, duration: expectedDuration, - slow: function() {} + slow: noop }; beforeEach(function() { + sandbox = sinon.createSandbox(); sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { sandbox.restore(); - runner = undefined; }); - describe('on start and test', function() { - it('should write expected new line and title to the console', function() { - runner = createMockRunner('start test', 'start', 'test', null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - var startString = '\n'; - var testString = ' ' + expectedTitle + ': '; - var expectedArray = [startString, testString]; - expect(stdout, 'to equal', expectedArray); + describe('event handlers', function() { + describe("on 'start' and 'test' events", function() { + it('should write expected newline and title', function() { + var runner = createMockRunner( + 'start test', + EVENT_RUN_BEGIN, + EVENT_TEST_BEGIN, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + var startString = '\n'; + var testString = ' ' + expectedTitle + ': '; + var expectedArray = [startString, testString]; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on pending', function() { - it('should write expected title to the console', function() { - runner = createMockRunner('pending test', 'pending', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); + describe("on 'pending' event", function() { + it('should write expected title', function() { + var runner = createMockRunner( + 'pending test', + EVENT_TEST_PENDING, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); + }); }); - }); - describe('on pass', function() { - it('should call cursor CR', function() { - sandbox.stub(Base.cursor, 'CR'); - runner = createMockRunner('pass', 'pass', null, null, test); - runReporter({epilogue: function() {}}, runner, options); - - expect(Base.cursor.CR, 'was called'); - }); - it('should write expected symbol, title and duration to the console', function() { - var expectedOkSymbol = 'OK'; - sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); - sandbox.stub(Base.cursor, 'CR'); - - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - expect( - stdout[0], - 'to be', - ' ' + - expectedOkSymbol + - ' ' + - expectedTitle + - ': ' + - expectedDuration + - 'ms\n' - ); + describe("on 'pass' event", function() { + var crStub; + + beforeEach(function() { + crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + }); + + it('should call cursor CR', function() { + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(crStub.called, 'to be true'); + }); + + it('should write expected symbol, title, and duration', function() { + var expectedOkSymbol = 'OK'; + sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); + + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect( + stdout[0], + 'to be', + ' ' + + expectedOkSymbol + + ' ' + + expectedTitle + + ': ' + + expectedDuration + + 'ms\n' + ); + }); }); - }); - describe('on fail', function() { - it('should call cursor CR', function() { - sandbox.stub(Base.cursor, 'CR'); - - runner = createMockRunner('fail', 'fail', null, null, test); - runReporter({epilogue: function() {}}, runner, options); - expect(Base.cursor.CR, 'was called'); - }); - it('should write expected error number and title', function() { - sandbox.stub(Base.cursor, 'CR'); - - var expectedErrorCount = 1; - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - expect( - stdout[0], - 'to be', - ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' - ); - }); - it('should immediately construct fail strings', function() { - var actual = {a: 'actual'}; - var expected = {a: 'expected'}; - var checked = false; - var err; - test = {}; - runner = createMockRunner('fail', 'fail', null, null, test); - runner.on = runner.once = function(event, callback) { - if ( - !checked && - event === 'fail' && - callback.toString().includes('stringifyDiffObjs') // target correct fail event callback - ) { - err = new Error('fake failure object with actual/expected'); - err.actual = actual; - err.expected = expected; - err.showDiff = true; - callback(test, err); - checked = true; - } - }; - runReporter({epilogue: function() {}}, runner, options); - - expect(typeof err.actual, 'to be', 'string'); - expect(typeof err.expected, 'to be', 'string'); + describe("on 'fail' event", function() { + var crStub; + + beforeEach(function() { + crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + }); + + it('should call cursor CR', function() { + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(crStub.called, 'to be true'); + }); + + it('should write expected error number and title', function() { + var expectedErrorCount = 1; + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect( + stdout[0], + 'to be', + ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' + ); + }); + + it('should immediately construct fail strings', function() { + var actual = {a: 'actual'}; + var expected = {a: 'expected'}; + var checked = false; + var err; + test = {}; + + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + runner.on = runner.once = function(event, callback) { + if ( + !checked && + event === 'fail' && + callback.toString().includes('stringifyDiffObjs') // target correct fail event callback + ) { + err = new Error('fake failure object with actual/expected'); + err.actual = actual; + err.expected = expected; + err.showDiff = true; + callback(test, err); + checked = true; + } + }; + var options = {}; + var fakeThis = { + epilogue: noop + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(typeof err.actual, 'to be', 'string'); + expect(typeof err.expected, 'to be', 'string'); + }); }); - }); - - describe('on end', function() { - it('should call epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, options); - expect(reporterStub.epilogue, 'was called'); + describe("on 'end' event", function() { + it('should call epilogue', function() { + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var fakeThis = { + epilogue: sinon.spy() + }; + runReporter(fakeThis, runner, options); + sandbox.restore(); + + expect(fakeThis.epilogue.calledOnce, 'to be true'); + }); }); }); }); diff --git a/test/reporters/markdown.spec.js b/test/reporters/markdown.spec.js index 842d7c7643..e068c58cea 100644 --- a/test/reporters/markdown.spec.js +++ b/test/reporters/markdown.spec.js @@ -1,102 +1,115 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Markdown = reporters.Markdown; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_SUITE_END = events.EVENT_SUITE_END; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; describe('Markdown reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Markdown); var expectedTitle = 'expected title'; var expectedFullTitle = 'full title'; var sluggedFullTitle = 'full-title'; + var noop = function() {}; - afterEach(function() { - runner = undefined; - }); - - describe("on 'suite'", function() { - it("should write expected slugged titles on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [ - { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - } - ] - }; - runner = createMockRunner( - 'suite suite end', - 'suite', - 'suite end', - 'end', - expectedSuite - ); - runner.suite = expectedSuite; - var stdout = runReporter({}, runner, options); + describe('event handlers', function() { + describe("on 'suite' event", function() { + it("should write expected slugged titles on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [ + { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + } + ] + }; + var runner = createMockRunner( + 'suite suite end', + EVENT_SUITE_BEGIN, + EVENT_SUITE_END, + EVENT_RUN_END, + expectedSuite + ); + runner.suite = expectedSuite; + var options = {}; + var stdout = runReporter({}, runner, options); - var expectedArray = [ - '# TOC\n', - ' - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n - [' + - expectedTitle + - '](#' + - sluggedFullTitle + - ')\n', - '\n ' + expectedTitle + '\n' - ]; + var expectedArray = [ + '# TOC\n', + ' - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n - [' + + expectedTitle + + '](#' + + sluggedFullTitle + + ')\n', + '\n ' + expectedTitle + '\n' + ]; - expect(stdout, 'to equal', expectedArray); + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe("on 'pass'", function() { - it("should write test code inside js code block, on 'end' event", function() { - var expectedSuite = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - suites: [] - }; - var expectedDuration = 1000; - var currentRetry = 1; - var expectedBody = 'some body'; - var expectedTest = { - title: expectedTitle, - fullTitle: function() { - return expectedFullTitle; - }, - duration: expectedDuration, - currentRetry: function() { - return currentRetry; - }, - slow: function() {}, - body: expectedBody - }; - runner = createMockRunner('pass end', 'pass', 'end', null, expectedTest); - runner.suite = expectedSuite; - var stdout = runReporter({}, runner, options); - var expectedArray = [ - '# TOC\n', - ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', - expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' - ]; + describe("on 'pass' event", function() { + it("should write test code inside js code block, on 'end' event", function() { + var expectedSuite = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + suites: [] + }; + var expectedDuration = 1000; + var currentRetry = 1; + var expectedBody = 'some body'; + var expectedTest = { + title: expectedTitle, + fullTitle: function() { + return expectedFullTitle; + }, + duration: expectedDuration, + currentRetry: function() { + return currentRetry; + }, + slow: noop, + body: expectedBody + }; + var runner = createMockRunner( + 'pass end', + EVENT_TEST_PASS, + EVENT_RUN_END, + null, + expectedTest + ); + runner.suite = expectedSuite; + var options = {}; + var stdout = runReporter({}, runner, options); + + var expectedArray = [ + '# TOC\n', + ' - [' + expectedTitle + '](#' + sluggedFullTitle + ')\n', + expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' + ]; - expect(stdout, 'to equal', expectedArray); + expect(stdout, 'to equal', expectedArray); + }); }); }); }); diff --git a/test/reporters/min.spec.js b/test/reporters/min.spec.js index f88adf31d7..1fe46333cf 100644 --- a/test/reporters/min.spec.js +++ b/test/reporters/min.spec.js @@ -1,45 +1,47 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var Min = reporters.Min; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; describe('Min reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Min); - - afterEach(function() { - runner = undefined; - }); - - describe('on start', function() { - it('should clear screen then set cursor position', function() { - runner = createMockRunner('start', 'start'); - var stdout = runReporter({epilogue: function() {}}, runner, options); - - var expectedArray = ['\u001b[2J', '\u001b[1;3H']; - expect(stdout, 'to equal', expectedArray); + var noop = function() {}; + + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should clear screen then set cursor position', function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + var fakeThis = { + epilogue: noop + }; + var stdout = runReporter(fakeThis, runner, options); + + var expectedArray = ['\u001b[2J', '\u001b[1;3H']; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on end', function() { - it('should call epilogue', function() { - var calledEpilogue = false; - runner = createMockRunner('end', 'end'); - runReporter( - { - epilogue: function() { - calledEpilogue = true; - } - }, - runner, - options - ); - - expect(calledEpilogue, 'to be', true); + describe("on 'end' event", function() { + it('should call epilogue', function() { + var fakeThis = { + epilogue: sinon.stub().callsFake(noop) + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + + expect(fakeThis.epilogue.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index b1ad3a22a3..05d2e1bf77 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -1,172 +1,205 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var NyanCat = reporters.Nyan; + var Base = reporters.Base; +var NyanCat = reporters.Nyan; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Nyan reporter', function() { - describe('events', function() { - var runner; - var options = {}; - var runReporter = makeRunReporter(NyanCat); + var sandbox; + var noop = function() {}; - afterEach(function() { - sandbox.restore(); - runner = undefined; - }); + beforeEach(function() { + sandbox = sinon.createSandbox(); + }); - describe('on start', function() { + afterEach(function() { + sandbox.restore(); + }); + + describe('event handlers', function() { + var runReporter = makeRunReporter(NyanCat); + + describe("on 'start' event", function() { it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'draw'); - runner = createMockRunner('start', 'start'); - runReporter(reporterStub, runner, options); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on pending', function() { + + describe("on 'pending' event", function() { it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'draw'); + var runner = createMockRunner('pending', EVENT_TEST_PENDING); + var options = {}; + runReporter(fakeThis, runner, options); - runner = createMockRunner('pending', 'pending'); - runReporter(reporterStub, runner, options); - - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on pass', function() { - it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} - }; - sandbox.stub(reporterStub, 'draw'); + describe("on 'pass' event", function() { + it('should call draw', function() { var test = { duration: '', - slow: function() {} + slow: noop }; - runner = createMockRunner('pass', 'pass', null, null, test); - runReporter(reporterStub, runner, options); + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on fail', function() { - it('should call draw', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {} - }; - sandbox.stub(reporterStub, 'draw'); + describe("on 'fail' event", function() { + it('should call draw', function() { var test = { err: '' }; - runner = createMockRunner('fail', 'fail', null, null, test); - runReporter(reporterStub, runner, options); + var fakeThis = { + draw: sinon.stub().callsFake(noop), + generateColors: noop + }; + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.draw, 'was called'); + expect(fakeThis.draw.called, 'to be true'); }); }); - describe('on end', function() { + + describe("on 'end' event", function() { it('should call epilogue', function() { - var reporterStub = { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} + var fakeThis = { + draw: noop, + epilogue: sinon.stub().callsFake(noop), + generateColors: noop }; - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, options); + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); - expect(reporterStub.epilogue, 'was called'); + expect(fakeThis.epilogue.called, 'to be true'); }); - it('should write numberOfLines amount of new lines', function() { + + it('should write numberOfLines amount of newlines', function() { var expectedNumberOfLines = 4; - runner = createMockRunner('end', 'end'); - var stdout = runReporter( - { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} - }, - runner, - options - ); + var fakeThis = { + draw: noop, + epilogue: noop, + generateColors: noop + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + var stdout = runReporter(fakeThis, runner, options); - var arrayOfNewlines = stdout.filter(function(value) { + var isBlankLine = function(value) { return value === '\n'; - }); + }; - expect(arrayOfNewlines, 'to have length', expectedNumberOfLines); + expect( + stdout.filter(isBlankLine), + 'to have length', + expectedNumberOfLines + ); }); + it('should call Base show', function() { - sandbox.stub(Base.cursor, 'show'); - - runner = createMockRunner('end', 'end'); - runReporter( - { - draw: function() {}, - generateColors: function() {}, - epilogue: function() {} - }, - runner, - options - ); + var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var fakeThis = { + draw: noop, + epilogue: noop, + generateColors: noop + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(Base.cursor.show, 'was called'); + expect(showCursorStub.called, 'to be true'); }); }); }); - describe('draw', function() { + describe('#draw', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - }; }); - afterEach(function() { - process.stdout.write = stdoutWrite; - }); - - describe('if tick is false', function() { + describe("when 'tick' is false", function() { it('should draw face with expected spaces, _ and ^', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - - nyanCat.draw.call({ + var fakeThis = { tick: false, - appendRainbow: function() {}, - rainbowify: function() {}, - drawScoreboard: function() {}, - drawRainbow: function() {}, + appendRainbow: noop, + rainbowify: noop, + drawScoreboard: noop, + drawRainbow: noop, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: function() {}, - cursorUp: function() {} - }); + face: noop, + cursorUp: noop + }; + + try { + try { + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[0C', @@ -185,23 +218,35 @@ describe('Nyan reporter', function() { expect(stdout, 'to equal', expectedArray); }); }); - describe('if tick is true', function() { + + describe("when 'tick' is true", function() { it('should draw face with expected spaces, _ and ~', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - - nyanCat.draw.call({ + var fakeThis = { tick: true, - appendRainbow: function() {}, - rainbowify: function() {}, - drawScoreboard: function() {}, - drawRainbow: function() {}, + appendRainbow: noop, + rainbowify: noop, + drawScoreboard: noop, + drawRainbow: noop, drawNyanCat: NyanCat.prototype.drawNyanCat, scoreboardWidth: 0, trajectories: [[]], - face: function() {}, - cursorUp: function() {} - }); + face: noop, + cursorUp: noop + }; + + try { + try { + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[0C', @@ -222,102 +267,136 @@ describe('Nyan reporter', function() { }); }); - describe('cursorDown', function() { + describe('#cursorDown', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write cursor down interaction with expected number', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedNumber = 25; - nyanCat.cursorDown(expectedNumber); + try { + try { + nyanCat.cursorDown(expectedNumber); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = ['\u001b[' + expectedNumber + 'B']; expect(stdout, 'to equal', expectedArray); }); }); - describe('cursorUp', function() { + describe('#cursorUp', function() { + var stdoutWriteStub; var stdout; - var stdoutWrite; beforeEach(function() { + stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write cursor up interaction with expected number', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedNumber = 25; - nyanCat.cursorUp(expectedNumber); + try { + try { + nyanCat.cursorUp(expectedNumber); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = ['\u001b[' + expectedNumber + 'A']; expect(stdout, 'to equal', expectedArray); }); }); - describe('rainbowify', function() { - describe('useColors is false', function() { + describe('#rainbowify', function() { + var useColorsStub; + + beforeEach(function() { + useColorsStub = sandbox.stub(Base, 'useColors'); + }); + + afterEach(function() { + sandbox.restore(); + }); + + describe("when 'useColors' is false", function() { beforeEach(function() { - sandbox.stub(Base, 'useColors').value(false); + useColorsStub.value(false); }); it('should return argument string', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - var expectedString = 'hello'; - var outputString = nyanCat.rainbowify(expectedString); + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + + var inputString = 'hello'; + var outputString = nyanCat.rainbowify(inputString); + sandbox.restore(); + var expectedString = inputString; expect(outputString, 'to be', expectedString); }); }); - describe('useColors is true', function() { + + describe("when 'useColors' is true", function() { beforeEach(function() { - sandbox.stub(Base, 'useColors').value(true); + useColorsStub.value(true); }); it('should return rainbowified string from the given string and predefined codes', function() { - var startCode = '\u001b[38;5;'; - var endCode = '\u001b[0m'; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - var expectedString = 'hello'; + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + + var inputString = 'hello'; var colorCode = 'somecode'; - var expectedRainbowifyString = - startCode + colorCode + 'm' + expectedString + endCode; - var outputString = nyanCat.rainbowify.call( - { - rainbowColors: [colorCode], - colorIndex: 0 - }, - expectedString - ); + var fakeThis = { + rainbowColors: [colorCode], + colorIndex: 0 + }; + var outputString = nyanCat.rainbowify.call(fakeThis, inputString); + sandbox.restore(); - expect(outputString, 'to be', expectedRainbowifyString); + var startCode = '\u001b[38;5;'; + var endCode = '\u001b[0m'; + var expectedString = + startCode + colorCode + 'm' + inputString + endCode; + expect(outputString, 'to be', expectedString); }); }); }); - describe('appendRainbow', function() { - describe('if tick is true', function() { - it('should set an _ segment', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + describe('#appendRainbow', function() { + describe("when 'tick' is true", function() { + it('should set an underscore segment', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -333,8 +412,11 @@ describe('Nyan reporter', function() { expect(expectedSegment, 'to be', '_'); }); - it('should shift each trajectory item, if its length is greater of equal to its max width', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + it('should shift each trajectory item if its length is greater than or equal to its max width', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var rainbowifyResult = 'rainbowify'; var inputArray = ['itemToShify']; @@ -359,9 +441,12 @@ describe('Nyan reporter', function() { expect(trajectories, 'to equal', expectedTrajectories); }); }); - describe('if tick is false', function() { - it('should set an - segment', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + describe("when 'tick' is false", function() { + it('should set a dash segment', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); var expectedSegment; var inputArray = []; var trajectories = [inputArray, inputArray, inputArray, inputArray]; @@ -380,42 +465,45 @@ describe('Nyan reporter', function() { }); }); - describe('drawScoreboard', function() { - var stdoutWrite; + describe('#drawScoreboard', function() { var stdout; - var cachedColor; - var showOutput = false; beforeEach(function() { - stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - if (showOutput) { - stdoutWrite.call(process.stdout, string, enc, callback); - } - }; - cachedColor = Base.color; - Base.color = function(type, n) { + sandbox.stub(Base, 'color').callsFake(function(type, n) { return type + n; - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; - Base.color = cachedColor; + }); + var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); + stdout = []; }); it('should write scoreboard with color set with each stat', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var passes = 2; var pending = 1; var failures = 1; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawScoreboard.call({ - cursorUp: function() {}, + + var fakeThis = { + cursorUp: noop, stats: {passes: passes, pending: pending, failures: failures}, numberOfLines: 4 - }); + }; + + try { + try { + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + var expectedArray = [ ' ', 'green' + passes, @@ -432,40 +520,40 @@ describe('Nyan reporter', function() { }); it('should call cursorUp with given numberOfLines', function() { - var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawScoreboard.call({ - cursorUp: function(lines) { - expectedCursorArgument = lines; - }, + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { + cursorUp: sinon.spy(), stats: {passes: 0, pending: 0, failures: 0}, numberOfLines: expectedNumberOfLines - }); + }; - expect(expectedCursorArgument, 'to be', expectedNumberOfLines); + try { + try { + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } + + expect(fakeThis.cursorUp.calledWith(expectedNumberOfLines), 'to be true'); }); }); - describe('drawRainbow', function() { - var stdoutWrite; + describe('#drawRainbow', function() { var stdout; - var showOutput = false; beforeEach(function() { + var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub.callsFake(function(chunk, encoding, cb) { + stdout.push(chunk); + }); stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - if (showOutput) { - stdoutWrite.call(process.stdout, string, enc, callback); - } - }; - }); - - afterEach(function() { - process.stdout.write = stdoutWrite; }); it('should write width, contents and newline for each trajectory', function() { @@ -474,13 +562,25 @@ describe('Nyan reporter', function() { var expectedContents = 'input'; var inputArray = [expectedContents]; var trajectories = [inputArray]; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawRainbow.call({ - cursorUp: function() {}, + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { + cursorUp: noop, trajectories: trajectories, scoreboardWidth: expectedWidth, numberOfLines: 1 - }); + }; + + try { + try { + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } var expectedArray = [ '\u001b[' + expectedWidth + 'C', @@ -494,41 +594,66 @@ describe('Nyan reporter', function() { var expectedCursorArgument = null; var expectedNumberOfLines = 1000; - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); - nyanCat.drawRainbow.call({ + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); + var fakeThis = { cursorUp: function(lines) { expectedCursorArgument = lines; }, trajectories: [['input']], scoreboardWidth: 1, numberOfLines: expectedNumberOfLines - }); + }; + + try { + try { + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); + } + } catch (err) { + throw err; // Rethrow + } expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); - describe('face', function() { - it('expected face:(x .x) when "failures" at least one', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + + describe('#face', function() { + it('should expect "( x .x)" if any failures', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 1}; + expect(nyanCat.face(), 'to be', '( x .x)'); }); - it('expected face:(x .x) when "pending" at least one and no failing', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( o .o)" if any pending but none failing', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; + expect(nyanCat.face(), 'to be', '( o .o)'); }); - it('expected face:(^ .^) when "passing" only', function() { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( ^ .^)" if all passing', function() { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 1, pending: 0, failures: 0}; + expect(nyanCat.face(), 'to be', '( ^ .^)'); }); - it('expected face:(- .-) when otherwise', function(done) { - var nyanCat = new NyanCat({on: function() {}, once: function() {}}); + it('should expect "( - .-)" otherwise', function(done) { + var runner = {on: noop, once: noop}; + var options = {}; + var nyanCat = new NyanCat(runner, options); nyanCat.stats = {passes: 0, pending: 0, failures: 0}; + expect(nyanCat.face(), 'to be', '( - .-)'); done(); }); diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index cdea9c643e..0d45abeaf7 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -1,107 +1,117 @@ 'use strict'; -var sandbox = require('sinon').createSandbox(); +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Progress = reporters.Progress; + var Base = reporters.Base; +var Progress = reporters.Progress; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; describe('Progress reporter', function() { - var stdout; - var stdoutWrite; - var runner; + var sandbox; var runReporter = makeRunReporter(Progress); + var noop = function() {}; beforeEach(function() { - stdout = []; - stdoutWrite = process.stdout.write; - process.stdout.write = function(string, enc, callback) { - stdout.push(string); - stdoutWrite.call(process.stdout, string, enc, callback); - }; + sandbox = sinon.createSandbox(); }); afterEach(function() { sandbox.restore(); - process.stdout.write = stdoutWrite; }); - describe('on start', function() { - it('should call cursor hide', function() { - sandbox.stub(Base.cursor, 'hide'); + describe('event handlers', function() { + describe("on 'start' event", function() { + it('should call cursor hide', function() { + var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); - runner = createMockRunner('start', 'start'); - runReporter({}, runner, {}); + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + var options = {}; + runReporter({}, runner, options); + sandbox.restore(); - expect(Base.cursor.hide, 'was called'); + expect(hideCursorStub.called, 'to be true'); + }); }); - }); - - describe('on test end', function() { - describe('if line has not changed', function() { - it('should return and not write anything', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR'); - sandbox.stub(Base.window, 'width').value(-3); - var expectedTotal = 1; - var expectedOptions = {}; - runner = createMockRunner('test end', 'test end'); - runner.total = expectedTotal; - var stdout = runReporter({}, runner, expectedOptions); - - expect(stdout, 'to equal', []); + describe("on 'test end' event", function() { + describe('when line has changed', function() { + it('should write expected progress of open and close options', function() { + var crCursorStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.window, 'width').value(5); + + var expectedTotal = 12; + var expectedOpen = 'OpEn'; + var expectedClose = 'cLoSe'; + var expectedIncomplete = 'iNcOmPlEtE'; + var expectedOptions = { + open: expectedOpen, + complete: 'cOmPlEtE', + incomplete: expectedIncomplete, + close: expectedClose + }; + + var runner = createMockRunner('test end', EVENT_TEST_END); + runner.total = expectedTotal; + var options = { + reporterOptions: expectedOptions + }; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + var expectedArray = [ + '\u001b[J', + ' ' + expectedOpen, + '', + expectedIncomplete, + expectedClose + ]; + + expect(crCursorStub.called, 'to be true'); + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('if line has changed', function() { - it('should write expected progress of open and close options', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR'); - sandbox.stub(Base.window, 'width').value(5); - - var expectedTotal = 12; - var expectedOpen = 'OpEn'; - var expectedClose = 'cLoSe'; - var expectedIncomplete = 'iNcOmPlEtE'; - var expectedOptions = { - open: expectedOpen, - complete: 'cOmPlEtE', - incomplete: expectedIncomplete, - close: expectedClose - }; - var options = { - reporterOptions: expectedOptions - }; - runner = createMockRunner('test end', 'test end'); - runner.total = expectedTotal; - var stdout = runReporter({}, runner, options); - - var expectedArray = [ - '\u001b[J', - ' ' + expectedOpen, - '', - expectedIncomplete, - expectedClose - ]; - expect(Base.cursor.CR, 'was called'); - expect(stdout, 'to equal', expectedArray); + + describe('when line has not changed', function() { + it('should not write anything', function() { + sandbox.stub(Base, 'useColors').value(false); + sandbox.stub(Base.cursor, 'CR').callsFake(noop); + sandbox.stub(Base.window, 'width').value(-3); + + var expectedTotal = 1; + var runner = createMockRunner('test end', EVENT_TEST_END); + runner.total = expectedTotal; + var options = {}; + var stdout = runReporter({}, runner, options); + sandbox.restore(); + + expect(stdout, 'to equal', []); + }); }); }); - }); - describe('on end', function() { - it('should call cursor show and epilogue', function() { - var reporterStub = {epilogue: function() {}}; - sandbox.stub(Base.cursor, 'show'); - sandbox.stub(reporterStub, 'epilogue'); - - runner = createMockRunner('end', 'end'); - runReporter(reporterStub, runner, {}); + describe("on 'end' event", function() { + it('should call cursor show and epilogue', function() { + var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var fakeThis = { + epilogue: sinon.spy() + }; + var runner = createMockRunner('end', EVENT_RUN_END); + var options = {}; + runReporter(fakeThis, runner, options); + sandbox.restore(); - expect(reporterStub.epilogue, 'was called'); - expect(Base.cursor.show, 'was called'); + expect(fakeThis.epilogue.calledOnce, 'to be true'); + expect(showCursorStub.called, 'to be true'); + }); }); }); }); diff --git a/test/reporters/spec.spec.js b/test/reporters/spec.spec.js index 5f7584e33e..608bc7f512 100644 --- a/test/reporters/spec.spec.js +++ b/test/reporters/spec.spec.js @@ -1,104 +1,163 @@ 'use strict'; +var sinon = require('sinon'); +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; -var Spec = reporters.Spec; + var Base = reporters.Base; +var Spec = reporters.Spec; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_SUITE_BEGIN = events.EVENT_SUITE_BEGIN; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Spec reporter', function() { - var runner; - var options = {}; var runReporter = makeRunReporter(Spec); - var useColors; var expectedTitle = 'expectedTitle'; + var noop = function() {}; + var sandbox; beforeEach(function() { - useColors = Base.useColors; - Base.useColors = false; + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); }); afterEach(function() { - Base.useColors = useColors; - runner = undefined; + sandbox.restore(); }); - describe('on suite', function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - runner = createMockRunner('suite', 'suite', null, null, suite); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); - describe('on pending', function() { - it('should return title', function() { - var suite = { - title: expectedTitle - }; - runner = createMockRunner('pending test', 'pending', null, null, suite); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [' - ' + expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); + describe('event handlers', function() { + describe("on 'suite' event", function() { + it('should return title', function() { + var suite = { + title: expectedTitle + }; + var runner = createMockRunner( + 'suite', + EVENT_SUITE_BEGIN, + null, + null, + suite + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); + }); }); - }); - describe('on pass', function() { - describe('if test speed is slow', function() { - it('should return expected tick, title and duration', function() { - var expectedDuration = 2; - var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 1; - } + + describe("on 'pending' event", function() { + it('should return title', function() { + var suite = { + title: expectedTitle }; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedString = - ' ' + - Base.symbols.ok + - ' ' + - expectedTitle + - ' (' + - expectedDuration + - 'ms)' + - '\n'; - expect(stdout[0], 'to be', expectedString); + var runner = createMockRunner( + 'pending test', + EVENT_TEST_PENDING, + null, + null, + suite + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [' - ' + expectedTitle + '\n']; + expect(stdout, 'to equal', expectedArray); }); }); - describe('if test speed is fast', function() { - it('should return expected tick, title and without a duration', function() { - var expectedDuration = 1; + + describe("on 'pass' event", function() { + describe('when test speed is slow', function() { + it('should return expected tick, title, and duration', function() { + var expectedDuration = 2; + var test = { + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 1; + } + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedString = + ' ' + + Base.symbols.ok + + ' ' + + expectedTitle + + ' (' + + expectedDuration + + 'ms)' + + '\n'; + expect(stdout[0], 'to be', expectedString); + }); + }); + + describe('when test speed is fast', function() { + it('should return expected tick, title without a duration', function() { + var expectedDuration = 1; + var test = { + title: expectedTitle, + duration: expectedDuration, + slow: function() { + return 2; + } + }; + var runner = createMockRunner( + 'pass', + EVENT_TEST_PASS, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedString = + ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to be', expectedString); + }); + }); + }); + + describe("on 'fail' event", function() { + it('should return title and function count', function() { + var functionCount = 1; var test = { - title: expectedTitle, - duration: expectedDuration, - slow: function() { - return 2; - } + title: expectedTitle }; - runner = createMockRunner('pass', 'pass', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedString = - ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to be', expectedString); + var runner = createMockRunner( + 'fail', + EVENT_TEST_FAIL, + null, + null, + test + ); + var options = {}; + var stdout = runReporter({epilogue: noop}, runner, options); + sandbox.restore(); + + var expectedArray = [ + ' ' + functionCount + ') ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); }); }); }); - describe('on fail', function() { - it('should return title and function count', function() { - var functionCount = 1; - var test = { - title: expectedTitle - }; - runner = createMockRunner('fail', 'fail', null, null, test); - var stdout = runReporter({epilogue: function() {}}, runner, options); - var expectedArray = [' ' + functionCount + ') ' + expectedTitle + '\n']; - expect(stdout, 'to equal', expectedArray); - }); - }); }); diff --git a/test/reporters/tap.spec.js b/test/reporters/tap.spec.js index c0a5419d37..f3bfe8d473 100644 --- a/test/reporters/tap.spec.js +++ b/test/reporters/tap.spec.js @@ -1,246 +1,295 @@ 'use strict'; +var events = require('../../').Runner.constants; +var helpers = require('./helpers'); var reporters = require('../../').reporters; + var TAP = reporters.TAP; +var createMockRunner = helpers.createMockRunner; +var makeRunReporter = helpers.createRunReporterFunction; -var createMockRunner = require('./helpers').createMockRunner; -var makeRunReporter = require('./helpers.js').createRunReporterFunction; +var EVENT_RUN_BEGIN = events.EVENT_RUN_BEGIN; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('TAP reporter', function() { - var runner; var runReporter = makeRunReporter(TAP); var expectedTitle = 'some title'; var countAfterTestEnd = 2; - var test; + var noop = function() {}; - beforeEach(function() { - test = { + function createTest() { + return { fullTitle: function() { return expectedTitle; }, - slow: function() {} + slow: noop }; - }); - - afterEach(function() { - runner = undefined; - test = undefined; - }); + } describe('TAP12 spec', function() { - var options = {}; - - describe('on start', function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout; - - before(function() { - runner = createMockRunner('start', 'start'); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - stdout = runReporter({}, runner, options); - }); - - it('should not write the TAP specification version', function() { - expect(stdout, 'not to contain', 'TAP version'); - }); - it('should write the number of tests that it plans to run', function() { - var expectedArray = ['1..' + expectedTotal + '\n']; - expect(stdout, 'to equal', expectedArray); - expect(expectedString, 'to be', expectedSuite); - }); - }); - - describe('on pending', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner( - 'start test', - 'test end', - 'pending', - null, - test - ); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); + var options = { + reporterOptions: { + tapVersion: '12' + } + }; - describe('on pass', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner('start test', 'test end', 'pass', null, test); - runner.suite = ''; - runner.grepTotal = function() {}; + describe('event handlers', function() { + describe("on 'start' event", function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout = []; + + before(function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + stdout = runReporter({}, runner, options); + }); - var stdout = runReporter({}, runner, options); + it('should not write a TAP specification version', function() { + expect(stdout, 'not to contain', 'TAP version'); + }); - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); + it('should write the number of tests that it plans to run', function() { + var expectedArray = ['1..' + expectedTotal + '\n']; + expect(stdout, 'to equal', expectedArray); + expect(expectedString, 'to be', expectedSuite); + }); }); - }); - describe('on fail', function() { - describe('if there is an error message', function() { - it('should write expected message and error message', function() { - var expectedErrorMessage = 'some error'; - var error = { - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pending' event", function() { + var stdout = []; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PENDING, null, - test, - error + test ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var error = { - stack: expectedStack - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pass' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PASS, null, - test, - error + test ); runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack and error message', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var expectedErrorMessage = 'some error'; - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = function() {}; + describe("on 'fail' event", function() { + var expectedErrorMessage = 'some error'; + var expectedStack = 'some stack'; + + describe("when 'error' has only message", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and error message', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var stdout = runReporter({}, runner, options); + describe("when 'error' has only stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ' + expectedErrorMessage + '\n', - ' ' + expectedStack + '\n' - ]; - expect(stdout, 'to equal', expectedArray); + describe("when 'error' has both message and stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message, error message, and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ' + expectedErrorMessage + '\n', + ' ' + expectedStack + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe("when 'error' has neither message nor stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = {}; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message only', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if there is no error stack or error message', function() { - it('should write expected message only', function() { - var error = {}; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error + describe("on 'end' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'fail end pass', + EVENT_TEST_FAIL, + EVENT_RUN_END, + EVENT_TEST_PASS, + test ); - runner.on = runner.once = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + it('should write total tests, passes, and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); - - describe('on end', function() { - it('should write total tests, passes and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var totalTests = numberOfPasses + numberOfFails; - var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); }); describe('TAP13 spec', function() { @@ -250,229 +299,270 @@ describe('TAP reporter', function() { } }; - describe('on start', function() { - var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; - var stdout; - - before(function() { - runner = createMockRunner('start', 'start'); - runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; - - stdout = runReporter({}, runner, options); - }); + describe('event handlers', function() { + describe("on 'start' event", function() { + var expectedSuite = 'some suite'; + var expectedTotal = 10; + var expectedString; + var stdout; + + before(function() { + var runner = createMockRunner('start', EVENT_RUN_BEGIN); + runner.suite = expectedSuite; + runner.grepTotal = function(string) { + expectedString = string; + return expectedTotal; + }; + stdout = runReporter({}, runner, options); + }); - it('should write the TAP specification version', function() { - var tapVersion = options.reporterOptions.tapVersion; - var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; - expect(stdout[0], 'to equal', expectedFirstLine); - }); - it('should write the number of tests that it plans to run', function() { - var expectedSecondLine = '1..' + expectedTotal + '\n'; - expect(stdout[1], 'to equal', expectedSecondLine); - expect(expectedString, 'to be', expectedSuite); - }); - }); + it('should write the TAP specification version', function() { + var tapVersion = options.reporterOptions.tapVersion; + var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; + expect(stdout[0], 'to equal', expectedFirstLine); + }); - describe('on pending', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner( - 'start test', - 'test end', - 'pending', - null, - test - ); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0], 'to equal', expectedMessage); + it('should write the number of tests that it plans to run', function() { + var expectedSecondLine = '1..' + expectedTotal + '\n'; + expect(stdout[1], 'to equal', expectedSecondLine); + expect(expectedString, 'to be', expectedSuite); + }); }); - }); - - describe('on pass', function() { - it('should write expected message including count and title', function() { - runner = createMockRunner('start test', 'test end', 'pass', null, test); - runner.suite = ''; - runner.grepTotal = function() {}; - var stdout = runReporter({}, runner, options); + describe("on 'pending' event", function() { + var stdout; - var expectedMessage = - 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0], 'to equal', expectedMessage); - }); - }); - - describe('on fail', function() { - describe('if there is an error message', function() { - it('should write expected message and error message', function() { - var expectedErrorMessage = 'some error'; - var error = { - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PENDING, null, - test, - error + test ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var error = { - stack: expectedStack - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', + describe("on 'pass' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'start test', + EVENT_TEST_END, + EVENT_TEST_PASS, null, - test, - error + test ); runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + it('should write expected message including count and title', function() { + var expectedMessage = + 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; + expect(stdout[0], 'to equal', expectedMessage); }); }); - describe('if there is an error stack and error message', function() { - it('should write expected message and stack', function() { - var expectedStack = 'some stack'; - var expectedErrorMessage = 'some error'; - var error = { - stack: expectedStack, - message: expectedErrorMessage - }; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error - ); - runner.on = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; - runner.suite = ''; - runner.grepTotal = function() {}; + describe("on 'fail' event", function() { + var expectedErrorMessage = 'some error'; + var expectedStack = 'some stack'; + + describe("when 'error' has only message", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and error message', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var stdout = runReporter({}, runner, options); + describe("when 'error' has only stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); - var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', - ' ---\n', - ' message: |-\n', - ' ' + expectedErrorMessage + '\n', - ' stack: |-\n', - ' ' + expectedStack + '\n', - ' ...\n' - ]; - expect(stdout, 'to equal', expectedArray); + describe("when 'error' has both message and stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = { + stack: expectedStack, + message: expectedErrorMessage + }; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message, error message, and stack', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', + ' ---\n', + ' message: |-\n', + ' ' + expectedErrorMessage + '\n', + ' stack: |-\n', + ' ' + expectedStack + '\n', + ' ...\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); + }); + + describe("when 'error' has neither message nor stack", function() { + var stdout; + + before(function() { + var test = createTest(); + var error = {}; + var runner = createMockRunner( + 'test end fail', + EVENT_TEST_END, + EVENT_TEST_FAIL, + null, + test, + error + ); + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_END) { + callback(); + } else if (event === EVENT_TEST_FAIL) { + callback(test, error); + } + }; + runner.suite = ''; + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + + it('should write expected message only', function() { + var expectedArray = [ + 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + ]; + expect(stdout, 'to equal', expectedArray); + }); }); }); - describe('if there is no error stack or error message', function() { - it('should write expected message only', function() { - var error = {}; - runner = createMockRunner( - 'test end fail', - 'test end', - 'fail', - null, - test, - error + describe("on 'end' event", function() { + var stdout; + + before(function() { + var test = createTest(); + var runner = createMockRunner( + 'fail end pass', + EVENT_TEST_FAIL, + EVENT_RUN_END, + EVENT_TEST_PASS, + test ); - runner.on = runner.once = function(event, callback) { - if (event === 'test end') { - callback(); - } else if (event === 'fail') { - callback(test, error); - } - }; runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); + runner.grepTotal = noop; + stdout = runReporter({}, runner, options); + }); + it('should write total tests, passes, and failures', function() { + var numberOfPasses = 1; + var numberOfFails = 1; + var totalTests = numberOfPasses + numberOfFails; var expectedArray = [ - 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' + 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', + 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', + '# tests ' + totalTests + '\n', + '# pass ' + numberOfPasses + '\n', + '# fail ' + numberOfFails + '\n' ]; expect(stdout, 'to equal', expectedArray); }); }); }); - - describe('on end', function() { - it('should write total tests, passes and failures', function() { - var numberOfPasses = 1; - var numberOfFails = 1; - runner = createMockRunner('fail end pass', 'fail', 'end', 'pass', test); - runner.suite = ''; - runner.grepTotal = function() {}; - - var stdout = runReporter({}, runner, options); - - var totalTests = numberOfPasses + numberOfFails; - var expectedArray = [ - 'ok ' + numberOfPasses + ' ' + expectedTitle + '\n', - 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', - '# tests ' + totalTests + '\n', - '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' - ]; - expect(stdout, 'to equal', expectedArray); - }); - }); }); }); diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 35555968a1..26fce4a1c4 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -1,25 +1,34 @@ 'use strict'; +var EventEmitter = require('events').EventEmitter; var fs = require('fs'); -var mkdirp = require('mkdirp'); +var os = require('os'); var path = require('path'); -var assert = require('assert'); +var mkdirp = require('mkdirp'); +var rimraf = require('rimraf'); +var sinon = require('sinon'); var createStatsCollector = require('../../lib/stats-collector'); -var EventEmitter = require('events').EventEmitter; +var events = require('../../').Runner.constants; var reporters = require('../../').reporters; -var constants = require('../../lib/runnable').constants; -var STATE_FAILED = constants.STATE_FAILED; -var STATE_PASSED = constants.STATE_PASSED; +var states = require('../../').Runnable.constants; + +var Base = reporters.Base; var XUnit = reporters.XUnit; +var EVENT_RUN_END = events.EVENT_RUN_END; +var EVENT_TEST_END = events.EVENT_TEST_END; +var EVENT_TEST_FAIL = events.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = events.EVENT_TEST_PASS; +var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; + +var STATE_FAILED = states.STATE_FAILED; +var STATE_PASSED = states.STATE_PASSED; + describe('XUnit reporter', function() { - var stdout; - var stdoutWrite; - // the runner parameter of the reporter + var sandbox; var runner; + var noop = function() {}; - var callbackArgument = null; - var expectedFailure = 'some-failures'; var expectedLine = 'some-line'; var expectedClassName = 'fullTitle'; var expectedTitle = 'some title'; @@ -27,192 +36,286 @@ describe('XUnit reporter', function() { var expectedDiff = '\n + expected - actual\n\n -foo\n +bar\n '; var expectedStack = 'some-stack'; - var expectedWrite = null; beforeEach(function() { - stdout = []; - runner = {on: function() {}, once: function() {}}; + runner = {on: noop, once: noop}; createStatsCollector(runner); }); - describe('if reporter options output is given', function() { - var expectedOutput = 'some-output'; + describe("when 'reporterOptions.output' is provided", function() { + var expectedOutput = path.join(path.sep, 'path', 'to', 'some-output'); var options = { reporterOptions: { output: expectedOutput } }; - describe('but it cant create a write stream', function() { - it('should throw expected error', function() { - var fsCreateWriteStream = fs.createWriteStream; - fs.createWriteStream = false; - - var boundXUnit = XUnit.bind({}, runner, options); - expect(boundXUnit, 'to throw', 'file output not supported in browser'); - fs.createWriteStream = fsCreateWriteStream; + + describe('when fileStream can be created', function() { + var mkdirpSync; + var fsCreateWriteStream; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + mkdirpSync = sandbox.stub(mkdirp, 'sync'); + fsCreateWriteStream = sandbox.stub(fs, 'createWriteStream'); }); - }); - describe('and it can create a write stream', function() { - it('should locate the output dir, create it, then assign as fileStream', function() { - var expectedDirectory; - var mkdirpSync = mkdirp.sync; - var pathDirname = path.dirname; - var fsCreateWriteStream = fs.createWriteStream; - mkdirp.sync = function(directory) { - expectedDirectory = directory; - }; - path.dirname = function(location) { - return location; - }; - fs.createWriteStream = function(streamDetails) { - return streamDetails; - }; - var contextVariables = { + it('should open given file for writing, recursively creating directories in pathname', function() { + var fakeThis = { fileStream: null }; - XUnit.call(contextVariables, runner, options); + XUnit.call(fakeThis, runner, options); - expect(expectedDirectory, 'to be', expectedOutput); - expect(contextVariables.fileStream, 'to be', expectedOutput); + var expectedDirectory = path.dirname(expectedOutput); + expect(mkdirpSync.calledWith(expectedDirectory), 'to be true'); + expect(fsCreateWriteStream.calledWith(expectedOutput), 'to be true'); + }); - fs.createWriteStream = fsCreateWriteStream; - mkdirp.sync = mkdirpSync; - path.dirname = pathDirname; + afterEach(function() { + sandbox.restore(); }); }); - }); - describe("on 'pending', 'pass' and 'fail' events", function() { - it("should add test to tests called on 'end' event", function() { - var pendingTest = { - name: 'pending', - slow: function() {} - }; - var failTest = { - name: 'fail', - slow: function() {} - }; - var passTest = { - name: 'pass', - slow: function() {} - }; - runner.on = runner.once = function(event, callback) { - if (event === 'pending') { - callback(pendingTest); - } - if (event === 'pass') { - callback(passTest); - } - if (event === 'fail') { - callback(failTest); - } - if (event === 'end') { - callback(); - } - }; + describe('when fileStream cannot be created', function() { + describe('when given an invalid pathname', function() { + var tmpdir; + var invalidPath; - var calledTests = []; - XUnit.call( - { - write: function() {}, - test: function(test) { - calledTests.push(test); + beforeEach(function createInvalidPath() { + tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-test-')); + + function touch(filename) { + fs.closeSync(fs.openSync(filename, 'w')); } - }, - runner - ); - var expectedCalledTests = [pendingTest, passTest, failTest]; - expect(calledTests, 'to equal', expectedCalledTests); + // Create path where file 'some-file' used as directory + invalidPath = path.join( + tmpdir, + 'some-file', + path.basename(expectedOutput) + ); + touch(path.dirname(invalidPath)); + }); + + it('should throw system error', function() { + var options = { + reporterOptions: { + output: invalidPath + } + }; + var boundXUnit = XUnit.bind({}, runner, options); + expect( + boundXUnit, + 'to throw', + expect.it('to be an', Error).and('to satisfy', { + syscall: 'mkdir', + code: 'EEXIST', + path: path.dirname(invalidPath) + }) + ); + }); + + afterEach(function() { + rimraf.sync(tmpdir); + }); + }); + + describe('when run in browser', function() { + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(fs, 'createWriteStream').value(false); + }); + + it('should throw unsupported error', function() { + var boundXUnit = XUnit.bind({}, runner, options); + expect( + boundXUnit, + 'to throw', + 'file output not supported in browser' + ); + }); + + afterEach(function() { + sandbox.restore(); + }); + }); }); }); - describe('done', function() { - describe('if fileStream is truthy', function() { - it('should run callback with failure inside streams end', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var callback = function(failures) { - callbackArgument = failures; + describe('event handlers', function() { + describe("on 'pending', 'pass' and 'fail' events", function() { + it("should add test to tests called on 'end' event", function() { + var pendingTest = { + name: 'pending', + slow: noop + }; + var failTest = { + name: 'fail', + slow: noop + }; + var passTest = { + name: 'pass', + slow: noop }; - var calledEnd = false; - var fileStream = { - end: function(callback) { - calledEnd = true; + runner.on = runner.once = function(event, callback) { + if (event === EVENT_TEST_PENDING) { + callback(pendingTest); + } else if (event === EVENT_TEST_PASS) { + callback(passTest); + } else if (event === EVENT_TEST_FAIL) { + callback(failTest); + } else if (event === EVENT_RUN_END) { callback(); } }; - xunit.done.call({fileStream: fileStream}, expectedFailure, callback); - expect(calledEnd, 'to be', true); - expect(callbackArgument, 'to be', expectedFailure); - }); - }); - describe('if fileStream is falsy', function() { - it('should run callback with failure', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var callback = function(failures) { - callbackArgument = failures; + var calledTests = []; + var fakeThis = { + write: noop, + test: function(test) { + calledTests.push(test); + } }; - xunit.done.call({fileStream: false}, expectedFailure, callback); + XUnit.call(fakeThis, runner); - expect(callbackArgument, 'to be', expectedFailure); + var expectedCalledTests = [pendingTest, passTest, failTest]; + expect(calledTests, 'to equal', expectedCalledTests); }); }); }); - describe('write', function() { - describe('if fileStream is truthy', function() { - it('should call fileStream write with line and new line', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - var fileStream = { - write: function(write) { - expectedWrite = write; + describe('#done', function() { + var xunit; + var options = { + reporterOptions: {} + }; + var expectedNFailures = 13; + var callback; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + callback = sandbox.spy(); + }); + + afterEach(function() { + callback = null; + xunit = null; + sandbox.restore(); + }); + + describe('when output directed to file', function() { + var fakeThis; + + beforeEach(function() { + xunit = new XUnit(runner, options); + + fakeThis = { + fileStream: { + end: sinon.stub().callsFake(function(chunk, encoding, cb) { + if (typeof arguments[0] === 'function') { + cb = arguments[0]; + } + cb(); + }), + write: function(chunk, encoding, cb) {} } }; - xunit.write.call({fileStream: fileStream}, expectedLine); + }); - expect(expectedWrite, 'to be', expectedLine + '\n'); + it("should run completion callback via 'fileStream.end'", function() { + xunit.done.call(fakeThis, expectedNFailures, callback); + + expect(fakeThis.fileStream.end.calledOnce, 'to be true'); + expect(callback.calledOnce, 'to be true'); + expect(callback.calledWith(expectedNFailures), 'to be true'); }); }); - describe('if fileStream is falsy and stdout exists', function() { - it('should call write with line and new line', function() { - stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; - var xunit = new XUnit({on: function() {}, once: function() {}}); - xunit.write.call({fileStream: false}, expectedLine); + describe('when output directed to stdout (or console)', function() { + var fakeThis; + + beforeEach(function() { + xunit = new XUnit(runner, options); + fakeThis = {}; + }); - process.stdout.write = stdoutWrite; + it('should run completion callback', function() { + xunit.done.call(fakeThis, expectedNFailures, callback); - expect(stdout[0], 'to be', expectedLine + '\n'); + expect(callback.calledOnce, 'to be true'); + expect(callback.calledWith(expectedNFailures), 'to be true'); }); }); - describe('if fileStream is falsy and stdout does not exist', function() { - it('should call write with line', function() { - stdoutWrite = process; + }); + + describe('#write', function() { + // :TODO: Method should be named 'writeln', not 'write' + describe('when output directed to file', function() { + var fileStream = { + write: sinon.spy() + }; + + it("should call 'fileStream.write' with line and newline", function() { + var xunit = new XUnit(runner); + var fakeThis = {fileStream: fileStream}; + xunit.write.call(fakeThis, expectedLine); + + expect(fileStream.write.calledWith(expectedLine + '\n'), 'to be true'); + }); + }); + + describe('when output directed to stdout', function() { + it("should call 'process.stdout.write' with line and newline", function() { + var xunit = new XUnit(runner); + var fakeThis = {fileStream: false}; + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); + xunit.write.call(fakeThis, expectedLine); + stdoutWriteStub.restore(); + + expect(stdoutWriteStub.calledWith(expectedLine + '\n'), 'to be true'); + }); + }); + + describe('when output directed to console', function() { + it("should call 'console.log' with line", function() { + // :TODO: XUnit needs a trivially testable means to force console.log() + var realProcess = process; process = false; // eslint-disable-line no-native-reassign, no-global-assign - var cachedConsoleLog = console.log; - console.log = function(string) { - stdout.push(string); - }; - var xunit = new XUnit({on: function() {}, once: function() {}}); - xunit.write.call({fileStream: false}, expectedLine); + var xunit = new XUnit(runner); + var fakeThis = {fileStream: false}; + var consoleLogStub = sinon.stub(console, 'log'); + xunit.write.call(fakeThis, expectedLine); + consoleLogStub.restore(); - console.log = cachedConsoleLog; - process = stdoutWrite; // eslint-disable-line no-native-reassign, no-global-assign - expect(stdout[0], 'to be', expectedLine); + process = realProcess; // eslint-disable-line no-native-reassign, no-global-assign + + expect(consoleLogStub.calledWith(expectedLine), 'to be true'); }); }); }); - describe('test', function() { + describe('#test', function() { + var expectedWrite; + var fakeThis = { + write: function(str) { + expectedWrite = str; + } + }; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(Base, 'useColors').value(false); + }); + + afterEach(function() { + sandbox.restore(); + expectedWrite = null; + }); + describe('on test failure', function() { it('should write expected tag with error details', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); + var xunit = new XUnit(runner); var expectedTest = { state: STATE_FAILED, title: expectedTitle, @@ -229,14 +332,9 @@ describe('XUnit reporter', function() { stack: expectedStack } }; - xunit.test.call( - { - write: function(string) { - expectedWrite = string; - } - }, - expectedTest - ); + + xunit.test.call(fakeThis, expectedTest); + sandbox.restore(); var expectedTag = ''; - expect(expectedWrite, 'to be', expectedTag); }); }); + describe('on test in any other state', function() { it('should write expected tag', function() { - var xunit = new XUnit({on: function() {}, once: function() {}}); - + var xunit = new XUnit(runner); var expectedTest = { isPending: function() { return false; @@ -305,14 +396,9 @@ describe('XUnit reporter', function() { }, duration: false }; - xunit.test.call( - { - write: function(string) { - expectedWrite = string; - } - }, - expectedTest - ); + + xunit.test.call(fakeThis, expectedTest); + sandbox.restore(); var expectedTag = ''; - expect(expectedWrite, 'to be', expectedTag); }); }); + it('should write expected summary statistics', function() { - var count = 0; + var numTests = 0; + var numPass = 0; + var numFail = 0; var simpleError = { actual: 'foo', expected: 'bar', @@ -333,8 +421,14 @@ describe('XUnit reporter', function() { stack: expectedStack }; var generateTest = function(passed) { - var t = { - title: expectedTitle + count, + numTests++; + if (passed) { + numPass++; + } else { + numFail++; + } + return { + title: [expectedTitle, numTests].join(': '), state: passed ? STATE_PASSED : STATE_FAILED, isPending: function() { return false; @@ -349,26 +443,36 @@ describe('XUnit reporter', function() { }, duration: 1000 }; - return t; }; var runner = new EventEmitter(); createStatsCollector(runner); var xunit = new XUnit(runner); expectedWrite = ''; - xunit.write = function(string) { - expectedWrite += string; - }; + sandbox.stub(xunit, 'write').callsFake(function(str) { + expectedWrite += str; + }); // 3 tests, no failures (i.e. tests that could not run), and 2 errors - runner.emit('test end'); - runner.emit('pass', generateTest(true)); - runner.emit('test end'); - runner.emit('fail', generateTest(false), simpleError); - runner.emit('test end'); - runner.emit('fail', generateTest(false), simpleError); - runner.emit('end'); + runner.emit(EVENT_TEST_PASS, generateTest(true)); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_TEST_FAIL, generateTest(false), simpleError); + runner.emit(EVENT_TEST_END); + runner.emit(EVENT_RUN_END); + + sandbox.restore(); + + var expectedNumPass = 1; + var expectedNumFail = 2; + var expectedNumTests = 3; + + expect(expectedNumPass, 'to be', numPass); + expect(expectedNumFail, 'to be', numFail); + expect(expectedNumTests, 'to be', numTests); + // :NOTE: Mocha test "fail" is an XUnit "error" var expectedTag = '= 0, - 'it should contain the text "Mocha Tests"' - ); + expect(lines[0], 'to contain', customSuiteName); }); - it('should use the custom suite name as the suite name when provided in the reporter options', function() { - // arrange + it('should use default name otherwise', function() { + var defaultSuiteName = 'Mocha Tests'; var options = { - reporterOptions: { - // this time, with a custom suite name - suiteName: 'Mocha Is Great!' - } + reporterOptions: {} }; var xunit = new XUnit(runner, options); xunit.fileStream = fileStream; - // act (trigger the end event to force xunit reporter to write the output) - events['end'](); + // Trigger end event to force XUnit reporter to write its output + events[EVENT_RUN_END](); - // assert - assert( - lines[0].indexOf(' Date: Thu, 2 May 2019 01:10:28 -0700 Subject: [PATCH 1340/1771] various doc-related fixes (#3790) - ensure `.html` gets hit by prettier - fix order in which docs are generated; let assetgraph process API docs - some auto-generated content in `docs/index.md` updated --- .lintstagedrc.json | 5 ++++- docs/index.md | 2 +- jsdoc.conf.json | 2 +- package-scripts.js | 5 ++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 74973575e8..14dcdd9302 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,7 +1,10 @@ { "linters": { "(bin/*|*.js|**/*.js)": ["eslint --fix", "git add"], - "(*.{json,yml,md}|**/*.{json,yml,md})": ["prettier --write", "git add"] + "(*.{json,yml,md,html}|**/*.{json,yml,md,html})": [ + "prettier --write", + "git add" + ] }, "ignore": ["docs/**/*.js", "test/**/*.fixture.js", "package*.json"] } diff --git a/docs/index.md b/docs/index.md index 4c41381b05..99ca417f0f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -883,7 +883,7 @@ Test Filters Positional Arguments spec One or more files, directories, or globs to test - [array] [default: ["test/"]] + [array] [default: ["test"]] Other Options --help, -h Show usage information & exit [boolean] diff --git a/jsdoc.conf.json b/jsdoc.conf.json index 161b1fd252..e8ea986021 100644 --- a/jsdoc.conf.json +++ b/jsdoc.conf.json @@ -8,7 +8,7 @@ "static": false }, "opts": { - "destination": "docs/_dist/api", + "destination": "docs/_site/api", "encoding": "utf8", "recurse": true, "template": "node_modules/@mocha/docdash", diff --git a/package-scripts.js b/package-scripts.js index 30e4294be1..7febdc016f 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -266,7 +266,7 @@ module.exports = { docs: { default: { script: - 'nps docs.prebuild && eleventy && nps docs.postbuild && nps docs.api', + 'nps docs.prebuild && nps docs.api && eleventy && nps docs.postbuild', description: 'Build documentation' }, prebuild: { @@ -299,8 +299,7 @@ module.exports = { description: 'Watch docs for changes & build' }, api: { - script: - 'nps docs.preprocess.api && jsdoc -c jsdoc.conf.json && cp LICENSE docs/_dist/api', + script: 'nps docs.preprocess.api && jsdoc -c jsdoc.conf.json', description: 'Build API docs' } }, From a4f1a442a22e53ad629a5f565d4a17b687afce53 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 2 May 2019 03:01:51 -0700 Subject: [PATCH 1341/1771] rename "exclude" to "ignore" and create alias; closes #3871 (#3872) --- docs/index.md | 10 +++---- example/config/.mocharc.yml | 6 ++--- lib/cli/run-helpers.js | 6 ++--- lib/cli/run-option-metadata.js | 3 ++- lib/cli/run.js | 12 ++++----- .../{exclude => ignore}/fail.fixture.js | 2 +- .../nested/fail.fixture.js | 2 +- .../nested/pass.fixture.js | 2 +- .../{exclude => ignore}/pass.fixture.js | 2 +- .../{exclude.spec.js => ignore.spec.js} | 26 +++++++++---------- 10 files changed, 36 insertions(+), 35 deletions(-) rename test/integration/fixtures/options/{exclude => ignore}/fail.fixture.js (71%) rename test/integration/fixtures/options/{exclude => ignore}/nested/fail.fixture.js (68%) rename test/integration/fixtures/options/{exclude => ignore}/nested/pass.fixture.js (56%) rename test/integration/fixtures/options/{exclude => ignore}/pass.fixture.js (60%) rename test/integration/options/{exclude.spec.js => ignore.spec.js} (65%) diff --git a/docs/index.md b/docs/index.md index 99ca417f0f..234682c4a4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -817,7 +817,7 @@ Mocha supports the `err.expected` and `err.actual` properties of any thrown `Ass -```plain +```text mocha [spec..] @@ -864,7 +864,7 @@ Configuration --package Path to package.json for config [string] File Handling - --exclude Ignore file(s) or glob pattern(s) + --ignore, --exclude Ignore file(s) or glob pattern(s) [array] [default: (none)] --extension, --watch-extensions File extension(s) to load and/or watch [array] [default: js] @@ -1075,9 +1075,9 @@ Specify an explicit path to a [`package.json` file](#configuring-mocha-nodejs) ( By default, Mocha looks for a `package.json` in the current working directory or nearest ancestor, and will use the first file found (regardless of whether it contains a `mocha` property); to suppress `package.json` lookup, use `--no-package`. -### `--exclude ` +### `--ignore ` -Explicitly exclude one or more files, directories or "globs" that would otherwise be loaded. +Explicitly ignore (exclude) one or more test files, directories or globs (e.g., `some/**/files*`) that would otherwise be loaded. Files specified using `--file` _are not affected_ by this option. @@ -1093,7 +1093,7 @@ Affects `--watch` behavior. Specifying `--extension` will _remove_ `.js` as a test file extension; use `--extension js` to re-add it. For example, to load `.mjs` and `.js` test files, you must supply `--extension mjs --extension js`. -### `--file ` +### `--file ` Explicitly _include_ a test file to be loaded before other test files files. Multiple uses of `--file` are allowed, and will be loaded in order given. diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index 1a5f820482..466b4956f1 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -6,8 +6,6 @@ check-leaks: false color: true delay: false diff: true -exclude: - - /path/to/some/excluded/file exit: false # could be expressed as "no-exit: true" extension: - js @@ -25,6 +23,8 @@ global: # fgrep and grep are mutually exclusive # grep: something growl: false +ignore: + - /path/to/some/ignored/file inline-diffs: false # needs to be used with grep or fgrep # invert: false @@ -39,8 +39,8 @@ retries: 1 slow: 75 sort: false spec: test/**/*.spec.js # the positional arguments! -v8-stack-trace-limit: 100 # V8 flags are prepended with "v8-" timeout: false # same as "no-timeout: true" or "timeout: 0" trace-warnings: true # node flags ok ui: bdd +v8-stack-trace-limit: 100 # V8 flags are prepended with "v8-" watch: false diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 732161b146..6f3476d496 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -123,14 +123,14 @@ exports.handleRequires = (requires = []) => { * @param {Object} [opts] - Options * @param {string[]} [opts.extension] - File extensions to use * @param {string[]} [opts.spec] - Files, dirs, globs to run - * @param {string[]} [opts.exclude] - Files, dirs, globs to exclude + * @param {string[]} [opts.ignore] - Files, dirs, globs to ignore * @param {boolean} [opts.recursive=false] - Find files recursively * @param {boolean} [opts.sort=false] - Sort test files * @returns {string[]} List of files to test * @private */ exports.handleFiles = ({ - exclude = [], + ignore = [], extension = [], file = [], recursive = false, @@ -157,7 +157,7 @@ exports.handleFiles = ({ newFiles = [newFiles]; } newFiles = newFiles.filter(fileName => - exclude.every(pattern => !minimatch(fileName, pattern)) + ignore.every(pattern => !minimatch(fileName, pattern)) ); } diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index 0838e6050c..e10e008fa6 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -14,10 +14,10 @@ */ exports.types = { array: [ - 'exclude', 'extension', 'file', 'global', + 'ignore', 'require', 'reporter-option', 'spec' @@ -63,6 +63,7 @@ exports.aliases = { global: ['globals'], grep: ['g'], growl: ['G'], + ignore: ['exclude'], invert: ['i'], 'no-colors': ['C'], reporter: ['R'], diff --git a/lib/cli/run.js b/lib/cli/run.js index 3a6ba0072c..da5ffd7b6a 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -82,12 +82,6 @@ exports.builder = yargs => description: 'Show diff on failure', group: GROUPS.OUTPUT }, - exclude: { - defaultDescription: '(none)', - description: 'Ignore file(s) or glob pattern(s)', - group: GROUPS.FILES, - requiresArg: true - }, exit: { description: 'Force Mocha to quit after tests complete', group: GROUPS.RULES @@ -143,6 +137,12 @@ exports.builder = yargs => description: 'Enable Growl notifications', group: GROUPS.OUTPUT }, + ignore: { + defaultDescription: '(none)', + description: 'Ignore file(s) or glob pattern(s)', + group: GROUPS.FILES, + requiresArg: true + }, 'inline-diffs': { description: 'Display actual/expected differences inline within each string', diff --git a/test/integration/fixtures/options/exclude/fail.fixture.js b/test/integration/fixtures/options/ignore/fail.fixture.js similarity index 71% rename from test/integration/fixtures/options/exclude/fail.fixture.js rename to test/integration/fixtures/options/ignore/fail.fixture.js index 2b58528bfc..fb848b288e 100644 --- a/test/integration/fixtures/options/exclude/fail.fixture.js +++ b/test/integration/fixtures/options/ignore/fail.fixture.js @@ -1,6 +1,6 @@ 'use strict'; -describe('exclude test fail', function () { +describe('ignore test fail', function () { it('should not run this test', function () { throw new Error('should not run'); }); diff --git a/test/integration/fixtures/options/exclude/nested/fail.fixture.js b/test/integration/fixtures/options/ignore/nested/fail.fixture.js similarity index 68% rename from test/integration/fixtures/options/exclude/nested/fail.fixture.js rename to test/integration/fixtures/options/ignore/nested/fail.fixture.js index 5264ce7bff..88fb7c811f 100644 --- a/test/integration/fixtures/options/exclude/nested/fail.fixture.js +++ b/test/integration/fixtures/options/ignore/nested/fail.fixture.js @@ -1,6 +1,6 @@ 'use strict'; -describe('exclude test nested fail', function () { +describe('ignore test nested fail', function () { it('should not run this test', function () { throw new Error('should not run'); }); diff --git a/test/integration/fixtures/options/exclude/nested/pass.fixture.js b/test/integration/fixtures/options/ignore/nested/pass.fixture.js similarity index 56% rename from test/integration/fixtures/options/exclude/nested/pass.fixture.js rename to test/integration/fixtures/options/ignore/nested/pass.fixture.js index 36f55d138c..5351e1918d 100644 --- a/test/integration/fixtures/options/exclude/nested/pass.fixture.js +++ b/test/integration/fixtures/options/ignore/nested/pass.fixture.js @@ -1,5 +1,5 @@ 'use strict'; -describe('exclude test nested pass', function () { +describe('ignore test nested pass', function () { it('should find this test', function () {}); }); diff --git a/test/integration/fixtures/options/exclude/pass.fixture.js b/test/integration/fixtures/options/ignore/pass.fixture.js similarity index 60% rename from test/integration/fixtures/options/exclude/pass.fixture.js rename to test/integration/fixtures/options/ignore/pass.fixture.js index ada7e68678..8cb7779f09 100644 --- a/test/integration/fixtures/options/exclude/pass.fixture.js +++ b/test/integration/fixtures/options/ignore/pass.fixture.js @@ -1,5 +1,5 @@ 'use strict'; -describe('exclude test pass', function () { +describe('ignore test pass', function () { it('should find this test', function () {}); }); diff --git a/test/integration/options/exclude.spec.js b/test/integration/options/ignore.spec.js similarity index 65% rename from test/integration/options/exclude.spec.js rename to test/integration/options/ignore.spec.js index dc56410c1f..85d9de4204 100644 --- a/test/integration/options/exclude.spec.js +++ b/test/integration/options/ignore.spec.js @@ -5,7 +5,7 @@ var helpers = require('../helpers'); var runMochaJSON = helpers.runMochaJSON; var resolvePath = helpers.resolveFixturePath; -describe('--exclude', function() { +describe('--ignore', function() { /* * Runs mocha in {path} with the given args. * Calls handleResult with the result. @@ -26,11 +26,11 @@ describe('--exclude', function() { }); } - it('should exclude specific files', function(done) { - var fixtures = path.join('options', 'exclude', '*'); + it('should ignore specific files', function(done) { + var fixtures = path.join('options', 'ignore', '*'); runMochaTest( fixtures, - ['--exclude', resolvePath(path.join('options', 'exclude', 'fail'))], + ['--ignore', resolvePath(path.join('options', 'ignore', 'fail'))], function(res) { expect(res, 'to have passed') .and('to have run test', 'should find this test') @@ -40,11 +40,11 @@ describe('--exclude', function() { ); }); - it('should exclude globbed files', function(done) { - var fixtures = path.join('options', 'exclude', '**', '*'); + it('should ignore globbed files', function(done) { + var fixtures = path.join('options', 'ignore', '**', '*'); runMochaTest( fixtures, - ['--exclude', '**/fail.fixture.js'], + ['--ignore', '**/fail.fixture.js'], function(res) { expect(res, 'to have passed') .and('not to have pending tests') @@ -54,15 +54,15 @@ describe('--exclude', function() { ); }); - it('should exclude multiple patterns', function(done) { - var fixtures = path.join('options', 'exclude', '**', '*'); + it('should ignore multiple patterns', function(done) { + var fixtures = path.join('options', 'ignore', '**', '*'); runMochaTest( fixtures, [ - '--exclude', - resolvePath(path.join('options', 'exclude', 'fail')), - '--exclude', - resolvePath(path.join('options', 'exclude', 'nested', 'fail')) + '--ignore', + resolvePath(path.join('options', 'ignore', 'fail')), + '--ignore', + resolvePath(path.join('options', 'ignore', 'nested', 'fail')) ], function(res) { expect(res, 'to have passed') From 42a7e4e17ff7078936ef494dac37588588551edb Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 13 Mar 2019 17:07:09 -0700 Subject: [PATCH 1342/1771] fix extension handling; closes #3808 --- lib/cli/options.js | 29 +++++++++- lib/utils.js | 12 +++- test/node-unit/cli/options.spec.js | 90 +++++++++++++++++++++++++++--- 3 files changed, 119 insertions(+), 12 deletions(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index a033c39ac7..8ca16d88c2 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -10,7 +10,8 @@ const fs = require('fs'); const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); -const mocharc = require('../mocharc.json'); +// paranoia +const mocharc = Object.freeze(require('../mocharc.json')); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); @@ -321,6 +322,30 @@ const loadOptions = (argv = []) => { args.opts = false; args._ = args._.concat(optsConfig._ || []); } + // special case: "extension" option should not combine with default value. + // normally we want to combine "array"-type options, and we _do_ with "extension", but only + // within user-defined configuration (args or anything else). + // we must also search through any aliases of "extension" because while the arguments are /// + // normalized by this point, the config file values are not. + // only the "canonical" option name is used in `mocharc`, so we needn't worry about clearing + // multiple options. + // NOTE: as of this writing, "extension" is the only default value which is of an "array" type; + // it's unknown whether the the below strategy should be generalized to any other future + // "array"-type default option. + const processedMocharc = Object.assign({}, mocharc); + if ( + args.extension || + ['extension'] + .concat(aliases.extension) + .some( + opt => + Object.hasOwnProperty(rcConfig, opt) || + Object.hasOwnProperty(pkgConfig, opt) || + Object.hasOwnProperty(optsConfig, opt) + ) + ) { + delete processedMocharc.extension; + } args = parse( args._, @@ -328,7 +353,7 @@ const loadOptions = (argv = []) => { rcConfig || {}, pkgConfig || {}, optsConfig || {}, - mocharc + processedMocharc ); // recombine positional arguments and "spec" diff --git a/lib/utils.js b/lib/utils.js index 86ba8f0376..14c5ce126d 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -575,9 +575,15 @@ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { var stat; if (!fs.existsSync(filepath)) { - if (fs.existsSync(filepath + '.js')) { - filepath += '.js'; - } else { + // check all extensions + if ( + !extensions.some(function(ext) { + if (fs.existsSync(filepath + '.' + ext)) { + filepath += '.' + ext; + return true; + } + }) + ) { // Handle glob files = glob.sync(filepath); if (!files.length) { diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 3438a5564f..62a63f9fd6 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -27,7 +27,9 @@ const defaults = { timeout: 1000, timeouts: 1000, t: 1000, - opts: '/default/path/to/mocha.opts' + opts: '/default/path/to/mocha.opts', + extension: ['js'], + 'watch-extensions': ['js'] }; describe('options', function() { @@ -59,6 +61,7 @@ describe('options', function() { describe('loadOptions()', function() { describe('when no parameter provided', function() { beforeEach(function() { + this.timeout(500); readFileSync = sandbox.stub(); readFileSync.onFirstCall().returns('{}'); readFileSync.onSecondCall().returns('--retries 3'); @@ -497,8 +500,8 @@ describe('options', function() { beforeEach(function() { readFileSync = sandbox.stub(); config = '/some/.mocharc.json'; - readFileSync.onFirstCall().returns('--retries 3'); - readFileSync.onSecondCall().returns('{}'); + readFileSync.onFirstCall().returns('{}'); + readFileSync.onSecondCall().returns('--retries 3'); findConfig = sandbox.stub(); loadConfig = sandbox.stub().throws('Error', 'failed to parse'); findupSync = sandbox.stub().returns('/some/package.json'); @@ -542,8 +545,8 @@ describe('options', function() { beforeEach(function() { readFileSync = sandbox.stub(); - readFileSync.onFirstCall().returns('--retries 3'); - readFileSync.onSecondCall().returns('{}'); + readFileSync.onFirstCall().returns('{}'); + readFileSync.onSecondCall().throws(); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub().returns('/some/package.json'); @@ -578,8 +581,8 @@ describe('options', function() { beforeEach(function() { readFileSync = sandbox.stub(); - readFileSync.onFirstCall().returns('--retries 3'); - readFileSync.onSecondCall().returns('{}'); + readFileSync.onFirstCall().returns('{}'); + readFileSync.onSecondCall().throws(); findConfig = sandbox.stub().returns(null); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub().returns('/some/package.json'); @@ -716,5 +719,78 @@ describe('options', function() { }); }); }); + + describe('"extension" handling', function() { + describe('when user supplies "extension" option', function() { + let result; + + beforeEach(function() { + readFileSync = sandbox.stub(); + readFileSync.onFirstCall().throws(); + findConfig = sandbox.stub().returns('/some/.mocharc.json'); + loadConfig = sandbox.stub().returns({extension: ['tsx']}); + findupSync = sandbox.stub(); + loadOptions = proxyLoadOptions({ + readFileSync, + findConfig, + loadConfig, + findupSync + }); + result = loadOptions(['--extension', 'ts']); + }); + + it('should not concatenate the default value', function() { + expect(result, 'to have property', 'extension', ['ts', 'tsx']); + }); + }); + + describe('when user does not supply "extension" option', function() { + let result; + + beforeEach(function() { + readFileSync = sandbox.stub(); + readFileSync.onFirstCall().throws(); + findConfig = sandbox.stub().returns('/some/.mocharc.json'); + loadConfig = sandbox.stub().returns({}); + findupSync = sandbox.stub(); + loadOptions = proxyLoadOptions({ + readFileSync, + findConfig, + loadConfig, + findupSync + }); + result = loadOptions(); + }); + + it('should retain the default', function() { + expect(result, 'to have property', 'extension', ['js']); + }); + }); + }); + + describe('"spec" handling', function() { + describe('when user supplies "spec" in config and positional arguments', function() { + let result; + + beforeEach(function() { + readFileSync = sandbox.stub(); + readFileSync.onFirstCall().throws(); + findConfig = sandbox.stub().returns('/some/.mocharc.json'); + loadConfig = sandbox.stub().returns({spec: '*.spec.js'}); + findupSync = sandbox.stub(); + loadOptions = proxyLoadOptions({ + readFileSync, + findConfig, + loadConfig, + findupSync + }); + result = loadOptions(['*.test.js']); + }); + + it('should place both into the positional arguments array', function() { + expect(result, 'to have property', '_', ['*.test.js', '*.spec.js']); + }); + }); + }); }); }); From aed20bdb290db1bbf4ef173de297945702ee86e5 Mon Sep 17 00:00:00 2001 From: juergba Date: Thu, 25 Apr 2019 15:50:26 +0200 Subject: [PATCH 1343/1771] use yargs-parser options.default utils.js: fix lookupFiles() --- lib/cli/options.js | 35 +++++------------------------ lib/cli/run-helpers.js | 4 ++-- lib/utils.js | 20 ++++++++--------- test/integration/file-utils.spec.js | 13 +++++++---- 4 files changed, 26 insertions(+), 46 deletions(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index 8ca16d88c2..340fb01e86 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -10,8 +10,7 @@ const fs = require('fs'); const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); -// paranoia -const mocharc = Object.freeze(require('../mocharc.json')); +const mocharc = require('../mocharc.json'); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); @@ -81,11 +80,12 @@ const nargOpts = types.array /** * Wrapper around `yargs-parser` which applies our settings * @param {string|string[]} args - Arguments to parse + * @param {Object} defaultValues - Default values of mocharc.json * @param {...Object} configObjects - `configObjects` for yargs-parser * @private * @ignore */ -const parse = (args = [], ...configObjects) => { +const parse = (args = [], defaultValues = {}, ...configObjects) => { // save node-specific args for special handling. // 1. when these args have a "=" they should be considered to have values // 2. if they don't, they just boolean flags @@ -110,6 +110,7 @@ const parse = (args = [], ...configObjects) => { const result = yargsParser.detailed(args, { configuration, configObjects, + default: defaultValues, coerce: coerceOpts, narg: nargOpts, alias: aliases, @@ -322,38 +323,14 @@ const loadOptions = (argv = []) => { args.opts = false; args._ = args._.concat(optsConfig._ || []); } - // special case: "extension" option should not combine with default value. - // normally we want to combine "array"-type options, and we _do_ with "extension", but only - // within user-defined configuration (args or anything else). - // we must also search through any aliases of "extension" because while the arguments are /// - // normalized by this point, the config file values are not. - // only the "canonical" option name is used in `mocharc`, so we needn't worry about clearing - // multiple options. - // NOTE: as of this writing, "extension" is the only default value which is of an "array" type; - // it's unknown whether the the below strategy should be generalized to any other future - // "array"-type default option. - const processedMocharc = Object.assign({}, mocharc); - if ( - args.extension || - ['extension'] - .concat(aliases.extension) - .some( - opt => - Object.hasOwnProperty(rcConfig, opt) || - Object.hasOwnProperty(pkgConfig, opt) || - Object.hasOwnProperty(optsConfig, opt) - ) - ) { - delete processedMocharc.extension; - } args = parse( args._, + mocharc, args, rcConfig || {}, pkgConfig || {}, - optsConfig || {}, - processedMocharc + optsConfig || {} ); // recombine positional arguments and "spec" diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 6f3476d496..0858d61b03 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -219,7 +219,7 @@ exports.singleRun = (mocha, {files = [], exit = false} = {}) => { */ exports.watchRun = ( mocha, - {extension = ['js'], grep = '', ui = 'bdd', files = []} = {} + {extension = [], grep = '', ui = 'bdd', files = []} = {} ) => { let runner; @@ -291,7 +291,7 @@ exports.watchRun = ( */ exports.runMocha = ( mocha, - {watch = false, extension = ['js'], grep = '', ui = 'bdd', exit = false} = {}, + {watch = false, extension = [], grep = '', ui = 'bdd', exit = false} = {}, files = [] ) => { if (watch) { diff --git a/lib/utils.js b/lib/utils.js index 14c5ce126d..93005cedf2 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -562,7 +562,6 @@ function isHiddenOnUnix(pathname) { * * @public * @memberof Mocha.utils - * @todo Fix extension handling * @param {string} filepath - Base path to start searching from. * @param {string[]} extensions - File extensions to look for. * @param {boolean} recursive - Whether to recurse into subdirectories. @@ -571,19 +570,18 @@ function isHiddenOnUnix(pathname) { * @throws {TypeError} if `filepath` is directory and `extensions` not provided. */ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { + extensions = extensions || []; var files = []; var stat; if (!fs.existsSync(filepath)) { // check all extensions - if ( - !extensions.some(function(ext) { - if (fs.existsSync(filepath + '.' + ext)) { - filepath += '.' + ext; - return true; - } - }) - ) { + extensions.forEach(function(ext) { + if (fs.existsSync(filepath + '.' + ext)) { + files.push(filepath + '.' + ext); + } + }); + if (!files.length) { // Handle glob files = glob.sync(filepath); if (!files.length) { @@ -592,8 +590,8 @@ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { filepath ); } - return files; } + return files; } // Handle file @@ -624,7 +622,7 @@ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { // ignore error return; } - if (!extensions) { + if (!extensions.length) { throw createMissingArgumentError( util.format( 'Argument %s required when argument %s is a directory', diff --git a/test/integration/file-utils.spec.js b/test/integration/file-utils.spec.js index 3fe030ee46..f09018871b 100644 --- a/test/integration/file-utils.spec.js +++ b/test/integration/file-utils.spec.js @@ -58,7 +58,7 @@ describe('file utils', function() { ex.and('to have length', expectedLength); }); - it('should parse extensions from extnsions parameter', function() { + it('should parse extensions from extensions parameter', function() { var nonJsFile = tmpFile('mocha-utils-text.txt'); fs.writeFileSync(nonJsFile, 'yippy skippy ying yang yow'); @@ -66,9 +66,14 @@ describe('file utils', function() { expect(res, 'to contain', nonJsFile).and('to have length', 1); }); - it('should not require the extensions parameter when looking up a file', function() { - var res = utils.lookupFiles(tmpFile('mocha-utils'), undefined, false); - expect(res, 'to be', tmpFile('mocha-utils.js')); + it('should require the extensions parameter when looking up a file', function() { + var dirLookup = function() { + return utils.lookupFiles(tmpFile('mocha-utils'), undefined, false); + }; + expect(dirLookup, 'to throw', { + name: 'Error', + code: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN' + }); }); it('should require the extensions parameter when looking up a directory', function() { From 9b00fedb610241e33f7592c40164e42a38a793cf Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 8 May 2019 19:29:31 +0200 Subject: [PATCH 1344/1771] preserve-symlinks{-main} flags (#3900) Update unit test for Node-12 compatibility. --- test/node-unit/cli/node-flags.spec.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/node-unit/cli/node-flags.spec.js b/test/node-unit/cli/node-flags.spec.js index a66a17e4a2..1347f256a9 100644 --- a/test/node-unit/cli/node-flags.spec.js +++ b/test/node-unit/cli/node-flags.spec.js @@ -35,9 +35,12 @@ describe('node-flags', function() { it('should return true for flags starting with "preserve-symlinks"', function() { expect(isNodeFlag('preserve-symlinks'), 'to be true'); expect(isNodeFlag('preserve-symlinks-main'), 'to be true'); - // XXX this is not true in some newer versions of Node.js. figure out where - // this changed. - expect(isNodeFlag('preserve_symlinks'), 'to be false'); + // Node >= v12 both flags exist in process.allowedNodeEnvironmentFlags + const nodeVersion = parseInt(process.version.match(/^v(\d+)\./)[1], 10); + expect( + isNodeFlag('preserve_symlinks'), + nodeVersion >= 12 ? 'to be true' : 'to be false' + ); }); it('should return true for flags starting with "harmony-" or "harmony_"', function() { From ffbcbf63a447f67681b901979dde5d2c70919d24 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Sun, 12 May 2019 15:08:29 +0200 Subject: [PATCH 1345/1771] Document option to define custom report name for XUnit reporter (#3906) --- docs/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.md b/docs/index.md index 234682c4a4..a3fa090632 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1467,6 +1467,8 @@ The `xunit` reporter is also available. It outputs an XUnit-compatible XML docum By default, it will output to the console. To write directly to a file, use `--reporter-options output=filename.xml`. +To specify custom report title, use `--reporter-options suiteName="Custom name"`. + ### Third-Party Reporters Mocha allows you to define custom reporters. For more information see the [wiki][mocha-wiki-more-reporters]. From 8ce447181f0c6e1312a4d4f1f1c2f3e64e4f30cc Mon Sep 17 00:00:00 2001 From: Avi Vahl Date: Fri, 17 May 2019 07:48:17 +0300 Subject: [PATCH 1346/1771] chore: upgrade (most) depedencies to latest (#3903) * chore: upgrade several depedencies to latest only major is diff@4, which doesn't seem to break mocha's use. * chore: upgrade all devDeps to latest stable replaced coffee-script with coffeescript (fixes deprecation notice) and regenerate package-lock.json * Another round of upgrades now using debug@4, which still supports node@6 --- docs/index.md | 6 +- package-lock.json | 4386 ++++++++------------ package-scripts.js | 2 +- package.json | 64 +- test/integration/compiler-globbing.spec.js | 2 +- test/integration/options/compilers.spec.js | 2 +- test/integration/options/extension.spec.js | 2 +- 7 files changed, 1884 insertions(+), 2580 deletions(-) diff --git a/docs/index.md b/docs/index.md index a3fa090632..814b261ba9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -45,7 +45,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [extensible reporting, bundled with 9+ reporters](#reporters) - [extensible test DSLs or "interfaces"](#interfaces) - [before, after, before each, after each hooks](#hooks) -- [arbitrary transpiler support (coffee-script etc)](#-compilers) +- [arbitrary transpiler support (coffeescript etc)](#-compilers) - [TextMate bundle](#textmate) ## Table of Contents @@ -864,12 +864,12 @@ Configuration --package Path to package.json for config [string] File Handling - --ignore, --exclude Ignore file(s) or glob pattern(s) - [array] [default: (none)] --extension, --watch-extensions File extension(s) to load and/or watch [array] [default: js] --file Specify file(s) to be loaded prior to root suite execution [array] [default: (none)] + --ignore, --exclude Ignore file(s) or glob pattern(s) + [array] [default: (none)] --recursive Look for tests in subdirectories [boolean] --require, -r Require module [array] [default: (none)] --sort, -S Sort test files [boolean] diff --git a/package-lock.json b/package-lock.json index 2aeadf2b21..fa43458827 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,58 +5,56 @@ "requires": true, "dependencies": { "@11ty/eleventy": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.7.1.tgz", - "integrity": "sha512-tG5L9f2JcwLcoG6XnR8EOYMJWZIw7Gl33BDVct9dRh+upAL5qMPfwgPMN6kKdaMQ9ki42EBHKmLLAVRcyCk1yg==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.8.3.tgz", + "integrity": "sha512-TehjvEuVQaocz3R/rYMJdujg8a2SL4Wt+ZUPKfXZS926Wd14JqLpWtR/dTNPOh3JzAovZDNrOpFmwN3/urX6gQ==", "dev": true, "requires": { "browser-sync": "^2.26.3", "chalk": "^2.4.2", - "chokidar": "^2.0.4", + "chokidar": "^2.1.5", "debug": "^4.1.1", + "dependency-graph": "^0.8.0", "dependency-tree": "^6.3.0", "ejs": "^2.6.1", "fast-glob": "^2.2.6", "fs-extra": "^7.0.1", - "gray-matter": "^4.0.1", + "gray-matter": "^4.0.2", "hamljs": "^0.6.2", - "handlebars": "^4.0.12", - "javascript-stringify": "^1.6.0", - "liquidjs": "^6.2.0", + "handlebars": "^4.1.1", + "javascript-stringify": "^2.0.0", + "liquidjs": "^6.4.3", "lodash": "^4.17.11", - "luxon": "^1.9.0", + "luxon": "^1.12.0", "markdown-it": "^8.4.2", "minimist": "^1.2.0", "moo": "^0.5.0", "multimatch": "^3.0.0", "mustache": "^2.3.0", "normalize-path": "^3.0.0", - "nunjucks": "^3.1.6", + "nunjucks": "^3.2.0", "parse-filepath": "^1.0.2", "please-upgrade-node": "^3.1.1", "pretty": "^2.0.0", "pug": "^2.0.3", - "recursive-copy": "^2.0.9", - "semver": "^5.6.0", + "recursive-copy": "^2.0.10", + "semver": "^6.0.0", "slugify": "^1.3.4", "time-require": "^0.1.2", "valid-url": "^1.0.9" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true } } }, @@ -70,12 +68,12 @@ } }, "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.4", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", @@ -103,12 +101,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -123,71 +121,60 @@ } }, "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/runtime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", - "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", + "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", "dev": true, "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", "dev": true } } }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -216,6 +203,85 @@ "yargs": "^12.0.5" }, "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -234,18 +300,16 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -291,9 +355,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.1.tgz", - "integrity": "sha512-rgmZk5CrBGAMATk0HlHOFvo8V44/r+On6cKS80tqid0Eljd+fFBWBOXZp9H2/EB3faxdNdzXTx6QZIKLkbJ7mA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", + "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -310,9 +374,9 @@ } }, "@sinonjs/samsam": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.2.0.tgz", - "integrity": "sha512-j5F1rScewLtx6pbTK0UAjA3jJj4RYiSKOix53YWv+Jzy/AZ69qHxUpU8fwVLjyKbEEud9QrLpv6Ggs7WqTimYw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", + "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", "dev": true, "requires": { "@sinonjs/commons": "^1.0.2", @@ -327,9 +391,9 @@ "dev": true }, "@types/babel-types": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.6.tgz", - "integrity": "sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", + "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==", "dev": true }, "@types/babylon": { @@ -342,15 +406,21 @@ } }, "@types/node": { - "version": "10.12.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.29.tgz", - "integrity": "sha512-J/tnbnj8HcsBgCe2apZbdUpQ7hs4d7oZNTYA5bekWdP0sr2NGsOpI/HRdDroEi209tEvTcTtxhD0FfED3DhEcw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", + "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, "@types/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", - "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, "@types/unist": { @@ -409,13 +479,13 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { @@ -523,6 +593,12 @@ "repeat-string": "^1.5.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -566,9 +642,9 @@ } }, "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { "version": "3.2.0", @@ -637,6 +713,15 @@ "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -666,6 +751,12 @@ } } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -728,7 +819,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -750,6 +841,16 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -846,11 +947,12 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -884,9 +986,9 @@ "dev": true }, "assetgraph": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.1.tgz", - "integrity": "sha512-u9u6WDu1je6FraTV1Gx5/M8VhKsH6WuTdmz/7XDznwTYD2LZGU2rE/sJVUc2gwOOWF4Ztqa06sTmoW9OSrOdXA==", + "version": "5.8.4", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.4.tgz", + "integrity": "sha512-vDGeWPSaRihVny07KsyFHYXFh7w2ScbzKruxNi0pZ7OT3zKzU9ppxVFK1kNnFUEjicLKaFB5Ffh2xk2n6dGjNA==", "dev": true, "requires": { "acorn": "^6.1.0", @@ -907,25 +1009,26 @@ "estraverse": "^4.2.0", "estraverse-fb": "^1.3.2", "font-family-papandreou": "^0.2.0-patch1", - "font-tracer": "^1.0.1", + "font-snapper": "^1.0.0", + "font-tracer": "^1.1.0", "fontkit": "^1.7.7", "gettemporaryfilepath": "^1.0.0", "glob": "^7.0.5", - "html-minifier": "^3.5.8", + "html-minifier": "^4.0.0", "imageinfo": "^1.0.4", - "jsdom": "13.2.0", + "jsdom": "14.0.0", "lines-and-columns": "^1.1.6", "lodash": "4.17.11", "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", "perfectionist": "^2.4.0", - "postcss": "7.0.9", + "postcss": "^7.0.14", "postcss-values-parser": "^2.0.0", "read-pkg-up": "^4.0.0", "repeat-string": "^1.5.4", "schemes": "^1.0.1", - "semver": "^5.3.0", + "semver": "^6.0.0", "sift": "^7.0.1", "source-map": "~0.6.1", "specificity": "^0.4.0", @@ -979,17 +1082,6 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "postcss": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.9.tgz", - "integrity": "sha512-eXB2Fm8/BtSABq7ia1HyvbkoD9zFqq2BWjHUAyRSgbK8qdyKrA6yMCX06l05Onc8bHemeXLB8hzJ8tM0ABc0Zw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-values-parser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", @@ -1022,6 +1114,12 @@ "read-pkg": "^3.0.0" } }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1033,25 +1131,16 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "assetgraph-builder": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.0.tgz", - "integrity": "sha512-HGpCM92CtNKtk/ijQzIt2icWbHVe05qh4pI8XeEt+/AGy+nkHkAtL9l22aD5bEgsrdiWRbT67+6+4+yxrJj/Iw==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.1.tgz", + "integrity": "sha512-jRqme+K8BWVAlY3+qqkWH19/FD92aay0TqZzCfaH3HkTTqFPacIHiGA/DRvPPOxjl+wvIvjVNLWSG2QrPxtHrA==", "dev": true, "requires": { - "assetgraph": "5.8.1", + "assetgraph": "5.8.4", "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", "chalk": "^2.3.2", @@ -1070,14 +1159,6 @@ "pngcrush": "^2.0.1", "pngquant": "^2.0.1", "urltools": "^0.4.1" - }, - "dependencies": { - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", - "dev": true - } } }, "assetgraph-sprite": { @@ -1144,7 +1225,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1156,7 +1237,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1173,9 +1254,9 @@ "dev": true }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-each-series": { @@ -1210,18 +1291,18 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, "autoprefixer": { - "version": "9.4.10", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.10.tgz", - "integrity": "sha512-XR8XZ09tUrrSzgSlys4+hy5r2/z4Jp7Ag3pHm31U4g/CTccYPOVe19AkaJ4ey/vRd1sfj+5TtuD6I0PXtutjvQ==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", + "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", "dev": true, "requires": { - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000940", + "browserslist": "^4.5.4", + "caniuse-lite": "^1.0.30000957", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.14", @@ -1248,6 +1329,14 @@ "requires": { "follow-redirects": "^1.2.5", "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } } }, "babel-runtime": { @@ -1285,9 +1374,9 @@ "dev": true }, "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", + "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", "dev": true }, "balanced-match": { @@ -1484,9 +1573,9 @@ } }, "bin-version": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.0.0.tgz", - "integrity": "sha512-Ekhwm6AUiMbZ1LgVCNMkgjovpMR30FyQN74laAW9gs0NPjZR5gdY0ARNB0YsQG8GOme3CsHbxmeyq/7Ofq6QYQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", "dev": true, "requires": { "execa": "^1.0.0", @@ -1597,6 +1686,23 @@ "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", @@ -1645,9 +1751,9 @@ } }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "bindings": { @@ -1661,7 +1767,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1676,9 +1782,9 @@ "dev": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "dev": true }, "bn.js": { @@ -1688,21 +1794,21 @@ "dev": true }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { "debug": { @@ -1721,9 +1827,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } @@ -1797,7 +1903,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -1889,13 +1995,13 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { - "version": "2.26.3", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.3.tgz", - "integrity": "sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.5.tgz", + "integrity": "sha512-zVa6MmadAFgl5Uk53Yy5cw5tGTO7xSGAWK3Yx70GJ1t5jK+r6B4q3xq+1XbYfLt1SbeFg7WoNWneNhMT4B9jFw==", "dev": true, "requires": { - "browser-sync-client": "^2.26.2", - "browser-sync-ui": "^2.26.2", + "browser-sync-client": "^2.26.4", + "browser-sync-ui": "^2.26.4", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", "chokidar": "^2.0.4", @@ -1910,7 +2016,7 @@ "http-proxy": "1.15.2", "immutable": "^3", "localtunnel": "1.9.1", - "micromatch": "2.3.11", + "micromatch": "^3.1.10", "opn": "5.3.0", "portscanner": "2.1.1", "qs": "6.2.3", @@ -1932,32 +2038,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -1975,24 +2055,6 @@ "wrap-ansi": "^2.0.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -2004,18 +2066,18 @@ "universalify": "^0.1.0" } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -2025,24 +2087,6 @@ "number-is-nan": "^1.0.0" } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2052,36 +2096,6 @@ "invert-kv": "^1.0.0" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -2091,6 +2105,12 @@ "lcid": "^1.0.0" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -2117,8 +2137,18 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "y18n": { - "version": "3.2.1", + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true @@ -2157,9 +2187,9 @@ } }, "browser-sync-client": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.2.tgz", - "integrity": "sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.4.tgz", + "integrity": "sha512-mQiDp5/tf79VezDS5j/EExU4Ze6f5DQYuL0Z7VdJgBbNLTHDfkYGi2R620qc6HkY9XZA0m4/UwihT7J42RBIJA==", "dev": true, "requires": { "etag": "1.8.1", @@ -2169,9 +2199,9 @@ } }, "browser-sync-ui": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz", - "integrity": "sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", + "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", "dev": true, "requires": { "async-each-series": "0.1.1", @@ -2258,7 +2288,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2312,7 +2342,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2353,14 +2383,14 @@ } }, "browserslist": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.2.tgz", - "integrity": "sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz", + "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000939", - "electron-to-chromium": "^1.3.113", - "node-releases": "^1.1.8" + "caniuse-lite": "^1.0.30000967", + "electron-to-chromium": "^1.3.133", + "node-releases": "^1.1.19" } }, "bs-recipes": { @@ -2438,9 +2468,9 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "cache-base": { @@ -2512,6 +2542,18 @@ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2559,13 +2601,13 @@ } }, "camelcase": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.1.0.tgz", - "integrity": "sha512-WP9f9OBL/TAbwOFBJL79FoS9UKUmnp82RWnhlwTgrAJeMq7lytHhe0Jzc6/P7Zq0+2oviXJuPlvkZalWUug9gg==" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2594,19 +2636,20 @@ } }, "caniuse-lite": { - "version": "1.0.30000941", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz", - "integrity": "sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA==", + "version": "1.0.30000967", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", + "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==", "dev": true }, "canvas": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.1.tgz", - "integrity": "sha512-SaFomFqDuuuSTScTHQ7nXc5ea71Ieb8ctvwXjR7vzLsBMfp3euTv2xsTY70zIoC5r4sSQZYXv6tiHiORJ4y1vg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.5.0.tgz", + "integrity": "sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==", "dev": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.11.0" + "nan": "^2.13.2", + "node-pre-gyp": "^0.11.0", + "simple-get": "^3.0.3" } }, "capitalize": { @@ -2628,12 +2671,12 @@ "dev": true }, "catharsis": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", - "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", + "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", "dev": true, "requires": { - "underscore-contrib": "~0.3.0" + "lodash": "^4.17.11" } }, "caw": { @@ -2649,9 +2692,9 @@ } }, "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", + "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", "dev": true }, "center-align": { @@ -2699,21 +2742,21 @@ } }, "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", "dev": true }, "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", + "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==", "dev": true }, "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", "dev": true }, "character-parser": { @@ -2726,9 +2769,9 @@ } }, "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", "dev": true }, "chardet": { @@ -2744,9 +2787,9 @@ "dev": true }, "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -2760,18 +2803,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" - }, - "dependencies": { - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } + "upath": "^1.1.1" } }, "chownr": { @@ -2878,7 +2910,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -2923,21 +2955,23 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -2973,16 +3007,16 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "coffeescript": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz", + "integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg==", "dev": true }, "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", + "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", "dev": true }, "collection-visit": { @@ -2996,9 +3030,9 @@ } }, "color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", - "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", + "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -3054,7 +3088,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3067,18 +3101,18 @@ } }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, "comment-regex": { @@ -3099,6 +3133,12 @@ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "compare-module-exports": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", @@ -3160,6 +3200,12 @@ "is-extendable": "^0.1.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3193,6 +3239,23 @@ "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "connect": { @@ -3324,15 +3387,14 @@ "dev": true }, "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", + "js-yaml": "^3.13.0", "parse-json": "^4.0.0" }, "dependencies": { @@ -3364,12 +3426,33 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -3391,7 +3474,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3404,7 +3487,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3471,7 +3554,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -3734,9 +3817,9 @@ "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -3766,6 +3849,25 @@ "make-dir": "^1.0.0", "pify": "^2.3.0", "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + } } }, "decompress-response": { @@ -3889,6 +3991,23 @@ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3984,6 +4103,12 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, "dependency-tree": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-6.5.0.tgz", @@ -3994,17 +4119,6 @@ "debug": "^4.1.1", "filing-cabinet": "^2.3.0", "precinct": "^5.3.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "deps-sort": { @@ -4072,7 +4186,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4118,17 +4232,6 @@ "debug": "^4.0.0", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "detective-postcss": { @@ -4141,17 +4244,6 @@ "is-url": "^1.2.4", "postcss": "^7.0.2", "postcss-values-parser": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "detective-sass": { @@ -4163,17 +4255,6 @@ "debug": "^4.1.1", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "detective-scss": { @@ -4185,17 +4266,6 @@ "debug": "^4.1.1", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "detective-stylus": { @@ -4243,13 +4313,13 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4270,6 +4340,15 @@ "lodash.omit": "^4.5.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -4400,6 +4479,15 @@ "url-to-options": "^1.0.1" } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -4410,7 +4498,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4482,9 +4570,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", - "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", + "version": "1.3.133", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz", + "integrity": "sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==", "dev": true }, "elegant-spinner": { @@ -4688,6 +4776,12 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-promise": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", @@ -4696,7 +4790,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -4761,9 +4855,9 @@ } }, "eslint": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.0.tgz", - "integrity": "sha512-xwG7SS5JLeqkiR3iOmVgtF8Y6xPdtr6AAsN6ph7Q6R/fv+3UlKYoika8SmNzmb35qdRF+RfTY35kMEdtbi+9wg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4772,7 +4866,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.2", + "eslint-scope": "^4.0.3", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^5.0.1", @@ -4786,7 +4880,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.11", @@ -4804,24 +4898,6 @@ "text-table": "^0.2.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "import-fresh": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", @@ -4850,9 +4926,9 @@ } }, "eslint-config-prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", - "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.2.0.tgz", + "integrity": "sha512-y0uWc/FRfrHhpPZCYflWC8aE0KRJRY04rdZVfl8cL3sEZmOYyaBdhdlQPjKZBnuRMyLVK+JUZr7HaZFClQiH4w==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -4906,9 +4982,9 @@ } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -4943,21 +5019,22 @@ } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", "lodash": "^4.17.11", "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.10.0" }, "dependencies": { "debug": { @@ -4971,7 +5048,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -4988,6 +5065,12 @@ "locate-path": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5079,40 +5162,46 @@ } }, "eslint-plugin-node": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", - "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", + "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", "dev": true, "requires": { - "eslint-plugin-es": "^1.3.1", + "eslint-plugin-es": "^1.4.0", "eslint-utils": "^1.3.1", - "ignore": "^5.0.2", + "ignore": "^5.1.1", "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" + "resolve": "^1.10.1", + "semver": "^6.0.0" }, "dependencies": { "ignore": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", - "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true } } }, "eslint-plugin-prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", - "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", + "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", "dev": true }, "eslint-plugin-standard": { @@ -5122,9 +5211,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", - "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -5217,7 +5306,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5353,6 +5442,12 @@ "repeat-string": "^1.5.2" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -5362,6 +5457,12 @@ "kind-of": "^3.0.2" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -5416,9 +5517,9 @@ }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", + "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", "dev": true } } @@ -5478,17 +5579,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "extglob": { @@ -5612,17 +5702,6 @@ "is-glob": "^4.0.0", "merge2": "^1.2.3", "micromatch": "^3.1.10" - }, - "dependencies": { - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } } }, "fast-json-stable-stringify": { @@ -5683,12 +5762,6 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -5724,17 +5797,6 @@ "sass-lookup": "^3.0.0", "stylus-lookup": "^3.0.1", "typescript": "^3.0.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "fill-range": { @@ -5801,6 +5863,28 @@ "traverse-chain": "~0.1.0" } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", @@ -5816,19 +5900,19 @@ } }, "find-versions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", - "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.1.0.tgz", + "integrity": "sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==", "dev": true, "requires": { - "array-uniq": "^2.0.0", + "array-uniq": "^2.1.0", "semver-regex": "^2.0.0" }, "dependencies": { "array-uniq": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", - "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", + "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", "dev": true } } @@ -5845,13 +5929,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -5863,13 +5947,6 @@ "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "requires": { "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" - } } }, "flat-cache": { @@ -5908,6 +5985,17 @@ "dev": true, "requires": { "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "font-family-papandreou": { @@ -5916,6 +6004,16 @@ "integrity": "sha512-l6WMbeh7+Zd4TTu3yUUPR5KOepiuGLd/QAPfTIoX8ipTko0IF7PU6dsM4YM2zCDToEPIPSyCBKEJnKlSdYMgaA==", "dev": true }, + "font-snapper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/font-snapper/-/font-snapper-1.0.0.tgz", + "integrity": "sha512-8E91ADLNoLIXZGGRDuuK13SWPVbbxIwVkcIcvEoQdEpP13U20bOVXXrur4VxUff3pMImrot7cM/9vN0LwiJ32w==", + "dev": true, + "requires": { + "css-font-weight-names": "^0.2.1", + "font-family-papandreou": "^0.2.0-patch1" + } + }, "font-tracer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.1.0.tgz", @@ -5966,21 +6064,34 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6031,7 +6142,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6087,14 +6198,14 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -6172,12 +6283,12 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { @@ -6348,24 +6459,24 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.4", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.3", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, @@ -6393,13 +6504,13 @@ } }, "npm-bundled": { - "version": "1.0.5", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.2.0", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -6538,7 +6649,7 @@ "optional": true }, "semver": { - "version": "5.6.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -6706,7 +6817,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -6732,9 +6843,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -6799,9 +6910,9 @@ "dev": true }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6811,52 +6922,27 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.0" } } } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, "glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", @@ -6873,9 +6959,9 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globby": { @@ -6916,7 +7002,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -6925,7 +7011,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -6960,7 +7046,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7027,9 +7113,9 @@ "dev": true }, "handlebars": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", - "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7094,14 +7180,6 @@ "dev": true, "requires": { "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } } }, "has-color": { @@ -7168,6 +7246,12 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -7199,6 +7283,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, "hat": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", @@ -7276,31 +7369,23 @@ } }, "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" } }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -7330,15 +7415,16 @@ "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" }, "dependencies": { "statuses": { @@ -7407,24 +7493,35 @@ "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "husky": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", - "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-2.3.0.tgz", + "integrity": "sha512-A/ZQSEILoq+mQM3yC3RIBSaw1bYXdkKnyyKVSUiJl+iBjVZc5LQEXdGY1ZjrDxC4IzfRPiJ0IqzEQGCN5TQa/A==", "dev": true, "requires": { - "cosmiconfig": "^5.0.7", + "cosmiconfig": "^5.2.0", "execa": "^1.0.0", "find-up": "^3.0.0", - "get-stdin": "^6.0.0", + "get-stdin": "^7.0.0", "is-ci": "^2.0.0", - "pkg-dir": "^3.0.0", + "pkg-dir": "^4.1.0", "please-upgrade-node": "^3.1.1", - "read-pkg": "^4.0.1", + "read-pkg": "^5.1.1", "run-node": "^1.0.0", - "slash": "^2.0.0" + "slash": "^3.0.0" }, "dependencies": { "ci-info": { @@ -7434,9 +7531,9 @@ "dev": true }, "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", "dev": true }, "is-ci": { @@ -7458,36 +7555,31 @@ "json-parse-better-errors": "^1.0.1" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.1.0.tgz", + "integrity": "sha512-55k9QN4saZ8q518lE6EFgYiu95u3BWkSajCifhdQjvLvmr8IpnRbhI+UGpWJQfa0KzDguHeeWT1ccO1PmkOi3A==", "dev": true, "requires": { "find-up": "^3.0.0" } }, "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", + "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", "dev": true, "requires": { - "normalize-package-data": "^2.3.2", + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", "parse-json": "^4.0.0", - "pify": "^3.0.0" + "type-fest": "^0.4.1" } }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } @@ -7499,18 +7591,18 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -7640,9 +7732,9 @@ } }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -7656,7 +7748,7 @@ "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { @@ -7670,9 +7762,9 @@ } }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7698,6 +7790,12 @@ "xtend": "^4.0.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -7758,6 +7856,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7770,9 +7874,9 @@ } }, "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", "dev": true }, "is-alphanumeric": { @@ -7782,9 +7886,9 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", + "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -7807,10 +7911,9 @@ } }, "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" }, "is-callable": { "version": "1.1.4", @@ -7849,6 +7952,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7866,9 +7975,9 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", "dev": true }, "is-descriptor": { @@ -7896,21 +8005,6 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", @@ -7956,18 +8050,18 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } }, "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", "dev": true }, "is-installed-globally": { @@ -8007,6 +8101,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8029,7 +8129,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8095,18 +8195,6 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -8216,9 +8304,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", + "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", "dev": true }, "is-windows": { @@ -8228,9 +8316,9 @@ "dev": true }, "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", + "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", "dev": true }, "is-wsl": { @@ -8240,9 +8328,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, "isbinaryfile": { @@ -8272,61 +8360,119 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "append-transform": "^1.0.0" } }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } } }, - "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", - "dev": true - }, - "jpegtran": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", - "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "jpegtran-bin": "^4.0.0", - "memoizeasync": "^1.0.0", - "which": "^1.2.14" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" } }, - "jpegtran-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", - "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "javascript-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", + "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==", + "dev": true + }, + "jpegtran": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", + "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", + "dev": true, + "requires": { + "jpegtran-bin": "^4.0.0", + "memoizeasync": "^1.0.0", + "which": "^1.2.14" + } + }, + "jpegtran-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", + "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", "logalot": "^2.0.0" } }, @@ -8337,15 +8483,15 @@ "dev": true }, "js-beautify": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz", - "integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", + "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", "dev": true, "requires": { "config-chain": "^1.1.12", - "editorconfig": "^0.15.2", + "editorconfig": "^0.15.3", "glob": "^7.1.3", - "mkdirp": "~0.5.0", + "mkdirp": "~0.5.1", "nopt": "~4.0.1" } }, @@ -8377,12 +8523,12 @@ } }, "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", + "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", "dev": true, "requires": { - "xmlcreate": "^1.0.1" + "xmlcreate": "^2.0.0" } }, "jsbn": { @@ -8392,29 +8538,37 @@ "dev": true }, "jsdoc": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", - "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", - "dev": true, - "requires": { - "babylon": "7.0.0-beta.19", - "bluebird": "~3.5.0", - "catharsis": "~0.8.9", - "escape-string-regexp": "~1.0.5", - "js2xmlparser": "~3.0.0", - "klaw": "~2.0.0", - "marked": "~0.3.6", - "mkdirp": "~0.5.1", - "requizzle": "~0.2.1", - "strip-json-comments": "~2.0.1", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", + "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", + "dev": true, + "requires": { + "@babel/parser": "^7.4.4", + "bluebird": "^3.5.4", + "catharsis": "^0.8.10", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.0", + "klaw": "^3.0.0", + "markdown-it": "^8.4.2", + "markdown-it-anchor": "^5.0.2", + "marked": "^0.6.2", + "mkdirp": "^0.5.1", + "requizzle": "^0.2.2", + "strip-json-comments": "^3.0.1", "taffydb": "2.6.2", - "underscore": "~1.8.3" + "underscore": "~1.9.1" }, "dependencies": { - "babylon": { - "version": "7.0.0-beta.19", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", - "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "taffydb": { @@ -8422,19 +8576,13 @@ "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true } } }, "jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", - "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz", + "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==", "dev": true, "requires": { "abab": "^2.0.0", @@ -8472,9 +8620,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -8578,9 +8726,9 @@ } }, "jszip": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", - "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", + "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -8610,9 +8758,9 @@ "dev": true }, "karma": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", - "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", "dev": true, "requires": { "bluebird": "^3.3.0", @@ -8645,9 +8793,9 @@ }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", + "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", "dev": true }, "source-map": { @@ -8693,7 +8841,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -8748,9 +8896,9 @@ "dev": true }, "klaw": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", - "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -8851,9 +8999,9 @@ } }, "lint-staged": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.5.tgz", - "integrity": "sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.6.tgz", + "integrity": "sha512-QT13AniHN6swAtTjsrzxOfE4TVCiQ39xESwLmjGVNCMMZ/PK5aopwvbxLrzw+Zf9OxM3cQG6WCx9lceLzETOnQ==", "dev": true, "requires": { "chalk": "^2.3.1", @@ -8880,9 +9028,18 @@ "staged-git-files": "1.1.2", "string-argv": "^0.0.2", "stringify-object": "^3.2.2", - "yup": "^0.26.10" + "yup": "^0.27.0" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -8918,14 +9075,11 @@ } } }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true }, "pify": { "version": "3.0.0", @@ -8962,6 +9116,12 @@ "is-extendable": "^0.1.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -8999,16 +9159,10 @@ "rxjs": "^6.3.3" }, "dependencies": { - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", - "dev": true - }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -9080,7 +9234,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -9175,6 +9329,12 @@ "ms": "2.0.0" } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -9214,6 +9374,12 @@ "lcid": "^1.0.0" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -9240,6 +9406,16 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -9328,10 +9504,10 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lodash.isfinite": { @@ -9442,16 +9618,16 @@ } }, "log4js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", - "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.2.0.tgz", + "integrity": "sha512-1dJ2ORJcdqbzxvzKM2ceqPBh4O6bbICJpB4dvSEUoMcb14s8MqQ/54zNPqekuN5yjGtxO3GUDTvZfQOQhwdqnA==", "dev": true, "requires": { "date-format": "^2.0.0", - "debug": "^3.1.0", + "debug": "^4.1.1", "flatted": "^2.0.0", "rfdc": "^1.1.2", - "streamroller": "^1.0.1" + "streamroller": "^1.0.5" } }, "logalot": { @@ -9465,9 +9641,9 @@ } }, "lolex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", - "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.0.1.tgz", + "integrity": "sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw==", "dev": true }, "longest": { @@ -9477,9 +9653,9 @@ "dev": true }, "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", + "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==", "dev": true }, "loud-rejection": { @@ -9527,14 +9703,14 @@ } }, "luxon": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.12.1.tgz", - "integrity": "sha512-Zv/qJb2X1ESTrlniAViWx2aqGwi2cVpeoZFTbPdPiCu4EsadKsmb/QCH8HQjMUpDZKKJIHKHsJxV5Rwpq47HKQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.13.2.tgz", + "integrity": "sha512-U7i2AE+/VWeB8PZZkIeEcxJCZvBA8LegCHufaIFYx3qRQdw2UJw3fuaL/Fqi9Q+2MeFYu+gYqIzr5hWOvAMHBQ==", "dev": true }, "magic-string": { "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -9542,14 +9718,13 @@ } }, "magicpen": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-5.12.0.tgz", - "integrity": "sha1-u+nunUI2R2rs+EE27KGDPrRwqWs=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-6.0.2.tgz", + "integrity": "sha512-zGaX9FDqnM0P1iZLl7CQsB+cj7NzVLClpCEVAS0GQBWg3u2QEg5Gs4247pVRxb265q/ZUTCB+lB6+NfPu+L63A==", "dev": true, "requires": { "ansi-styles": "2.0.0", - "color-diff": "0.1.7", - "supports-color": "1.2.0" + "color-diff": "0.1.7" }, "dependencies": { "ansi-styles": { @@ -9557,28 +9732,23 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.0.tgz", "integrity": "sha1-QysmFi/qG2PIeIlqvIzFVI8lBj4=", "dev": true - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true } } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "dependencies": { "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } @@ -9611,7 +9781,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -9625,9 +9795,9 @@ } }, "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", + "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", "dev": true }, "markdown-it": { @@ -9650,9 +9820,9 @@ "dev": true }, "markdown-it-attrs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.3.2.tgz", - "integrity": "sha512-DyatNvpatg7w+fGkplWGeie7o/0TogBr2w0izyz9ZQfTMv5G3lbDHQFQ42aP2e5L2mJQt0IeAjWzvYaa2d9xzQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.3.4.tgz", + "integrity": "sha512-DwGzugbveSUfRiUuxIC7svr8i+x3e3/eUJ7U7GRduNa2SO5Qyd2rZtjx6j0c3uS2xCIddZFcydEVlbg6C3s2vA==", "dev": true }, "markdown-it-prism": { @@ -9708,7 +9878,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -9783,9 +9953,9 @@ } }, "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, "markdown-toc": { @@ -9808,6 +9978,12 @@ "strip-color": "^0.1.0" }, "dependencies": { + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -9841,42 +10017,42 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "markdownlint": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.12.0.tgz", - "integrity": "sha512-bjur6ZP0yKHVYh1U5+xD+bVkouKiUyiVzg9c9qkytYRW2nDfSowifKSmpPeO0uZHxzZOYMcV2Oe7sycPOEqMOQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.14.1.tgz", + "integrity": "sha512-W3RxMP8GYyJAhgUXIXvBOXT2ai89qDIuLf2ZM0Xd+XcwXBS6Hu06Hg2UKNwMDPTy0uQK8YWCH4hkdxlevm/BgQ==", "dev": true, "requires": { "markdown-it": "8.4.2" } }, "markdownlint-cli": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.14.1.tgz", - "integrity": "sha512-bHueUEp1NmSFPWvOk3SNWhRRAInrdvmuzlkMrZJptUF6jNXJ32OhPXicRw2xg43+NLiUI01V5sc1VIrRWLKgig==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.16.0.tgz", + "integrity": "sha512-BmtWhDvbsnbgYirYOiSOxP8THhkCjp28+xVfTyj3D1JsOlj0Txf3IA9wlT5GHCYaR6QfDlWq4pz/rh+bfOw2Vg==", "dev": true, "requires": { "commander": "~2.9.0", "deep-extend": "~0.5.1", "get-stdin": "~5.0.1", "glob": "~7.1.2", - "js-yaml": "~3.13.0", + "js-yaml": "^3.13.1", "lodash.differencewith": "~4.5.0", "lodash.flatten": "~4.4.0", - "markdownlint": "~0.12.0", + "markdownlint": "~0.14.1", "minimatch": "~3.0.4", "rc": "~1.2.7" }, "dependencies": { "commander": { "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -9898,9 +10074,9 @@ } }, "marked": { - "version": "0.3.19", - "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", "dev": true }, "matcher": { @@ -9987,17 +10163,17 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, @@ -10013,7 +10189,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10048,7 +10224,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10066,7 +10242,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10125,24 +10301,24 @@ "dev": true }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.40.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -10172,7 +10348,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10231,7 +10407,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -10294,17 +10470,6 @@ "find": "^0.3.0", "requirejs": "^2.3.5", "requirejs-config-file": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "moo": { @@ -10343,9 +10508,9 @@ "dev": true }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true }, "nanomatch": { @@ -10380,43 +10545,43 @@ "dev": true }, "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "dev": true, "requires": { - "debug": "^2.1.2", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, "nice-try": { @@ -10455,9 +10620,9 @@ } }, "node-abi": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", - "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", + "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", "dev": true, "requires": { "semver": "^5.4.1" @@ -10470,13 +10635,6 @@ "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } } }, "node-libs-browser": { @@ -10512,7 +10670,7 @@ "dependencies": { "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -10527,6 +10685,12 @@ "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -10550,7 +10714,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -10565,7 +10729,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -10593,9 +10757,9 @@ } }, "node-releases": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.9.tgz", - "integrity": "sha512-oic3GT4OtbWWKfRolz5Syw0Xus0KRFxeorLNj0s93ofX6PWyuzKjsiGxsCtWktBwwmTF6DdRRf2KreGqeOk5KA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.19.tgz", + "integrity": "sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==", "dev": true, "requires": { "semver": "^5.3.0" @@ -10737,9 +10901,9 @@ } }, "nps": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.4.tgz", - "integrity": "sha512-4RFiRTG0/hwcdTqfhwOT2sxtC7JEElyZDTsa3DIhf4ekFFL/87y2JvPAIRZJWVnEp+tG2a7qzv0eJE4NgJLlDg==", + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.5.tgz", + "integrity": "sha512-UsjrtowHeXGnKELZUlqiyPSXc3vYs3YwLZEFfZJ1Z9kZCFgtzK4YRVKnxEa+teRMMdw6Q4keAX/M/aLCkPTqIw==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -10827,6 +10991,12 @@ "locate-path": "^2.0.0" } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -10888,6 +11058,12 @@ "mimic-fn": "^1.0.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -10953,6 +11129,12 @@ "read-pkg": "^2.0.0" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10968,6 +11150,29 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -11126,6 +11331,16 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -11150,1042 +11365,64 @@ } }, "nwsapi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", - "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", "dev": true, "requires": { "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", + "caching-transform": "^3.0.2", "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", + "test-exclude": "^5.2.3", "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "source-map": "^0.6.1" } }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "camelcase": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { + "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "yallist": { - "version": "2.1.2", - "bundled": true, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "yargs": { - "version": "12.0.5", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -12227,6 +11464,12 @@ "is-descriptor": "^0.1.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -12245,9 +11488,9 @@ "dev": true }, "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-path": { "version": "0.9.2", @@ -12284,16 +11527,6 @@ "es-abstract": "^1.5.1" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -12332,6 +11565,23 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", @@ -12419,7 +11669,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12441,7 +11691,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12490,9 +11740,9 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { "version": "2.2.0", @@ -12511,9 +11761,9 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, "p-map-series": { @@ -12541,9 +11791,21 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } }, "package-json": { "version": "4.0.1", @@ -12573,18 +11835,18 @@ } }, "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" }, "dependencies": { "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true } } @@ -12646,35 +11908,6 @@ "path-root": "^0.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -12715,9 +11948,9 @@ } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -12751,7 +11984,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12828,7 +12061,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12913,7 +12146,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12957,7 +12190,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13188,9 +12421,9 @@ "dev": true }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -13203,15 +12436,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13652,9 +12876,9 @@ } }, "prebuild-install": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", - "integrity": "sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", + "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", "dev": true, "requires": { "detect-libc": "^1.0.3", @@ -13677,7 +12901,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -13723,17 +12947,6 @@ "detective-typescript": "^4.1.2", "module-definition": "^3.1.0", "node-source-walk": "^4.2.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "prefix-matches": { @@ -13758,16 +12971,10 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", + "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", "dev": true }, "prettier-linter-helpers": { @@ -13803,7 +13010,7 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, @@ -13817,9 +13024,9 @@ } }, "prismjs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", - "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", + "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -14154,7 +13361,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14209,20 +13416,20 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, @@ -14240,7 +13447,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -14308,7 +13515,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14319,6 +13526,14 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "readdirp": { @@ -14372,15 +13587,6 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -14422,6 +13628,15 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remark": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", @@ -14557,6 +13772,12 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -14635,9 +13856,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "requirejs": { "version": "2.3.6", @@ -14654,24 +13875,6 @@ "esprima": "^4.0.0", "make-dir": "^2.1.0", "stringify-object": "^3.2.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } } }, "requires-port": { @@ -14681,26 +13884,18 @@ "dev": true }, "requizzle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", - "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", + "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", "dev": true, "requires": { - "underscore": "~1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } + "lodash": "^4.17.11" } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -14768,17 +13963,6 @@ "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" - }, - "dependencies": { - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } } }, "restructure": { @@ -14797,9 +13981,9 @@ "dev": true }, "rewiremock": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.0.tgz", - "integrity": "sha512-1MkO4mX4j31GilbMsqdgLNXjmrHo9EUKQFCa82rLye8ltOHnJe0rRaHUSKz2yUClr8l0Qnj1ZTjZHmp6vNTrzQ==", + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.7.tgz", + "integrity": "sha512-U6iFfdXPiNtIBDcJWmspl/nhVk1EANkXLq2GM78T3ZfegvO5EW0TgNzExLh5iHXFJKQr//SmH9iloK/s4O7UqA==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -14813,9 +13997,9 @@ } }, "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, "rgb-regex": { @@ -14826,7 +14010,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -14896,7 +14080,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14919,9 +14103,9 @@ } }, "sauce-connect-launcher": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz", - "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.6.tgz", + "integrity": "sha512-yBTYfzI6AWRwoXJoIqmVgz+eCpWX6CsJ4Ap8fowjsGlN+27OKbnQxv6POd4Rzh57BH9WeA9K8orIzNxO8mMBQA==", "dev": true, "requires": { "adm-zip": "~0.4.3", @@ -15007,7 +14191,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15047,9 +14231,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "semver-compare": { "version": "1.0.0", @@ -15111,12 +14295,30 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -15149,11 +14351,35 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true } } }, @@ -15231,14 +14457,14 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15273,7 +14499,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15341,23 +14567,12 @@ } }, "simple-git": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", - "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==", + "version": "1.113.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.113.0.tgz", + "integrity": "sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==", "dev": true, "requires": { "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "simple-swizzle": { @@ -15378,20 +14593,26 @@ } }, "sinon": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.7.tgz", - "integrity": "sha512-rlrre9F80pIQr3M36gOdoCEWzFAMDgHYD8+tocqOw+Zw9OZ8F84a80Ds69eZfcjnzDqqG88ulFld0oin/6rG/g==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", + "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.1", + "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.2.0", + "@sinonjs/samsam": "^3.3.1", "diff": "^3.5.0", - "lolex": "^3.1.0", + "lolex": "^4.0.1", "nise": "^1.4.10", "supports-color": "^5.5.0" }, "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -15537,6 +14758,12 @@ "kind-of": "^3.2.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -15590,12 +14817,6 @@ "yeast": "0.1.2" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15713,12 +14934,6 @@ "ms": "2.0.0" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15803,9 +15018,9 @@ } }, "source-map-support": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", - "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -15842,6 +15057,20 @@ "spawn-command": "^0.0.2-1" } }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -15869,9 +15098,9 @@ } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "specificity": { @@ -15882,7 +15111,7 @@ }, "split": { "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15987,14 +15216,14 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", + "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", "dev": true }, "static-eval": { @@ -16111,7 +15340,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16162,16 +15391,16 @@ } }, "streamroller": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", - "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", + "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", "dev": true, "requires": { - "async": "^2.6.1", + "async": "^2.6.2", "date-format": "^2.0.0", - "debug": "^3.1.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.10" + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11" }, "dependencies": { "async": { @@ -16182,6 +15411,15 @@ "requires": { "lodash": "^4.17.11" } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } } } }, @@ -16255,17 +15493,17 @@ } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, @@ -16301,7 +15539,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -16359,17 +15597,6 @@ "requires": { "commander": "^2.8.1", "debug": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "subarg": { @@ -16383,24 +15610,24 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } }, "svgo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.0.tgz", - "integrity": "sha512-xBfxJxfk4UeVN8asec9jNxHiv3UAMv/ujwBWGYvQhhMb2u3YTGKkiybPcLFDLq7GLLWE9wa73e0/m8L5nTzQbw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -16410,7 +15637,7 @@ "css-tree": "1.0.0-alpha.28", "css-url-regex": "^1.1.0", "csso": "^3.5.1", - "js-yaml": "^3.12.0", + "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", @@ -16471,9 +15698,9 @@ } }, "synchronous-promise": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.6.tgz", - "integrity": "sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.7.tgz", + "integrity": "sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A==", "dev": true }, "syntax-error": { @@ -16486,9 +15713,9 @@ } }, "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", "dev": true, "requires": { "ajv": "^6.9.1", @@ -16498,14 +15725,14 @@ }, "dependencies": { "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } } } @@ -16517,9 +15744,9 @@ "dev": true }, "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, "tar": { @@ -16607,7 +15834,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16661,49 +15888,127 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" } }, - "get-stream": { + "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } } @@ -16790,7 +16095,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16916,6 +16221,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -16957,16 +16268,14 @@ "requires": { "is-buffer": "^2.0.0", "vfile": "^3.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "token-stream": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", @@ -17038,15 +16347,15 @@ "dev": true }, "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", + "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", "dev": true }, "trough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", - "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", + "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", "dev": true }, "tslib": { @@ -17091,14 +16400,20 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -17108,9 +16423,9 @@ "dev": true }, "typescript": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", - "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, "typescript-eslint-parser": { @@ -17144,21 +16459,15 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", + "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17221,23 +16530,6 @@ "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, "underscore.string": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", @@ -17245,19 +16537,18 @@ "dev": true }, "unexpected": { - "version": "10.40.2", - "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.40.2.tgz", - "integrity": "sha512-xwLScBxEnHiK8H8yLblQ6u3Uoammhpk+oCB/HWiNY6exMEwxenUR+eWIKderEXQPOlZkUEakBAKborGJqK6hZQ==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-11.5.1.tgz", + "integrity": "sha512-Zqr5aRiH4cRtXtaWm7LyAR6dwpQXs4u9a+VrR11eNDGAXuE7qKy6rsMTKgk/CVzeDkSASn7T9MardgoJc1eDog==", "dev": true, "requires": { "array-changes": "3.0.1", "array-changes-async": "3.0.1", - "babel-runtime": "6.26.0", "detect-indent": "3.0.1", - "diff": "1.1.0", + "diff": "4.0.1", "greedy-interval-packer": "1.2.0", "leven": "2.1.0", - "magicpen": "5.12.0", + "magicpen": "^6.0.2", "unexpected-bluebird": "2.9.34-longstack2" }, "dependencies": { @@ -17272,12 +16563,6 @@ "repeating": "^1.1.0" } }, - "diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.1.0.tgz", - "integrity": "sha1-eYpJOBqkZBUem08Ob/Kwmooa0j8=", - "dev": true - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -17308,15 +16593,15 @@ "dev": true }, "unexpected-sinon": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.1.tgz", - "integrity": "sha512-2zSX7vsOYlljjS/3DeQolFzYgA22PmH0ncLCva+ve2AHHJBO0Xnxyt8ri1en1W5b7nRg5F7N6HNdflVNhI7dww==", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.2.tgz", + "integrity": "sha512-N2KIKPweTVs6AK8cDKQTUwu0fGWyGt+cI/UJZ/eltAyOKgsHL9eILttdGfpZjI/iMYcHcbtUwIlXoHfmh6EcBw==", "dev": true }, "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", + "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -17455,9 +16740,9 @@ } }, "unist-util-visit-parents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", - "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.0.tgz", + "integrity": "sha512-j0XZY3063E6v7qhx4+Q2Z0r8SMrLX7Mr6DabiCy67zMEcFQYtpNOplLlEK1KKEBEs9S+xB5U+yloQxbSwF9P/g==", "dev": true, "requires": { "unist-util-is": "^2.1.2" @@ -17524,6 +16809,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -17534,9 +16825,9 @@ "dev": true }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "update-notifier": { @@ -17707,9 +16998,9 @@ } }, "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", "dev": true }, "verror": { @@ -17733,20 +17024,6 @@ "replace-ext": "1.0.0", "unist-util-stringify-position": "^1.0.0", "vfile-message": "^1.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - } } }, "vfile-location": { @@ -17842,17 +17119,6 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "whatwg-mimetype": { @@ -17946,43 +17212,23 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -18032,6 +17278,15 @@ "write-file-atomic": "^2.0.0" }, "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -18100,9 +17355,9 @@ "dev": true }, "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", + "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", "dev": true }, "xmldom": { @@ -18135,11 +17390,11 @@ "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", @@ -18149,44 +17404,25 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.0" }, "dependencies": { - "get-caller-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", - "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "strip-ansi": "^5.1.0" } } } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -18202,6 +17438,76 @@ "yargs": "^12.0.5" }, "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -18219,17 +17525,15 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -18251,16 +17555,16 @@ "dev": true }, "yup": { - "version": "0.26.10", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.26.10.tgz", - "integrity": "sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", + "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", "dev": true, "requires": { - "@babel/runtime": "7.0.0", + "@babel/runtime": "^7.0.0", "fn-name": "~2.0.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.5", + "synchronous-promise": "^2.0.6", "toposort": "^2.0.2" } } diff --git a/package-scripts.js b/package-scripts.js index 7febdc016f..7a84e550b7 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -137,7 +137,7 @@ module.exports = { script: test( 'requires', [ - '--require coffee-script/register', + '--require coffeescript/register', '--require test/require/a.js', '--require test/require/b.coffee', '--require test/require/c.js', diff --git a/package.json b/package.json index 67f1aae4f0..272d5249b5 100644 --- a/package.json +++ b/package.json @@ -504,13 +504,13 @@ "version": "nps version" }, "dependencies": { - "ansi-colors": "3.2.3", + "ansi-colors": "3.2.4", "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", + "debug": "4.1.1", + "diff": "4.0.1", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", - "glob": "7.1.3", + "glob": "7.1.4", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", @@ -521,68 +521,68 @@ "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", + "supports-color": "6.1.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", + "yargs": "13.2.4", + "yargs-parser": "13.1.0", "yargs-unparser": "1.5.0" }, "devDependencies": { - "@11ty/eleventy": "^0.7.1", + "@11ty/eleventy": "^0.8.3", "@mocha/contributors": "^1.0.3", "@mocha/docdash": "^2.1.0", - "assetgraph-builder": "^6.10.0", - "autoprefixer": "^9.4.10", + "assetgraph-builder": "^6.10.1", + "autoprefixer": "^9.5.1", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", - "coffee-script": "^1.12.7", + "coffeescript": "^2.4.1", "coveralls": "^3.0.3", "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", - "eslint": "^5.15.0", - "eslint-config-prettier": "^3.6.0", + "eslint": "^5.16.0", + "eslint-config-prettier": "^4.2.0", "eslint-config-semistandard": "^13.0.0", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-node": "^8.0.1", - "eslint-plugin-prettier": "^3.0.1", - "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-import": "^2.17.2", + "eslint-plugin-node": "^9.0.1", + "eslint-plugin-prettier": "^3.1.0", + "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", - "husky": "^1.3.1", - "jsdoc": "^3.5.5", - "karma": "^4.0.1", + "husky": "^2.3.0", + "jsdoc": "^3.6.2", + "karma": "^4.1.0", "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", "karma-sauce-launcher": "^2.0.2", - "lint-staged": "^8.1.5", + "lint-staged": "^8.1.6", "markdown-it": "^8.4.2", "markdown-it-anchor": "^5.0.2", - "markdown-it-attrs": "^2.3.2", + "markdown-it-attrs": "^2.3.4", "markdown-it-prism": "^2.0.1", "markdown-magic": "^0.1.25", "markdown-magic-package-json": "^2.0.0", "markdown-toc": "^1.2.0", - "markdownlint-cli": "^0.14.1", - "nps": "^5.9.4", - "nyc": "^13.3.0", - "prettier": "^1.16.4", + "markdownlint-cli": "^0.16.0", + "nps": "^5.9.5", + "nyc": "^14.1.1", + "prettier": "^1.17.1", "remark": "^10.0.1", "remark-github": "^7.0.6", "remark-inline-links": "^3.1.2", - "rewiremock": "^3.13.0", + "rewiremock": "^3.13.7", "rimraf": "^2.6.3", - "sinon": "^7.2.7", - "strip-ansi": "^5.0.0", - "svgo": "^1.2.0", + "sinon": "^7.3.2", + "strip-ansi": "^5.2.0", + "svgo": "^1.2.2", "through2": "^3.0.1", "to-vfile": "^5.0.2", - "unexpected": "^10.40.2", + "unexpected": "^11.5.1", "unexpected-eventemitter": "^1.1.3", - "unexpected-sinon": "^10.11.1", + "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", "watchify": "^3.11.1" }, diff --git a/test/integration/compiler-globbing.spec.js b/test/integration/compiler-globbing.spec.js index 20ea050e4d..f245f4ab91 100644 --- a/test/integration/compiler-globbing.spec.js +++ b/test/integration/compiler-globbing.spec.js @@ -10,7 +10,7 @@ describe('globbing like --compilers', function() { process.execPath + '" "' + path.join('bin', 'mocha') + - '" -R json --require coffee-script/register --require test/compiler-fixtures/foo.fixture "test/compiler/*.@(coffee|foo)"', + '" -R json --require coffeescript/register --require test/compiler-fixtures/foo.fixture "test/compiler/*.@(coffee|foo)"', {cwd: path.join(__dirname, '..', '..')}, function(error, stdout) { if (error && !stdout) { diff --git a/test/integration/options/compilers.spec.js b/test/integration/options/compilers.spec.js index 99fa79a7f5..ea4826ccda 100644 --- a/test/integration/options/compilers.spec.js +++ b/test/integration/options/compilers.spec.js @@ -6,7 +6,7 @@ var invokeMocha = helpers.invokeMocha; describe('--compilers', function() { it('should report deprecation', function(done) { invokeMocha( - ['--compilers', 'coffee:coffee-script/register'], + ['--compilers', 'coffee:coffeescript/register'], function(err, res) { if (err) { return done(err); diff --git a/test/integration/options/extension.spec.js b/test/integration/options/extension.spec.js index 760e3bcd88..d07ab129fe 100644 --- a/test/integration/options/extension.spec.js +++ b/test/integration/options/extension.spec.js @@ -8,7 +8,7 @@ describe('--extension', function() { it('should allow comma-separated variables', function(done) { var args = [ '--require', - 'coffee-script/register', + 'coffeescript/register', '--require', './test/setup', '--reporter', From 94033bf5f5d4266caa8b53f3eb4b1b1de76a114c Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 17 May 2019 11:06:20 +0200 Subject: [PATCH 1347/1771] Revert "chore: upgrade (most) depedencies to latest (#3903)" (#3918) This reverts commit 8ce447181f0c6e1312a4d4f1f1c2f3e64e4f30cc. --- docs/index.md | 6 +- package-lock.json | 4412 +++++++++++--------- package-scripts.js | 2 +- package.json | 64 +- test/integration/compiler-globbing.spec.js | 2 +- test/integration/options/compilers.spec.js | 2 +- test/integration/options/extension.spec.js | 2 +- 7 files changed, 2593 insertions(+), 1897 deletions(-) diff --git a/docs/index.md b/docs/index.md index 814b261ba9..a3fa090632 100644 --- a/docs/index.md +++ b/docs/index.md @@ -45,7 +45,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [extensible reporting, bundled with 9+ reporters](#reporters) - [extensible test DSLs or "interfaces"](#interfaces) - [before, after, before each, after each hooks](#hooks) -- [arbitrary transpiler support (coffeescript etc)](#-compilers) +- [arbitrary transpiler support (coffee-script etc)](#-compilers) - [TextMate bundle](#textmate) ## Table of Contents @@ -864,12 +864,12 @@ Configuration --package Path to package.json for config [string] File Handling + --ignore, --exclude Ignore file(s) or glob pattern(s) + [array] [default: (none)] --extension, --watch-extensions File extension(s) to load and/or watch [array] [default: js] --file Specify file(s) to be loaded prior to root suite execution [array] [default: (none)] - --ignore, --exclude Ignore file(s) or glob pattern(s) - [array] [default: (none)] --recursive Look for tests in subdirectories [boolean] --require, -r Require module [array] [default: (none)] --sort, -S Sort test files [boolean] diff --git a/package-lock.json b/package-lock.json index fa43458827..2aeadf2b21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,56 +5,58 @@ "requires": true, "dependencies": { "@11ty/eleventy": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.8.3.tgz", - "integrity": "sha512-TehjvEuVQaocz3R/rYMJdujg8a2SL4Wt+ZUPKfXZS926Wd14JqLpWtR/dTNPOh3JzAovZDNrOpFmwN3/urX6gQ==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.7.1.tgz", + "integrity": "sha512-tG5L9f2JcwLcoG6XnR8EOYMJWZIw7Gl33BDVct9dRh+upAL5qMPfwgPMN6kKdaMQ9ki42EBHKmLLAVRcyCk1yg==", "dev": true, "requires": { "browser-sync": "^2.26.3", "chalk": "^2.4.2", - "chokidar": "^2.1.5", + "chokidar": "^2.0.4", "debug": "^4.1.1", - "dependency-graph": "^0.8.0", "dependency-tree": "^6.3.0", "ejs": "^2.6.1", "fast-glob": "^2.2.6", "fs-extra": "^7.0.1", - "gray-matter": "^4.0.2", + "gray-matter": "^4.0.1", "hamljs": "^0.6.2", - "handlebars": "^4.1.1", - "javascript-stringify": "^2.0.0", - "liquidjs": "^6.4.3", + "handlebars": "^4.0.12", + "javascript-stringify": "^1.6.0", + "liquidjs": "^6.2.0", "lodash": "^4.17.11", - "luxon": "^1.12.0", + "luxon": "^1.9.0", "markdown-it": "^8.4.2", "minimist": "^1.2.0", "moo": "^0.5.0", "multimatch": "^3.0.0", "mustache": "^2.3.0", "normalize-path": "^3.0.0", - "nunjucks": "^3.2.0", + "nunjucks": "^3.1.6", "parse-filepath": "^1.0.2", "please-upgrade-node": "^3.1.1", "pretty": "^2.0.0", "pug": "^2.0.3", - "recursive-copy": "^2.0.10", - "semver": "^6.0.0", + "recursive-copy": "^2.0.9", + "semver": "^5.6.0", "slugify": "^1.3.4", "time-require": "^0.1.2", "valid-url": "^1.0.9" }, "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true } } }, @@ -68,12 +70,12 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", + "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.3.4", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", @@ -101,12 +103,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.0.0" } }, "@babel/highlight": { @@ -121,60 +123,71 @@ } }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", + "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", "dev": true }, "@babel/runtime": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", - "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.12.0" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true } } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" } }, "@babel/traverse": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", - "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", + "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/generator": "^7.3.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.3.4", + "@babel/types": "^7.3.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", + "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -203,85 +216,6 @@ "yargs": "^12.0.5" }, "dependencies": { - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -300,16 +234,18 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + }, + "dependencies": { + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } } } @@ -355,9 +291,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.1.tgz", + "integrity": "sha512-rgmZk5CrBGAMATk0HlHOFvo8V44/r+On6cKS80tqid0Eljd+fFBWBOXZp9H2/EB3faxdNdzXTx6QZIKLkbJ7mA==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -374,9 +310,9 @@ } }, "@sinonjs/samsam": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", - "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.2.0.tgz", + "integrity": "sha512-j5F1rScewLtx6pbTK0UAjA3jJj4RYiSKOix53YWv+Jzy/AZ69qHxUpU8fwVLjyKbEEud9QrLpv6Ggs7WqTimYw==", "dev": true, "requires": { "@sinonjs/commons": "^1.0.2", @@ -391,9 +327,9 @@ "dev": true }, "@types/babel-types": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", - "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.6.tgz", + "integrity": "sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==", "dev": true }, "@types/babylon": { @@ -406,21 +342,15 @@ } }, "@types/node": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", - "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "10.12.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.29.tgz", + "integrity": "sha512-J/tnbnj8HcsBgCe2apZbdUpQ7hs4d7oZNTYA5bekWdP0sr2NGsOpI/HRdDroEi209tEvTcTtxhD0FfED3DhEcw==", "dev": true }, "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", "dev": true }, "@types/unist": { @@ -479,13 +409,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.18", + "negotiator": "0.6.1" } }, "acorn": { @@ -593,12 +523,6 @@ "repeat-string": "^1.5.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -642,9 +566,9 @@ } }, "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" }, "ansi-escapes": { "version": "3.2.0", @@ -713,15 +637,6 @@ "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -751,12 +666,6 @@ } } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -819,7 +728,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -841,16 +750,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -947,12 +846,11 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "dev": true, "requires": { - "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -986,9 +884,9 @@ "dev": true }, "assetgraph": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.4.tgz", - "integrity": "sha512-vDGeWPSaRihVny07KsyFHYXFh7w2ScbzKruxNi0pZ7OT3zKzU9ppxVFK1kNnFUEjicLKaFB5Ffh2xk2n6dGjNA==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.1.tgz", + "integrity": "sha512-u9u6WDu1je6FraTV1Gx5/M8VhKsH6WuTdmz/7XDznwTYD2LZGU2rE/sJVUc2gwOOWF4Ztqa06sTmoW9OSrOdXA==", "dev": true, "requires": { "acorn": "^6.1.0", @@ -1009,26 +907,25 @@ "estraverse": "^4.2.0", "estraverse-fb": "^1.3.2", "font-family-papandreou": "^0.2.0-patch1", - "font-snapper": "^1.0.0", - "font-tracer": "^1.1.0", + "font-tracer": "^1.0.1", "fontkit": "^1.7.7", "gettemporaryfilepath": "^1.0.0", "glob": "^7.0.5", - "html-minifier": "^4.0.0", + "html-minifier": "^3.5.8", "imageinfo": "^1.0.4", - "jsdom": "14.0.0", + "jsdom": "13.2.0", "lines-and-columns": "^1.1.6", "lodash": "4.17.11", "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", "perfectionist": "^2.4.0", - "postcss": "^7.0.14", + "postcss": "7.0.9", "postcss-values-parser": "^2.0.0", "read-pkg-up": "^4.0.0", "repeat-string": "^1.5.4", "schemes": "^1.0.1", - "semver": "^6.0.0", + "semver": "^5.3.0", "sift": "^7.0.1", "source-map": "~0.6.1", "specificity": "^0.4.0", @@ -1082,6 +979,17 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "postcss": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.9.tgz", + "integrity": "sha512-eXB2Fm8/BtSABq7ia1HyvbkoD9zFqq2BWjHUAyRSgbK8qdyKrA6yMCX06l05Onc8bHemeXLB8hzJ8tM0ABc0Zw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-values-parser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", @@ -1114,12 +1022,6 @@ "read-pkg": "^3.0.0" } }, - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1131,16 +1033,25 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "assetgraph-builder": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.1.tgz", - "integrity": "sha512-jRqme+K8BWVAlY3+qqkWH19/FD92aay0TqZzCfaH3HkTTqFPacIHiGA/DRvPPOxjl+wvIvjVNLWSG2QrPxtHrA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.0.tgz", + "integrity": "sha512-HGpCM92CtNKtk/ijQzIt2icWbHVe05qh4pI8XeEt+/AGy+nkHkAtL9l22aD5bEgsrdiWRbT67+6+4+yxrJj/Iw==", "dev": true, "requires": { - "assetgraph": "5.8.4", + "assetgraph": "5.8.1", "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", "chalk": "^2.3.2", @@ -1159,6 +1070,14 @@ "pngcrush": "^2.0.1", "pngquant": "^2.0.1", "urltools": "^0.4.1" + }, + "dependencies": { + "p-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", + "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", + "dev": true + } } }, "assetgraph-sprite": { @@ -1225,7 +1144,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1237,7 +1156,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1254,9 +1173,9 @@ "dev": true }, "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, "async-each-series": { @@ -1291,18 +1210,18 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, "autoprefixer": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", - "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", + "version": "9.4.10", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.10.tgz", + "integrity": "sha512-XR8XZ09tUrrSzgSlys4+hy5r2/z4Jp7Ag3pHm31U4g/CTccYPOVe19AkaJ4ey/vRd1sfj+5TtuD6I0PXtutjvQ==", "dev": true, "requires": { - "browserslist": "^4.5.4", - "caniuse-lite": "^1.0.30000957", + "browserslist": "^4.4.2", + "caniuse-lite": "^1.0.30000940", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.14", @@ -1329,14 +1248,6 @@ "requires": { "follow-redirects": "^1.2.5", "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } } }, "babel-runtime": { @@ -1374,9 +1285,9 @@ "dev": true }, "bail": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", "dev": true }, "balanced-match": { @@ -1573,9 +1484,9 @@ } }, "bin-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", - "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.0.0.tgz", + "integrity": "sha512-Ekhwm6AUiMbZ1LgVCNMkgjovpMR30FyQN74laAW9gs0NPjZR5gdY0ARNB0YsQG8GOme3CsHbxmeyq/7Ofq6QYQ==", "dev": true, "requires": { "execa": "^1.0.0", @@ -1686,23 +1597,6 @@ "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", @@ -1751,9 +1645,9 @@ } }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", "dev": true }, "bindings": { @@ -1767,7 +1661,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1782,9 +1676,9 @@ "dev": true }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -1794,21 +1688,21 @@ "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" }, "dependencies": { "debug": { @@ -1827,9 +1721,9 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true } } @@ -1903,7 +1797,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -1995,13 +1889,13 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { - "version": "2.26.5", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.5.tgz", - "integrity": "sha512-zVa6MmadAFgl5Uk53Yy5cw5tGTO7xSGAWK3Yx70GJ1t5jK+r6B4q3xq+1XbYfLt1SbeFg7WoNWneNhMT4B9jFw==", + "version": "2.26.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.3.tgz", + "integrity": "sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag==", "dev": true, "requires": { - "browser-sync-client": "^2.26.4", - "browser-sync-ui": "^2.26.4", + "browser-sync-client": "^2.26.2", + "browser-sync-ui": "^2.26.2", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", "chokidar": "^2.0.4", @@ -2016,7 +1910,7 @@ "http-proxy": "1.15.2", "immutable": "^3", "localtunnel": "1.9.1", - "micromatch": "^3.1.10", + "micromatch": "2.3.11", "opn": "5.3.0", "portscanner": "2.1.1", "qs": "6.2.3", @@ -2038,6 +1932,32 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -2055,6 +1975,24 @@ "wrap-ansi": "^2.0.0" } }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -2066,18 +2004,18 @@ "universalify": "^0.1.0" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -2087,6 +2025,24 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2096,6 +2052,36 @@ "invert-kv": "^1.0.0" } }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -2105,12 +2091,6 @@ "lcid": "^1.0.0" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -2137,16 +2117,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -2187,9 +2157,9 @@ } }, "browser-sync-client": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.4.tgz", - "integrity": "sha512-mQiDp5/tf79VezDS5j/EExU4Ze6f5DQYuL0Z7VdJgBbNLTHDfkYGi2R620qc6HkY9XZA0m4/UwihT7J42RBIJA==", + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.2.tgz", + "integrity": "sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw==", "dev": true, "requires": { "etag": "1.8.1", @@ -2199,9 +2169,9 @@ } }, "browser-sync-ui": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", - "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz", + "integrity": "sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ==", "dev": true, "requires": { "async-each-series": "0.1.1", @@ -2288,7 +2258,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2342,7 +2312,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2383,14 +2353,14 @@ } }, "browserslist": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz", - "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.2.tgz", + "integrity": "sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000967", - "electron-to-chromium": "^1.3.133", - "node-releases": "^1.1.19" + "caniuse-lite": "^1.0.30000939", + "electron-to-chromium": "^1.3.113", + "node-releases": "^1.1.8" } }, "bs-recipes": { @@ -2468,9 +2438,9 @@ "dev": true }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, "cache-base": { @@ -2542,18 +2512,6 @@ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - } - }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2601,13 +2559,13 @@ } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.1.0.tgz", + "integrity": "sha512-WP9f9OBL/TAbwOFBJL79FoS9UKUmnp82RWnhlwTgrAJeMq7lytHhe0Jzc6/P7Zq0+2oviXJuPlvkZalWUug9gg==" }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2636,20 +2594,19 @@ } }, "caniuse-lite": { - "version": "1.0.30000967", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", - "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==", + "version": "1.0.30000941", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz", + "integrity": "sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA==", "dev": true }, "canvas": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.5.0.tgz", - "integrity": "sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.1.tgz", + "integrity": "sha512-SaFomFqDuuuSTScTHQ7nXc5ea71Ieb8ctvwXjR7vzLsBMfp3euTv2xsTY70zIoC5r4sSQZYXv6tiHiORJ4y1vg==", "dev": true, "requires": { - "nan": "^2.13.2", - "node-pre-gyp": "^0.11.0", - "simple-get": "^3.0.3" + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0" } }, "capitalize": { @@ -2671,12 +2628,12 @@ "dev": true }, "catharsis": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", - "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", + "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", "dev": true, "requires": { - "lodash": "^4.17.11" + "underscore-contrib": "~0.3.0" } }, "caw": { @@ -2692,9 +2649,9 @@ } }, "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", "dev": true }, "center-align": { @@ -2742,21 +2699,21 @@ } }, "character-entities": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", - "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", "dev": true }, "character-entities-html4": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", - "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", "dev": true }, "character-entities-legacy": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", - "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", "dev": true }, "character-parser": { @@ -2769,9 +2726,9 @@ } }, "character-reference-invalid": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", - "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", "dev": true }, "chardet": { @@ -2787,9 +2744,9 @@ "dev": true }, "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -2803,7 +2760,18 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.1" + "upath": "^1.1.0" + }, + "dependencies": { + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } } }, "chownr": { @@ -2910,7 +2878,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -2955,23 +2923,21 @@ } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^3.0.0" } } } @@ -3007,16 +2973,16 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "coffeescript": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz", - "integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg==", + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", "dev": true }, "collapse-white-space": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", - "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", "dev": true }, "collection-visit": { @@ -3030,9 +2996,9 @@ } }, "color": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", - "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", + "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -3088,7 +3054,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3101,18 +3067,18 @@ } }, "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "comment-regex": { @@ -3133,12 +3099,6 @@ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "compare-module-exports": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", @@ -3200,12 +3160,6 @@ "is-extendable": "^0.1.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3239,23 +3193,6 @@ "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "connect": { @@ -3387,14 +3324,15 @@ "dev": true }, "cosmiconfig": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", - "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", + "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.13.0", + "js-yaml": "^3.9.0", + "lodash.get": "^4.4.2", "parse-json": "^4.0.0" }, "dependencies": { @@ -3426,33 +3364,12 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -3474,7 +3391,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3487,7 +3404,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3554,7 +3471,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -3817,9 +3734,9 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { "ms": "^2.1.1" } @@ -3849,25 +3766,6 @@ "make-dir": "^1.0.0", "pify": "^2.3.0", "strip-dirs": "^2.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - } } }, "decompress-response": { @@ -3991,23 +3889,6 @@ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4103,12 +3984,6 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "dependency-graph": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", - "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", - "dev": true - }, "dependency-tree": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-6.5.0.tgz", @@ -4119,6 +3994,17 @@ "debug": "^4.1.1", "filing-cabinet": "^2.3.0", "precinct": "^5.3.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "deps-sort": { @@ -4186,7 +4072,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4232,6 +4118,17 @@ "debug": "^4.0.0", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "detective-postcss": { @@ -4244,6 +4141,17 @@ "is-url": "^1.2.4", "postcss": "^7.0.2", "postcss-values-parser": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "detective-sass": { @@ -4255,6 +4163,17 @@ "debug": "^4.1.1", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "detective-scss": { @@ -4266,6 +4185,17 @@ "debug": "^4.1.1", "gonzales-pe": "^4.2.3", "node-source-walk": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "detective-stylus": { @@ -4313,13 +4243,13 @@ "dev": true }, "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4340,15 +4270,6 @@ "lodash.omit": "^4.5.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -4479,15 +4400,6 @@ "url-to-options": "^1.0.1" } }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -4498,7 +4410,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4570,9 +4482,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.133", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz", - "integrity": "sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==", + "version": "1.3.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", + "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", "dev": true }, "elegant-spinner": { @@ -4776,12 +4688,6 @@ "is-symbol": "^1.0.2" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "es6-promise": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", @@ -4790,7 +4696,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -4855,9 +4761,9 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.0.tgz", + "integrity": "sha512-xwG7SS5JLeqkiR3iOmVgtF8Y6xPdtr6AAsN6ph7Q6R/fv+3UlKYoika8SmNzmb35qdRF+RfTY35kMEdtbi+9wg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4866,7 +4772,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", + "eslint-scope": "^4.0.2", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^5.0.1", @@ -4880,7 +4786,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.11", @@ -4898,6 +4804,24 @@ "text-table": "^0.2.0" }, "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "import-fresh": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", @@ -4926,9 +4850,9 @@ } }, "eslint-config-prettier": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.2.0.tgz", - "integrity": "sha512-y0uWc/FRfrHhpPZCYflWC8aE0KRJRY04rdZVfl8cL3sEZmOYyaBdhdlQPjKZBnuRMyLVK+JUZr7HaZFClQiH4w==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", + "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -4982,9 +4906,9 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", + "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", "dev": true, "requires": { "debug": "^2.6.8", @@ -5019,22 +4943,21 @@ } }, "eslint-plugin-import": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", - "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { - "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-module-utils": "^2.3.0", "has": "^1.0.3", "lodash": "^4.17.11", "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.10.0" + "resolve": "^1.9.0" }, "dependencies": { "debug": { @@ -5048,7 +4971,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5065,12 +4988,6 @@ "locate-path": "^2.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5162,46 +5079,40 @@ } }, "eslint-plugin-node": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", - "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", + "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", "dev": true, "requires": { - "eslint-plugin-es": "^1.4.0", + "eslint-plugin-es": "^1.3.1", "eslint-utils": "^1.3.1", - "ignore": "^5.1.1", + "ignore": "^5.0.2", "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.0.0" + "resolve": "^1.8.1", + "semver": "^5.5.0" }, "dependencies": { "ignore": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", - "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", - "dev": true - }, - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", + "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", "dev": true } } }, "eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", + "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", - "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", "dev": true }, "eslint-plugin-standard": { @@ -5211,9 +5122,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", + "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -5306,7 +5217,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5442,12 +5353,6 @@ "repeat-string": "^1.5.2" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -5457,12 +5362,6 @@ "kind-of": "^3.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -5517,9 +5416,9 @@ }, "dependencies": { "mime": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", - "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true } } @@ -5579,6 +5478,17 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extglob": { @@ -5702,6 +5612,17 @@ "is-glob": "^4.0.0", "merge2": "^1.2.3", "micromatch": "^3.1.10" + }, + "dependencies": { + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } } }, "fast-json-stable-stringify": { @@ -5762,6 +5683,12 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -5797,8 +5724,19 @@ "sass-lookup": "^3.0.0", "stylus-lookup": "^3.0.1", "typescript": "^3.0.3" - } - }, + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -5863,28 +5801,6 @@ "traverse-chain": "~0.1.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", @@ -5900,19 +5816,19 @@ } }, "find-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.1.0.tgz", - "integrity": "sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", + "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", "dev": true, "requires": { - "array-uniq": "^2.1.0", + "array-uniq": "^2.0.0", "semver-regex": "^2.0.0" }, "dependencies": { "array-uniq": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", - "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", + "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", "dev": true } } @@ -5929,13 +5845,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -5947,6 +5863,13 @@ "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "requires": { "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + } } }, "flat-cache": { @@ -5985,17 +5908,6 @@ "dev": true, "requires": { "debug": "^3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "font-family-papandreou": { @@ -6004,16 +5916,6 @@ "integrity": "sha512-l6WMbeh7+Zd4TTu3yUUPR5KOepiuGLd/QAPfTIoX8ipTko0IF7PU6dsM4YM2zCDToEPIPSyCBKEJnKlSdYMgaA==", "dev": true }, - "font-snapper": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/font-snapper/-/font-snapper-1.0.0.tgz", - "integrity": "sha512-8E91ADLNoLIXZGGRDuuK13SWPVbbxIwVkcIcvEoQdEpP13U20bOVXXrur4VxUff3pMImrot7cM/9vN0LwiJ32w==", - "dev": true, - "requires": { - "css-font-weight-names": "^0.2.1", - "font-family-papandreou": "^0.2.0-patch1" - } - }, "font-tracer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.1.0.tgz", @@ -6064,34 +5966,21 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6142,7 +6031,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6198,14 +6087,14 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -6283,12 +6172,12 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "deep-extend": { @@ -6459,24 +6348,24 @@ } }, "ms": { - "version": "2.1.1", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^2.1.2", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.12.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, @@ -6504,13 +6393,13 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, @@ -6649,7 +6538,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -6817,7 +6706,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -6843,9 +6732,9 @@ "dev": true }, "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-func-name": { "version": "2.0.0", @@ -6910,9 +6799,9 @@ "dev": true }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6922,27 +6811,52 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^1.0.0" } } } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, "glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", @@ -6959,9 +6873,9 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", "dev": true }, "globby": { @@ -7002,7 +6916,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7011,7 +6925,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7046,7 +6960,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7113,9 +7027,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7180,6 +7094,14 @@ "dev": true, "requires": { "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } } }, "has-color": { @@ -7246,12 +7168,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -7283,15 +7199,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, "hat": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", @@ -7369,23 +7276,31 @@ } }, "html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } } }, "htmlescape": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -7415,16 +7330,15 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "dependencies": { "statuses": { @@ -7493,35 +7407,24 @@ "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "husky": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-2.3.0.tgz", - "integrity": "sha512-A/ZQSEILoq+mQM3yC3RIBSaw1bYXdkKnyyKVSUiJl+iBjVZc5LQEXdGY1ZjrDxC4IzfRPiJ0IqzEQGCN5TQa/A==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", "dev": true, "requires": { - "cosmiconfig": "^5.2.0", + "cosmiconfig": "^5.0.7", "execa": "^1.0.0", "find-up": "^3.0.0", - "get-stdin": "^7.0.0", + "get-stdin": "^6.0.0", "is-ci": "^2.0.0", - "pkg-dir": "^4.1.0", + "pkg-dir": "^3.0.0", "please-upgrade-node": "^3.1.1", - "read-pkg": "^5.1.1", + "read-pkg": "^4.0.1", "run-node": "^1.0.0", - "slash": "^3.0.0" + "slash": "^2.0.0" }, "dependencies": { "ci-info": { @@ -7531,9 +7434,9 @@ "dev": true }, "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, "is-ci": { @@ -7555,31 +7458,36 @@ "json-parse-better-errors": "^1.0.1" } }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, "pkg-dir": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.1.0.tgz", - "integrity": "sha512-55k9QN4saZ8q518lE6EFgYiu95u3BWkSajCifhdQjvLvmr8IpnRbhI+UGpWJQfa0KzDguHeeWT1ccO1PmkOi3A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" } }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^2.3.2", "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "pify": "^3.0.0" } }, "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true } } @@ -7591,18 +7499,18 @@ "dev": true }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, "ignore": { @@ -7732,9 +7640,9 @@ } }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -7748,7 +7656,7 @@ "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { @@ -7762,9 +7670,9 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7790,12 +7698,6 @@ "xtend": "^4.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -7856,12 +7758,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7874,9 +7770,9 @@ } }, "is-alphabetical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", - "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", "dev": true }, "is-alphanumeric": { @@ -7886,9 +7782,9 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", - "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -7911,9 +7807,10 @@ } }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.1.4", @@ -7952,12 +7849,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7975,9 +7866,9 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-decimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", - "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", "dev": true }, "is-descriptor": { @@ -8005,6 +7896,21 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, "is-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", @@ -8050,18 +7956,18 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "^2.1.0" } }, "is-hexadecimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", - "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", "dev": true }, "is-installed-globally": { @@ -8101,12 +8007,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8129,7 +8029,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8195,6 +8095,18 @@ "isobject": "^3.0.1" } }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -8304,9 +8216,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", - "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", "dev": true }, "is-windows": { @@ -8316,9 +8228,9 @@ "dev": true }, "is-word-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", - "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", "dev": true }, "is-wsl": { @@ -8328,9 +8240,9 @@ "dev": true }, "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isbinaryfile": { @@ -8360,115 +8272,57 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" } }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - } + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, + "jpegtran": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", + "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "jpegtran-bin": "^4.0.0", + "memoizeasync": "^1.0.0", + "which": "^1.2.14" } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", - "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "javascript-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", - "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==", - "dev": true - }, - "jpegtran": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", - "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", - "dev": true, - "requires": { - "jpegtran-bin": "^4.0.0", - "memoizeasync": "^1.0.0", - "which": "^1.2.14" - } - }, - "jpegtran-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", - "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", + "jpegtran-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", + "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", "dev": true, "requires": { "bin-build": "^3.0.0", @@ -8483,15 +8337,15 @@ "dev": true }, "js-beautify": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", - "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz", + "integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==", "dev": true, "requires": { "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", + "editorconfig": "^0.15.2", "glob": "^7.1.3", - "mkdirp": "~0.5.1", + "mkdirp": "~0.5.0", "nopt": "~4.0.1" } }, @@ -8523,12 +8377,12 @@ } }, "js2xmlparser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", - "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", "dev": true, "requires": { - "xmlcreate": "^2.0.0" + "xmlcreate": "^1.0.1" } }, "jsbn": { @@ -8538,37 +8392,29 @@ "dev": true }, "jsdoc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", - "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", - "dev": true, - "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", - "catharsis": "^0.8.10", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", - "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.6.2", - "mkdirp": "^0.5.1", - "requizzle": "^0.2.2", - "strip-json-comments": "^3.0.1", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", + "dev": true, + "requires": { + "babylon": "7.0.0-beta.19", + "bluebird": "~3.5.0", + "catharsis": "~0.8.9", + "escape-string-regexp": "~1.0.5", + "js2xmlparser": "~3.0.0", + "klaw": "~2.0.0", + "marked": "~0.3.6", + "mkdirp": "~0.5.1", + "requizzle": "~0.2.1", + "strip-json-comments": "~2.0.1", "taffydb": "2.6.2", - "underscore": "~1.9.1" + "underscore": "~1.8.3" }, "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "babylon": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", "dev": true }, "taffydb": { @@ -8576,13 +8422,19 @@ "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true } } }, "jsdom": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz", - "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", + "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", "dev": true, "requires": { "abab": "^2.0.0", @@ -8620,9 +8472,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -8726,9 +8578,9 @@ } }, "jszip": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", - "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", + "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", "dev": true, "requires": { "lie": "~3.3.0", @@ -8758,9 +8610,9 @@ "dev": true }, "karma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", - "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", + "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", "dev": true, "requires": { "bluebird": "^3.3.0", @@ -8793,9 +8645,9 @@ }, "dependencies": { "mime": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", - "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true }, "source-map": { @@ -8841,7 +8693,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -8896,9 +8748,9 @@ "dev": true }, "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", + "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -8999,9 +8851,9 @@ } }, "lint-staged": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.6.tgz", - "integrity": "sha512-QT13AniHN6swAtTjsrzxOfE4TVCiQ39xESwLmjGVNCMMZ/PK5aopwvbxLrzw+Zf9OxM3cQG6WCx9lceLzETOnQ==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.5.tgz", + "integrity": "sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA==", "dev": true, "requires": { "chalk": "^2.3.1", @@ -9028,18 +8880,9 @@ "staged-git-files": "1.1.2", "string-argv": "^0.0.2", "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "yup": "^0.26.10" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -9075,11 +8918,14 @@ } } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } }, "pify": { "version": "3.0.0", @@ -9116,12 +8962,6 @@ "is-extendable": "^0.1.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -9159,10 +8999,16 @@ "rxjs": "^6.3.3" }, "dependencies": { + "p-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", + "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", + "dev": true + }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -9234,7 +9080,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -9329,12 +9175,6 @@ "ms": "2.0.0" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -9374,12 +9214,6 @@ "lcid": "^1.0.0" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -9406,16 +9240,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -9504,10 +9328,10 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "lodash.isfinite": { @@ -9618,16 +9442,16 @@ } }, "log4js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.2.0.tgz", - "integrity": "sha512-1dJ2ORJcdqbzxvzKM2ceqPBh4O6bbICJpB4dvSEUoMcb14s8MqQ/54zNPqekuN5yjGtxO3GUDTvZfQOQhwdqnA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", + "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", "dev": true, "requires": { "date-format": "^2.0.0", - "debug": "^4.1.1", + "debug": "^3.1.0", "flatted": "^2.0.0", "rfdc": "^1.1.2", - "streamroller": "^1.0.5" + "streamroller": "^1.0.1" } }, "logalot": { @@ -9641,9 +9465,9 @@ } }, "lolex": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.0.1.tgz", - "integrity": "sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", + "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", "dev": true }, "longest": { @@ -9653,9 +9477,9 @@ "dev": true }, "longest-streak": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", - "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", "dev": true }, "loud-rejection": { @@ -9703,14 +9527,14 @@ } }, "luxon": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.13.2.tgz", - "integrity": "sha512-U7i2AE+/VWeB8PZZkIeEcxJCZvBA8LegCHufaIFYx3qRQdw2UJw3fuaL/Fqi9Q+2MeFYu+gYqIzr5hWOvAMHBQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.12.1.tgz", + "integrity": "sha512-Zv/qJb2X1ESTrlniAViWx2aqGwi2cVpeoZFTbPdPiCu4EsadKsmb/QCH8HQjMUpDZKKJIHKHsJxV5Rwpq47HKQ==", "dev": true }, "magic-string": { "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -9718,13 +9542,14 @@ } }, "magicpen": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-6.0.2.tgz", - "integrity": "sha512-zGaX9FDqnM0P1iZLl7CQsB+cj7NzVLClpCEVAS0GQBWg3u2QEg5Gs4247pVRxb265q/ZUTCB+lB6+NfPu+L63A==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-5.12.0.tgz", + "integrity": "sha1-u+nunUI2R2rs+EE27KGDPrRwqWs=", "dev": true, "requires": { "ansi-styles": "2.0.0", - "color-diff": "0.1.7" + "color-diff": "0.1.7", + "supports-color": "1.2.0" }, "dependencies": { "ansi-styles": { @@ -9732,23 +9557,28 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.0.tgz", "integrity": "sha1-QysmFi/qG2PIeIlqvIzFVI8lBj4=", "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true } } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } @@ -9781,7 +9611,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -9795,9 +9625,9 @@ } }, "markdown-escapes": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", - "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", "dev": true }, "markdown-it": { @@ -9820,9 +9650,9 @@ "dev": true }, "markdown-it-attrs": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.3.4.tgz", - "integrity": "sha512-DwGzugbveSUfRiUuxIC7svr8i+x3e3/eUJ7U7GRduNa2SO5Qyd2rZtjx6j0c3uS2xCIddZFcydEVlbg6C3s2vA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.3.2.tgz", + "integrity": "sha512-DyatNvpatg7w+fGkplWGeie7o/0TogBr2w0izyz9ZQfTMv5G3lbDHQFQ42aP2e5L2mJQt0IeAjWzvYaa2d9xzQ==", "dev": true }, "markdown-it-prism": { @@ -9878,7 +9708,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -9953,9 +9783,9 @@ } }, "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", + "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", "dev": true }, "markdown-toc": { @@ -9978,12 +9808,6 @@ "strip-color": "^0.1.0" }, "dependencies": { - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "dev": true - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -10017,42 +9841,42 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "markdownlint": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.14.1.tgz", - "integrity": "sha512-W3RxMP8GYyJAhgUXIXvBOXT2ai89qDIuLf2ZM0Xd+XcwXBS6Hu06Hg2UKNwMDPTy0uQK8YWCH4hkdxlevm/BgQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.12.0.tgz", + "integrity": "sha512-bjur6ZP0yKHVYh1U5+xD+bVkouKiUyiVzg9c9qkytYRW2nDfSowifKSmpPeO0uZHxzZOYMcV2Oe7sycPOEqMOQ==", "dev": true, "requires": { "markdown-it": "8.4.2" } }, "markdownlint-cli": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.16.0.tgz", - "integrity": "sha512-BmtWhDvbsnbgYirYOiSOxP8THhkCjp28+xVfTyj3D1JsOlj0Txf3IA9wlT5GHCYaR6QfDlWq4pz/rh+bfOw2Vg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.14.1.tgz", + "integrity": "sha512-bHueUEp1NmSFPWvOk3SNWhRRAInrdvmuzlkMrZJptUF6jNXJ32OhPXicRw2xg43+NLiUI01V5sc1VIrRWLKgig==", "dev": true, "requires": { "commander": "~2.9.0", "deep-extend": "~0.5.1", "get-stdin": "~5.0.1", "glob": "~7.1.2", - "js-yaml": "^3.13.1", + "js-yaml": "~3.13.0", "lodash.differencewith": "~4.5.0", "lodash.flatten": "~4.4.0", - "markdownlint": "~0.14.1", + "markdownlint": "~0.12.0", "minimatch": "~3.0.4", "rc": "~1.2.7" }, "dependencies": { "commander": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -10074,9 +9898,9 @@ } }, "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", + "version": "0.3.19", + "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, "matcher": { @@ -10163,17 +9987,17 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", + "mimic-fn": "^1.0.0", "p-is-promise": "^2.0.0" } }, @@ -10189,7 +10013,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10224,7 +10048,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10242,7 +10066,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10301,24 +10125,24 @@ "dev": true }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "~1.38.0" } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "1.0.1", @@ -10348,7 +10172,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10407,7 +10231,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -10470,6 +10294,17 @@ "find": "^0.3.0", "requirejs": "^2.3.5", "requirejs-config-file": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "moo": { @@ -10508,9 +10343,9 @@ "dev": true }, "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true }, "nanomatch": { @@ -10545,43 +10380,43 @@ "dev": true }, "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, "requires": { - "debug": "^3.2.6", + "debug": "^2.1.2", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, "nice-try": { @@ -10620,9 +10455,9 @@ } }, "node-abi": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", - "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", + "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", "dev": true, "requires": { "semver": "^5.4.1" @@ -10635,6 +10470,13 @@ "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "node-libs-browser": { @@ -10670,7 +10512,7 @@ "dependencies": { "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -10685,12 +10527,6 @@ "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -10714,7 +10550,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -10729,7 +10565,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -10757,9 +10593,9 @@ } }, "node-releases": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.19.tgz", - "integrity": "sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.9.tgz", + "integrity": "sha512-oic3GT4OtbWWKfRolz5Syw0Xus0KRFxeorLNj0s93ofX6PWyuzKjsiGxsCtWktBwwmTF6DdRRf2KreGqeOk5KA==", "dev": true, "requires": { "semver": "^5.3.0" @@ -10901,9 +10737,9 @@ } }, "nps": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.5.tgz", - "integrity": "sha512-UsjrtowHeXGnKELZUlqiyPSXc3vYs3YwLZEFfZJ1Z9kZCFgtzK4YRVKnxEa+teRMMdw6Q4keAX/M/aLCkPTqIw==", + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.4.tgz", + "integrity": "sha512-4RFiRTG0/hwcdTqfhwOT2sxtC7JEElyZDTsa3DIhf4ekFFL/87y2JvPAIRZJWVnEp+tG2a7qzv0eJE4NgJLlDg==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -10991,12 +10827,6 @@ "locate-path": "^2.0.0" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -11058,12 +10888,6 @@ "mimic-fn": "^1.0.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -11129,12 +10953,6 @@ "read-pkg": "^2.0.0" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -11150,29 +10968,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -11331,16 +11126,6 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -11365,64 +11150,1042 @@ } }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", + "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", "dev": true }, "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", "dev": true, "requires": { "archy": "^1.0.0", - "caching-transform": "^3.0.2", + "arrify": "^1.0.1", + "caching-transform": "^3.0.1", "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^2.0.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.1.0", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.1", + "make-dir": "^1.3.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", + "test-exclude": "^5.1.0", "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" + "yargs": "^12.0.5", + "yargs-parser": "^11.1.1" }, "dependencies": { - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "bundled": true, "dev": true, "requires": { - "source-map": "^0.6.1" + "default-require-extensions": "^2.0.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "archy": { + "version": "1.0.0", + "bundled": true, "dev": true }, - "source-map": { + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caching-transform": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^1.3.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "camelcase": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "hasha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.1.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "bundled": true, + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "bundled": true, + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "uglify-js": { + "version": "3.4.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, "dev": true + }, + "yargs": { + "version": "12.0.5", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -11464,12 +12227,6 @@ "is-descriptor": "^0.1.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -11488,9 +12245,9 @@ "dev": true }, "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" }, "object-path": { "version": "0.9.2", @@ -11527,6 +12284,16 @@ "es-abstract": "^1.5.1" } }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -11565,23 +12332,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - } - } - }, "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", @@ -11669,7 +12419,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -11691,7 +12441,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -11740,9 +12490,9 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" }, "p-limit": { "version": "2.2.0", @@ -11761,9 +12511,9 @@ } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-map-series": { @@ -11791,21 +12541,9 @@ } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" }, "package-json": { "version": "4.0.1", @@ -11835,18 +12573,18 @@ } }, "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", "dev": true, "requires": { "callsites": "^3.0.0" }, "dependencies": { "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", "dev": true } } @@ -11908,6 +12646,35 @@ "path-root": "^0.1.1" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -11948,9 +12715,9 @@ } }, "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, "pascalcase": { @@ -11984,7 +12751,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12061,7 +12828,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12146,7 +12913,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12190,7 +12957,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -12421,9 +13188,9 @@ "dev": true }, "postcss": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", - "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -12436,6 +13203,15 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12876,9 +13652,9 @@ } }, "prebuild-install": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", - "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", + "integrity": "sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==", "dev": true, "requires": { "detect-libc": "^1.0.3", @@ -12901,7 +13677,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12947,6 +13723,17 @@ "detective-typescript": "^4.1.2", "module-definition": "^3.1.0", "node-source-walk": "^4.2.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "prefix-matches": { @@ -12971,10 +13758,16 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, "prettier": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", - "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", + "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", "dev": true }, "prettier-linter-helpers": { @@ -13010,7 +13803,7 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, @@ -13024,9 +13817,9 @@ } }, "prismjs": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", - "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", + "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -13361,7 +14154,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -13416,20 +14209,20 @@ } }, "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" } }, @@ -13447,7 +14240,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -13515,25 +14308,17 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -13587,6 +14372,15 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -13628,15 +14422,6 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, "remark": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", @@ -13772,12 +14557,6 @@ "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -13856,9 +14635,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "requirejs": { "version": "2.3.6", @@ -13875,6 +14654,24 @@ "esprima": "^4.0.0", "make-dir": "^2.1.0", "stringify-object": "^3.2.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "requires-port": { @@ -13884,18 +14681,26 @@ "dev": true }, "requizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", - "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", + "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", "dev": true, "requires": { - "lodash": "^4.17.11" + "underscore": "~1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } } }, "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -13963,6 +14768,17 @@ "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" + }, + "dependencies": { + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + } } }, "restructure": { @@ -13981,9 +14797,9 @@ "dev": true }, "rewiremock": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.7.tgz", - "integrity": "sha512-U6iFfdXPiNtIBDcJWmspl/nhVk1EANkXLq2GM78T3ZfegvO5EW0TgNzExLh5iHXFJKQr//SmH9iloK/s4O7UqA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.0.tgz", + "integrity": "sha512-1MkO4mX4j31GilbMsqdgLNXjmrHo9EUKQFCa82rLye8ltOHnJe0rRaHUSKz2yUClr8l0Qnj1ZTjZHmp6vNTrzQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -13997,9 +14813,9 @@ } }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", "dev": true }, "rgb-regex": { @@ -14010,7 +14826,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -14080,7 +14896,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14103,9 +14919,9 @@ } }, "sauce-connect-launcher": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.6.tgz", - "integrity": "sha512-yBTYfzI6AWRwoXJoIqmVgz+eCpWX6CsJ4Ap8fowjsGlN+27OKbnQxv6POd4Rzh57BH9WeA9K8orIzNxO8mMBQA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz", + "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==", "dev": true, "requires": { "adm-zip": "~0.4.3", @@ -14191,7 +15007,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -14231,9 +15047,9 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-compare": { "version": "1.0.0", @@ -14295,30 +15111,12 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -14351,35 +15149,11 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true } } }, @@ -14457,14 +15231,14 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -14499,7 +15273,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -14567,12 +15341,23 @@ } }, "simple-git": { - "version": "1.113.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.113.0.tgz", - "integrity": "sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==", + "version": "1.107.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", + "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==", "dev": true, "requires": { "debug": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "simple-swizzle": { @@ -14593,26 +15378,20 @@ } }, "sinon": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", - "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.7.tgz", + "integrity": "sha512-rlrre9F80pIQr3M36gOdoCEWzFAMDgHYD8+tocqOw+Zw9OZ8F84a80Ds69eZfcjnzDqqG88ulFld0oin/6rG/g==", "dev": true, "requires": { - "@sinonjs/commons": "^1.4.0", + "@sinonjs/commons": "^1.3.1", "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.1", + "@sinonjs/samsam": "^3.2.0", "diff": "^3.5.0", - "lolex": "^4.0.1", + "lolex": "^3.1.0", "nise": "^1.4.10", "supports-color": "^5.5.0" }, "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -14758,12 +15537,6 @@ "kind-of": "^3.2.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -14817,6 +15590,12 @@ "yeast": "0.1.2" } }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -14934,6 +15713,12 @@ "ms": "2.0.0" } }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15018,9 +15803,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -15057,20 +15842,6 @@ "spawn-command": "^0.0.2-1" } }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -15098,9 +15869,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "specificity": { @@ -15111,7 +15882,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15216,14 +15987,14 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, "state-toggle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", - "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", "dev": true }, "static-eval": { @@ -15340,7 +16111,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -15391,16 +16162,16 @@ } }, "streamroller": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", - "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", + "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", "dev": true, "requires": { - "async": "^2.6.2", + "async": "^2.6.1", "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11" + "debug": "^3.1.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.10" }, "dependencies": { "async": { @@ -15411,15 +16182,6 @@ "requires": { "lodash": "^4.17.11" } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } } } }, @@ -15493,17 +16255,17 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" } } }, @@ -15539,7 +16301,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -15597,6 +16359,17 @@ "requires": { "commander": "^2.8.1", "debug": "^4.1.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "subarg": { @@ -15610,24 +16383,24 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "requires": { "has-flag": "^3.0.0" } }, "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.0.tgz", + "integrity": "sha512-xBfxJxfk4UeVN8asec9jNxHiv3UAMv/ujwBWGYvQhhMb2u3YTGKkiybPcLFDLq7GLLWE9wa73e0/m8L5nTzQbw==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -15637,7 +16410,7 @@ "css-tree": "1.0.0-alpha.28", "css-url-regex": "^1.1.0", "csso": "^3.5.1", - "js-yaml": "^3.13.1", + "js-yaml": "^3.12.0", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", @@ -15698,9 +16471,9 @@ } }, "synchronous-promise": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.7.tgz", - "integrity": "sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.6.tgz", + "integrity": "sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g==", "dev": true }, "syntax-error": { @@ -15713,9 +16486,9 @@ } }, "table": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", - "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", "dev": true, "requires": { "ajv": "^6.9.1", @@ -15725,14 +16498,14 @@ }, "dependencies": { "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^5.0.0" } } } @@ -15744,9 +16517,9 @@ "dev": true }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, "tar": { @@ -15834,7 +16607,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -15875,140 +16648,62 @@ }, "term-size": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "strip-bom": { + "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -16095,7 +16790,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16221,12 +16916,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -16268,14 +16957,16 @@ "requires": { "is-buffer": "^2.0.0", "vfile": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, "token-stream": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", @@ -16347,15 +17038,15 @@ "dev": true }, "trim-trailing-lines": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", - "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", "dev": true }, "trough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", + "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", "dev": true }, "tslib": { @@ -16400,20 +17091,14 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true - }, "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -16423,9 +17108,9 @@ "dev": true }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", + "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", "dev": true }, "typescript-eslint-parser": { @@ -16459,15 +17144,21 @@ "dev": true }, "uglify-js": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", - "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.17.1", "source-map": "~0.6.1" }, "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16530,6 +17221,23 @@ "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", + "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, "underscore.string": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", @@ -16537,18 +17245,19 @@ "dev": true }, "unexpected": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-11.5.1.tgz", - "integrity": "sha512-Zqr5aRiH4cRtXtaWm7LyAR6dwpQXs4u9a+VrR11eNDGAXuE7qKy6rsMTKgk/CVzeDkSASn7T9MardgoJc1eDog==", + "version": "10.40.2", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.40.2.tgz", + "integrity": "sha512-xwLScBxEnHiK8H8yLblQ6u3Uoammhpk+oCB/HWiNY6exMEwxenUR+eWIKderEXQPOlZkUEakBAKborGJqK6hZQ==", "dev": true, "requires": { "array-changes": "3.0.1", "array-changes-async": "3.0.1", + "babel-runtime": "6.26.0", "detect-indent": "3.0.1", - "diff": "4.0.1", + "diff": "1.1.0", "greedy-interval-packer": "1.2.0", "leven": "2.1.0", - "magicpen": "^6.0.2", + "magicpen": "5.12.0", "unexpected-bluebird": "2.9.34-longstack2" }, "dependencies": { @@ -16563,6 +17272,12 @@ "repeating": "^1.1.0" } }, + "diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.1.0.tgz", + "integrity": "sha1-eYpJOBqkZBUem08Ob/Kwmooa0j8=", + "dev": true + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -16593,15 +17308,15 @@ "dev": true }, "unexpected-sinon": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.2.tgz", - "integrity": "sha512-N2KIKPweTVs6AK8cDKQTUwu0fGWyGt+cI/UJZ/eltAyOKgsHL9eILttdGfpZjI/iMYcHcbtUwIlXoHfmh6EcBw==", + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.1.tgz", + "integrity": "sha512-2zSX7vsOYlljjS/3DeQolFzYgA22PmH0ncLCva+ve2AHHJBO0Xnxyt8ri1en1W5b7nRg5F7N6HNdflVNhI7dww==", "dev": true }, "unherit": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", - "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -16740,9 +17455,9 @@ } }, "unist-util-visit-parents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.0.tgz", - "integrity": "sha512-j0XZY3063E6v7qhx4+Q2Z0r8SMrLX7Mr6DabiCy67zMEcFQYtpNOplLlEK1KKEBEs9S+xB5U+yloQxbSwF9P/g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", + "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", "dev": true, "requires": { "unist-util-is": "^2.1.2" @@ -16809,12 +17524,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, @@ -16825,9 +17534,9 @@ "dev": true }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, "update-notifier": { @@ -16998,9 +17707,9 @@ } }, "vendors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", "dev": true }, "verror": { @@ -17024,6 +17733,20 @@ "replace-ext": "1.0.0", "unist-util-stringify-position": "^1.0.0", "vfile-message": "^1.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + } } }, "vfile-location": { @@ -17119,6 +17842,17 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "whatwg-mimetype": { @@ -17212,23 +17946,43 @@ "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -17278,15 +18032,6 @@ "write-file-atomic": "^2.0.0" }, "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -17355,9 +18100,9 @@ "dev": true }, "xmlcreate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", - "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", "dev": true }, "xmldom": { @@ -17390,11 +18135,11 @@ "dev": true }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "requires": { - "cliui": "^5.0.0", + "cliui": "^4.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", @@ -17404,25 +18149,44 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.0.0" }, "dependencies": { + "get-caller-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", + "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^5.0.0" + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -17438,76 +18202,6 @@ "yargs": "^12.0.5" }, "dependencies": { - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -17525,15 +18219,17 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + }, + "dependencies": { + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } } } @@ -17555,16 +18251,16 @@ "dev": true }, "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", + "version": "0.26.10", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.26.10.tgz", + "integrity": "sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw==", "dev": true, "requires": { - "@babel/runtime": "^7.0.0", + "@babel/runtime": "7.0.0", "fn-name": "~2.0.1", - "lodash": "^4.17.11", + "lodash": "^4.17.10", "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", + "synchronous-promise": "^2.0.5", "toposort": "^2.0.2" } } diff --git a/package-scripts.js b/package-scripts.js index 7a84e550b7..7febdc016f 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -137,7 +137,7 @@ module.exports = { script: test( 'requires', [ - '--require coffeescript/register', + '--require coffee-script/register', '--require test/require/a.js', '--require test/require/b.coffee', '--require test/require/c.js', diff --git a/package.json b/package.json index 272d5249b5..67f1aae4f0 100644 --- a/package.json +++ b/package.json @@ -504,13 +504,13 @@ "version": "nps version" }, "dependencies": { - "ansi-colors": "3.2.4", + "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", - "debug": "4.1.1", - "diff": "4.0.1", + "debug": "3.2.6", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", - "glob": "7.1.4", + "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", @@ -521,68 +521,68 @@ "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", - "supports-color": "6.1.0", + "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.4", - "yargs-parser": "13.1.0", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", "yargs-unparser": "1.5.0" }, "devDependencies": { - "@11ty/eleventy": "^0.8.3", + "@11ty/eleventy": "^0.7.1", "@mocha/contributors": "^1.0.3", "@mocha/docdash": "^2.1.0", - "assetgraph-builder": "^6.10.1", - "autoprefixer": "^9.5.1", + "assetgraph-builder": "^6.10.0", + "autoprefixer": "^9.4.10", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", - "coffeescript": "^2.4.1", + "coffee-script": "^1.12.7", "coveralls": "^3.0.3", "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", - "eslint": "^5.16.0", - "eslint-config-prettier": "^4.2.0", + "eslint": "^5.15.0", + "eslint-config-prettier": "^3.6.0", "eslint-config-semistandard": "^13.0.0", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.17.2", - "eslint-plugin-node": "^9.0.1", - "eslint-plugin-prettier": "^3.1.0", - "eslint-plugin-promise": "^4.1.1", + "eslint-plugin-import": "^2.16.0", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-prettier": "^3.0.1", + "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", - "husky": "^2.3.0", - "jsdoc": "^3.6.2", - "karma": "^4.1.0", + "husky": "^1.3.1", + "jsdoc": "^3.5.5", + "karma": "^4.0.1", "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", "karma-sauce-launcher": "^2.0.2", - "lint-staged": "^8.1.6", + "lint-staged": "^8.1.5", "markdown-it": "^8.4.2", "markdown-it-anchor": "^5.0.2", - "markdown-it-attrs": "^2.3.4", + "markdown-it-attrs": "^2.3.2", "markdown-it-prism": "^2.0.1", "markdown-magic": "^0.1.25", "markdown-magic-package-json": "^2.0.0", "markdown-toc": "^1.2.0", - "markdownlint-cli": "^0.16.0", - "nps": "^5.9.5", - "nyc": "^14.1.1", - "prettier": "^1.17.1", + "markdownlint-cli": "^0.14.1", + "nps": "^5.9.4", + "nyc": "^13.3.0", + "prettier": "^1.16.4", "remark": "^10.0.1", "remark-github": "^7.0.6", "remark-inline-links": "^3.1.2", - "rewiremock": "^3.13.7", + "rewiremock": "^3.13.0", "rimraf": "^2.6.3", - "sinon": "^7.3.2", - "strip-ansi": "^5.2.0", - "svgo": "^1.2.2", + "sinon": "^7.2.7", + "strip-ansi": "^5.0.0", + "svgo": "^1.2.0", "through2": "^3.0.1", "to-vfile": "^5.0.2", - "unexpected": "^11.5.1", + "unexpected": "^10.40.2", "unexpected-eventemitter": "^1.1.3", - "unexpected-sinon": "^10.11.2", + "unexpected-sinon": "^10.11.1", "uslug": "^1.0.4", "watchify": "^3.11.1" }, diff --git a/test/integration/compiler-globbing.spec.js b/test/integration/compiler-globbing.spec.js index f245f4ab91..20ea050e4d 100644 --- a/test/integration/compiler-globbing.spec.js +++ b/test/integration/compiler-globbing.spec.js @@ -10,7 +10,7 @@ describe('globbing like --compilers', function() { process.execPath + '" "' + path.join('bin', 'mocha') + - '" -R json --require coffeescript/register --require test/compiler-fixtures/foo.fixture "test/compiler/*.@(coffee|foo)"', + '" -R json --require coffee-script/register --require test/compiler-fixtures/foo.fixture "test/compiler/*.@(coffee|foo)"', {cwd: path.join(__dirname, '..', '..')}, function(error, stdout) { if (error && !stdout) { diff --git a/test/integration/options/compilers.spec.js b/test/integration/options/compilers.spec.js index ea4826ccda..99fa79a7f5 100644 --- a/test/integration/options/compilers.spec.js +++ b/test/integration/options/compilers.spec.js @@ -6,7 +6,7 @@ var invokeMocha = helpers.invokeMocha; describe('--compilers', function() { it('should report deprecation', function(done) { invokeMocha( - ['--compilers', 'coffee:coffeescript/register'], + ['--compilers', 'coffee:coffee-script/register'], function(err, res) { if (err) { return done(err); diff --git a/test/integration/options/extension.spec.js b/test/integration/options/extension.spec.js index d07ab129fe..760e3bcd88 100644 --- a/test/integration/options/extension.spec.js +++ b/test/integration/options/extension.spec.js @@ -8,7 +8,7 @@ describe('--extension', function() { it('should allow comma-separated variables', function(done) { var args = [ '--require', - 'coffeescript/register', + 'coffee-script/register', '--require', './test/setup', '--reporter', From 8f2a35d8975dce56c7c534df0bc374a1dd9d8f62 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 12 Mar 2019 11:57:53 -0700 Subject: [PATCH 1348/1771] fix timeout/slow string values and duplicate arguments --- lib/cli/run-option-metadata.js | 4 +- lib/cli/run.js | 7 +++ test/integration/duplicate-arguments.spec.js | 36 +++++++++++++ .../fixtures/options/slow-test.fixture.js | 11 ++++ .../fixtures/passing-async.fixture.js | 7 +++ .../fixtures/passing-sync.fixture.js | 6 +++ test/integration/invalid-arguments.spec.js | 28 +++++----- test/integration/options/timeout.spec.js | 52 +++++++++++++++++++ test/node-unit/cli/options.spec.js | 4 +- 9 files changed, 138 insertions(+), 17 deletions(-) create mode 100644 test/integration/duplicate-arguments.spec.js create mode 100644 test/integration/fixtures/options/slow-test.fixture.js create mode 100644 test/integration/fixtures/passing-async.fixture.js create mode 100644 test/integration/fixtures/passing-sync.fixture.js create mode 100644 test/integration/options/timeout.spec.js diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index e10e008fa6..f19bd57788 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -44,8 +44,8 @@ exports.types = { 'sort', 'watch' ], - number: ['retries', 'slow', 'timeout'], - string: ['fgrep', 'grep', 'package', 'reporter', 'ui'] + number: ['retries'], + string: ['fgrep', 'grep', 'package', 'reporter', 'ui', 'slow', 'timeout'] }; /** diff --git a/lib/cli/run.js b/lib/cli/run.js index da5ffd7b6a..0541ec6a83 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -258,6 +258,13 @@ exports.builder = yargs => } }); + types.boolean + .concat(types.string, types.number) + .filter(opt => Array.isArray(argv[opt])) + .forEach(opt => { + argv[opt] = argv[opt].pop(); + }); + // yargs.implies() isn't flexible enough to handle this if (argv.invert && !('fgrep' in argv || 'grep' in argv)) { throw createMissingArgumentError( diff --git a/test/integration/duplicate-arguments.spec.js b/test/integration/duplicate-arguments.spec.js new file mode 100644 index 0000000000..28fd225d9b --- /dev/null +++ b/test/integration/duplicate-arguments.spec.js @@ -0,0 +1,36 @@ +'use strict'; + +var runMocha = require('./helpers').runMocha; + +describe('when non-array argument is provided multiple times', function() { + describe('when the same argument name is used', function() { + it('should prefer the last value', function(done) { + runMocha( + 'passing-sync', + ['--no-async-only', '--async-only', '--no-async-only'], + function(err, result) { + if (err) { + return done(err); + } + expect(result, 'to have passed'); + done(); + } + ); + }); + }); + + describe('when a different argument name is used', function() { + it('should prefer the last value', function(done) { + runMocha('passing-async', ['--timeout', '100', '-t', '10'], function( + err, + result + ) { + if (err) { + return done(err); + } + expect(result, 'to have failed'); + done(); + }); + }); + }); +}); diff --git a/test/integration/fixtures/options/slow-test.fixture.js b/test/integration/fixtures/options/slow-test.fixture.js new file mode 100644 index 0000000000..f15cb6d9dd --- /dev/null +++ b/test/integration/fixtures/options/slow-test.fixture.js @@ -0,0 +1,11 @@ +'use strict'; + +describe('a suite', function() { + it('should succeed in 500ms', function(done) { + setTimeout(done, 500); + }); + + it('should succeed in 1.5s', function(done) { + setTimeout(done, 1500); + }); +}); diff --git a/test/integration/fixtures/passing-async.fixture.js b/test/integration/fixtures/passing-async.fixture.js new file mode 100644 index 0000000000..24db0b98d0 --- /dev/null +++ b/test/integration/fixtures/passing-async.fixture.js @@ -0,0 +1,7 @@ +'use strict'; + +describe('a suite', function() { + it('should succeed in 50ms', function(done) { + setTimeout(done, 50); + }); +}); diff --git a/test/integration/fixtures/passing-sync.fixture.js b/test/integration/fixtures/passing-sync.fixture.js new file mode 100644 index 0000000000..6087ebcbd4 --- /dev/null +++ b/test/integration/fixtures/passing-sync.fixture.js @@ -0,0 +1,6 @@ +'use strict'; + +describe('a suite', function() { + it('should succeed', function() { + }); +}); diff --git a/test/integration/invalid-arguments.spec.js b/test/integration/invalid-arguments.spec.js index 6c147bdb48..e1eabf20ae 100644 --- a/test/integration/invalid-arguments.spec.js +++ b/test/integration/invalid-arguments.spec.js @@ -3,18 +3,20 @@ var invokeMocha = require('./helpers').invokeMocha; describe('invalid arguments', function() { - it('should exit with failure if arguments are invalid', function(done) { - invokeMocha( - ['--ui'], - function(err, result) { - if (err) { - return done(err); - } - expect(result, 'to have failed'); - expect(result.output, 'to match', /not enough arguments/i); - done(); - }, - {stdio: 'pipe'} - ); + describe('when argument is missing required value', function() { + it('should exit with failure', function(done) { + invokeMocha( + ['--ui'], + function(err, result) { + if (err) { + return done(err); + } + expect(result, 'to have failed'); + expect(result.output, 'to match', /not enough arguments/i); + done(); + }, + {stdio: 'pipe'} + ); + }); }); }); diff --git a/test/integration/options/timeout.spec.js b/test/integration/options/timeout.spec.js new file mode 100644 index 0000000000..ac786da54d --- /dev/null +++ b/test/integration/options/timeout.spec.js @@ -0,0 +1,52 @@ +'use strict'; + +var helpers = require('../helpers'); +var runMochaJSON = helpers.runMochaJSON; + +describe('--timeout', function() { + it('should allow human-readable string value', function(done) { + runMochaJSON('options/slow-test', ['--timeout', '1s'], function(err, res) { + if (err) { + done(err); + return; + } + expect(res, 'to have failed') + .and('to have passed test count', 1) + .and('to have failed test count', 1); + done(); + }); + }); + + it('should allow numeric value', function(done) { + runMochaJSON('options/slow-test', ['--timeout', '1000'], function( + err, + res + ) { + if (err) { + done(err); + return; + } + expect(res, 'to have failed') + .and('to have passed test count', 1) + .and('to have failed test count', 1); + done(); + }); + }); + + it('should allow multiple values', function(done) { + var fixture = 'options/slow-test'; + runMochaJSON(fixture, ['--timeout', '2s', '--timeout', '1000'], function( + err, + res + ) { + if (err) { + done(err); + return; + } + expect(res, 'to have failed') + .and('to have passed test count', 1) + .and('to have failed test count', 1); + done(); + }); + }); +}); diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 62a63f9fd6..2e1e4aa09d 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -629,7 +629,7 @@ describe('options', function() { findupSync }); - expect(loadOptions(), 'to satisfy', {timeout: 800, require: ['foo']}); + expect(loadOptions(), 'to satisfy', {timeout: '800', require: ['foo']}); }); it('should prioritize package.json over mocha.opts', function() { @@ -692,7 +692,7 @@ describe('options', function() { loadOptions('--timeout 500'), 'to have property', 'timeout', - 500 + '500' ); }); }); From ffe1967c8d2a3ec4503c3fa9d24beeb62beefaa3 Mon Sep 17 00:00:00 2001 From: juergba Date: Thu, 2 May 2019 19:54:21 +0200 Subject: [PATCH 1349/1771] coerce function for boolean/string/number types --- lib/cli/options.js | 21 ++++++++++++++++----- lib/cli/run-option-metadata.js | 12 +++++++++++- lib/cli/run.js | 7 ------- test/node-unit/cli/options.spec.js | 8 ++++---- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index 340fb01e86..fcc619a9b3 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -54,15 +54,26 @@ const configuration = Object.assign({}, YARGS_PARSER_CONFIG, { }); /** - * This is a really fancy way to ensure unique values for `array`-type - * options. + * This is a really fancy way to: + * - ensure unique values for `array`-type options + * - use its array's last element for `boolean`/`number`/`string`- options given multiple times * This is passed as the `coerce` option to `yargs-parser` * @private * @ignore */ -const coerceOpts = types.array.reduce( - (acc, arg) => Object.assign(acc, {[arg]: v => Array.from(new Set(list(v)))}), - {} +const coerceOpts = Object.assign( + types.array.reduce( + (acc, arg) => + Object.assign(acc, {[arg]: v => Array.from(new Set(list(v)))}), + {} + ), + types.boolean + .concat(types.string, types.number) + .reduce( + (acc, arg) => + Object.assign(acc, {[arg]: v => (Array.isArray(v) ? v.pop() : v)}), + {} + ) ); /** diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index f19bd57788..fbc4ea9072 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -45,7 +45,17 @@ exports.types = { 'watch' ], number: ['retries'], - string: ['fgrep', 'grep', 'package', 'reporter', 'ui', 'slow', 'timeout'] + string: [ + 'config', + 'fgrep', + 'grep', + 'opts', + 'package', + 'reporter', + 'ui', + 'slow', + 'timeout' + ] }; /** diff --git a/lib/cli/run.js b/lib/cli/run.js index 0541ec6a83..da5ffd7b6a 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -258,13 +258,6 @@ exports.builder = yargs => } }); - types.boolean - .concat(types.string, types.number) - .filter(opt => Array.isArray(argv[opt])) - .forEach(opt => { - argv[opt] = argv[opt].pop(); - }); - // yargs.implies() isn't flexible enough to handle this if (argv.invert && !('fgrep' in argv || 'grep' in argv)) { throw createMissingArgumentError( diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 2e1e4aa09d..3c39cc7f09 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -86,7 +86,7 @@ describe('options', function() { config: false, opts: false, package: false, - retries: 3 + retries: '3' }) ); }); @@ -202,7 +202,7 @@ describe('options', function() { config: false, opts: false, package: false, - retries: 3 + retries: '3' } ) ); @@ -427,7 +427,7 @@ describe('options', function() { config: false, opts: false, package: false, - retries: 3 + retries: '3' }) ); }); @@ -476,7 +476,7 @@ describe('options', function() { config: false, opts: false, package: false, - retries: 3 + retries: '3' }) ); }); From 750c5f81625f4f67d0d3a4602e344dac8663ee07 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 17 May 2019 15:39:33 +0200 Subject: [PATCH 1350/1771] Fix regression/bug in "lookupFiles()" (#3905) --- lib/utils.js | 37 ++++++++++++++++------------- test/integration/file-utils.spec.js | 28 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index 93005cedf2..013d3ffe0a 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -563,33 +563,38 @@ function isHiddenOnUnix(pathname) { * @public * @memberof Mocha.utils * @param {string} filepath - Base path to start searching from. - * @param {string[]} extensions - File extensions to look for. - * @param {boolean} recursive - Whether to recurse into subdirectories. + * @param {string[]} [extensions=[]] - File extensions to look for. + * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. * @return {string[]} An array of paths. * @throws {Error} if no files match pattern. * @throws {TypeError} if `filepath` is directory and `extensions` not provided. */ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { extensions = extensions || []; + recursive = recursive || false; var files = []; var stat; if (!fs.existsSync(filepath)) { - // check all extensions - extensions.forEach(function(ext) { - if (fs.existsSync(filepath + '.' + ext)) { - files.push(filepath + '.' + ext); - } - }); + var pattern; + if (glob.hasMagic(filepath)) { + // Handle glob as is without extensions + pattern = filepath; + } else { + // glob pattern e.g. 'filepath+(.js|.ts)' + var strExtensions = extensions + .map(function(v) { + return '.' + v; + }) + .join('|'); + pattern = filepath + '+(' + strExtensions + ')'; + } + files = glob.sync(pattern, {nodir: true}); if (!files.length) { - // Handle glob - files = glob.sync(filepath); - if (!files.length) { - throw createNoFilesMatchPatternError( - 'Cannot find any files matching pattern ' + exports.dQuote(filepath), - filepath - ); - } + throw createNoFilesMatchPatternError( + 'Cannot find any files matching pattern ' + exports.dQuote(filepath), + filepath + ); } return files; } diff --git a/test/integration/file-utils.spec.js b/test/integration/file-utils.spec.js index f09018871b..ae97b996e2 100644 --- a/test/integration/file-utils.spec.js +++ b/test/integration/file-utils.spec.js @@ -66,6 +66,34 @@ describe('file utils', function() { expect(res, 'to contain', nonJsFile).and('to have length', 1); }); + it('should return only the ".js" file', function() { + var TsFile = tmpFile('mocha-utils.ts'); + fs.writeFileSync(TsFile, 'yippy skippy ying yang yow'); + + var res = utils + .lookupFiles(tmpFile('mocha-utils'), ['js'], false) + .map(path.normalize.bind(path)); + expect(res, 'to contain', tmpFile('mocha-utils.js')).and( + 'to have length', + 1 + ); + }); + + it('should return ".js" and ".ts" files', function() { + var TsFile = tmpFile('mocha-utils.ts'); + fs.writeFileSync(TsFile, 'yippy skippy ying yang yow'); + + var res = utils + .lookupFiles(tmpFile('mocha-utils'), ['js', 'ts'], false) + .map(path.normalize.bind(path)); + expect( + res, + 'to contain', + tmpFile('mocha-utils.js'), + tmpFile('mocha-utils.ts') + ).and('to have length', 2); + }); + it('should require the extensions parameter when looking up a file', function() { var dirLookup = function() { return utils.lookupFiles(tmpFile('mocha-utils'), undefined, false); From a7581542c879722986afecaa578e3734be3045ed Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Tue, 14 May 2019 17:38:51 +0200 Subject: [PATCH 1351/1771] Extend tests for `--watch` options This commit adds two test cases to test the `--watch` option. We check that touching a test file reruns the tests and we test that touching a file that has a correct extensions reruns the test. This commit adds `fs-extra` as a new dev dependency. --- .eslintrc.yml | 2 + package-lock.json | 46 +++++- package.json | 1 + test/integration/helpers.js | 41 +++--- test/integration/options/watch.spec.js | 189 ++++++++++++++++++++----- 5 files changed, 222 insertions(+), 57 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 3fe7399ed0..f696b45ca8 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -25,6 +25,8 @@ overrides: - bin/* - lib/cli/**/*.js - test/node-unit/**/*.js + - test/integration/options/watch.spec.js + - test/integration/helpers.js - lib/growl.js parserOptions: ecmaVersion: 6 diff --git a/package-lock.json b/package-lock.json index 2aeadf2b21..359f0ee697 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,26 @@ "ms": "^2.1.1" } }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -6051,9 +6071,9 @@ "dev": true }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", + "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -16182,6 +16202,26 @@ "requires": { "lodash": "^4.17.11" } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } } } }, diff --git a/package.json b/package.json index 67f1aae4f0..b8fc469780 100644 --- a/package.json +++ b/package.json @@ -550,6 +550,7 @@ "eslint-plugin-prettier": "^3.0.1", "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", + "fs-extra": "^8.0.1", "husky": "^1.3.1", "jsdoc": "^3.5.5", "karma": "^4.0.1", diff --git a/test/integration/helpers.js b/test/integration/helpers.js index b774bb7890..a705a2fe9b 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -114,32 +114,37 @@ module.exports = { ); }, /** - * Invokes the mocha binary for the given fixture using the JSON reporter, - * returning the **raw** string output, as well as exit code. + * Invokes the mocha binary with the given arguments fixture using + * the JSON reporter. Returns the child process and a promise for the + * results of running the command. The result includes the **raw** + * string output, as well as exit code. * * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you - * want it. - * @param {string} fixturePath - Path from __dirname__ + * want it as part of the result output. + * * @param {string[]} args - Array of args - * @param {Function} fn - Callback * @param {Object} [opts] - Opts for `spawn()` - * @returns {string} Raw output + * @returns {[ChildProcess|Promise]} */ - runMochaJSONRaw: function(fixturePath, args, fn, opts) { - var path; - - path = resolveFixturePath(fixturePath); + runMochaJSONRawAsync: function(args, opts) { args = args || []; - return invokeSubMocha( - args.concat(['--reporter', 'json', path]), - function(err, resRaw) { - if (err) return fn(err); + let childProcess; + const resultPromise = new Promise((resolve, reject) => { + childProcess = invokeSubMocha( + [...args, '--reporter', 'json'], + function(err, resRaw) { + if (err) { + reject(err); + } else { + resolve(resRaw); + } + }, + opts + ); + }); - fn(null, resRaw); - }, - opts - ); + return [childProcess, resultPromise]; }, /** diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 1df65fa342..1fb187a1e7 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -1,56 +1,173 @@ 'use strict'; -var helpers = require('../helpers'); -var runMochaJSONRaw = helpers.runMochaJSONRaw; +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const helpers = require('../helpers'); +const runMochaJSONRawAsync = helpers.runMochaJSONRawAsync; + +const sigintExitCode = 130; describe('--watch', function() { - var args = []; + describe('when enabled', function() { + this.timeout(10 * 1000); + this.slow(3000); - before(function() { - args = ['--watch']; - }); + beforeEach(function() { + this.tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-')); - describe('when enabled', function() { - before(function() { + const fixtureSource = helpers.DEFAULT_FIXTURE; + + this.testFile = path.join(this.tempDir, 'test.js'); + fs.copySync(fixtureSource, this.testFile); + }); + + afterEach(function() { + if (this.tempDir) { + return fs.remove(this.tempDir); + } + }); + + it('should show the cursor and signal correct exit code, when watch process is terminated', function() { // Feature works but SIMULATING the signal (ctrl+c) via child process // does not work due to lack of POSIX signal compliance on Windows. if (process.platform === 'win32') { this.skip(); } - }); - it('should show the cursor and signal correct exit code, when watch process is terminated', function(done) { - this.timeout(0); - this.slow(3000); - - var fixture = 'exit.fixture.js'; - var spawnOpts = {stdio: 'pipe'}; - var mocha = runMochaJSONRaw( - fixture, - args, - function postmortem(err, data) { - if (err) { - return done(err); - } - - var expectedCloseCursor = '\u001b[?25h'; + const [mocha, resultPromise] = runMochaJSONRawAsync([ + helpers.DEFAULT_FIXTURE, + '--watch' + ]); + + return sleep(1000) + .then(() => { + mocha.kill('SIGINT'); + return resultPromise; + }) + .then(data => { + const expectedCloseCursor = '\u001b[?25h'; expect(data.output, 'to contain', expectedCloseCursor); - function exitStatusBySignal(sig) { - return 128 + sig; - } + expect(data.code, 'to be', sigintExitCode); + }); + }); + + it('reruns test when watched test file is touched', function() { + const [mocha, outputPromise] = runMochaJSONWatchAsync([this.testFile], { + cwd: this.tempDir + }); - var sigint = 2; - expect(data.code, 'to be', exitStatusBySignal(sigint)); - done(); - }, - spawnOpts + return expect( + sleep(1000) + .then(() => { + touchFile(this.testFile); + return sleep(1000); + }) + .then(() => { + mocha.kill('SIGINT'); + return outputPromise; + }), + 'when fulfilled', + 'to have length', + 2 ); + }); - setTimeout(function() { - // Kill the child process - mocha.kill('SIGINT'); - }, 1000); + it('reruns test when file matching extension is touched', function() { + const watchedFile = path.join(this.tempDir, 'file.xyz'); + touchFile(watchedFile); + const [mocha, outputPromise] = runMochaJSONWatchAsync( + [this.testFile, '--extension', 'xyz,js'], + { + cwd: this.tempDir + } + ); + + return expect( + sleep(1000) + .then(() => { + touchFile(watchedFile); + return sleep(1000); + }) + .then(() => { + mocha.kill('SIGINT'); + return outputPromise; + }), + 'when fulfilled', + 'to have length', + 2 + ); + }); + + it('ignores files in "node_modules" and ".git"', function() { + const nodeModulesFile = path.join( + this.tempDir, + 'node_modules', + 'file.xyz' + ); + const gitFile = path.join(this.tempDir, '.git', 'file.xyz'); + + touchFile(gitFile); + touchFile(nodeModulesFile); + + const [mocha, outputPromise] = runMochaJSONWatchAsync( + [this.testFile, '--extension', 'xyz,js'], + { + cwd: this.tempDir + } + ); + + return expect( + sleep(1000) + .then(() => { + touchFile(gitFile); + touchFile(nodeModulesFile); + }) + .then(() => sleep(1000)) + .then(() => { + mocha.kill('SIGINT'); + return outputPromise; + }), + 'when fulfilled', + 'to have length', + 1 + ); }); }); }); + +/** + * Invokes the mocha binary with the `--watch` argument for the given fixture. + * + * Returns child process and a promise for the test results. The test results + * are an array of JSON objects generated by the JSON reporter. + */ +function runMochaJSONWatchAsync(args, spawnOpts) { + args = [...args, '--watch']; + const [mocha, mochaDone] = runMochaJSONRawAsync(args, spawnOpts); + const testResults = mochaDone.then(data => { + const testResults = data.output + // eslint-disable-next-line no-control-regex + .replace(/\u001b\[\?25./g, '') + .split('\u001b[2K') + .map(x => JSON.parse(x)); + return testResults; + }); + return [mocha, testResults]; +} + +/** + * Synchronously touch a file by appending a space to the end. Creates + * the file and all its parent directories if necessary. + */ +function touchFile(file) { + fs.ensureDirSync(path.dirname(file)); + fs.appendFileSync(file, ' '); +} + +function sleep(time) { + return new Promise(resolve => { + setTimeout(resolve, time); + }); +} From 29b7615148b383f4b177ecd21c917bad6f621561 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Sat, 25 May 2019 07:10:29 +0200 Subject: [PATCH 1352/1771] Extract `runWatch` into separate module (#3930) Also remove default values from `runWatch` they are already set by `runMocha`. --- lib/cli/run-helpers.js | 103 ++------------------------------------- lib/cli/watch-run.js | 107 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 99 deletions(-) create mode 100644 lib/cli/watch-run.js diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 0858d61b03..a3848598f9 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -12,12 +12,13 @@ const path = require('path'); const ansi = require('ansi-colors'); const debug = require('debug')('mocha:cli:run:helpers'); const minimatch = require('minimatch'); -const Context = require('../context'); -const Mocha = require('../mocha'); const utils = require('../utils'); +const watchRun = require('./watch-run'); const cwd = (exports.cwd = process.cwd()); +exports.watchRun = watchRun; + /** * Exits Mocha when tests + code under test has finished execution (default) * @param {number} code - Exit code; typically # of failures @@ -65,32 +66,6 @@ const exitMocha = code => { done(); }; -/** - * Hide the cursor. - * @ignore - * @private - */ -const hideCursor = () => { - process.stdout.write('\u001b[?25l'); -}; - -/** - * Show the cursor. - * @ignore - * @private - */ -const showCursor = () => { - process.stdout.write('\u001b[?25h'); -}; - -/** - * Stop cursor business - * @private - */ -const stop = () => { - process.stdout.write('\u001b[2K'); -}; - /** * Coerce a comma-delimited string (or array thereof) into a flattened array of * strings @@ -207,76 +182,6 @@ exports.singleRun = (mocha, {files = [], exit = false} = {}) => { return mocha.run(exit ? exitMocha : exitMochaLater); }; -/** - * Run Mocha in "watch" mode - * @param {Mocha} mocha - Mocha instance - * @param {Object} [opts] - Options - * @param {string[]} [opts.extension] - List of extensions to watch - * @param {string|RegExp} [opts.grep] - Grep for test titles - * @param {string} [opts.ui=bdd] - User interface - * @param {string[]} [files] - Array of test files - * @private - */ -exports.watchRun = ( - mocha, - {extension = [], grep = '', ui = 'bdd', files = []} = {} -) => { - let runner; - - console.log(); - hideCursor(); - process.on('SIGINT', () => { - showCursor(); - console.log('\n'); - process.exit(130); - }); - - const watchFiles = utils.files(cwd, extension); - let runAgain = false; - - const loadAndRun = () => { - try { - mocha.files = files; - runAgain = false; - runner = mocha.run(() => { - runner = null; - if (runAgain) { - rerun(); - } - }); - } catch (e) { - console.log(e.stack); - } - }; - - const purge = () => { - watchFiles.forEach(Mocha.unloadFile); - }; - - loadAndRun(); - - const rerun = () => { - purge(); - stop(); - if (!grep) { - mocha.grep(null); - } - mocha.suite = mocha.suite.clone(); - mocha.suite.ctx = new Context(); - mocha.ui(ui); - loadAndRun(); - }; - - utils.watch(watchFiles, () => { - runAgain = true; - if (runner) { - runner.abort(); - } else { - rerun(); - } - }); -}; - /** * Actually run tests * @param {Mocha} mocha - Mocha instance @@ -295,7 +200,7 @@ exports.runMocha = ( files = [] ) => { if (watch) { - exports.watchRun(mocha, {extension, grep, ui, files}); + watchRun(mocha, {extension, grep, ui, files}); } else { exports.singleRun(mocha, {files, exit}); } diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js new file mode 100644 index 0000000000..54765b7cf7 --- /dev/null +++ b/lib/cli/watch-run.js @@ -0,0 +1,107 @@ +'use strict'; + +const utils = require('../utils'); +const Context = require('../context'); +const Mocha = require('../mocha'); + +/** + * Exports the `watchRun` function that runs mocha in "watch" mode. + * @see module:lib/cli/run-helpers + * @module + * @private + */ + +/** + * Run Mocha in "watch" mode + * @param {Mocha} mocha - Mocha instance + * @param {Object} opts - Options + * @param {string[]} opts.extension - List of extensions to watch + * @param {string|RegExp} opts.grep - Grep for test titles + * @param {string} opts.ui - User interface + * @param {string[]} opts.files - Array of test files + * @private + */ +module.exports = (mocha, {extension, grep, ui, files}) => { + let runner; + + console.log(); + hideCursor(); + process.on('SIGINT', () => { + showCursor(); + console.log('\n'); + // By UNIX/Posix convention this indicates that the process was + // killed by SIGINT which has portable number 2. + process.exit(128 + 2); + }); + + const watchFiles = utils.files(process.cwd(), extension); + let runAgain = false; + + const loadAndRun = () => { + try { + mocha.files = files; + runAgain = false; + runner = mocha.run(() => { + runner = null; + if (runAgain) { + rerun(); + } + }); + } catch (e) { + console.log(e.stack); + } + }; + + const purge = () => { + watchFiles.forEach(Mocha.unloadFile); + }; + + loadAndRun(); + + const rerun = () => { + purge(); + eraseLine(); + if (!grep) { + mocha.grep(null); + } + mocha.suite = mocha.suite.clone(); + mocha.suite.ctx = new Context(); + mocha.ui(ui); + loadAndRun(); + }; + + utils.watch(watchFiles, () => { + runAgain = true; + if (runner) { + runner.abort(); + } else { + rerun(); + } + }); +}; + +/** + * Hide the cursor. + * @ignore + * @private + */ +const hideCursor = () => { + process.stdout.write('\u001b[?25l'); +}; + +/** + * Show the cursor. + * @ignore + * @private + */ +const showCursor = () => { + process.stdout.write('\u001b[?25h'); +}; + +/** + * Erases the line on stdout + * @private + */ +const eraseLine = () => { + process.stdout.write('\u001b[2K'); +}; From f3ed729b6908f3893e6f87722c6e996cca5f7733 Mon Sep 17 00:00:00 2001 From: Brian Lagerman <49239617+brian-lagerman@users.noreply.github.com> Date: Mon, 3 Jun 2019 15:50:05 +0200 Subject: [PATCH 1353/1771] Add mocha.min.js file to stacktrace filter (#3922) --- lib/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 013d3ffe0a..996e843507 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -723,7 +723,8 @@ exports.stackTraceFilter = function() { function isMochaInternal(line) { return ( ~line.indexOf('node_modules' + slash + 'mocha' + slash) || - ~line.indexOf(slash + 'mocha.js') + ~line.indexOf(slash + 'mocha.js') || + ~line.indexOf(slash + 'mocha.min.js') ); } From ca861d495885ca6f4b34998fcfeca85ed095a934 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 5 Jun 2019 11:38:29 -0700 Subject: [PATCH 1354/1771] ugprades for npm audit --- package-lock.json | 3148 +++++++++++++++++++-------------------------- package.json | 44 +- 2 files changed, 1339 insertions(+), 1853 deletions(-) diff --git a/package-lock.json b/package-lock.json index 359f0ee697..91e3c92f92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,44 +5,65 @@ "requires": true, "dependencies": { "@11ty/eleventy": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.7.1.tgz", - "integrity": "sha512-tG5L9f2JcwLcoG6XnR8EOYMJWZIw7Gl33BDVct9dRh+upAL5qMPfwgPMN6kKdaMQ9ki42EBHKmLLAVRcyCk1yg==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.8.3.tgz", + "integrity": "sha512-TehjvEuVQaocz3R/rYMJdujg8a2SL4Wt+ZUPKfXZS926Wd14JqLpWtR/dTNPOh3JzAovZDNrOpFmwN3/urX6gQ==", "dev": true, "requires": { "browser-sync": "^2.26.3", "chalk": "^2.4.2", - "chokidar": "^2.0.4", + "chokidar": "^2.1.5", "debug": "^4.1.1", + "dependency-graph": "^0.8.0", "dependency-tree": "^6.3.0", "ejs": "^2.6.1", "fast-glob": "^2.2.6", "fs-extra": "^7.0.1", - "gray-matter": "^4.0.1", + "gray-matter": "^4.0.2", "hamljs": "^0.6.2", - "handlebars": "^4.0.12", - "javascript-stringify": "^1.6.0", - "liquidjs": "^6.2.0", + "handlebars": "^4.1.1", + "javascript-stringify": "^2.0.0", + "liquidjs": "^6.4.3", "lodash": "^4.17.11", - "luxon": "^1.9.0", + "luxon": "^1.12.0", "markdown-it": "^8.4.2", "minimist": "^1.2.0", "moo": "^0.5.0", "multimatch": "^3.0.0", "mustache": "^2.3.0", "normalize-path": "^3.0.0", - "nunjucks": "^3.1.6", + "nunjucks": "^3.2.0", "parse-filepath": "^1.0.2", "please-upgrade-node": "^3.1.1", "pretty": "^2.0.0", "pug": "^2.0.3", - "recursive-copy": "^2.0.9", - "semver": "^5.6.0", + "recursive-copy": "^2.0.10", + "semver": "^6.0.0", "slugify": "^1.3.4", "time-require": "^0.1.2", "valid-url": "^1.0.9" }, "dependencies": { + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -63,6 +84,15 @@ "universalify": "^0.1.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -74,9 +104,21 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true } } }, @@ -90,12 +132,12 @@ } }, "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.4", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", @@ -123,12 +165,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.4" } }, "@babel/highlight": { @@ -149,50 +191,64 @@ "dev": true }, "@babel/runtime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", - "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", "dev": true, "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", "dev": true } } }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + } } }, "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" }, "dependencies": { + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -205,9 +261,9 @@ } }, "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -311,9 +367,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.1.tgz", - "integrity": "sha512-rgmZk5CrBGAMATk0HlHOFvo8V44/r+On6cKS80tqid0Eljd+fFBWBOXZp9H2/EB3faxdNdzXTx6QZIKLkbJ7mA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", + "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -330,9 +386,9 @@ } }, "@sinonjs/samsam": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.2.0.tgz", - "integrity": "sha512-j5F1rScewLtx6pbTK0UAjA3jJj4RYiSKOix53YWv+Jzy/AZ69qHxUpU8fwVLjyKbEEud9QrLpv6Ggs7WqTimYw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", + "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", "dev": true, "requires": { "@sinonjs/commons": "^1.0.2", @@ -347,9 +403,9 @@ "dev": true }, "@types/babel-types": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.6.tgz", - "integrity": "sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", + "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==", "dev": true }, "@types/babylon": { @@ -368,9 +424,9 @@ "dev": true }, "@types/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", - "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, "@types/unist": { @@ -657,6 +713,15 @@ "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -686,6 +751,12 @@ } } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -770,6 +841,16 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -904,9 +985,9 @@ "dev": true }, "assetgraph": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.1.tgz", - "integrity": "sha512-u9u6WDu1je6FraTV1Gx5/M8VhKsH6WuTdmz/7XDznwTYD2LZGU2rE/sJVUc2gwOOWF4Ztqa06sTmoW9OSrOdXA==", + "version": "5.8.4", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.4.tgz", + "integrity": "sha512-vDGeWPSaRihVny07KsyFHYXFh7w2ScbzKruxNi0pZ7OT3zKzU9ppxVFK1kNnFUEjicLKaFB5Ffh2xk2n6dGjNA==", "dev": true, "requires": { "acorn": "^6.1.0", @@ -927,25 +1008,26 @@ "estraverse": "^4.2.0", "estraverse-fb": "^1.3.2", "font-family-papandreou": "^0.2.0-patch1", - "font-tracer": "^1.0.1", + "font-snapper": "^1.0.0", + "font-tracer": "^1.1.0", "fontkit": "^1.7.7", "gettemporaryfilepath": "^1.0.0", "glob": "^7.0.5", - "html-minifier": "^3.5.8", + "html-minifier": "^4.0.0", "imageinfo": "^1.0.4", - "jsdom": "13.2.0", + "jsdom": "14.0.0", "lines-and-columns": "^1.1.6", "lodash": "4.17.11", "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", "perfectionist": "^2.4.0", - "postcss": "7.0.9", + "postcss": "^7.0.14", "postcss-values-parser": "^2.0.0", "read-pkg-up": "^4.0.0", "repeat-string": "^1.5.4", "schemes": "^1.0.1", - "semver": "^5.3.0", + "semver": "^6.0.0", "sift": "^7.0.1", "source-map": "~0.6.1", "specificity": "^0.4.0", @@ -999,17 +1081,6 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "postcss": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.9.tgz", - "integrity": "sha512-eXB2Fm8/BtSABq7ia1HyvbkoD9zFqq2BWjHUAyRSgbK8qdyKrA6yMCX06l05Onc8bHemeXLB8hzJ8tM0ABc0Zw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-values-parser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", @@ -1042,6 +1113,12 @@ "read-pkg": "^3.0.0" } }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1053,25 +1130,16 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "assetgraph-builder": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.0.tgz", - "integrity": "sha512-HGpCM92CtNKtk/ijQzIt2icWbHVe05qh4pI8XeEt+/AGy+nkHkAtL9l22aD5bEgsrdiWRbT67+6+4+yxrJj/Iw==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.1.tgz", + "integrity": "sha512-jRqme+K8BWVAlY3+qqkWH19/FD92aay0TqZzCfaH3HkTTqFPacIHiGA/DRvPPOxjl+wvIvjVNLWSG2QrPxtHrA==", "dev": true, "requires": { - "assetgraph": "5.8.1", + "assetgraph": "5.8.4", "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", "chalk": "^2.3.2", @@ -1090,14 +1158,6 @@ "pngcrush": "^2.0.1", "pngquant": "^2.0.1", "urltools": "^0.4.1" - }, - "dependencies": { - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", - "dev": true - } } }, "assetgraph-sprite": { @@ -1235,17 +1295,46 @@ "dev": true }, "autoprefixer": { - "version": "9.4.10", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.10.tgz", - "integrity": "sha512-XR8XZ09tUrrSzgSlys4+hy5r2/z4Jp7Ag3pHm31U4g/CTccYPOVe19AkaJ4ey/vRd1sfj+5TtuD6I0PXtutjvQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", "dev": true, "requires": { - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000940", + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.14", + "postcss": "^7.0.16", "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "aws-sign2": { @@ -1504,9 +1593,9 @@ } }, "bin-version": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.0.0.tgz", - "integrity": "sha512-Ekhwm6AUiMbZ1LgVCNMkgjovpMR30FyQN74laAW9gs0NPjZR5gdY0ARNB0YsQG8GOme3CsHbxmeyq/7Ofq6QYQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", "dev": true, "requires": { "execa": "^1.0.0", @@ -1696,9 +1785,9 @@ "dev": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, "bn.js": { @@ -1708,23 +1797,29 @@ "dev": true }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1734,6 +1829,28 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1741,9 +1858,33 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true } } @@ -1909,13 +2050,13 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { - "version": "2.26.3", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.3.tgz", - "integrity": "sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.5.tgz", + "integrity": "sha512-zVa6MmadAFgl5Uk53Yy5cw5tGTO7xSGAWK3Yx70GJ1t5jK+r6B4q3xq+1XbYfLt1SbeFg7WoNWneNhMT4B9jFw==", "dev": true, "requires": { - "browser-sync-client": "^2.26.2", - "browser-sync-ui": "^2.26.2", + "browser-sync-client": "^2.26.4", + "browser-sync-ui": "^2.26.4", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", "chokidar": "^2.0.4", @@ -1930,7 +2071,7 @@ "http-proxy": "1.15.2", "immutable": "^3", "localtunnel": "1.9.1", - "micromatch": "2.3.11", + "micromatch": "^3.1.10", "opn": "5.3.0", "portscanner": "2.1.1", "qs": "6.2.3", @@ -1952,32 +2093,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -1995,24 +2110,6 @@ "wrap-ansi": "^2.0.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -2030,12 +2127,6 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -2045,24 +2136,6 @@ "number-is-nan": "^1.0.0" } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2072,39 +2145,9 @@ "invert-kv": "^1.0.0" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -2145,7 +2188,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2167,7 +2210,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -2177,9 +2220,9 @@ } }, "browser-sync-client": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.2.tgz", - "integrity": "sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.4.tgz", + "integrity": "sha512-mQiDp5/tf79VezDS5j/EExU4Ze6f5DQYuL0Z7VdJgBbNLTHDfkYGi2R620qc6HkY9XZA0m4/UwihT7J42RBIJA==", "dev": true, "requires": { "etag": "1.8.1", @@ -2189,9 +2232,9 @@ } }, "browser-sync-ui": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz", - "integrity": "sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", + "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", "dev": true, "requires": { "async-each-series": "0.1.1", @@ -2373,14 +2416,14 @@ } }, "browserslist": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.2.tgz", - "integrity": "sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", + "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000939", - "electron-to-chromium": "^1.3.113", - "node-releases": "^1.1.8" + "caniuse-lite": "^1.0.30000971", + "electron-to-chromium": "^1.3.137", + "node-releases": "^1.1.21" } }, "bs-recipes": { @@ -2458,9 +2501,9 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "cache-base": { @@ -2532,6 +2575,36 @@ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2614,19 +2687,28 @@ } }, "caniuse-lite": { - "version": "1.0.30000941", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz", - "integrity": "sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA==", + "version": "1.0.30000973", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", + "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", "dev": true }, "canvas": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.1.tgz", - "integrity": "sha512-SaFomFqDuuuSTScTHQ7nXc5ea71Ieb8ctvwXjR7vzLsBMfp3euTv2xsTY70zIoC5r4sSQZYXv6tiHiORJ4y1vg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.5.0.tgz", + "integrity": "sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==", "dev": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.11.0" + "nan": "^2.13.2", + "node-pre-gyp": "^0.11.0", + "simple-get": "^3.0.3" + }, + "dependencies": { + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + } } }, "capitalize": { @@ -2648,12 +2730,12 @@ "dev": true }, "catharsis": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", - "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", + "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", "dev": true, "requires": { - "underscore-contrib": "~0.3.0" + "lodash": "^4.17.11" } }, "caw": { @@ -3016,9 +3098,9 @@ } }, "color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", - "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -3119,6 +3201,12 @@ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "compare-module-exports": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", @@ -3390,21 +3478,52 @@ } } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, "requires": { "capture-stack-trace": "^1.0.0" } @@ -3909,6 +4028,23 @@ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4004,6 +4140,12 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, "dependency-tree": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-6.5.0.tgz", @@ -4290,6 +4432,15 @@ "lodash.omit": "^4.5.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -4502,9 +4653,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", - "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", + "version": "1.3.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", + "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", "dev": true }, "elegant-spinner": { @@ -4708,6 +4859,12 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-promise": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", @@ -4781,9 +4938,9 @@ } }, "eslint": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.0.tgz", - "integrity": "sha512-xwG7SS5JLeqkiR3iOmVgtF8Y6xPdtr6AAsN6ph7Q6R/fv+3UlKYoika8SmNzmb35qdRF+RfTY35kMEdtbi+9wg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4792,7 +4949,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.2", + "eslint-scope": "^4.0.3", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^5.0.1", @@ -4806,7 +4963,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.11", @@ -4833,15 +4990,6 @@ "ms": "^2.1.1" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "import-fresh": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", @@ -4926,9 +5074,9 @@ } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -4963,21 +5111,22 @@ } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz", + "integrity": "sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", "lodash": "^4.17.11", "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.11.0" }, "dependencies": { "debug": { @@ -5090,6 +5239,15 @@ "read-pkg": "^2.0.0" } }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -5121,18 +5279,18 @@ } }, "eslint-plugin-prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", - "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", + "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", "dev": true }, "eslint-plugin-standard": { @@ -5142,9 +5300,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", - "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -5436,9 +5594,9 @@ }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", "dev": true } } @@ -5621,9 +5779,9 @@ "dev": true }, "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", @@ -5703,12 +5861,6 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -5727,9 +5879,9 @@ } }, "filing-cabinet": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-2.3.2.tgz", - "integrity": "sha512-31zt8QRdGW8HEQNdAz2Hsk/eixQE+ZOFh7k9Fwh6cHb/ms7SbyE+JInGG8HP36HL6erPb6aCw6Q8OeyxE9PfNg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-2.3.3.tgz", + "integrity": "sha512-Lp9FNBm74UnZI/0tVcH8WlJZmnYf9/qImt1/VUaEj3rlBl+V7M5yVAzYPJ7X1T2WxQeCrSQN4jN64SlQa6Rbew==", "dev": true, "requires": { "app-module-path": "^2.2.0", @@ -5739,7 +5891,7 @@ "is-relative-path": "^1.0.2", "module-definition": "^3.0.0", "module-lookup-amd": "^6.1.0", - "resolve": "^1.9.0", + "resolve": "^1.11.1", "resolve-dependency-path": "^2.0.0", "sass-lookup": "^3.0.0", "stylus-lookup": "^3.0.1", @@ -5754,6 +5906,15 @@ "requires": { "ms": "^2.1.1" } + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, @@ -5821,6 +5982,44 @@ "traverse-chain": "~0.1.0" } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", @@ -5836,19 +6035,19 @@ } }, "find-versions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", - "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.1.0.tgz", + "integrity": "sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==", "dev": true, "requires": { - "array-uniq": "^2.0.0", + "array-uniq": "^2.1.0", "semver-regex": "^2.0.0" }, "dependencies": { "array-uniq": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", - "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", + "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", "dev": true } } @@ -5936,6 +6135,16 @@ "integrity": "sha512-l6WMbeh7+Zd4TTu3yUUPR5KOepiuGLd/QAPfTIoX8ipTko0IF7PU6dsM4YM2zCDToEPIPSyCBKEJnKlSdYMgaA==", "dev": true }, + "font-snapper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/font-snapper/-/font-snapper-1.0.0.tgz", + "integrity": "sha512-8E91ADLNoLIXZGGRDuuK13SWPVbbxIwVkcIcvEoQdEpP13U20bOVXXrur4VxUff3pMImrot7cM/9vN0LwiJ32w==", + "dev": true, + "requires": { + "css-font-weight-names": "^0.2.1", + "font-family-papandreou": "^0.2.0-patch1" + } + }, "font-tracer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.1.0.tgz", @@ -5986,21 +6195,34 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6093,9 +6315,9 @@ } }, "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -6831,42 +7053,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -7047,9 +7233,9 @@ "dev": true }, "handlebars": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", - "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7219,6 +7405,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, "hat": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", @@ -7296,25 +7491,43 @@ } }, "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } } } }, @@ -7350,15 +7563,16 @@ "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" }, "dependencies": { "statuses": { @@ -7660,9 +7874,9 @@ } }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -7676,7 +7890,7 @@ "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { @@ -7690,9 +7904,9 @@ } }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7916,21 +8130,6 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", @@ -8115,18 +8314,6 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -8292,53 +8479,169 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "append-transform": "^1.0.0" } }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + } } }, - "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", - "dev": true - }, - "jpegtran": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", - "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "jpegtran-bin": "^4.0.0", - "memoizeasync": "^1.0.0", - "which": "^1.2.14" - } - }, + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "javascript-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", + "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==", + "dev": true + }, + "jpegtran": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", + "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", + "dev": true, + "requires": { + "jpegtran-bin": "^4.0.0", + "memoizeasync": "^1.0.0", + "which": "^1.2.14" + } + }, "jpegtran-bin": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", @@ -8357,15 +8660,15 @@ "dev": true }, "js-beautify": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz", - "integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", + "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", "dev": true, "requires": { "config-chain": "^1.1.12", - "editorconfig": "^0.15.2", + "editorconfig": "^0.15.3", "glob": "^7.1.3", - "mkdirp": "~0.5.0", + "mkdirp": "~0.5.1", "nopt": "~4.0.1" } }, @@ -8397,12 +8700,12 @@ } }, "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", + "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", "dev": true, "requires": { - "xmlcreate": "^1.0.1" + "xmlcreate": "^2.0.0" } }, "jsbn": { @@ -8412,29 +8715,43 @@ "dev": true }, "jsdoc": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", - "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", + "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", "dev": true, "requires": { - "babylon": "7.0.0-beta.19", - "bluebird": "~3.5.0", - "catharsis": "~0.8.9", - "escape-string-regexp": "~1.0.5", - "js2xmlparser": "~3.0.0", - "klaw": "~2.0.0", - "marked": "~0.3.6", - "mkdirp": "~0.5.1", - "requizzle": "~0.2.1", - "strip-json-comments": "~2.0.1", + "@babel/parser": "^7.4.4", + "bluebird": "^3.5.4", + "catharsis": "^0.8.10", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.0", + "klaw": "^3.0.0", + "markdown-it": "^8.4.2", + "markdown-it-anchor": "^5.0.2", + "marked": "^0.6.2", + "mkdirp": "^0.5.1", + "requizzle": "^0.2.2", + "strip-json-comments": "^3.0.1", "taffydb": "2.6.2", - "underscore": "~1.8.3" + "underscore": "~1.9.1" }, "dependencies": { - "babylon": { - "version": "7.0.0-beta.19", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", - "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "taffydb": { @@ -8442,19 +8759,13 @@ "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true } } }, "jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", - "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz", + "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==", "dev": true, "requires": { "abab": "^2.0.0", @@ -8492,9 +8803,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -8630,9 +8941,9 @@ "dev": true }, "karma": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", - "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", "dev": true, "requires": { "bluebird": "^3.3.0", @@ -8665,9 +8976,9 @@ }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", "dev": true }, "source-map": { @@ -8768,9 +9079,9 @@ "dev": true }, "klaw": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", - "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -8871,14 +9182,14 @@ } }, "lint-staged": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.5.tgz", - "integrity": "sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA==", + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.7.tgz", + "integrity": "sha512-egT0goFhIFoOGk6rasPngTFh2qDqxZddM0PwI58oi66RxCDcn5uDwxmiasWIF0qGnchHSYVJ8HPRD5LrFo7TKA==", "dev": true, "requires": { "chalk": "^2.3.1", "commander": "^2.14.1", - "cosmiconfig": "^5.0.2", + "cosmiconfig": "^5.2.0", "debug": "^3.1.0", "dedent": "^0.7.0", "del": "^3.0.0", @@ -8900,9 +9211,21 @@ "staged-git-files": "1.1.2", "string-argv": "^0.0.2", "stringify-object": "^3.2.2", - "yup": "^0.26.10" + "yup": "^0.27.0" }, "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -8939,14 +9262,30 @@ } }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -9019,16 +9358,10 @@ "rxjs": "^6.3.3" }, "dependencies": { - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", - "dev": true - }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -9227,7 +9560,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -9268,7 +9601,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -9289,7 +9622,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -9348,6 +9681,12 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -9462,16 +9801,27 @@ } }, "log4js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", - "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", + "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", "dev": true, "requires": { "date-format": "^2.0.0", - "debug": "^3.1.0", + "debug": "^4.1.1", "flatted": "^2.0.0", "rfdc": "^1.1.2", - "streamroller": "^1.0.1" + "streamroller": "^1.0.5" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "logalot": { @@ -9485,9 +9835,9 @@ } }, "lolex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", - "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.1.0.tgz", + "integrity": "sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==", "dev": true }, "longest": { @@ -9547,9 +9897,9 @@ } }, "luxon": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.12.1.tgz", - "integrity": "sha512-Zv/qJb2X1ESTrlniAViWx2aqGwi2cVpeoZFTbPdPiCu4EsadKsmb/QCH8HQjMUpDZKKJIHKHsJxV5Rwpq47HKQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.16.0.tgz", + "integrity": "sha512-qaqB+JwpGwtl7UbIXng3A/l4W/ySBr8drQvwtMLZBMiLD2V+0fEnPWMrs+UjnIy9PsktazQaKvwDUCLzoWz0Hw==", "dev": true }, "magic-string": { @@ -9664,24 +10014,24 @@ } }, "markdown-it-anchor": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz", - "integrity": "sha512-AFM/woBI8QDJMS/9+MmsBMT5/AR+ImfOsunQZTZhzcTmna3rIzAzbOh5E0l6mlFM/i9666BpUtkqQ9bS7WApCg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", + "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", "dev": true }, "markdown-it-attrs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.3.2.tgz", - "integrity": "sha512-DyatNvpatg7w+fGkplWGeie7o/0TogBr2w0izyz9ZQfTMv5G3lbDHQFQ42aP2e5L2mJQt0IeAjWzvYaa2d9xzQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.4.1.tgz", + "integrity": "sha512-BASnIYS+JLpjlhDf7jLV8VOuccxjfDDnQcz5dLfgPsYw8OsgbASexADdIkF7tIdGn+jaQSA4qOZXM3v3W3JBCg==", "dev": true }, "markdown-it-prism": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.1.tgz", - "integrity": "sha512-hO5vcnMsVWUw3WWrhric++7I4O8Nfv4NJx7kfypa45c2qfeLUtyH0lw6R5WdqTEWVstWElGCHfbB9hDjQHUd/w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.2.tgz", + "integrity": "sha512-tBRK+L36D2m4NauUr9teyFYJXBtw6XtuCdCJJWeNabSBwKlgI3oil4TfHHWd0bunwSf8zkmXEZkJzDVgVkfp+g==", "dev": true, "requires": { - "prismjs": "^1.15.0" + "prismjs": "^1.16.0" } }, "markdown-link": { @@ -9918,9 +10268,9 @@ } }, "marked": { - "version": "0.3.19", - "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", "dev": true }, "matcher": { @@ -10400,31 +10750,14 @@ "dev": true }, "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "dev": true, "requires": { - "debug": "^2.1.2", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } } }, "negotiator": { @@ -10434,9 +10767,15 @@ "dev": true }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, "nice-try": { @@ -10445,24 +10784,16 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nise": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", - "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.0.tgz", + "integrity": "sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==", "dev": true, "requires": { "@sinonjs/formatio": "^3.1.0", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^2.3.2", + "lolex": "^4.1.0", "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - } } }, "no-case": { @@ -10475,9 +10806,9 @@ } }, "node-abi": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", - "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", + "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", "dev": true, "requires": { "semver": "^5.4.1" @@ -10613,9 +10944,9 @@ } }, "node-releases": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.9.tgz", - "integrity": "sha512-oic3GT4OtbWWKfRolz5Syw0Xus0KRFxeorLNj0s93ofX6PWyuzKjsiGxsCtWktBwwmTF6DdRRf2KreGqeOk5KA==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", + "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", "dev": true, "requires": { "semver": "^5.3.0" @@ -10757,9 +11088,9 @@ } }, "nps": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.4.tgz", - "integrity": "sha512-4RFiRTG0/hwcdTqfhwOT2sxtC7JEElyZDTsa3DIhf4ekFFL/87y2JvPAIRZJWVnEp+tG2a7qzv0eJE4NgJLlDg==", + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.5.tgz", + "integrity": "sha512-UsjrtowHeXGnKELZUlqiyPSXc3vYs3YwLZEFfZJ1Z9kZCFgtzK4YRVKnxEa+teRMMdw6Q4keAX/M/aLCkPTqIw==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -11113,7 +11444,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -11154,7 +11485,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -11170,1042 +11501,80 @@ } }, "nwsapi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", - "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", "dev": true, "requires": { "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", + "caching-transform": "^3.0.2", "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", + "test-exclude": "^5.2.3", "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, + "merge-source-map": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { - "lodash": "^4.17.11" + "source-map": "^0.6.1" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "camelcase": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "resolve-from": { "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "yargs": { - "version": "12.0.5", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -12304,16 +11673,6 @@ "es-abstract": "^1.5.1" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -12352,6 +11711,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", @@ -12360,7 +11728,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -12400,21 +11768,21 @@ } }, "optipng": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/optipng/-/optipng-2.0.0.tgz", - "integrity": "sha512-4iClrdhjPbziIefK9GBnGIpAUPcW6nbJkRyabgLRVtsJNtvzAjgq+V0J1cOEN1OXlr0xd5BQO0dj/XotOx6hnw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/optipng/-/optipng-2.1.0.tgz", + "integrity": "sha512-Qih2It6tRiHr6tjxY3fL16G+vXJa4+LbpIA4vrNabpvpCOzlnNUwNQqQg9h4lxu/fTz3yReqlqqeIna+KVhTDA==", "dev": true, "requires": { "gettemporaryfilepath": "^1.0.0", "memoizeasync": "^1.1.0", - "optipng-bin": "^5.0.0", + "optipng-bin": "^6.0.0", "which": "^1.2.14" } }, "optipng-bin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", - "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-6.0.0.tgz", + "integrity": "sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==", "dev": true, "requires": { "bin-build": "^3.0.0", @@ -12531,9 +11899,9 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, "p-map-series": { @@ -12565,6 +11933,18 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", @@ -12593,18 +11973,18 @@ } }, "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" }, "dependencies": { "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true } } @@ -12666,35 +12046,6 @@ "path-root": "^0.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -13672,9 +13023,9 @@ } }, "prebuild-install": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", - "integrity": "sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", + "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", "dev": true, "requires": { "detect-libc": "^1.0.3", @@ -13778,16 +13129,10 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", + "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", "dev": true }, "prettier-linter-helpers": { @@ -13829,7 +13174,7 @@ }, "pretty-ms": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -13837,9 +13182,9 @@ } }, "prismjs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", - "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", + "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -14031,7 +13376,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14235,15 +13580,26 @@ "dev": true }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "rc": { @@ -14392,15 +13748,6 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -14442,6 +13789,15 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remark": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", @@ -14701,20 +14057,12 @@ "dev": true }, "requizzle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", - "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", + "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", "dev": true, "requires": { - "underscore": "~1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } + "lodash": "^4.17.11" } }, "resolve": { @@ -14788,17 +14136,6 @@ "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" - }, - "dependencies": { - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } } }, "restructure": { @@ -14817,9 +14154,9 @@ "dev": true }, "rewiremock": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.0.tgz", - "integrity": "sha512-1MkO4mX4j31GilbMsqdgLNXjmrHo9EUKQFCa82rLye8ltOHnJe0rRaHUSKz2yUClr8l0Qnj1ZTjZHmp6vNTrzQ==", + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.7.tgz", + "integrity": "sha512-U6iFfdXPiNtIBDcJWmspl/nhVk1EANkXLq2GM78T3ZfegvO5EW0TgNzExLh5iHXFJKQr//SmH9iloK/s4O7UqA==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -14833,9 +14170,9 @@ } }, "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, "rgb-regex": { @@ -15131,12 +14468,30 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -15169,11 +14524,35 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true } } }, @@ -15251,9 +14630,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { @@ -15361,9 +14740,9 @@ } }, "simple-git": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", - "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==", + "version": "1.113.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.113.0.tgz", + "integrity": "sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==", "dev": true, "requires": { "debug": "^4.0.1" @@ -15398,16 +14777,16 @@ } }, "sinon": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.7.tgz", - "integrity": "sha512-rlrre9F80pIQr3M36gOdoCEWzFAMDgHYD8+tocqOw+Zw9OZ8F84a80Ds69eZfcjnzDqqG88ulFld0oin/6rG/g==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", + "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.1", + "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.2.0", + "@sinonjs/samsam": "^3.3.1", "diff": "^3.5.0", - "lolex": "^3.1.0", + "lolex": "^4.0.1", "nise": "^1.4.10", "supports-color": "^5.5.0" }, @@ -15823,9 +15202,9 @@ } }, "source-map-support": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", - "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -15862,6 +15241,20 @@ "spawn-command": "^0.0.2-1" } }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -16182,16 +15575,16 @@ } }, "streamroller": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", - "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", + "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", "dev": true, "requires": { - "async": "^2.6.1", + "async": "^2.6.2", "date-format": "^2.0.0", - "debug": "^3.1.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.10" + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11" }, "dependencies": { "async": { @@ -16295,17 +15688,17 @@ } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, @@ -16438,9 +15831,9 @@ } }, "svgo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.0.tgz", - "integrity": "sha512-xBfxJxfk4UeVN8asec9jNxHiv3UAMv/ujwBWGYvQhhMb2u3YTGKkiybPcLFDLq7GLLWE9wa73e0/m8L5nTzQbw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -16450,7 +15843,7 @@ "css-tree": "1.0.0-alpha.28", "css-url-regex": "^1.1.0", "csso": "^3.5.1", - "js-yaml": "^3.12.0", + "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", @@ -16511,9 +15904,9 @@ } }, "synchronous-promise": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.6.tgz", - "integrity": "sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.9.tgz", + "integrity": "sha512-LO95GIW16x69LuND1nuuwM4pjgFGupg7pZ/4lU86AmchPKrhk0o2tpMU2unXRrqo81iAFe1YJ0nAGEVwsrZAgg==", "dev": true }, "syntax-error": { @@ -16526,9 +15919,9 @@ } }, "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", + "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", "dev": true, "requires": { "ajv": "^6.9.1", @@ -16538,14 +15931,14 @@ }, "dependencies": { "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } } } @@ -16557,24 +15950,24 @@ "dev": true }, "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" }, "dependencies": { "yallist": { @@ -16748,6 +16141,90 @@ } } }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16874,7 +16351,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -16990,9 +16467,9 @@ } }, "to-vfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-5.0.2.tgz", - "integrity": "sha512-Gp2q0HCUR+4At6c6mvFKug75NP/8Cu5r7ONvEcJJPBGiDT4HeLBrRnPKJbOe84nHJqYhIah2y367Tr2+IUkwMA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-5.0.3.tgz", + "integrity": "sha512-z1Lfx60yAMDMmr+f426Y4yECsHdl8GVEAE+LymjRF5oOIZ7T4N20IxWNAxXLMRzP9jSSll38Z0fKVAhVLsdLOw==", "dev": true, "requires": { "is-buffer": "^2.0.0", @@ -17007,6 +16484,12 @@ } } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "token-stream": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", @@ -17132,13 +16615,30 @@ "dev": true }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + } } }, "typedarray": { @@ -17148,9 +16648,9 @@ "dev": true }, "typescript": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", - "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", + "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", "dev": true }, "typescript-eslint-parser": { @@ -17184,26 +16684,29 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, + "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "optional": true } } }, @@ -17261,23 +16764,6 @@ "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, "underscore.string": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", @@ -17348,9 +16834,9 @@ "dev": true }, "unexpected-sinon": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.1.tgz", - "integrity": "sha512-2zSX7vsOYlljjS/3DeQolFzYgA22PmH0ncLCva+ve2AHHJBO0Xnxyt8ri1en1W5b7nRg5F7N6HNdflVNhI7dww==", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.2.tgz", + "integrity": "sha512-N2KIKPweTVs6AK8cDKQTUwu0fGWyGt+cI/UJZ/eltAyOKgsHL9eILttdGfpZjI/iMYcHcbtUwIlXoHfmh6EcBw==", "dev": true }, "unherit": { @@ -17747,9 +17233,9 @@ } }, "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", "dev": true }, "verror": { @@ -18140,9 +17626,9 @@ "dev": true }, "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", + "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", "dev": true }, "xmldom": { @@ -18291,16 +17777,16 @@ "dev": true }, "yup": { - "version": "0.26.10", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.26.10.tgz", - "integrity": "sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", + "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", "dev": true, "requires": { - "@babel/runtime": "7.0.0", + "@babel/runtime": "^7.0.0", "fn-name": "~2.0.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.5", + "synchronous-promise": "^2.0.6", "toposort": "^2.0.2" } } diff --git a/package.json b/package.json index b8fc469780..8cc9ea2bb9 100644 --- a/package.json +++ b/package.json @@ -529,11 +529,11 @@ "yargs-unparser": "1.5.0" }, "devDependencies": { - "@11ty/eleventy": "^0.7.1", + "@11ty/eleventy": "^0.8.3", "@mocha/contributors": "^1.0.3", "@mocha/docdash": "^2.1.0", - "assetgraph-builder": "^6.10.0", - "autoprefixer": "^9.4.10", + "assetgraph-builder": "^6.10.1", + "autoprefixer": "^9.6.0", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", @@ -541,49 +541,49 @@ "coveralls": "^3.0.3", "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", - "eslint": "^5.15.0", + "eslint": "^5.16.0", "eslint-config-prettier": "^3.6.0", "eslint-config-semistandard": "^13.0.0", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.16.0", + "eslint-plugin-import": "^2.17.3", "eslint-plugin-node": "^8.0.1", - "eslint-plugin-prettier": "^3.0.1", - "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-prettier": "^3.1.0", + "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", "fs-extra": "^8.0.1", "husky": "^1.3.1", - "jsdoc": "^3.5.5", - "karma": "^4.0.1", + "jsdoc": "^3.6.2", + "karma": "^4.1.0", "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", "karma-sauce-launcher": "^2.0.2", - "lint-staged": "^8.1.5", + "lint-staged": "^8.1.7", "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "markdown-it-attrs": "^2.3.2", - "markdown-it-prism": "^2.0.1", + "markdown-it-anchor": "^5.2.4", + "markdown-it-attrs": "^2.4.1", + "markdown-it-prism": "^2.0.2", "markdown-magic": "^0.1.25", "markdown-magic-package-json": "^2.0.0", "markdown-toc": "^1.2.0", "markdownlint-cli": "^0.14.1", - "nps": "^5.9.4", - "nyc": "^13.3.0", - "prettier": "^1.16.4", + "nps": "^5.9.5", + "nyc": "^14.1.1", + "prettier": "^1.17.1", "remark": "^10.0.1", "remark-github": "^7.0.6", "remark-inline-links": "^3.1.2", - "rewiremock": "^3.13.0", + "rewiremock": "^3.13.7", "rimraf": "^2.6.3", - "sinon": "^7.2.7", - "strip-ansi": "^5.0.0", - "svgo": "^1.2.0", + "sinon": "^7.3.2", + "strip-ansi": "^5.2.0", + "svgo": "^1.2.2", "through2": "^3.0.1", - "to-vfile": "^5.0.2", + "to-vfile": "^5.0.3", "unexpected": "^10.40.2", "unexpected-eventemitter": "^1.1.3", - "unexpected-sinon": "^10.11.1", + "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", "watchify": "^3.11.1" }, From d02a0966d03b0945c77412bee5ea56b48ca26cf2 Mon Sep 17 00:00:00 2001 From: Pascal Date: Thu, 6 Jun 2019 01:36:26 -0400 Subject: [PATCH 1355/1771] modify Mocha constructor to accept options.global or options.globals (#3914) * consume options.global or options.globals in the constructor. filter unique values * added tests for options.global and options.globals * fixed API doc link --- lib/mocha.js | 13 ++++++++--- test/unit/mocha.spec.js | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index aab5604448..c0a5aa6dd9 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -106,6 +106,10 @@ function Mocha(options) { options.color = 'color' in options ? options.color : options.useColors; } + // Globals are passed in as options.global, with options.globals for backward compatibility. + options.globals = options.global || options.globals || []; + delete options.global; + this.grep(options.grep) .fgrep(options.fgrep) .ui(options.ui) @@ -540,7 +544,7 @@ Mocha.prototype._growl = growl.notify; * Specifies whitelist of variable names to be expected in global scope. * * @public - * @see {@link https://mochajs.org/#--globals-names|CLI option} + * @see {@link https://mochajs.org/#-global-variable-name|CLI option} * @see {@link Mocha#checkLeaks} * @param {String[]|String} globals - Accepted global variable name(s). * @return {Mocha} this @@ -551,9 +555,12 @@ Mocha.prototype._growl = growl.notify; * mocha.globals(['jQuery', 'MyLib']); */ Mocha.prototype.globals = function(globals) { - this.options.globals = (this.options.globals || []) + this.options.globals = this.options.globals .concat(globals) - .filter(Boolean); + .filter(Boolean) + .filter(function(elt, idx, arr) { + return arr.indexOf(elt) === idx; + }); return this; }; diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 16fbbd7f82..ed99a3e257 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -21,6 +21,7 @@ describe('Mocha', function() { sandbox.stub(Mocha.prototype, 'useColors').returnsThis(); sandbox.stub(utils, 'deprecate'); sandbox.stub(Mocha.prototype, 'timeout').returnsThis(); + sandbox.stub(Mocha.prototype, 'globals').returnsThis(); }); describe('when "useColors" option is defined', function() { @@ -64,6 +65,44 @@ describe('Mocha', function() { ); }); }); + + describe('when "options.global" is provided', function() { + it('should pass "options.global" to #globals()', function() { + // eslint-disable-next-line no-new + new Mocha({global: ['singular']}); + expect(Mocha.prototype.globals, 'to have a call satisfying', [ + ['singular'] + ]).and('was called once'); + }); + it('should delete mocha.options.global', function() { + var mocha = new Mocha({global: ['singular']}); + expect(mocha.options.global, 'to be', undefined); + }); + }); + + describe('when "options.globals" is provided', function() { + it('should pass "options.globals" to #globals()', function() { + // eslint-disable-next-line no-new + new Mocha({globals: ['plural']}); + expect(Mocha.prototype.globals, 'to have a call satisfying', [ + ['plural'] + ]).and('was called once'); + }); + }); + + describe('when "options.global" AND "options.globals" are provided', function() { + it('should pass "options.global" to #globals(), ignoring "options.globals"', function() { + // eslint-disable-next-line no-new + new Mocha({global: ['singular'], globals: ['plural']}); + expect(Mocha.prototype.globals, 'to have a call satisfying', [ + ['singular'] + ]).and('was called once'); + }); + it('should delete mocha.options.global', function() { + var mocha = new Mocha({global: ['singular'], globals: ['plural']}); + expect(mocha.options.global, 'to be', undefined); + }); + }); }); describe('#allowUncaught()', function() { @@ -159,6 +198,7 @@ describe('Mocha', function() { describe('when argument is valid', function() { var elem = 'foo'; var elem2 = 'bar'; + var elem3 = 'baz'; it('should add string to the whitelist', function() { var mocha = new Mocha(opts); @@ -174,6 +214,14 @@ describe('Mocha', function() { expect(mocha.options.globals, 'to contain', elem, elem2); expect(mocha.options.globals, 'to have length', elems.length); }); + + it('should not have duplicates', function() { + var mocha = new Mocha({globals: [elem, elem2]}); + var elems = [elem, elem2, elem3]; + mocha.globals(elems); + expect(mocha.options.globals, 'to contain', elem, elem2, elem3); + expect(mocha.options.globals, 'to have length', elems.length); + }); }); }); From 9ea45e7557a193c4b69816085397a6655fb5bc06 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 9 Jun 2019 22:42:04 -0700 Subject: [PATCH 1356/1771] do not fork if no node flags present (#3827) * do not fork if no node flags present * peer review changes, also ensure `lib/cli/cli.js` is executable --- bin/mocha | 58 ++++++++++++++++++++++++++++---------------------- lib/cli/cli.js | 2 ++ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/bin/mocha b/bin/mocha index cec93a3366..df7cf48ca3 100755 --- a/bin/mocha +++ b/bin/mocha @@ -3,14 +3,14 @@ 'use strict'; /** - * This wrapper executable checks for known node flags and appends them when found, before invoking the "real" _mocha(1) executable. + * This wrapper executable checks for known node flags and appends them when found, + * before invoking the "real" executable (`lib/cli/cli.js`) * * @module bin/mocha * @private */ const {deprecate, warn} = require('../lib/utils'); -const {spawn} = require('child_process'); const {loadOptions} = require('../lib/cli/options'); const { unparseNodeFlags, @@ -22,7 +22,6 @@ const debug = require('debug')('mocha:cli:mocha'); const {aliases} = require('../lib/cli/run-option-metadata'); const nodeEnv = require('node-environment-flags'); -const mochaPath = require.resolve('./_mocha'); const mochaArgs = {}; const nodeArgs = {}; @@ -118,32 +117,39 @@ if (nodeArgs.gc) { delete nodeArgs.gc; } -debug('final node args', nodeArgs); +if (Object.keys(nodeArgs).length) { + const {spawn} = require('child_process'); + const mochaPath = require.resolve('../lib/cli/cli.js'); -const args = [].concat( - unparseNodeFlags(nodeArgs), - mochaPath, - unparse(mochaArgs, {alias: aliases}) -); + debug('final node args', nodeArgs); -debug(`exec ${process.execPath} w/ args:`, args); + const args = [].concat( + unparseNodeFlags(nodeArgs), + mochaPath, + unparse(mochaArgs, {alias: aliases}) + ); -const proc = spawn(process.execPath, args, { - stdio: 'inherit' -}); + debug(`exec ${process.execPath} w/ args:`, args); -proc.on('exit', (code, signal) => { - process.on('exit', () => { - if (signal) { - process.kill(process.pid, signal); - } else { - process.exit(code); - } + const proc = spawn(process.execPath, args, { + stdio: 'inherit' }); -}); -// terminate children. -process.on('SIGINT', () => { - proc.kill('SIGINT'); // calls runner.abort() - proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. -}); + proc.on('exit', (code, signal) => { + process.on('exit', () => { + if (signal) { + process.kill(process.pid, signal); + } else { + process.exit(code); + } + }); + }); + + // terminate children. + process.on('SIGINT', () => { + proc.kill('SIGINT'); // calls runner.abort() + proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. + }); +} else { + require('../lib/cli/cli').main(unparse(mochaArgs, {alias: aliases})); +} diff --git a/lib/cli/cli.js b/lib/cli/cli.js index 8e82983af4..dee8e70dd4 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -1,3 +1,5 @@ +#!/usr/bin/env node + 'use strict'; /** From 3064d25ee50cde6aabeca5751e090c8893cdbd31 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 12 Jun 2019 10:58:11 -0700 Subject: [PATCH 1357/1771] update @mocha/docdash to v2.1.1 (#3945) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91e3c92f92..4b751c2727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,9 +327,9 @@ } }, "@mocha/docdash": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.0.tgz", - "integrity": "sha512-7IHmZJlWjasKdWGSEKwI0HxqSN3OC+BRPhFNhY9QAN7xnJWGBo7eU6+phwRWheU42Dnj8Tm2JeLzBG9YJEGvCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.1.tgz", + "integrity": "sha512-D6l+L2rItDsO2bcc2Fl/REKDaOZMMUB1VYuFdgrM2Kk02DMCnhzZWyuBfXyNWfh3YplR38AJlOifx0dHutYD6g==", "dev": true, "requires": { "taffydb": "^2.7.3" diff --git a/package.json b/package.json index 8cc9ea2bb9..0df4039ec8 100644 --- a/package.json +++ b/package.json @@ -531,7 +531,7 @@ "devDependencies": { "@11ty/eleventy": "^0.8.3", "@mocha/contributors": "^1.0.3", - "@mocha/docdash": "^2.1.0", + "@mocha/docdash": "^2.1.1", "assetgraph-builder": "^6.10.1", "autoprefixer": "^9.6.0", "browserify": "^16.2.3", From e341ea4ad9f02b2f55798872f49e15ee023b3134 Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Wed, 12 Jun 2019 15:10:06 -0500 Subject: [PATCH 1358/1771] Update CI config files to use Node-12.x (#3919) * ci(.travis.yml): Update Travis config to use Node-12 Downgrade to Node-10 for browser tests so we can use the pre-built canvas package. * ci(appveyor.yml): Update AppVeyor config to use Node-12 Future-proof install for Node versions to use alternative Node update method if pre-installed version unavailable. --- .travis.yml | 5 ++++- appveyor.yml | 11 +++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2de2a30cdb..e6125d7d3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,11 @@ stages: # defaults language: node_js -node_js: '11' +node_js: '12' addons: apt: packages: + # Growl - libnotify-bin # `nvm install` happens before the cache is restored, which means # we must install our own npm elsewhere (`~/npm`) @@ -49,6 +50,8 @@ jobs: node_js: '6' - script: npm start test.bundle test.browser + # XXX: update when canvas supplies a prebuilt binary for Node.js v12.x + node_js: 10 install: npm ci # we need the native modules here addons: artifacts: diff --git a/appveyor.yml b/appveyor.yml index 32ed327dea..780466f46b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ shallow_clone: true clone_depth: 1 environment: matrix: - - nodejs_version: '11' + - nodejs_version: '12' - nodejs_version: '10' - nodejs_version: '8' - nodejs_version: '6' @@ -35,7 +35,14 @@ install: ## Node-related installs - ps: Add-AppveyorMessage "Installing Node..." - set PATH=%APPDATA%\npm;C:\MinGW\bin;%PATH% - - ps: Install-Product node $env:nodejs_version x64 + ## Prefer pre-installed Node versions, with fallback to manual update + - ps: | + try { + Install-Product node $env:nodejs_version $env:platform + } catch { + Add-AppveyorMessage " install failed - attempting manual update..." + Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:platform + } - ps: Add-AppveyorMessage "Installing npm..." - npm install -g npm ## Mocha-related package installs From c903147f059fd5c8a0b2b61a47e9612fd4426760 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Thu, 13 Jun 2019 13:27:35 +0200 Subject: [PATCH 1359/1771] More, improved integration tests for watching (#3929) To extend the test coverage for mocha in watch mode we add the following two tests: * Check that test files are reloaded * Check that watched dependencies are reloaded To support this change we consolidate `runMochaJSONWatchAsync`, `runMochaJSONRawAsync`, and repeated code in tests into `runMochaWatch`. We introduce `invokeMochaAsync` in `test/integration/helpers` as an async alternative to `invokeMocha`. We also eliminate the test for the cursor control character in the output. Its usefulness is dubious as it relies on an implementation detail and the other tests cover the intended behavior. We are also more explicit which test fixtures are used. Instead of setting `this.testFile` in a `beforeEach` hook we do this explicitly for the tests that require it. This prevents interference in tests that do not use the file. --- .../options/watch/dependency.fixture.js | 1 + .../options/watch/test-file-change.fixture.js | 8 + .../watch/test-with-dependency.fixture.js | 7 + test/integration/helpers.js | 66 ++--- test/integration/options/watch.spec.js | 225 +++++++++--------- 5 files changed, 168 insertions(+), 139 deletions(-) create mode 100644 test/integration/fixtures/options/watch/dependency.fixture.js create mode 100644 test/integration/fixtures/options/watch/test-file-change.fixture.js create mode 100644 test/integration/fixtures/options/watch/test-with-dependency.fixture.js diff --git a/test/integration/fixtures/options/watch/dependency.fixture.js b/test/integration/fixtures/options/watch/dependency.fixture.js new file mode 100644 index 0000000000..d4975b8bd6 --- /dev/null +++ b/test/integration/fixtures/options/watch/dependency.fixture.js @@ -0,0 +1 @@ +module.exports.testShouldFail = false; diff --git a/test/integration/fixtures/options/watch/test-file-change.fixture.js b/test/integration/fixtures/options/watch/test-file-change.fixture.js new file mode 100644 index 0000000000..ca897b050c --- /dev/null +++ b/test/integration/fixtures/options/watch/test-file-change.fixture.js @@ -0,0 +1,8 @@ +// This will be replaced in the tests +const testShouldFail = true; + +it('checks dependency', () => { + if (testShouldFail === true) { + throw new Error('test failed'); + } +}); diff --git a/test/integration/fixtures/options/watch/test-with-dependency.fixture.js b/test/integration/fixtures/options/watch/test-with-dependency.fixture.js new file mode 100644 index 0000000000..94d60dffe7 --- /dev/null +++ b/test/integration/fixtures/options/watch/test-with-dependency.fixture.js @@ -0,0 +1,7 @@ +const dependency = require('./lib/dependency'); + +it('checks dependency', () => { + if (dependency.testShouldFail === true) { + throw new Error('test failed'); + } +}); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index a705a2fe9b..78251c986b 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -113,39 +113,6 @@ module.exports = { opts ); }, - /** - * Invokes the mocha binary with the given arguments fixture using - * the JSON reporter. Returns the child process and a promise for the - * results of running the command. The result includes the **raw** - * string output, as well as exit code. - * - * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you - * want it as part of the result output. - * - * @param {string[]} args - Array of args - * @param {Object} [opts] - Opts for `spawn()` - * @returns {[ChildProcess|Promise]} - */ - runMochaJSONRawAsync: function(args, opts) { - args = args || []; - - let childProcess; - const resultPromise = new Promise((resolve, reject) => { - childProcess = invokeSubMocha( - [...args, '--reporter', 'json'], - function(err, resRaw) { - if (err) { - reject(err); - } else { - resolve(resRaw); - } - }, - opts - ); - }); - - return [childProcess, resultPromise]; - }, /** * regular expression used for splitting lines based on new line / dot symbol. @@ -174,6 +141,8 @@ module.exports = { */ invokeMocha: invokeMocha, + invokeMochaAsync: invokeMochaAsync, + /** * Resolves the path to a fixture to the full path. */ @@ -227,6 +196,37 @@ function invokeMocha(args, fn, opts) { ); } +/** + * Invokes the mocha binary with the given arguments. Returns the + * child process and a promise for the results of running the + * command. The promise resolves when the child process exits. The + * result includes the **raw** string output, as well as exit code. + * + * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you + * want it as part of the result output. + * + * @param {string[]} args - Array of args + * @param {Object} [opts] - Opts for `spawn()` + * @returns {[ChildProcess|Promise]} + */ +function invokeMochaAsync(args, opts) { + let mochaProcess; + const resultPromise = new Promise((resolve, reject) => { + mochaProcess = _spawnMochaWithListeners( + defaultArgs([MOCHA_EXECUTABLE].concat(args)), + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }, + opts + ); + }); + return [mochaProcess, resultPromise]; +} + function invokeSubMocha(args, fn, opts) { if (typeof args === 'function') { opts = fn; diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 1fb187a1e7..53dd9900c3 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -4,9 +4,6 @@ const fs = require('fs-extra'); const os = require('os'); const path = require('path'); const helpers = require('../helpers'); -const runMochaJSONRawAsync = helpers.runMochaJSONRawAsync; - -const sigintExitCode = 130; describe('--watch', function() { describe('when enabled', function() { @@ -15,11 +12,6 @@ describe('--watch', function() { beforeEach(function() { this.tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-')); - - const fixtureSource = helpers.DEFAULT_FIXTURE; - - this.testFile = path.join(this.tempDir, 'test.js'); - fs.copySync(fixtureSource, this.testFile); }); afterEach(function() { @@ -28,79 +20,39 @@ describe('--watch', function() { } }); - it('should show the cursor and signal correct exit code, when watch process is terminated', function() { - // Feature works but SIMULATING the signal (ctrl+c) via child process - // does not work due to lack of POSIX signal compliance on Windows. - if (process.platform === 'win32') { - this.skip(); - } - - const [mocha, resultPromise] = runMochaJSONRawAsync([ - helpers.DEFAULT_FIXTURE, - '--watch' - ]); - - return sleep(1000) - .then(() => { - mocha.kill('SIGINT'); - return resultPromise; - }) - .then(data => { - const expectedCloseCursor = '\u001b[?25h'; - expect(data.output, 'to contain', expectedCloseCursor); - - expect(data.code, 'to be', sigintExitCode); - }); - }); - it('reruns test when watched test file is touched', function() { - const [mocha, outputPromise] = runMochaJSONWatchAsync([this.testFile], { - cwd: this.tempDir - }); + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); - return expect( - sleep(1000) - .then(() => { - touchFile(this.testFile); - return sleep(1000); - }) - .then(() => { - mocha.kill('SIGINT'); - return outputPromise; - }), - 'when fulfilled', - 'to have length', - 2 - ); + return runMochaWatch([testFile], this.tempDir, () => { + touchFile(testFile); + }).then(results => { + expect(results, 'to have length', 2); + }); }); it('reruns test when file matching extension is touched', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + const watchedFile = path.join(this.tempDir, 'file.xyz'); touchFile(watchedFile); - const [mocha, outputPromise] = runMochaJSONWatchAsync( - [this.testFile, '--extension', 'xyz,js'], - { - cwd: this.tempDir - } - ); - return expect( - sleep(1000) - .then(() => { - touchFile(watchedFile); - return sleep(1000); - }) - .then(() => { - mocha.kill('SIGINT'); - return outputPromise; - }), - 'when fulfilled', - 'to have length', - 2 - ); + return runMochaWatch( + [testFile, '--extension', 'xyz,js'], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results, 'to have length', 2); + }); }); - it('ignores files in "node_modules" and ".git"', function() { + it('ignores files in "node_modules" and ".git" by default', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + const nodeModulesFile = path.join( this.tempDir, 'node_modules', @@ -111,50 +63,91 @@ describe('--watch', function() { touchFile(gitFile); touchFile(nodeModulesFile); - const [mocha, outputPromise] = runMochaJSONWatchAsync( - [this.testFile, '--extension', 'xyz,js'], - { - cwd: this.tempDir + return runMochaWatch( + [testFile, '--extension', 'xyz,js'], + this.tempDir, + () => { + touchFile(gitFile); + touchFile(nodeModulesFile); } - ); + ).then(results => { + expect(results, 'to have length', 1); + }); + }); - return expect( - sleep(1000) - .then(() => { - touchFile(gitFile); - touchFile(nodeModulesFile); - }) - .then(() => sleep(1000)) - .then(() => { - mocha.kill('SIGINT'); - return outputPromise; - }), - 'when fulfilled', - 'to have length', - 1 - ); + it('reloads test files when they change', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('options/watch/test-file-change', testFile); + + return runMochaWatch([testFile], this.tempDir, () => { + replaceFileContents( + testFile, + 'testShouldFail = true', + 'testShouldFail = false' + ); + }).then(results => { + expect(results, 'to have length', 2); + expect(results[0].passes, 'to have length', 0); + expect(results[0].failures, 'to have length', 1); + expect(results[1].passes, 'to have length', 1); + expect(results[1].failures, 'to have length', 0); + }); + }); + + it('reloads test dependencies when they change', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('options/watch/test-with-dependency', testFile); + + const dependency = path.join(this.tempDir, 'lib', 'dependency.js'); + copyFixture('options/watch/dependency', dependency); + + return runMochaWatch([testFile], this.tempDir, () => { + replaceFileContents( + dependency, + 'module.exports.testShouldFail = false', + 'module.exports.testShouldFail = true' + ); + }).then(results => { + expect(results, 'to have length', 2); + expect(results[0].passes, 'to have length', 1); + expect(results[0].failures, 'to have length', 0); + expect(results[1].passes, 'to have length', 0); + expect(results[1].failures, 'to have length', 1); + }); }); }); }); /** - * Invokes the mocha binary with the `--watch` argument for the given fixture. + * Runs the mocha binary in watch mode calls `change` and returns the + * JSON reporter output. * - * Returns child process and a promise for the test results. The test results - * are an array of JSON objects generated by the JSON reporter. + * The function starts mocha with the given arguments and `--watch` and + * waits until the first test run has completed. Then it calls `change` + * and waits until the second test run has been completed. Mocha is + * killed and the list of JSON outputs is returned. */ -function runMochaJSONWatchAsync(args, spawnOpts) { - args = [...args, '--watch']; - const [mocha, mochaDone] = runMochaJSONRawAsync(args, spawnOpts); - const testResults = mochaDone.then(data => { - const testResults = data.output - // eslint-disable-next-line no-control-regex - .replace(/\u001b\[\?25./g, '') - .split('\u001b[2K') - .map(x => JSON.parse(x)); - return testResults; - }); - return [mocha, testResults]; +function runMochaWatch(args, cwd, change) { + const [mochaProcess, resultPromise] = helpers.invokeMochaAsync( + [...args, '--watch', '--reporter', 'json'], + {cwd} + ); + + return sleep(1000) + .then(() => change()) + .then(() => sleep(1000)) + .then(() => { + mochaProcess.kill('SIGINT'); + return resultPromise; + }) + .then(data => { + const testResults = data.output + // eslint-disable-next-line no-control-regex + .replace(/\u001b\[\?25./g, '') + .split('\u001b[2K') + .map(x => JSON.parse(x)); + return testResults; + }); } /** @@ -166,6 +159,26 @@ function touchFile(file) { fs.appendFileSync(file, ' '); } +/** + * Synchronously eplace all substrings matched by `pattern` with + * `replacement` in the file’s content. + */ +function replaceFileContents(file, pattern, replacement) { + const contents = fs.readFileSync(file, 'utf-8'); + const newContents = contents.replace(pattern, replacement); + fs.writeFileSync(file, newContents, 'utf-8'); +} + +/** + * Synchronously copy a fixture to the given destion file path. Creates + * parent directories of the destination path if necessary. + */ +function copyFixture(fixtureName, dest) { + const fixtureSource = helpers.resolveFixturePath(fixtureName); + fs.ensureDirSync(path.dirname(dest)); + fs.copySync(fixtureSource, dest); +} + function sleep(time) { return new Promise(resolve => { setTimeout(resolve, time); From 47318a75fb0a218f843289de0511e8558f8b4df0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 19 Jun 2019 00:50:13 -0700 Subject: [PATCH 1360/1771] update @mocha/contributors to v1.0.4 (#3944) --- package-lock.json | 28 +++++++++++++--------------- package.json | 2 +- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b751c2727..08a127af94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -280,9 +280,9 @@ } }, "@mocha/contributors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@mocha/contributors/-/contributors-1.0.3.tgz", - "integrity": "sha512-BXrD00uf9gXqYVhS4wsKNdR7I88fQgNcxFNUhsdwZoWX4OZsR+F3fy8N+rizFMOGMiJbSa/Qm9CVjXYSXNznZA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@mocha/contributors/-/contributors-1.0.4.tgz", + "integrity": "sha512-bdOaBixwP7948K7xlqSXnelbsLDAnCX1h4qSRYfbRADMg+UtNJE+ggpzTdBVpdLNxJLkgnRM5KJ9MXiLoMib3Q==", "dev": true, "requires": { "log-symbols": "^2.2.0", @@ -310,18 +310,16 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index 0df4039ec8..b8f51c452c 100644 --- a/package.json +++ b/package.json @@ -530,7 +530,7 @@ }, "devDependencies": { "@11ty/eleventy": "^0.8.3", - "@mocha/contributors": "^1.0.3", + "@mocha/contributors": "^1.0.4", "@mocha/docdash": "^2.1.1", "assetgraph-builder": "^6.10.1", "autoprefixer": "^9.6.0", From ccee5f1b37bb405b81814daa35c63801cad20b4d Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Wed, 19 Jun 2019 11:05:47 +0100 Subject: [PATCH 1361/1771] Base reporter store ref to console.log (#3725) * add console.log ref * inherit println * unit test change * use static property and fix test * fix base test * rename consoleLog * test include Base.consoleLog check * linter rule so reporters dont console.log * use hooks for stubs with base test * restore stub dont callThrough * fix test + rebase * fix faulty rebase. Removed printLn * remove superfluous base --- .eslintrc.yml | 9 +++++++++ lib/reporters/base.js | 23 +++++++++++++++-------- lib/reporters/doc.js | 24 ++++++++++++++---------- lib/reporters/dot.js | 2 +- lib/reporters/landing.js | 2 +- lib/reporters/list.js | 8 ++++---- lib/reporters/progress.js | 4 ++-- lib/reporters/spec.js | 14 +++++++------- lib/reporters/xunit.js | 2 +- test/reporters/base.spec.js | 24 +++++++++++++++++++++++- test/reporters/xunit.spec.js | 4 ++-- 11 files changed, 79 insertions(+), 37 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index f696b45ca8..a668139868 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -79,3 +79,12 @@ overrides: parserOptions: ecmaVersion: 6 sourceType: module + + - files: + - lib/reporters/*.js + rules: + no-restricted-syntax: + - error + # disallow Reporters using `console.log()` + - selector: 'CallExpression[callee.object.name=console][callee.property.name=log]' + message: &GH-3604 See https://github.com/mochajs/mocha/issues/3604 diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 3736c018ca..670a160fa8 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -27,6 +27,11 @@ exports = module.exports = Base; var isatty = tty.isatty(1) && tty.isatty(2); +/** + * Save log references to avoid tests interfering (see GH-3604). + */ +var consoleLog = console.log; + /** * Enable coloring by default, except in the browser interface. */ @@ -192,7 +197,7 @@ var generateDiff = (exports.generateDiff = function(actual, expected) { * Error property */ exports.list = function(failures) { - console.log(); + Base.consoleLog(); failures.forEach(function(test, i) { // format var fmt = @@ -253,7 +258,7 @@ exports.list = function(failures) { testTitle += str; }); - console.log(fmt, i + 1, testTitle, msg, stack); + Base.consoleLog(fmt, i + 1, testTitle, msg, stack); }); }; @@ -308,7 +313,7 @@ Base.prototype.epilogue = function() { var stats = this.stats; var fmt; - console.log(); + Base.consoleLog(); // passes fmt = @@ -316,26 +321,26 @@ Base.prototype.epilogue = function() { color('green', ' %d passing') + color('light', ' (%s)'); - console.log(fmt, stats.passes || 0, milliseconds(stats.duration)); + Base.consoleLog(fmt, stats.passes || 0, milliseconds(stats.duration)); // pending if (stats.pending) { fmt = color('pending', ' ') + color('pending', ' %d pending'); - console.log(fmt, stats.pending); + Base.consoleLog(fmt, stats.pending); } // failures if (stats.failures) { fmt = color('fail', ' %d failing'); - console.log(fmt, stats.failures); + Base.consoleLog(fmt, stats.failures); Base.list(this.failures); - console.log(); + Base.consoleLog(); } - console.log(); + Base.consoleLog(); }; /** @@ -488,4 +493,6 @@ function sameType(a, b) { return objToString.call(a) === objToString.call(b); } +Base.consoleLog = consoleLog; + Base.abstract = true; diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js index efcb2d0caf..5a6af8fb42 100644 --- a/lib/reporters/doc.js +++ b/lib/reporters/doc.js @@ -44,41 +44,45 @@ function Doc(runner, options) { return; } ++indents; - console.log('%s
              ', indent()); + Base.consoleLog('%s
              ', indent()); ++indents; - console.log('%s

              %s

              ', indent(), utils.escape(suite.title)); - console.log('%s
              ', indent()); + Base.consoleLog('%s

              %s

              ', indent(), utils.escape(suite.title)); + Base.consoleLog('%s
              ', indent()); }); runner.on(EVENT_SUITE_END, function(suite) { if (suite.root) { return; } - console.log('%s
              ', indent()); + Base.consoleLog('%s
              ', indent()); --indents; - console.log('%s
              ', indent()); + Base.consoleLog('%s
              ', indent()); --indents; }); runner.on(EVENT_TEST_PASS, function(test) { - console.log('%s
              %s
              ', indent(), utils.escape(test.title)); + Base.consoleLog('%s
              %s
              ', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.body)); - console.log('%s
              %s
              ', indent(), code); + Base.consoleLog('%s
              %s
              ', indent(), code); }); runner.on(EVENT_TEST_FAIL, function(test, err) { - console.log( + Base.consoleLog( '%s
              %s
              ', indent(), utils.escape(test.title) ); var code = utils.escape(utils.clean(test.body)); - console.log( + Base.consoleLog( '%s
              %s
              ', indent(), code ); - console.log('%s
              %s
              ', indent(), utils.escape(err)); + Base.consoleLog( + '%s
              %s
              ', + indent(), + utils.escape(err) + ); }); } diff --git a/lib/reporters/dot.js b/lib/reporters/dot.js index c4c5ce5d92..3913f0c679 100644 --- a/lib/reporters/dot.js +++ b/lib/reporters/dot.js @@ -68,7 +68,7 @@ function Dot(runner, options) { }); runner.once(EVENT_RUN_END, function() { - console.log(); + process.stdout.write('\n'); self.epilogue(); }); } diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index b124c7789c..a6af946c42 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -95,7 +95,7 @@ function Landing(runner, options) { runner.once(EVENT_RUN_END, function() { cursor.show(); - console.log(); + process.stdout.write('\n'); self.epilogue(); }); } diff --git a/lib/reporters/list.js b/lib/reporters/list.js index cdf4279644..c7ff8c4ea8 100644 --- a/lib/reporters/list.js +++ b/lib/reporters/list.js @@ -41,7 +41,7 @@ function List(runner, options) { var n = 0; runner.on(EVENT_RUN_BEGIN, function() { - console.log(); + Base.consoleLog(); }); runner.on(EVENT_TEST_BEGIN, function(test) { @@ -50,7 +50,7 @@ function List(runner, options) { runner.on(EVENT_TEST_PENDING, function(test) { var fmt = color('checkmark', ' -') + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); + Base.consoleLog(fmt, test.fullTitle()); }); runner.on(EVENT_TEST_PASS, function(test) { @@ -59,12 +59,12 @@ function List(runner, options) { color('pass', ' %s: ') + color(test.speed, '%dms'); cursor.CR(); - console.log(fmt, test.fullTitle(), test.duration); + Base.consoleLog(fmt, test.fullTitle(), test.duration); }); runner.on(EVENT_TEST_FAIL, function(test) { cursor.CR(); - console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + Base.consoleLog(color('fail', ' %d) %s'), ++n, test.fullTitle()); }); runner.once(EVENT_RUN_END, self.epilogue.bind(self)); diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 0432e4fb0a..0211122a9d 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -58,7 +58,7 @@ function Progress(runner, options) { // tests started runner.on(EVENT_RUN_BEGIN, function() { - console.log(); + process.stdout.write('\n'); cursor.hide(); }); @@ -91,7 +91,7 @@ function Progress(runner, options) { // and the failures if any runner.once(EVENT_RUN_END, function() { cursor.show(); - console.log(); + process.stdout.write('\n'); self.epilogue(); }); } diff --git a/lib/reporters/spec.js b/lib/reporters/spec.js index e1ae95e92d..e51ed80ac4 100644 --- a/lib/reporters/spec.js +++ b/lib/reporters/spec.js @@ -46,24 +46,24 @@ function Spec(runner, options) { } runner.on(EVENT_RUN_BEGIN, function() { - console.log(); + Base.consoleLog(); }); runner.on(EVENT_SUITE_BEGIN, function(suite) { ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); + Base.consoleLog(color('suite', '%s%s'), indent(), suite.title); }); runner.on(EVENT_SUITE_END, function() { --indents; if (indents === 1) { - console.log(); + Base.consoleLog(); } }); runner.on(EVENT_TEST_PENDING, function(test) { var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); + Base.consoleLog(fmt, test.title); }); runner.on(EVENT_TEST_PASS, function(test) { @@ -73,19 +73,19 @@ function Spec(runner, options) { indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); - console.log(fmt, test.title); + Base.consoleLog(fmt, test.title); } else { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); - console.log(fmt, test.title, test.duration); + Base.consoleLog(fmt, test.title, test.duration); } }); runner.on(EVENT_TEST_FAIL, function(test) { - console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + Base.consoleLog(indent() + color('fail', ' %d) %s'), ++n, test.title); }); runner.once(EVENT_RUN_END, self.epilogue.bind(self)); diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 09b32f1ca7..6c9c937be8 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -142,7 +142,7 @@ XUnit.prototype.write = function(line) { } else if (typeof process === 'object' && process.stdout) { process.stdout.write(line + '\n'); } else { - console.log(line); + Base.consoleLog(line); } }; diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 739063f32a..80957c39aa 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -5,7 +5,6 @@ var chai = require('chai'); var sinon = require('sinon'); var helpers = require('./helpers'); var reporters = require('../../').reporters; - var AssertionError = assert.AssertionError; var Base = reporters.Base; var chaiExpect = chai.expect; @@ -417,4 +416,27 @@ describe('Base reporter', function() { var errOut = stdout.join('\n').trim(); expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); + + describe('when reporter output immune to user test changes', function() { + var sandbox; + var baseConsoleLog; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + sandbox.stub(console, 'log'); + baseConsoleLog = sandbox.stub(Base, 'consoleLog'); + }); + + it('should let you stub out console.log without effecting reporters output', function() { + Base.list([]); + baseConsoleLog.restore(); + + expect(baseConsoleLog, 'was called'); + expect(console.log, 'was not called'); + }); + + afterEach(function() { + sandbox.restore(); + }); + }); }); diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 26fce4a1c4..2d05312fae 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -277,14 +277,14 @@ describe('XUnit reporter', function() { }); describe('when output directed to console', function() { - it("should call 'console.log' with line", function() { + it("should call 'Base.consoleLog' with line", function() { // :TODO: XUnit needs a trivially testable means to force console.log() var realProcess = process; process = false; // eslint-disable-line no-native-reassign, no-global-assign var xunit = new XUnit(runner); var fakeThis = {fileStream: false}; - var consoleLogStub = sinon.stub(console, 'log'); + var consoleLogStub = sinon.stub(Base, 'consoleLog'); xunit.write.call(fakeThis, expectedLine); consoleLogStub.restore(); From 15b96afccaf508312445770e3af1c145d90b28c6 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Wed, 26 Jun 2019 19:33:19 +0200 Subject: [PATCH 1362/1771] Collect test files later (#3953) This commit prepares improvements to the watch mode behavior. In the future we want Mocha in watch mode to pick up new test files. This requires that the test files are collected inside `watchRun` instead of before. To accomplish this change we rename `handleFiles` to `collectFiles` and move it to its own module. Instead of calling `collectFiles` in `lib/cli/run` and passing the files on to `watchRun` or `singleRun` we pass down the file collection parameters through `runMocha` and call `collectFiles` in both `watchRun` and `singleRun`. --- lib/cli/collect-files.js | 84 +++++++++++++++++++++++++ lib/cli/run-helpers.js | 130 ++++++++++----------------------------- lib/cli/run.js | 6 +- lib/cli/watch-run.js | 11 ++-- 4 files changed, 126 insertions(+), 105 deletions(-) create mode 100644 lib/cli/collect-files.js diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js new file mode 100644 index 0000000000..ff35ed3d36 --- /dev/null +++ b/lib/cli/collect-files.js @@ -0,0 +1,84 @@ +'use strict'; + +const path = require('path'); +const ansi = require('ansi-colors'); +const debug = require('debug')('mocha:cli:run:helpers'); +const minimatch = require('minimatch'); +const utils = require('../utils'); + +/** + * Exports a function that collects test files from CLI parameters. + * @see module:lib/cli/run-helpers + * @see module:lib/cli/watch-run + * @module + * @private + */ + +/** + * Smash together an array of test files in the correct order + * @param {Object} opts - Options + * @param {string[]} opts.extension - File extensions to use + * @param {string[]} opts.spec - Files, dirs, globs to run + * @param {string[]} opts.ignore - Files, dirs, globs to ignore + * @param {string[]} opts.file - List of additional files to include + * @param {boolean} opts.recursive - Find files recursively + * @param {boolean} opts.sort - Sort test files + * @returns {string[]} List of files to test + * @private + */ +module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { + let files = []; + const unmatched = []; + spec.forEach(arg => { + let newFiles; + try { + newFiles = utils.lookupFiles(arg, extension, recursive); + } catch (err) { + if (err.code === 'ERR_MOCHA_NO_FILES_MATCH_PATTERN') { + unmatched.push({message: err.message, pattern: err.pattern}); + return; + } + + throw err; + } + + if (typeof newFiles !== 'undefined') { + if (typeof newFiles === 'string') { + newFiles = [newFiles]; + } + newFiles = newFiles.filter(fileName => + ignore.every(pattern => !minimatch(fileName, pattern)) + ); + } + + files = files.concat(newFiles); + }); + + if (!files.length) { + // give full message details when only 1 file is missing + const noneFoundMsg = + unmatched.length === 1 + ? `Error: No test files found: ${JSON.stringify(unmatched[0].pattern)}` // stringify to print escaped characters raw + : 'Error: No test files found'; + console.error(ansi.red(noneFoundMsg)); + process.exit(1); + } else { + // print messages as an warning + unmatched.forEach(warning => { + console.warn(ansi.yellow(`Warning: ${warning.message}`)); + }); + } + + const fileArgs = file.map(filepath => path.resolve(filepath)); + files = files.map(filepath => path.resolve(filepath)); + + // ensure we don't sort the stuff from fileArgs; order is important! + if (sort) { + files.sort(); + } + + // add files given through --file to be ran first + files = fileArgs.concat(files); + debug('files (in order): ', files); + return files; +}; diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index a3848598f9..fce5e6250c 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -9,11 +9,9 @@ const fs = require('fs'); const path = require('path'); -const ansi = require('ansi-colors'); const debug = require('debug')('mocha:cli:run:helpers'); -const minimatch = require('minimatch'); -const utils = require('../utils'); const watchRun = require('./watch-run'); +const collectFiles = require('./collect-files'); const cwd = (exports.cwd = process.cwd()); @@ -94,90 +92,18 @@ exports.handleRequires = (requires = []) => { }; /** - * Smash together an array of test files in the correct order - * @param {Object} [opts] - Options - * @param {string[]} [opts.extension] - File extensions to use - * @param {string[]} [opts.spec] - Files, dirs, globs to run - * @param {string[]} [opts.ignore] - Files, dirs, globs to ignore - * @param {boolean} [opts.recursive=false] - Find files recursively - * @param {boolean} [opts.sort=false] - Sort test files - * @returns {string[]} List of files to test - * @private - */ -exports.handleFiles = ({ - ignore = [], - extension = [], - file = [], - recursive = false, - sort = false, - spec = [] -} = {}) => { - let files = []; - const unmatched = []; - spec.forEach(arg => { - let newFiles; - try { - newFiles = utils.lookupFiles(arg, extension, recursive); - } catch (err) { - if (err.code === 'ERR_MOCHA_NO_FILES_MATCH_PATTERN') { - unmatched.push({message: err.message, pattern: err.pattern}); - return; - } - - throw err; - } - - if (typeof newFiles !== 'undefined') { - if (typeof newFiles === 'string') { - newFiles = [newFiles]; - } - newFiles = newFiles.filter(fileName => - ignore.every(pattern => !minimatch(fileName, pattern)) - ); - } - - files = files.concat(newFiles); - }); - - if (!files.length) { - // give full message details when only 1 file is missing - const noneFoundMsg = - unmatched.length === 1 - ? `Error: No test files found: ${JSON.stringify(unmatched[0].pattern)}` // stringify to print escaped characters raw - : 'Error: No test files found'; - console.error(ansi.red(noneFoundMsg)); - process.exit(1); - } else { - // print messages as an warning - unmatched.forEach(warning => { - console.warn(ansi.yellow(`Warning: ${warning.message}`)); - }); - } - - const fileArgs = file.map(filepath => path.resolve(filepath)); - files = files.map(filepath => path.resolve(filepath)); - - // ensure we don't sort the stuff from fileArgs; order is important! - if (sort) { - files.sort(); - } - - // add files given through --file to be ran first - files = fileArgs.concat(files); - debug('files (in order): ', files); - return files; -}; - -/** - * Give Mocha files and tell it to run + * Collect test files and run mocha instance. * @param {Mocha} mocha - Mocha instance - * @param {Options} [opts] - Options - * @param {string[]} [opts.files] - List of test files + * @param {Options} [opts] - Command line options * @param {boolean} [opts.exit] - Whether or not to force-exit after tests are complete + * @param {Object} fileCollectParams - Parameters that control test + * file collection. See `lib/cli/collect-files.js`. * @returns {Runner} * @private */ -exports.singleRun = (mocha, {files = [], exit = false} = {}) => { +exports.singleRun = (mocha, {exit}, fileCollectParams) => { + const files = collectFiles(fileCollectParams); + debug('running tests with files', files); mocha.files = files; return mocha.run(exit ? exitMocha : exitMochaLater); }; @@ -185,24 +111,36 @@ exports.singleRun = (mocha, {files = [], exit = false} = {}) => { /** * Actually run tests * @param {Mocha} mocha - Mocha instance - * @param {Object} [opts] - Options - * @param {boolean} [opts.watch=false] - Enable watch mode - * @param {string[]} [opts.extension] - List of extensions to watch - * @param {string|RegExp} [opts.grep] - Grep for test titles - * @param {string} [opts.ui=bdd] - User interface - * @param {boolean} [opts.exit=false] - Force-exit Mocha when tests done - * @param {string[]} [files] - Array of test files + * @param {Object} opts - Command line options * @private */ -exports.runMocha = ( - mocha, - {watch = false, extension = [], grep = '', ui = 'bdd', exit = false} = {}, - files = [] -) => { +exports.runMocha = (mocha, options) => { + const { + watch = false, + extension = [], + grep = '', + ui = 'bdd', + exit = false, + ignore = [], + file = [], + recursive = false, + sort = false, + spec = [] + } = options; + + const fileCollectParams = { + ignore, + extension, + file, + recursive, + sort, + spec + }; + if (watch) { - watchRun(mocha, {extension, grep, ui, files}); + watchRun(mocha, {ui, grep}, fileCollectParams); } else { - exports.singleRun(mocha, {files, exit}); + exports.singleRun(mocha, {exit}, fileCollectParams); } }; diff --git a/lib/cli/run.js b/lib/cli/run.js index da5ffd7b6a..bb7c021998 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -16,7 +16,6 @@ const { const { list, - handleFiles, handleRequires, validatePlugin, runMocha @@ -290,8 +289,5 @@ exports.builder = yargs => exports.handler = argv => { debug('post-yargs config', argv); const mocha = new Mocha(argv); - const files = handleFiles(argv); - - debug('running tests with files', files); - runMocha(mocha, argv, files); + runMocha(mocha, argv); }; diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index 54765b7cf7..10d4407673 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -3,6 +3,7 @@ const utils = require('../utils'); const Context = require('../context'); const Mocha = require('../mocha'); +const collectFiles = require('./collect-files'); /** * Exports the `watchRun` function that runs mocha in "watch" mode. @@ -15,14 +16,16 @@ const Mocha = require('../mocha'); * Run Mocha in "watch" mode * @param {Mocha} mocha - Mocha instance * @param {Object} opts - Options - * @param {string[]} opts.extension - List of extensions to watch * @param {string|RegExp} opts.grep - Grep for test titles * @param {string} opts.ui - User interface - * @param {string[]} opts.files - Array of test files + * @param {Object} fileCollectParams - Parameters that control test + * file collection. See `lib/cli/collect-files.js`. + * @param {string[]} fileCollectParams.extension - List of extensions to watch * @private */ -module.exports = (mocha, {extension, grep, ui, files}) => { +module.exports = (mocha, {grep, ui}, fileCollectParams) => { let runner; + const files = collectFiles(fileCollectParams); console.log(); hideCursor(); @@ -34,7 +37,7 @@ module.exports = (mocha, {extension, grep, ui, files}) => { process.exit(128 + 2); }); - const watchFiles = utils.files(process.cwd(), extension); + const watchFiles = utils.files(process.cwd(), fileCollectParams.extension); let runAgain = false; const loadAndRun = () => { From 5d4dd98747637d0e7ed3007328ec9627dd7eda41 Mon Sep 17 00:00:00 2001 From: Gabe Gorelick Date: Thu, 27 Jun 2019 03:11:23 -0500 Subject: [PATCH 1363/1771] Fix No Files error when file is passed via --files (#3942) Fixes #3941 --- lib/cli/collect-files.js | 23 ++++++++++++----------- test/integration/options/file.spec.js | 12 ++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js index ff35ed3d36..61d54ac4b3 100644 --- a/lib/cli/collect-files.js +++ b/lib/cli/collect-files.js @@ -54,6 +54,18 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { files = files.concat(newFiles); }); + const fileArgs = file.map(filepath => path.resolve(filepath)); + files = files.map(filepath => path.resolve(filepath)); + + // ensure we don't sort the stuff from fileArgs; order is important! + if (sort) { + files.sort(); + } + + // add files given through --file to be ran first + files = fileArgs.concat(files); + debug('files (in order): ', files); + if (!files.length) { // give full message details when only 1 file is missing const noneFoundMsg = @@ -69,16 +81,5 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { }); } - const fileArgs = file.map(filepath => path.resolve(filepath)); - files = files.map(filepath => path.resolve(filepath)); - - // ensure we don't sort the stuff from fileArgs; order is important! - if (sort) { - files.sort(); - } - - // add files given through --file to be ran first - files = fileArgs.concat(files); - debug('files (in order): ', files); return files; }; diff --git a/test/integration/options/file.spec.js b/test/integration/options/file.spec.js index f96b58668d..cbe361d8aa 100644 --- a/test/integration/options/file.spec.js +++ b/test/integration/options/file.spec.js @@ -52,4 +52,16 @@ describe('--file', function() { done(); }); }); + + it('should support having no other test files', function(done) { + args = ['--file', resolvePath(fixtures.alpha)]; + + runMochaJSON('filethatdoesnotexist.js', args, function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have passed').and('to have passed test count', 1); + done(); + }); + }); }); From 88f45d5fd146a03f728788c93594958f22942c44 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Wed, 17 Jul 2019 13:27:12 +0200 Subject: [PATCH 1364/1771] Don't re-initialize grep option on watch re-run (#3960) We remove code that called `mocha.grep(null)` on watch re-runs if the `--grep` option was not supplied. The code seems to serve no purpose and is the cause of #2027. --- lib/cli/run-helpers.js | 3 +-- lib/cli/watch-run.js | 6 +----- test/integration/options/watch.spec.js | 20 +++++++++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index fce5e6250c..7b3c7aa4fe 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -118,7 +118,6 @@ exports.runMocha = (mocha, options) => { const { watch = false, extension = [], - grep = '', ui = 'bdd', exit = false, ignore = [], @@ -138,7 +137,7 @@ exports.runMocha = (mocha, options) => { }; if (watch) { - watchRun(mocha, {ui, grep}, fileCollectParams); + watchRun(mocha, {ui}, fileCollectParams); } else { exports.singleRun(mocha, {exit}, fileCollectParams); } diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index 10d4407673..e7ef34c632 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -16,14 +16,13 @@ const collectFiles = require('./collect-files'); * Run Mocha in "watch" mode * @param {Mocha} mocha - Mocha instance * @param {Object} opts - Options - * @param {string|RegExp} opts.grep - Grep for test titles * @param {string} opts.ui - User interface * @param {Object} fileCollectParams - Parameters that control test * file collection. See `lib/cli/collect-files.js`. * @param {string[]} fileCollectParams.extension - List of extensions to watch * @private */ -module.exports = (mocha, {grep, ui}, fileCollectParams) => { +module.exports = (mocha, {ui}, fileCollectParams) => { let runner; const files = collectFiles(fileCollectParams); @@ -64,9 +63,6 @@ module.exports = (mocha, {grep, ui}, fileCollectParams) => { const rerun = () => { purge(); eraseLine(); - if (!grep) { - mocha.grep(null); - } mocha.suite = mocha.suite.clone(); mocha.suite.ctx = new Context(); mocha.ui(ui); diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 53dd9900c3..5d9fb2f26a 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -115,6 +115,20 @@ describe('--watch', function() { expect(results[1].failures, 'to have length', 1); }); }); + + // Regression test for https://github.com/mochajs/mocha/issues/2027 + it('respects --fgrep on re-runs', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('options/grep', testFile); + + return runMochaWatch([testFile, '--fgrep', 'match'], this.tempDir, () => { + touchFile(testFile); + }).then(results => { + expect(results, 'to have length', 2); + expect(results[0].tests, 'to have length', 2); + expect(results[1].tests, 'to have length', 2); + }); + }); }); }); @@ -160,7 +174,7 @@ function touchFile(file) { } /** - * Synchronously eplace all substrings matched by `pattern` with + * Synchronously replace all substrings matched by `pattern` with * `replacement` in the file’s content. */ function replaceFileContents(file, pattern, replacement) { @@ -170,8 +184,8 @@ function replaceFileContents(file, pattern, replacement) { } /** - * Synchronously copy a fixture to the given destion file path. Creates - * parent directories of the destination path if necessary. + * Synchronously copy a fixture to the given destination file path. + * Creates parent directories of the destination path if necessary. */ function copyFixture(fixtureName, dest) { const fixtureSource = helpers.resolveFixturePath(fixtureName); From 6201e426bb6856f4dc3314fffb2f25fca719f12f Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Thu, 18 Jul 2019 02:27:18 +0900 Subject: [PATCH 1365/1771] Hide stacktrace when cli args are missing (#3963) * hide stacktrace when cli args is missing Signed-off-by: Outsider * Update lib/cli/options.js Co-Authored-By: David da Silva * remove unused lines Signed-off-by: Outsider --- lib/cli/options.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index fcc619a9b3..a88dbfbf17 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -7,6 +7,7 @@ */ const fs = require('fs'); +const ansi = require('ansi-colors'); const yargsParser = require('yargs-parser'); const {types, aliases} = require('./run-option-metadata'); const {ONE_AND_DONE_ARGS} = require('./one-and-dones'); @@ -16,7 +17,6 @@ const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); const {deprecate} = require('../utils'); const debug = require('debug')('mocha:cli:options'); -const {createMissingArgumentError} = require('../errors'); const {isNodeFlag} = require('./node-flags'); /** @@ -131,7 +131,8 @@ const parse = (args = [], defaultValues = {}, ...configObjects) => { boolean: types.boolean.concat(nodeArgs.map(pair => pair[0])) }); if (result.error) { - throw createMissingArgumentError(result.error.message); + console.error(ansi.red(`Error: ${result.error.message}`)); + process.exit(1); } // reapply "=" arg values from above From f77cac46879426c924e947c749f57c72c59c3b5e Mon Sep 17 00:00:00 2001 From: Daniel Ruf <827205+DanielRuf@users.noreply.github.com> Date: Wed, 17 Jul 2019 19:31:15 +0200 Subject: [PATCH 1366/1771] fix: do not redeclare variable (#3956) --- docs/example/Array.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/example/Array.js b/docs/example/Array.js index 18105cf75f..9be8287b65 100644 --- a/docs/example/Array.js +++ b/docs/example/Array.js @@ -13,7 +13,7 @@ describe('Array', function(){ var arr = []; var n = arr.push('foo'); expect(n).to.equal(1); - var n = arr.push('bar'); + n = arr.push('bar'); expect(n).to.equal(2); }) @@ -39,7 +39,7 @@ describe('Array', function(){ var arr = []; var n = arr.unshift('foo'); expect(n).to.equal(1); - var n = arr.unshift('bar'); + n = arr.unshift('bar'); expect(n).to.equal(2); }) @@ -70,4 +70,5 @@ describe('Array', function(){ expect(arr).to.have.length(1); }) }) -}) \ No newline at end of file +}) + From 59d70ee1dfb29541a30d886ae152401dc7a35156 Mon Sep 17 00:00:00 2001 From: Daniel Ruf <827205+DanielRuf@users.noreply.github.com> Date: Wed, 17 Jul 2019 19:31:49 +0200 Subject: [PATCH 1367/1771] fix: remove duplicate line-height property (#3957) --- mocha.css | 1 - 1 file changed, 1 deletion(-) diff --git a/mocha.css b/mocha.css index ec96b003c9..4ca8fcb897 100644 --- a/mocha.css +++ b/mocha.css @@ -139,7 +139,6 @@ body { #mocha .test .html-error { overflow: auto; color: black; - line-height: 1.5; display: block; float: left; clear: left; From cc595afaffc8117d14ebdd382018754d6c48c4b0 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Thu, 18 Jul 2019 21:58:39 +0100 Subject: [PATCH 1368/1771] update CHANGELOG.md for v6.2.0 [ci skip] --- CHANGELOG.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d87143b0f7..fe9ca8a6c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,43 @@ +# 6.2.0 / 2019-07-18 + +## :tada: Enhancements + +- #3827: Do not fork child-process if no Node flags are present (@boneskull) +- #3725: Base reporter store ref to console.log, see [mocha/wiki](https://github.com/mochajs/mocha/wiki/HOW-TO:-Correctly-stub-stdout) (@craigtaub) + +## :bug: Fixes + +- #3942: Fix "No test files found" Error when file is passed via `--file` (@gabegorelick) +- #3914: Modify Mocha constructor to accept options `global` or `globals` (@pascalpp) +- #3894: Fix parsing of config files with `_mocha` binary (@juergba) +- #3834: Fix CLI parsing with default values (@boneskull, @juergba) +- #3831: Fix `--timeout`/`--slow` string values and duplicate arguments (@boneskull, @juergba) + +## :book: Documentation + +- #3906: Document option to define custom report name for XUnit reporter (@pkuczynski) +- #3889: Adds doc links for mocha-examples (@craigtaub) +- #3887: Fix broken links (@toyjhlee) +- #3841: Fix anchors to configuration section (@trescube) + +## :mag: Coverage + +- #3915, #3929: Increase tests coverage for `--watch` options (@geigerzaehler) + +## :nut_and_bolt: Other + +- #3953: Collect test files later, prepares improvements to the `--watch` mode behavior (@geigerzaehler) +- #3939: Upgrade for npm audit (@boneskull) +- #3930: Extract `runWatch` into separate module (@geigerzaehler) +- #3922: Add `mocha.min.js` file to stacktrace filter (@brian-lagerman) +- #3919: Update CI config files to use Node-12.x (@plroebuck) +- #3892: Rework reporter tests (@plroebuck) +- #3872: Rename `--exclude` to `--ignore` and create alias (@boneskull) +- #3963: Hide stacktrace when cli args are missing (@outsideris) +- #3956: Do not redeclare variable in docs array example (@DanielRuf) +- #3957: Remove duplicate line-height property in `mocha.css` (@DanielRuf) +- #3960: Don't re-initialize grep option on watch re-run (@geigerzaehler) + # 6.1.4 / 2019-04-18 ## :lock: Security Fixes From bd477769d6d76f467363ef2ff27e0b622aa5a132 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Thu, 18 Jul 2019 21:59:56 +0100 Subject: [PATCH 1369/1771] Release v6.2.0 --- CHANGELOG.md | 46 +++++++++++++++++++++++----------------------- package-lock.json | 2 +- package.json | 10 +++++++++- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe9ca8a6c8..f61ff11537 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,41 +2,41 @@ ## :tada: Enhancements -- #3827: Do not fork child-process if no Node flags are present (@boneskull) -- #3725: Base reporter store ref to console.log, see [mocha/wiki](https://github.com/mochajs/mocha/wiki/HOW-TO:-Correctly-stub-stdout) (@craigtaub) +- [#3827](https://github.com/mochajs/mocha/issues/3827): Do not fork child-process if no Node flags are present ([**@boneskull**](https://github.com/boneskull)) +- [#3725](https://github.com/mochajs/mocha/issues/3725): Base reporter store ref to console.log, see [mocha/wiki](https://github.com/mochajs/mocha/wiki/HOW-TO:-Correctly-stub-stdout) ([**@craigtaub**](https://github.com/craigtaub)) ## :bug: Fixes -- #3942: Fix "No test files found" Error when file is passed via `--file` (@gabegorelick) -- #3914: Modify Mocha constructor to accept options `global` or `globals` (@pascalpp) -- #3894: Fix parsing of config files with `_mocha` binary (@juergba) -- #3834: Fix CLI parsing with default values (@boneskull, @juergba) -- #3831: Fix `--timeout`/`--slow` string values and duplicate arguments (@boneskull, @juergba) +- [#3942](https://github.com/mochajs/mocha/issues/3942): Fix "No test files found" Error when file is passed via `--file` ([**@gabegorelick**](https://github.com/gabegorelick)) +- [#3914](https://github.com/mochajs/mocha/issues/3914): Modify Mocha constructor to accept options `global` or `globals` ([**@pascalpp**](https://github.com/pascalpp)) +- [#3894](https://github.com/mochajs/mocha/issues/3894): Fix parsing of config files with `_mocha` binary ([**@juergba**](https://github.com/juergba)) +- [#3834](https://github.com/mochajs/mocha/issues/3834): Fix CLI parsing with default values ([**@boneskull**](https://github.com/boneskull), [**@juergba**](https://github.com/juergba)) +- [#3831](https://github.com/mochajs/mocha/issues/3831): Fix `--timeout`/`--slow` string values and duplicate arguments ([**@boneskull**](https://github.com/boneskull), [**@juergba**](https://github.com/juergba)) ## :book: Documentation -- #3906: Document option to define custom report name for XUnit reporter (@pkuczynski) -- #3889: Adds doc links for mocha-examples (@craigtaub) -- #3887: Fix broken links (@toyjhlee) -- #3841: Fix anchors to configuration section (@trescube) +- [#3906](https://github.com/mochajs/mocha/issues/3906): Document option to define custom report name for XUnit reporter ([**@pkuczynski**](https://github.com/pkuczynski)) +- [#3889](https://github.com/mochajs/mocha/issues/3889): Adds doc links for mocha-examples ([**@craigtaub**](https://github.com/craigtaub)) +- [#3887](https://github.com/mochajs/mocha/issues/3887): Fix broken links ([**@toyjhlee**](https://github.com/toyjhlee)) +- [#3841](https://github.com/mochajs/mocha/issues/3841): Fix anchors to configuration section ([**@trescube**](https://github.com/trescube)) ## :mag: Coverage -- #3915, #3929: Increase tests coverage for `--watch` options (@geigerzaehler) +- [#3915](https://github.com/mochajs/mocha/issues/3915), [#3929](https://github.com/mochajs/mocha/issues/3929): Increase tests coverage for `--watch` options ([**@geigerzaehler**](https://github.com/geigerzaehler)) ## :nut_and_bolt: Other -- #3953: Collect test files later, prepares improvements to the `--watch` mode behavior (@geigerzaehler) -- #3939: Upgrade for npm audit (@boneskull) -- #3930: Extract `runWatch` into separate module (@geigerzaehler) -- #3922: Add `mocha.min.js` file to stacktrace filter (@brian-lagerman) -- #3919: Update CI config files to use Node-12.x (@plroebuck) -- #3892: Rework reporter tests (@plroebuck) -- #3872: Rename `--exclude` to `--ignore` and create alias (@boneskull) -- #3963: Hide stacktrace when cli args are missing (@outsideris) -- #3956: Do not redeclare variable in docs array example (@DanielRuf) -- #3957: Remove duplicate line-height property in `mocha.css` (@DanielRuf) -- #3960: Don't re-initialize grep option on watch re-run (@geigerzaehler) +- [#3953](https://github.com/mochajs/mocha/issues/3953): Collect test files later, prepares improvements to the `--watch` mode behavior ([**@geigerzaehler**](https://github.com/geigerzaehler)) +- [#3939](https://github.com/mochajs/mocha/issues/3939): Upgrade for npm audit ([**@boneskull**](https://github.com/boneskull)) +- [#3930](https://github.com/mochajs/mocha/issues/3930): Extract `runWatch` into separate module ([**@geigerzaehler**](https://github.com/geigerzaehler)) +- [#3922](https://github.com/mochajs/mocha/issues/3922): Add `mocha.min.js` file to stacktrace filter ([**@brian-lagerman**](https://github.com/brian-lagerman)) +- [#3919](https://github.com/mochajs/mocha/issues/3919): Update CI config files to use Node-12.x ([**@plroebuck**](https://github.com/plroebuck)) +- [#3892](https://github.com/mochajs/mocha/issues/3892): Rework reporter tests ([**@plroebuck**](https://github.com/plroebuck)) +- [#3872](https://github.com/mochajs/mocha/issues/3872): Rename `--exclude` to `--ignore` and create alias ([**@boneskull**](https://github.com/boneskull)) +- [#3963](https://github.com/mochajs/mocha/issues/3963): Hide stacktrace when cli args are missing ([**@outsideris**](https://github.com/outsideris)) +- [#3956](https://github.com/mochajs/mocha/issues/3956): Do not redeclare variable in docs array example ([**@DanielRuf**](https://github.com/DanielRuf)) +- [#3957](https://github.com/mochajs/mocha/issues/3957): Remove duplicate line-height property in `mocha.css` ([**@DanielRuf**](https://github.com/DanielRuf)) +- [#3960](https://github.com/mochajs/mocha/issues/3960): Don't re-initialize grep option on watch re-run ([**@geigerzaehler**](https://github.com/geigerzaehler)) # 6.1.4 / 2019-04-18 diff --git a/package-lock.json b/package-lock.json index 08a127af94..f7f44d0866 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.4", + "version": "6.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b8f51c452c..b33729afaa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.1.4", + "version": "6.2.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -78,6 +78,7 @@ "Bjorn Stromberg ", "Brendan Nee ", "Brian Beck ", + "Brian Lagerman <49239617+brian-lagerman@users.noreply.github.com>", "Brian Lalor ", "Brian M. Carlson ", "Brian Moore ", @@ -111,6 +112,7 @@ "Cory Thomas ", "Craig Taub ", "Cube ", + "Daniel Ruf <827205+DanielRuf@users.noreply.github.com>", "Daniel Ruf ", "Daniel St. Jules ", "Daniel Stockman ", @@ -163,6 +165,7 @@ "Fredrik Enestad ", "Fredrik Lindin ", "Fumiaki MATSUSHIMA ", + "Gabe Gorelick ", "Gabriel Silk ", "Gareth Aye ", "Gareth Murphy ", @@ -343,6 +346,7 @@ "P. Roebuck ", "Panu Horsmalahti ", "Parker Moore ", + "Pascal ", "Pat Finnigan ", "Paul Armstrong ", "Paul Miller ", @@ -353,6 +357,7 @@ "Peter Rust ", "Phil Sung ", "Philip M. White ", + "Piotr Kuczynski ", "PoppinL ", "Poprádi Árpád ", "Prayag Verma ", @@ -414,6 +419,7 @@ "Sorin Iclanzan ", "Standa Opichal ", "startswithaj ", + "Stephen Hess ", "Stephen Mathieson ", "Steve Mason ", "Stewart Taylor ", @@ -431,6 +437,7 @@ "Thedark1337 ", "Thomas Broadley ", "Thomas Grainger ", + "Thomas Scholtes ", "Thomas Vantuycom ", "Tim Ehat ", "Tim Harshman ", @@ -444,6 +451,7 @@ "Tom Coquereau ", "Tom Hughes ", "Tomer Eskenazi ", + "toyjhlee ", "traleig1 ", "Travis Jeffery ", "tripu ", From 48da42e6ad59827242b4671b4d34a9c69b91e0cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Fri, 19 Jul 2019 12:10:17 +0200 Subject: [PATCH 1370/1771] Remove jsdoc index.html placeholder from eleventy file structure and fix broken link in jsdoc tutorial (#3966) --- docs/api-tutorials/custom-reporter.md | 12 ++++++------ docs/api/index.html | 14 -------------- 2 files changed, 6 insertions(+), 20 deletions(-) delete mode 100644 docs/api/index.html diff --git a/docs/api-tutorials/custom-reporter.md b/docs/api-tutorials/custom-reporter.md index 1555ce26d0..a5abee8ce3 100644 --- a/docs/api-tutorials/custom-reporter.md +++ b/docs/api-tutorials/custom-reporter.md @@ -112,9 +112,9 @@ The event names are exported from the `constants` property of `Mocha.Runner`: > It's important to understand that all `Suite` callbacks will be run _before_ the [Runner] emits `EVENT_RUN_BEGIN`. Hooks and tests, however, won't run until _after_ the [Runner] emits `EVENT_RUN_BEGIN`. -[runner]: /api/runner -[test]: /api/test -[hook]: /api/hook -[suite]: /api/suite -[base]: /api/mocha.reporters.base -[delay]: /#delayed-root-suite +[runner]: /api/runner.html +[test]: /api/test.html +[hook]: /api/hook.html +[suite]: /api/suite.html +[base]: /api/mocha.reporters.base.html +[delay]: /#delayed-root-suite.html diff --git a/docs/api/index.html b/docs/api/index.html deleted file mode 100644 index b937ab3b43..0000000000 --- a/docs/api/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Document - - -

              - The JSDoc API documentation will be placed here by the build system -

              - - From 0e9d8ad59a78a482d97f4fe735dafa1f65dc89d2 Mon Sep 17 00:00:00 2001 From: Dmitrii Sorin Date: Sat, 20 Jul 2019 18:18:26 +1000 Subject: [PATCH 1371/1771] tty.getWindowSize is not a function inside a "worker_threads" worker (#3955) Use "isTTY" instead of tty.isatty(fd) --- lib/reporters/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 670a160fa8..b1d026fcce 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -25,7 +25,7 @@ exports = module.exports = Base; * Check if both stdio streams are associated with a tty. */ -var isatty = tty.isatty(1) && tty.isatty(2); +var isatty = process.stdout.isTTY && process.stderr.isTTY; /** * Save log references to avoid tests interfering (see GH-3604). From 91b3a547b9bce571bf3f98417691d38658c6d576 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Sat, 20 Jul 2019 20:29:42 +0900 Subject: [PATCH 1372/1771] fix style on mochajs.org (#3886) Signed-off-by: Outsider --- docs/css/prism.css | 1 - docs/css/style.css | 6 ++++++ docs/index.md | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/css/prism.css b/docs/css/prism.css index fca66adb37..793fd5df2b 100644 --- a/docs/css/prism.css +++ b/docs/css/prism.css @@ -115,7 +115,6 @@ pre[class*="language-"] { .language-css .token.string, .style .token.string { color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); } .token.atrule, diff --git a/docs/css/style.css b/docs/css/style.css index dd60370a30..e0ac07bb7a 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -174,6 +174,12 @@ code { line-height: 1.8; } +:not(pre)>code { + background-color: #f5f2f0; + border-radius: 3px; + padding: .2em .4em; +} + pre { background-color: #f3f3f3; border: 1px solid #ddd; diff --git a/docs/index.md b/docs/index.md index a3fa090632..ab898764c0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1176,7 +1176,7 @@ Requires either `--grep` or `--fgrep` (but not both). ### `--debug, --inspect, --debug-brk, --inspect-brk, debug, inspect` -> _BREAKING CHANGE in v6.0.0; `-d` is no longer an alias for `--debug`._ > _Other updates in v6.0.0:_ > _In versions of Node.js implementing `--inspect` and `--inspect-brk`, `--debug` and `--debug-brk` are respectively aliases for these two options._ > _Likewise, `debug` (not `--debug`) is an alias for `inspect` (not `--inspect`) in Node.js versions where `debug` is deprecated._ +> _BREAKING CHANGE in v6.0.0; `-d` is no longer an alias for `--debug`. Other updates in v6.0.0: In versions of Node.js implementing `--inspect` and `--inspect-brk`, `--debug` and `--debug-brk` are respectively aliases for these two options. Likewise, `debug` (not `--debug`) is an alias for `inspect` (not `--inspect`) in Node.js versions where `debug` is deprecated._ Enables Node.js' debugger or inspector. @@ -1637,7 +1637,7 @@ In addition to supporting the legacy [`mocha.opts`](#mochaopts) run-control form - **JavaScript**: Create a `.mocharc.js` in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. - **YAML**: Create a `.mocharc.yaml` (or `.mocharc.yml`) in your project's root directory. - **JSON**: Create a `.mocharc.json` (or `.mocharc.jsonc`) in your project's root directory. Comments — while not valid JSON — are allowed in this file, and will be ignored by Mocha. -- **`package.json`**: Create a `mocha` property in your project's `package.json`. +- **package.json**: Create a `mocha` property in your project's `package.json`. Mocha suggests using one of the above strategies for configuration instead of the legacy `mocha.opts` format. From 1e6cf3b74af087dd8c4c79804c7206a0bb589404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20D=C3=ADaz=20Ce=C3=B1era?= <46492068+MarioDiaz98@users.noreply.github.com> Date: Sat, 20 Jul 2019 15:53:20 +0200 Subject: [PATCH 1373/1771] Add Matomo to website (#3765) * Added Matomo to index.md * Fixed * Deleted

              * Deleted center tag and added style css * Requested changes done * Changed Matomo logo to another file * Changing css and adding aside to html * Fixed height and width * Fixed identations * Deleted footer logo * Requested changes done * Last changes * Trim and eresize matomo image * Remove resizing, it increased image weight * Retain matomo image aspect ratio --- docs/_includes/default.html | 10 ++++++++++ docs/css/style.css | 11 +++++++++++ docs/images/matomo-logo.png | Bin 0 -> 26528 bytes 3 files changed, 21 insertions(+) create mode 100644 docs/images/matomo-logo.png diff --git a/docs/_includes/default.html b/docs/_includes/default.html index 92b673b878..0a2a60b11e 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.html @@ -33,6 +33,16 @@

              {{ content }}
              + +
              diff --git a/docs/css/style.css b/docs/css/style.css index e0ac07bb7a..a7e6933f0f 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -199,6 +199,17 @@ img.screenshot { max-width: 100%; } +#matomoLogo { + display: block; + height: 176px; +} + +.sponsorship { + display: flex; + justify-content: center; + margin-bottom: 60px; +} + footer { background-color: #eee; border-top: 1px solid #ddd; diff --git a/docs/images/matomo-logo.png b/docs/images/matomo-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..18b2d9e1c35e4e032dc4b5c9295e210796d09406 GIT binary patch literal 26528 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 LCeQd=VJpsp)StL$-%Yl?Y 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 z z1K3#YheWa1=S?x?+%~?GDjn)3D{=5mZ{;h6o(T=gUsSU>`gcs02sZHG2RVHfe2E)% zu92_s1IR+7-MpWH@(*b~Fw^+LYQMnoDKw!?2JSx9*L16XE~{e=ap4wA&=*Xx#Qp+g zyGY|7*astH5mQ{S$kWjnstpLyfj4lz%9PtPgHF5^t`_!#Nfa^OdRPg;SzOB%g|YF` zuzdXO^-$>!qgXM5nhh@pa%+AVz3I)$hEMG!#5#jmBX#C;Vzr7Q#cInh*uLDka;`m6 zItqZvcH{mUxvs-WY_O3%3r&|6f9(CO<9ofKTye;YA>B9;c`m~ANNBh8rkbd7MWfb= ze2&VC-ab)wLA-;clbql4q0Wh!)cf>6(=;K$no5aGkXnL6fsEvN&AxfCW5iJi$2F2tCsmzBA8=I->4ZEALz3*-Ev&J%@;eySwbF zJ%Yxt38hkbhv9M8pK|AsIYSa>3WAceKZ$xBW%IDRYEM$)v9e`)=QIiX?019WR1*+llo;9tVls88&mq zEbT9l_z)U?)W+mbd(0@H7R{1p?|T!@mM&?H8iF~M$=dTxN#IR&2Tc;@lbWBnuO!A<*=TK=d@3n=`Qt8meDnj6(RC2je`}2L+x!B4_<^ek!`Z;?=~9(~?2DWo zPsy#D<)zhRU#iT#ClivzwU>0^5}AM&0qG!hJzs-+vrAOO`Ed7mZ@a#W<}ClJLQS%5 zJ-@bD`zldjr}G)1S4PV7x7t9s#gz>&L-_@)g|QdLRUQ6&1em!Pc`TBMKOITqdFS-q z#!IffL%*KSY}Pk^EiTRnROva%^9z1`hUaXz55v;a@zglb$4S$$sczzdBt)-sACuQ` zZtupM7tz02fTSGy;q}{$svi_9%(;l+!K+9k8t4?jA7E&*n zEhh!m@7Tnu5Vy4u@+1~{Bb@NhSH6N`!LB@=J=Z~mKv5vUxzR|pu=hDD@-t}C!2hsI zT{Fo%NEELl@Z(TO%OXZ{jG=@dvaDc^KMd7wpZ45egLu>bXF zIs=i@q0+&TA1T;!cYi%t{@o_k(`dh)fDS3kvHRV3g*RB#vo}wIEgp7-*_sgAxG-to z-DnqCuJ;O8mb5sy-FK%8zUfpwPT)UrYVDsBM>29yqm2ueXgV_B)9K4rV3!~&q z?EEjnFch&y-)D8pL2dNflOe^t$uTmF+K0+N9Qb~hbK~!4K4Vw2eLuGaUyEYe*F|B{ z$M{GiKl>pg!gW+ZAR$?n60Xi6yqqsm;SRQW(M`9?z#s0{`DB+rB7yh!Ta`Ahl;pW7h zb)Ql%RnusS^9n*7;0h<>7&Z^7r}=$uan0_#fMjDupxdDo#Y!IzajI% k6TSQY^N@+~-5b(%R|l$C%cUpu$~!P}QVNolpTR%=3x;dizyJUM literal 0 HcmV?d00001 From b269ad01b8faedc21d0bc0a955495719a06bae9d Mon Sep 17 00:00:00 2001 From: Oliver Salzburg Date: Mon, 22 Jul 2019 16:22:13 +0200 Subject: [PATCH 1374/1771] Clarify effect of .skip() (#3947) The fact that code inside of a skipped suite is executed, is potentially counter-intuitive. By using alternative phrasing, we make it clear how mocha handles code in skipped suites. Closes #3932 --- docs/index.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/index.md b/docs/index.md index ab898764c0..30613b87bf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -566,32 +566,36 @@ _Note_: Hooks, if present, will still be executed. ## Inclusive Tests -This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to simply ignore these suite(s) and test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an entire suite: +This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to simply ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: ```js describe('Array', function() { - describe.skip('#indexOf()', function() { - // ... + describe('#indexOf()', function() { + it.skip('should return -1 unless present', function() { + // this test will not be run + }); + + it('should return the index when present', function() { + // this test will be run + }); }); }); ``` -Or a specific test-case: +You can also put `.skip()` on an entire suite. This is equivalent to appending `.skip()` onto all tests in the suite. Hooks in the suite are also skipped. ```js describe('Array', function() { - describe('#indexOf()', function() { - it.skip('should return -1 unless present', function() { + describe.skip('#indexOf()', function() { + it('should return -1 unless present', function() { // this test will not be run }); - - it('should return the index when present', function() { - // this test will be run - }); }); }); ``` +_Note_: Code in skipped suites, that is placed outside of hooks or tests is still executed, as mocha will still invoke the suite function to build up the suite structure for visualization. + > _Best practice_: Use `.skip()` instead of commenting tests out. You may also skip _at runtime_ using `this.skip()`. If a test needs an environment or configuration which cannot be detected beforehand, a runtime skip is appropriate. For example: From ad4860e0aa2d3fea0e544edc784dc1140e2115a9 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 1 Aug 2019 16:42:12 +0200 Subject: [PATCH 1375/1771] Remove extraGlobals() (#3970) support of Node v0.9.11 has been dropped years ago. --- lib/runner.js | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index e41f6c5f97..1b1d875a80 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -141,7 +141,7 @@ function Runner(suite, delay) { }); this._defaultGrep = /.*/; this.grep(this._defaultGrep); - this.globals(this.globalProps().concat(extraGlobals())); + this.globals(this.globalProps()); } /** @@ -1016,30 +1016,6 @@ function thrown2Error(err) { ); } -/** - * Array of globals dependent on the environment. - * - * @return {Array} - * @deprecated - * @todo remove; long since unsupported - * @private - */ -function extraGlobals() { - if (typeof process === 'object' && typeof process.version === 'string') { - var parts = process.version.split('.'); - var nodeVersion = parts.reduce(function(a, v) { - return (a << 8) | v; - }); - - // 'errno' was renamed to process._errno in v0.9.11. - if (nodeVersion < 0x00090b) { - return ['errno']; - } - } - - return []; -} - Runner.constants = constants; /** From 6df12846e83c2d9adbc1b5cec3e52c1d6aab2066 Mon Sep 17 00:00:00 2001 From: Sona Lee Date: Wed, 7 Aug 2019 15:27:31 +0900 Subject: [PATCH 1376/1771] Drop node.js v6 support (#3885) --- .github/CONTRIBUTING.md | 100 ++++++++++++------------- .travis.yml | 3 - appveyor.yml | 1 - docs/README.md | 2 +- docs/index.md | 2 +- package.json | 2 +- test/integration/options/debug.spec.js | 50 ------------- 7 files changed, 53 insertions(+), 107 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 440a3cc92d..027a7f9647 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,90 +8,90 @@ If you have a question about using Mocha, please use the [mailing list](https:// ## :bug: I Found a Bug -Sorry! It happens to the best of us. If you've found a bug in Mocha, **please [search](https://github.com/mochajs/mocha/issues/) to see if it's already been reported**. Otherwise, create a [new issue](https://github.com/mochajs/mocha/issues/new). If you can fix the bug yourself, feel free to create a [pull request](#propose-a-change) thereafter. +Sorry! It happens to the best of us. If you've found a bug in Mocha, **please [search](https://github.com/mochajs/mocha/issues/) to see if it's already been reported**. Otherwise, create a [new issue](https://github.com/mochajs/mocha/issues/new). If you can fix the bug yourself, feel free to create a [pull request](#propose-a-change) thereafter. -Please include *as much detail as possible* to help us reproduce and diagnose the bug. Most importantly: +Please include _as much detail as possible_ to help us reproduce and diagnose the bug. Most importantly: -- Let us know *how* you're running Mocha (options, flags, environment, browser or Node.js, etc.) -- Include your test code or file(s). If large, please provide a link to a repository or [gist](https://gist.github.com). +- Let us know _how_ you're running Mocha (options, flags, environment, browser or Node.js, etc.) +- Include your test code or file(s). If large, please provide a link to a repository or [gist](https://gist.github.com). - Please show code in JavaScript only (any version) -If we need more information from you, we'll let you know. If you don't within a reasonable time frame (TBD), your issue will be automatically closed for inactivity. +If we need more information from you, we'll let you know. If you don't within a reasonable time frame (TBD), your issue will be automatically closed for inactivity. ## :exclamation: Propose a Change -Before you get your hands dirty, please [search](https://github.com/mochajs/mocha/issues/) for a related issue, or [create a new one](https://github.com/mochajs/mocha/issues/new). If you wish to contribute a new feature, this is doubly important! Let's discuss your proposed changes first; we don't want you to waste time implementing a change that is at odds with the project's direction. That said, we'll happily consider any contribution, no matter how great or small. +Before you get your hands dirty, please [search](https://github.com/mochajs/mocha/issues/) for a related issue, or [create a new one](https://github.com/mochajs/mocha/issues/new). If you wish to contribute a new feature, this is doubly important! Let's discuss your proposed changes first; we don't want you to waste time implementing a change that is at odds with the project's direction. That said, we'll happily consider any contribution, no matter how great or small. -*This paragraph would contain information about Mocha's roadmap, but it doesn't yet exist.* :poop: +_This paragraph would contain information about Mocha's roadmap, but it doesn't yet exist._ :poop: It's also important to understand some overarching goals of Mocha, detailed below. ### :soccer: About Project Goals -Mocha is a test framework. Developers use it against anything from legacy spaghetti in IE11 to stage-0 TC39 features in Electron. Mocha is committed to providing support for maintained (LTS) versions of Node.js and popular browsers (of which IE11 is still one, as of December 2018). +Mocha is a test framework. Developers use it against anything from legacy spaghetti in IE11 to stage-0 TC39 features in Electron. Mocha is committed to providing support for maintained (LTS) versions of Node.js and popular browsers (of which IE11 is still one, as of December 2018). -Mocha adheres strictly to [semantic versioning](https://semver.org). We are *extremely cautious* with changes that have the potential to break; given the size of Mocha's user base, it's *highly unlikely* a breaking change will slide by. +Mocha adheres strictly to [semantic versioning](https://semver.org). We are _extremely cautious_ with changes that have the potential to break; given the size of Mocha's user base, it's _highly unlikely_ a breaking change will slide by. -Mocha's usage far outweighs its resources. If a proposed feature would incur a maintenance penalty, it could be a hard sell. +Mocha's usage far outweighs its resources. If a proposed feature would incur a maintenance penalty, it could be a hard sell. We ask you please keep these goals in mind when making or proposing changes. ### :shoe: Contributing Code: Step-by-Step -Follow these steps to get going. If you are having trouble, don't be afraid to [ask for help](#got-a-question). +Follow these steps to get going. If you are having trouble, don't be afraid to [ask for help](#got-a-question). > PRO TIP: After `npm install`, run `npm start` to see a list of commands which can be run with `npm start ` (powered by [nps](https://npm.im/nps)). -1. [Install Node.js 6.x or newer](https://nodejs.org/en/download/). - - If you're new to installing Node, a tool like [nvm](https://github.com/creationix/nvm#install-script) can help you manage multiple version installations. - - You will need [Google Chrome](https://www.google.com/chrome/) to run browser-based tests locally. +1. [Install Node.js 8.x or newer](https://nodejs.org/en/download/). + - If you're new to installing Node, a tool like [nvm](https://github.com/creationix/nvm#install-script) can help you manage multiple version installations. + - You will need [Google Chrome](https://www.google.com/chrome/) to run browser-based tests locally. 1. Follow [Github's documentation](https://help.github.com/articles/fork-a-repo/) on setting up Git, forking and cloning. -1. Create a new branch in your working copy. Give your branch a descriptive name, such as `issue/12345`: `git checkout -b issue/12345`. +1. Create a new branch in your working copy. Give your branch a descriptive name, such as `issue/12345`: `git checkout -b issue/12345`. 1. Execute `npm install` to install the development dependencies. - - Do not use `yarn install`. - - Some optional dependencies may fail; you can safely ignore these unless you are trying to build the documentation. - - If you're sick of seeing the failures, run `npm install --ignore-scripts`. + - Do not use `yarn install`. + - Some optional dependencies may fail; you can safely ignore these unless you are trying to build the documentation. + - If you're sick of seeing the failures, run `npm install --ignore-scripts`. 1. Make your changes and add them via `git add`. - - Your changes will likely be somewhere in `lib/`, `bin/` or `browser-entry.js` (if your changes are browser-specific). - - Unit and/or integration **tests are required** for any code change. These live in `test/`. - - **Do not modify** the root `mocha.js` file directly; it is automatically generated. - - Keep your PR focused. Don't fix two things at once; don't upgrade dependencies unless necessary. + - Your changes will likely be somewhere in `lib/`, `bin/` or `browser-entry.js` (if your changes are browser-specific). + - Unit and/or integration **tests are required** for any code change. These live in `test/`. + - **Do not modify** the root `mocha.js` file directly; it is automatically generated. + - Keep your PR focused. Don't fix two things at once; don't upgrade dependencies unless necessary. 1. Before committing, run `npm start test`. - - This will run both Node.js-based and browser-based tests. - - Ultimately, your pull request will be built on our continuous integration servers ([Travis CI](https://travis-ci.org/mochajs/mocha) and [AppVeyor](https://ci.appveyor.com/project/boneskull/mocha)). The first step to ensuring these checks pass is to test on your own machine. - - A coverage check will be sent to [Coveralls](https://coveralls.io/github/mochajs/mocha). **A drop in code coverage % is considered a failed check**. + - This will run both Node.js-based and browser-based tests. + - Ultimately, your pull request will be built on our continuous integration servers ([Travis CI](https://travis-ci.org/mochajs/mocha) and [AppVeyor](https://ci.appveyor.com/project/boneskull/mocha)). The first step to ensuring these checks pass is to test on your own machine. + - A coverage check will be sent to [Coveralls](https://coveralls.io/github/mochajs/mocha). **A drop in code coverage % is considered a failed check**. 1. Commit your changes. - - Use a brief message on the first line, referencing a relevant issue (e.g. `closes #12345`). - - Add detail in subsequent lines. - - A pre-commit hook will run which automatically formats your staged changes (and fixes any problems it can) with ESLint and Prettier. If ESLint fails to fix an issue, your commit will fail and you will need to manually correct the problem. + - Use a brief message on the first line, referencing a relevant issue (e.g. `closes #12345`). + - Add detail in subsequent lines. + - A pre-commit hook will run which automatically formats your staged changes (and fixes any problems it can) with ESLint and Prettier. If ESLint fails to fix an issue, your commit will fail and you will need to manually correct the problem. 1. (Optional) Ensure you are up-to-date with Mocha's `master` branch: - - You can add an "upstream" remote repo using `git remote add upstream https://github.com/mochajs/mocha.git && git fetch upstream`. - - Navigate to your `master` branch using `git checkout master`. - - Pull changes from `upstream` using `git pull upstream master`. - - If any changes were pulled in, rebase your branch onto `master` by switching back to your branch (`git checkout `) then rebasing using `git rebase master`. + - You can add an "upstream" remote repo using `git remote add upstream https://github.com/mochajs/mocha.git && git fetch upstream`. + - Navigate to your `master` branch using `git checkout master`. + - Pull changes from `upstream` using `git pull upstream master`. + - If any changes were pulled in, rebase your branch onto `master` by switching back to your branch (`git checkout `) then rebasing using `git rebase master`. 1. Push your changes to your fork; `git push origin`. -1. In your browser, navigate to [mochajs/mocha](https://github.com/mochajs/mocha). You should see a notification about your recent changes in your fork's branch, with a (green?) button to create a pull request. Click it. -1. Describe your changes in detail here, following the template. Once you're satisfied, submit the form. -1. If you have not signed our [Contributor License Agreement](https://js.foundation/cla), a friendly robot will prompt you to do so. A [CLA](https://cla.js.foundation/mochajs/mocha) (electronic) signature is **required** for all contributions of code to Mocha. -1. Continuous integration checks will run against your changes. The result of these checks will be displayed on your PR. - - If the checks fail, you must address those before the PR is accepted. - - GitHub will indicate if there's a conflict. If this happens, you will need to [rebase](https://help.github.com/articles/about-git-rebase/) your branch onto the `master` branch of the source repository. **Do not `git merge`**. - - (Optional) [Squash](https://help.github.com/articles/about-pull-request-merges/#squash-and-merge-your-pull-request-commits) your changesets. If you have multiple changesets in your PR, they will be squashed upon PR acceptance by the Mocha team. +1. In your browser, navigate to [mochajs/mocha](https://github.com/mochajs/mocha). You should see a notification about your recent changes in your fork's branch, with a (green?) button to create a pull request. Click it. +1. Describe your changes in detail here, following the template. Once you're satisfied, submit the form. +1. If you have not signed our [Contributor License Agreement](https://js.foundation/cla), a friendly robot will prompt you to do so. A [CLA](https://cla.js.foundation/mochajs/mocha) (electronic) signature is **required** for all contributions of code to Mocha. +1. Continuous integration checks will run against your changes. The result of these checks will be displayed on your PR. + - If the checks fail, you must address those before the PR is accepted. + - GitHub will indicate if there's a conflict. If this happens, you will need to [rebase](https://help.github.com/articles/about-git-rebase/) your branch onto the `master` branch of the source repository. **Do not `git merge`**. + - (Optional) [Squash](https://help.github.com/articles/about-pull-request-merges/#squash-and-merge-your-pull-request-commits) your changesets. If you have multiple changesets in your PR, they will be squashed upon PR acceptance by the Mocha team. 1. Be patient while your PR is reviewed. This can take a while. We may request changes, but don't be afraid to question them. -1. Your PR might become conflicted with the code in `master`. If this is the case, you will need to [update your PR](#up-to-date) and resolve your conflicts. -1. You don't need to make a new PR to any needed changes. Instead, commit on top of your changes, and push these to your fork's branch. The PR will be updated, and CI will re-run. +1. Your PR might become conflicted with the code in `master`. If this is the case, you will need to [update your PR](#up-to-date) and resolve your conflicts. +1. You don't need to make a new PR to any needed changes. Instead, commit on top of your changes, and push these to your fork's branch. The PR will be updated, and CI will re-run. Join us in the [contributors' chat](https://gitter.im/mochajs/contributors)! ## :angel: I Just Want To Help -*Excellent.* Here's how: +_Excellent._ Here's how: -- **Handy with JavaScript?** Please check out the issues labeled [`help wanted`](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) or [`good-first-issue`](https://github.com/mochajs/mocha/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Agood-first-issue). Try `npx good-first-issue mocha`! -- **Can you write ~~good~~ well?** The [documentation](https://mochajs.org) almost always needs some love. See the [doc-related issues](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). -- **Design your thing?** [Our site](https://mochajs.org) needs your magic touch. -- **Familiar with Mocha's codebase?** We could use your help triaging issues and/or reviewing pull requests. Please contact an [org member](https://github.com/orgs/mochajs/people), and we'll chat. -- **Want to build our community?** Mocha has a *lot* of users. We could use your help bringing everyone together in peace and harmony. Please contact an [org member](https://github.com/mochajs/people). -- **You can sell dirt to worms?** Let's raise Mocha's profile in the JavaScript and OSS communities. Please contact an [org member](https://github.com/orgs/mochajs/people)! -- **Wait--you write unit tests for *fun*?** A PR which increases coverage is unlikely to be turned down. -- **Are you experienced?** :guitar: If you're a seasoned Mocha user, why not help answer some questions in the [main chat room](https://gitter.im/mochajs/mocha)? +- **Handy with JavaScript?** Please check out the issues labeled [`help wanted`](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) or [`good-first-issue`](https://github.com/mochajs/mocha/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Agood-first-issue). Try `npx good-first-issue mocha`! +- **Can you write ~~good~~ well?** The [documentation](https://mochajs.org) almost always needs some love. See the [doc-related issues](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). +- **Design your thing?** [Our site](https://mochajs.org) needs your magic touch. +- **Familiar with Mocha's codebase?** We could use your help triaging issues and/or reviewing pull requests. Please contact an [org member](https://github.com/orgs/mochajs/people), and we'll chat. +- **Want to build our community?** Mocha has a _lot_ of users. We could use your help bringing everyone together in peace and harmony. Please contact an [org member](https://github.com/mochajs/people). +- **You can sell dirt to worms?** Let's raise Mocha's profile in the JavaScript and OSS communities. Please contact an [org member](https://github.com/orgs/mochajs/people)! +- **Wait--you write unit tests for _fun_?** A PR which increases coverage is unlikely to be turned down. +- **Are you experienced?** :guitar: If you're a seasoned Mocha user, why not help answer some questions in the [main chat room](https://gitter.im/mochajs/mocha)? diff --git a/.travis.yml b/.travis.yml index e6125d7d3c..e298c419a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,9 +46,6 @@ jobs: - <<: *node node_js: '8' - - <<: *node - node_js: '6' - - script: npm start test.bundle test.browser # XXX: update when canvas supplies a prebuilt binary for Node.js v12.x node_js: 10 diff --git a/appveyor.yml b/appveyor.yml index 780466f46b..4feecb1635 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,6 @@ environment: - nodejs_version: '12' - nodejs_version: '10' - nodejs_version: '8' - - nodejs_version: '6' matrix: fast_finish: true install: diff --git a/docs/README.md b/docs/README.md index df132f76b0..203fa2e091 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ _So you wanna build the site?_ ## Prerequisites -- Node.js v6.x or greater +- Node.js v8.x or greater ## Development diff --git a/docs/index.md b/docs/index.md index 30613b87bf..8bb36e26ae 100644 --- a/docs/index.md +++ b/docs/index.md @@ -98,7 +98,7 @@ or as a development dependency for your project: $ npm install --save-dev mocha ``` -> As of v6.0.0, Mocha requires Node.js v6.0.0 or newer. +> As of v7.0.0, Mocha requires Node.js v8.0.0 or newer. ## Getting Started diff --git a/package.json b/package.json index b33729afaa..1621dda61e 100644 --- a/package.json +++ b/package.json @@ -503,7 +503,7 @@ "test": "./test" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 8.0.0" }, "scripts": { "prepublishOnly": "nps test clean build", diff --git a/test/integration/options/debug.spec.js b/test/integration/options/debug.spec.js index e7518283c4..297aee91f6 100644 --- a/test/integration/options/debug.spec.js +++ b/test/integration/options/debug.spec.js @@ -77,54 +77,4 @@ describe('--debug', function() { ); }); }); - - describe('Node.js v6', function() { - // note that v6.3.0 and newer supports --inspect but still supports --debug. - before(function() { - if (process.version.substring(0, 2) !== 'v6') { - this.skip(); - } - }); - - it('should start debugger', function(done) { - var proc = invokeMocha( - ['--debug', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to contain output', /Debugger listening/i); - done(); - }, - 'pipe' - ); - - // debugger must be manually killed - setTimeout(function() { - process.kill(proc.pid, 'SIGINT'); - }, 2000); - }); - - it('should respect custom host/port', function(done) { - var proc = invokeMocha( - ['--debug=127.0.0.1:9229', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect( - res, - 'to contain output', - /Debugger listening on .*127.0.0.1:9229/i - ); - done(); - }, - 'pipe' - ); - - setTimeout(function() { - process.kill(proc.pid, 'SIGINT'); - }, 2000); - }); - }); }); From 9d3c58421ff86e6b468cddfa2a5c19b86233b999 Mon Sep 17 00:00:00 2001 From: Park Seong-beom Date: Wed, 7 Aug 2019 17:02:44 +0900 Subject: [PATCH 1377/1771] Add prefix `list-` to --interfaces and --reporters options (#3962) --- docs/index.md | 4 ++-- lib/cli/one-and-dones.js | 4 ++-- lib/cli/run-option-metadata.js | 4 ++-- lib/cli/run.js | 16 ++++++++-------- ...interfaces.spec.js => listInterfaces.spec.js} | 4 ++-- .../{reporters.spec.js => listReporters.spec.js} | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) rename test/integration/options/{interfaces.spec.js => listInterfaces.spec.js} (89%) rename test/integration/options/{reporters.spec.js => listReporters.spec.js} (90%) diff --git a/docs/index.md b/docs/index.md index 8bb36e26ae..3e00e3468e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -892,8 +892,8 @@ Positional Arguments Other Options --help, -h Show usage information & exit [boolean] --version, -V Show version number & exit [boolean] - --interfaces List built-in user interfaces & exit [boolean] - --reporters List built-in reporters & exit [boolean] + --list-interfaces List built-in user interfaces & exit [boolean] + --list-reporters List built-in reporters & exit [boolean] Mocha Resources Chat: https://gitter.im/mochajs/mocha diff --git a/lib/cli/one-and-dones.js b/lib/cli/one-and-dones.js index c981b4bbb1..56fc1af032 100644 --- a/lib/cli/one-and-dones.js +++ b/lib/cli/one-and-dones.js @@ -48,14 +48,14 @@ exports.ONE_AND_DONES = { * Dump list of built-in interfaces * @private */ - interfaces: () => { + 'list-interfaces': () => { showKeys(Mocha.interfaces); }, /** * Dump list of built-in reporters * @private */ - reporters: () => { + 'list-reporters': () => { showKeys(Mocha.reporters); } }; diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index fbc4ea9072..d146ceeca9 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -36,11 +36,11 @@ exports.types = { 'full-trace', 'growl', 'inline-diffs', - 'interfaces', 'invert', + 'list-interfaces', + 'list-reporters', 'no-colors', 'recursive', - 'reporters', 'sort', 'watch' ], diff --git a/lib/cli/run.js b/lib/cli/run.js index bb7c021998..dc94c101a4 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -147,14 +147,18 @@ exports.builder = yargs => 'Display actual/expected differences inline within each string', group: GROUPS.OUTPUT }, - interfaces: { - conflicts: Array.from(ONE_AND_DONE_ARGS), - description: 'List built-in user interfaces & exit' - }, invert: { description: 'Inverts --grep and --fgrep matches', group: GROUPS.FILTERS }, + 'list-interfaces': { + conflicts: Array.from(ONE_AND_DONE_ARGS), + description: 'List built-in user interfaces & exit' + }, + 'list-reporters': { + conflicts: Array.from(ONE_AND_DONE_ARGS), + description: 'List built-in reporters & exit' + }, 'no-colors': { description: 'Force-disable color output', group: GROUPS.OUTPUT, @@ -183,10 +187,6 @@ exports.builder = yargs => group: GROUPS.OUTPUT, requiresArg: true }, - reporters: { - conflicts: Array.from(ONE_AND_DONE_ARGS), - description: 'List built-in reporters & exit' - }, 'reporter-option': { coerce: opts => list(opts).reduce((acc, opt) => { diff --git a/test/integration/options/interfaces.spec.js b/test/integration/options/listInterfaces.spec.js similarity index 89% rename from test/integration/options/interfaces.spec.js rename to test/integration/options/listInterfaces.spec.js index 7c58b89d6f..a9c18a1172 100644 --- a/test/integration/options/interfaces.spec.js +++ b/test/integration/options/listInterfaces.spec.js @@ -5,7 +5,7 @@ var invokeMocha = helpers.invokeMocha; var escapeRegExp = helpers.escapeRegExp; var interfaces = require('../../../lib/mocha').interfaces; -describe('--interfaces', function() { +describe('--list-interfaces', function() { it('should dump a list of all interfaces with descriptions', function(done) { var expected = Object.keys(interfaces) .filter(function(name) { @@ -18,7 +18,7 @@ describe('--interfaces', function() { }; }); - invokeMocha(['--interfaces'], function(err, result) { + invokeMocha(['--list-interfaces'], function(err, result) { if (err) { return done(err); } diff --git a/test/integration/options/reporters.spec.js b/test/integration/options/listReporters.spec.js similarity index 90% rename from test/integration/options/reporters.spec.js rename to test/integration/options/listReporters.spec.js index 650c65edcd..6cf06e94f2 100644 --- a/test/integration/options/reporters.spec.js +++ b/test/integration/options/listReporters.spec.js @@ -5,7 +5,7 @@ var invokeMocha = helpers.invokeMocha; var escapeRegExp = helpers.escapeRegExp; var reporters = require('../../../lib/mocha').reporters; -describe('--reporters', function() { +describe('--list-reporters', function() { it('should dump a list of all reporters with descriptions', function(done) { var expected = Object.keys(reporters) .filter(function(name) { @@ -21,7 +21,7 @@ describe('--reporters', function() { }; }); - invokeMocha(['--reporters'], function(err, result) { + invokeMocha(['--list-reporters'], function(err, result) { if (err) { return done(err); } From 8e6e747837444aca4341ab6cc03688bc8a2a5c6d Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 7 Aug 2019 13:05:59 +0200 Subject: [PATCH 1378/1771] Travis: don't run Smoke with Node v6 (#3981) --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index e298c419a4..5fb2bdb701 100644 --- a/.travis.yml +++ b/.travis.yml @@ -80,9 +80,6 @@ jobs: - <<: *smoke node_js: '8' - - <<: *smoke - node_js: '6' - - stage: precache script: true From 6d7c32abfe4c8c4dd76269964f28fe0a357c8977 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 10 Aug 2019 15:07:27 +0200 Subject: [PATCH 1379/1771] Update yargs-unparser to v1.6.0 (#3984) --- package-lock.json | 208 ++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 127 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7f44d0866..98f63a2678 100644 --- a/package-lock.json +++ b/package-lock.json @@ -817,7 +817,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1288,7 +1288,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1768,7 +1768,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -2319,7 +2319,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2373,7 +2373,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2656,7 +2656,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2978,7 +2978,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3154,7 +3154,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3470,7 +3470,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3528,7 +3528,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3541,7 +3541,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3608,7 +3608,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -4232,7 +4232,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4409,7 +4409,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4579,7 +4579,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4871,7 +4871,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -5138,7 +5138,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -6271,7 +6271,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6974,7 +6974,8 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true }, "get-func-name": { "version": "2.0.0", @@ -7120,7 +7121,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7129,7 +7130,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7531,7 +7532,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8246,7 +8247,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -9022,7 +9023,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9641,7 +9642,8 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -9979,7 +9981,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10209,7 +10211,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10244,7 +10246,7 @@ "dependencies": { "commander": { "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -10355,7 +10357,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10381,7 +10383,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10416,7 +10418,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10434,7 +10436,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10540,7 +10542,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10599,7 +10601,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -11805,7 +11807,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -11827,7 +11829,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12120,7 +12122,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12197,7 +12199,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12282,7 +12284,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12326,7 +12328,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13046,7 +13048,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -13614,7 +13616,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -13682,7 +13684,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14011,7 +14013,8 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "requirejs": { "version": "2.3.6", @@ -14251,7 +14254,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14362,7 +14365,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -14635,7 +14638,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -14670,7 +14673,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15293,7 +15296,7 @@ }, "split": { "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15398,7 +15401,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -15522,7 +15525,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -15732,7 +15735,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { @@ -15814,7 +15817,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -16038,7 +16041,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16305,7 +16308,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -17717,43 +17720,84 @@ } }, "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "requires": { "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" + "lodash": "^4.17.15", + "yargs": "^13.3.0" }, "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index 1621dda61e..62e70cd0b9 100644 --- a/package.json +++ b/package.json @@ -534,7 +534,7 @@ "wide-align": "1.1.3", "yargs": "13.2.2", "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs-unparser": "1.6.0" }, "devDependencies": { "@11ty/eleventy": "^0.8.3", From 7297b0ae37e545cec535fb4d41b31db0db26865f Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 11 Aug 2019 09:31:33 +0200 Subject: [PATCH 1380/1771] Fix hook pattern of this.skip() in it() tests (#3859) --- lib/runner.js | 5 ---- .../pending/skip-async-spec.fixture.js | 20 +++++++++++++- .../pending/skip-sync-spec.fixture.js | 20 +++++++++++++- test/integration/pending.spec.js | 26 ++++++++++--------- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 1b1d875a80..3ef0da1f4d 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -673,11 +673,6 @@ Runner.prototype.runTests = function(suite, fn) { self.fail(test, err); } self.emit(constants.EVENT_TEST_END, test); - - if (err instanceof Pending) { - return next(); - } - return self.hookUp(HOOK_TYPE_AFTER_EACH, next); } diff --git a/test/integration/fixtures/pending/skip-async-spec.fixture.js b/test/integration/fixtures/pending/skip-async-spec.fixture.js index 571ca5b851..402cd66c97 100644 --- a/test/integration/fixtures/pending/skip-async-spec.fixture.js +++ b/test/integration/fixtures/pending/skip-async-spec.fixture.js @@ -1,12 +1,30 @@ 'use strict'; +var assert = require('assert'); describe('skip in test', function () { + var runOrder = []; + beforeEach(function () { + runOrder.push('beforeEach'); + }); + it('should skip async', function (done) { var self = this; setTimeout(function () { self.skip(); // done() is not required }, 0); }); + it('should run other tests in suite', function () {}); - it('should run other tests in the suite', function () {}); + afterEach(function() { + runOrder.push('afterEach'); + }); + after(function() { + runOrder.push('after'); + assert.deepStrictEqual(runOrder, [ + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'after' + ]); + throw new Error('should throw this error'); + }); }); diff --git a/test/integration/fixtures/pending/skip-sync-spec.fixture.js b/test/integration/fixtures/pending/skip-sync-spec.fixture.js index 9178fce033..515c91d1ec 100644 --- a/test/integration/fixtures/pending/skip-sync-spec.fixture.js +++ b/test/integration/fixtures/pending/skip-sync-spec.fixture.js @@ -1,10 +1,28 @@ 'use strict'; +var assert = require('assert'); describe('skip in test', function () { + var runOrder = []; + beforeEach(function () { + runOrder.push('beforeEach'); + }); + it('should skip immediately', function () { this.skip(); throw new Error('never run this test'); }); + it('should run other tests in suite', function () {}); - it('should run other tests in the suite', function () {}); + afterEach(function() { + runOrder.push('afterEach'); + }); + after(function() { + runOrder.push('after'); + assert.deepStrictEqual(runOrder, [ + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'after' + ]); + throw new Error('should throw this error'); + }); }); diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index 7b96d36001..98620c8c9a 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -59,13 +59,14 @@ describe('pending', function() { it('should immediately skip the spec and run all others', function(done) { run('pending/skip-sync-spec.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 1); - assert.strictEqual(res.stats.passes, 1); - assert.strictEqual(res.stats.failures, 0); - assert.strictEqual(res.code, 0); + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 1) + .and('to have pending test order', 'should skip immediately') + .and('to have passed test count', 1) + .and('to have passed tests', 'should run other tests in suite'); done(); }); }); @@ -192,13 +193,14 @@ describe('pending', function() { it('should immediately skip the spec and run all others', function(done) { run('pending/skip-async-spec.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 1); - assert.strictEqual(res.stats.passes, 1); - assert.strictEqual(res.stats.failures, 0); - assert.strictEqual(res.code, 0); + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 1) + .and('to have pending test order', 'should skip async') + .and('to have passed test count', 1) + .and('to have passed tests', 'should run other tests in suite'); done(); }); }); From 5f1cad5ee254ab3ac48d4585726a884255a23583 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 13 Aug 2019 09:14:38 +0200 Subject: [PATCH 1381/1771] treat '--require esm' as Node option (#3983) --- bin/mocha | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bin/mocha b/bin/mocha index df7cf48ca3..865f5b1f07 100755 --- a/bin/mocha +++ b/bin/mocha @@ -117,6 +117,16 @@ if (nodeArgs.gc) { delete nodeArgs.gc; } +// --require/-r is treated as Mocha flag except when 'esm' is preloaded +if (mochaArgs.require && mochaArgs.require.includes('esm')) { + nodeArgs.require = ['esm']; + mochaArgs.require = mochaArgs.require.filter(mod => mod !== 'esm'); + if (!mochaArgs.require.length) { + delete mochaArgs.require; + } + delete mochaArgs.r; +} + if (Object.keys(nodeArgs).length) { const {spawn} = require('child_process'); const mochaPath = require.resolve('../lib/cli/cli.js'); From fafa9b98809b941e8e6ea81868eabdc22cbd17af Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 15 Aug 2019 09:30:29 +0200 Subject: [PATCH 1382/1771] Update yargs to v13.3.0 (#3986) Update yargs-parser to v13.1.1 --- package-lock.json | 116 +++++++++++++++++++++++++++++++--------------- package.json | 4 +- 2 files changed, 81 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 98f63a2678..62eb962113 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3026,6 +3026,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -3036,6 +3037,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -3071,7 +3073,8 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "coffee-script": { "version": "1.12.7", @@ -3573,6 +3576,7 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4698,6 +4702,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -5432,6 +5437,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -7008,6 +7014,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -7964,7 +7971,8 @@ "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true }, "is-absolute": { "version": "1.0.0", @@ -8369,7 +8377,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-svg": { "version": "3.0.0", @@ -9124,6 +9133,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, "requires": { "invert-kv": "^2.0.0" } @@ -9963,6 +9973,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, "requires": { "p-defer": "^1.0.0" } @@ -10365,6 +10376,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^1.0.0", @@ -10512,7 +10524,8 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "mimic-response": { "version": "1.0.1", @@ -10781,7 +10794,8 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "nise": { "version": "1.5.0", @@ -11060,6 +11074,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -11381,7 +11396,8 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "nunjucks": { "version": "3.2.0", @@ -11815,6 +11831,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", @@ -11861,7 +11878,8 @@ "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true }, "p-event": { "version": "1.3.0", @@ -11875,12 +11893,14 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-is-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true }, "p-limit": { "version": "2.2.0", @@ -12134,7 +12154,8 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -13454,6 +13475,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14407,7 +14429,8 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -14685,6 +14708,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -14692,7 +14716,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shell-quote": { "version": "1.6.1", @@ -14721,7 +14746,8 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "simple-concat": { "version": "1.0.0", @@ -15736,7 +15762,8 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "1.0.1", @@ -17476,6 +17503,7 @@ "version": "2.1.0", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -17484,12 +17512,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -17498,6 +17528,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -17508,6 +17539,7 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -17662,27 +17694,36 @@ "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.1" }, "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, "get-caller-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", - "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "require-main-filename": { "version": "2.0.0", @@ -17690,30 +17731,31 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } } } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 62e70cd0b9..d33830d39a 100644 --- a/package.json +++ b/package.json @@ -532,8 +532,8 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", "yargs-unparser": "1.6.0" }, "devDependencies": { From a3644c60b0482640e530837cf602feb06ee38c45 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 19 Aug 2019 08:26:59 +0200 Subject: [PATCH 1383/1771] Remove deprecated "getOptions()" and "lib/cli/options.js" (#3967) --- bin/options.js | 10 ---------- lib/cli/options.js | 35 ----------------------------------- package.json | 2 +- 3 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 bin/options.js diff --git a/bin/options.js b/bin/options.js deleted file mode 100644 index 102fd5a9c1..0000000000 --- a/bin/options.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -/* - * This module is deprecated and will be removed in a future version of Mocha. - * @deprecated Deprecated in v6.0.0; source moved into {@link module:lib/cli/options lib/cli/options module}. - * @module - * @exports module:lib/cli/options - */ - -module.exports = require('../lib/cli/options'); diff --git a/lib/cli/options.js b/lib/cli/options.js index a88dbfbf17..7cd2e48289 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -15,7 +15,6 @@ const mocharc = require('../mocharc.json'); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); -const {deprecate} = require('../utils'); const debug = require('debug')('mocha:cli:options'); const {isNodeFlag} = require('./node-flags'); @@ -163,40 +162,6 @@ const parseMochaOpts = content => .filter(Boolean) .map(value => value.replace(/%20/g, ' ')); -/** - * Prepends options from run-control file to the command line arguments. - * - * @deprecated Deprecated in v6.0.0; This function is no longer used internally and will be removed in a future version. - * @public - * @alias module:lib/cli/options - * @see {@link https://mochajs.org/#mochaopts|mocha.opts} - */ -module.exports = function getOptions() { - deprecate( - 'getOptions() is DEPRECATED and will be removed from a future version of Mocha. Use loadOptions() instead' - ); - if (process.argv.length === 3 && ONE_AND_DONE_ARGS.has(process.argv[2])) { - return; - } - - const optsPath = - process.argv.indexOf('--opts') === -1 - ? mocharc.opts - : process.argv[process.argv.indexOf('--opts') + 1]; - - try { - const options = parseMochaOpts(fs.readFileSync(optsPath, 'utf8')); - - process.argv = process.argv - .slice(0, 2) - .concat(options.concat(process.argv.slice(2))); - } catch (ignore) { - // NOTE: should console.error() and throw the error - } - - process.env.LOADED_MOCHA_OPTS = true; -}; - /** * Given filepath in `args.opts`, attempt to load and parse a `mocha.opts` file. * @param {Object} [args] - Arguments object diff --git a/package.json b/package.json index d33830d39a..07b81c9c7d 100644 --- a/package.json +++ b/package.json @@ -596,7 +596,7 @@ "watchify": "^3.11.1" }, "files": [ - "bin/{*mocha,options.js}", + "bin/*mocha", "assets/growl/*.png", "lib/**/*.{js,html,json}", "index.js", From ea26c3dee16626f13ddb6f016a92875a8f30e34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Thu, 22 Aug 2019 19:14:22 +0200 Subject: [PATCH 1384/1771] Add link checking to docs build step (#3972) * Add link checking to docs build step * Update hyperlink to 4.3.0 * Update @mocha/docdash to 2.1.2 * Fix internal broken fragment links from jsdoc comments to front page * Mark source code line fragment link checks as TODO. They are runtime JS generated and can't be found by hyperlink * Document reporters.Base.prototype.epilogue as a member of the right thing, thus not breaking docs links * Update to hyperlink 4.3.1 * Update to jsdoc 3.6.3 * experiment: add acorn 7 as dev dependency to attempt to fix broken build * Fix broken links from tutorial. Use jsdoc link functionality instead of guessign url's * Make hyperlink skipfilter argument windows compatible --- docs/api-tutorials/custom-reporter.md | 49 ++- lib/cli/options.js | 1 + lib/mocha.js | 32 +- lib/reporters/base.js | 2 +- package-lock.json | 484 +++++++++++++++++++++++--- package-scripts.js | 6 +- package.json | 6 +- 7 files changed, 477 insertions(+), 103 deletions(-) diff --git a/docs/api-tutorials/custom-reporter.md b/docs/api-tutorials/custom-reporter.md index a5abee8ce3..a0cfe48d66 100644 --- a/docs/api-tutorials/custom-reporter.md +++ b/docs/api-tutorials/custom-reporter.md @@ -77,44 +77,37 @@ For further examples, the built-in reporter implementations are the [best place ## The `Base` Reporter Class -[Base] is an "abstract" class. It contains console-specific settings and utilities, commonly used by built-in reporters. Browsing the built-in reporter implementations, you may often see static properties of [Base] referenced. +[Base]{@link Mocha.reporters.Base} is an "abstract" class. It contains console-specific settings and utilities, commonly used by built-in reporters. Browsing the built-in reporter implementations, you may often see static properties of [Base]{@link Mocha.reporters.Base} referenced. -It's often useful--but not necessary--for a custom reporter to extend [Base]. +It's often useful--but not necessary--for a custom reporter to extend [Base]{@link Mocha.reporters.Base}. ## Statistics -Mocha adds a `stats` property of type [StatsCollector](/api/module-lib_stats-collector.html) to the reporter's `Runner` instance (passed as first argument to constructor). +Mocha adds a `stats` property of type {@link StatsCollector} to the reporter's `Runner` instance (passed as first argument to constructor). ## Events -A reporter should listen for events emitted from the `runner` (a singleton instance of [Runner]). +A reporter should listen for events emitted from the `runner` (a singleton instance of {@link Runner}). The event names are exported from the `constants` property of `Mocha.Runner`: -| Constant | Event Name | Event Arguments | Description | -| -------------------- | ----------- | --------------- | ------------------------------------------------------------------------------------------- | -| `EVENT_RUN_BEGIN` | `start` | _(n/a)_ | Execution will begin. | -| `EVENT_RUN_END` | `end` | _(n/a)_ | All [Suite]s, [Test]s and [Hook]s have completed execution. | -| `EVENT_DELAY_BEGIN` | `waiting` | _(n/a)_ | Waiting for `global.run()` to be called; only emitted when [delay] option is `true`. | -| `EVENT_DELAY_END` | `ready` | _(n/a)_ | User called `global.run()` and the root suite is ready to execute. | -| `EVENT_SUITE_BEGIN` | `suite` | `Suite` | The [Hook]s and [Test]s within a [Suite] will be executed, including any nested [Suite]s. | -| `EVENT_SUITE_END` | `suite end` | `Suite` | The [Hook]s, [Test]s, and nested [Suite]s within a [Suite] have completed execution. | -| `EVENT_HOOK_BEGIN` | `hook` | `Hook` | A [Hook] will be executed. | -| `EVENT_HOOK_END` | `hook end` | `Hook` | A [Hook] has completed execution. | -| `EVENT_TEST_BEGIN` | `test` | `Test` | A [Test] will be executed. | -| `EVENT_TEST_END` | `test end` | `Test` | A [Test] has completed execution. | -| `EVENT_TEST_FAIL` | `fail` | `Test`, `Error` | A [Test] has failed or thrown an exception. | -| `EVENT_TEST_PASS` | `pass` | `Test` | A [Test] has passed. | -| `EVENT_TEST_PENDING` | `pending` | `Test` | A [Test] was skipped. | -| `EVENT_TEST_RETRY` | `retry` | `Test`, `Error` | A [Test] failed, but is about to be retried; only emitted if the `retry` option is nonzero. | +| Constant | Event Name | Event Arguments | Description | +| -------------------- | ----------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `EVENT_RUN_BEGIN` | `start` | _(n/a)_ | Execution will begin. | +| `EVENT_RUN_END` | `end` | _(n/a)_ | All [Suites]{@link Suite}, [Tests]{@link Test} and [Hooks]{@link Hook} have completed execution. | +| `EVENT_DELAY_BEGIN` | `waiting` | _(n/a)_ | Waiting for `global.run()` to be called; only emitted when [delay](/#delayed-root-suite) option is `true`. | +| `EVENT_DELAY_END` | `ready` | _(n/a)_ | User called `global.run()` and the root suite is ready to execute. | +| `EVENT_SUITE_BEGIN` | `suite` | `Suite` | The [Hooks]{@link Hook} and [Tests]{@link Test} within a {@link Suite} will be executed, including any nested [Suites]{@link Suite}. | +| `EVENT_SUITE_END` | `suite end` | `Suite` | The [Hooks]{@link Hook}, [Tests]{@link Test}, and nested [Suites]{@link Suite} within a {@link Suite} have completed execution. | +| `EVENT_HOOK_BEGIN` | `hook` | `Hook` | A {@link Hook} will be executed. | +| `EVENT_HOOK_END` | `hook end` | `Hook` | A {@link Hook} has completed execution. | +| `EVENT_TEST_BEGIN` | `test` | `Test` | A {@link Test} will be executed. | +| `EVENT_TEST_END` | `test end` | `Test` | A {@link Test} has completed execution. | +| `EVENT_TEST_FAIL` | `fail` | `Test`, `Error` | A {@link Test} has failed or thrown an exception. | +| `EVENT_TEST_PASS` | `pass` | `Test` | A {@link Test} has passed. | +| `EVENT_TEST_PENDING` | `pending` | `Test` | A {@link Test} was skipped. | +| `EVENT_TEST_RETRY` | `retry` | `Test`, `Error` | A {@link Test} failed, but is about to be retried; only emitted if the `retry` option is nonzero. | **Please use these constants** instead of the event names in your own reporter! This will ensure compatibility with future versions of Mocha. -> It's important to understand that all `Suite` callbacks will be run _before_ the [Runner] emits `EVENT_RUN_BEGIN`. Hooks and tests, however, won't run until _after_ the [Runner] emits `EVENT_RUN_BEGIN`. - -[runner]: /api/runner.html -[test]: /api/test.html -[hook]: /api/hook.html -[suite]: /api/suite.html -[base]: /api/mocha.reporters.base.html -[delay]: /#delayed-root-suite.html +> It's important to understand that all `Suite` callbacks will be run _before_ the {@link Runner} emits `EVENT_RUN_BEGIN`. Hooks and tests, however, won't run until _after_ the {@link Runner} emits `EVENT_RUN_BEGIN`. diff --git a/lib/cli/options.js b/lib/cli/options.js index 7cd2e48289..ffbca06396 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -168,6 +168,7 @@ const parseMochaOpts = content => * @param {string|boolean} [args.opts] - Filepath to mocha.opts; defaults to whatever's in `mocharc.opts`, or `false` to skip * @returns {external:yargsParser.Arguments|void} If read, object containing parsed arguments * @memberof module:lib/cli/options + * @see {@link /#mochaopts|mocha.opts} * @public */ const loadMochaOpts = (args = {}) => { diff --git a/lib/mocha.js b/lib/mocha.js index c0a5aa6dd9..5582324b8a 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -163,7 +163,7 @@ function Mocha(options) { * Enables or disables bailing on the first failure. * * @public - * @see {@link https://mochajs.org/#-b---bail|CLI option} + * @see {@link /#-bail-b|CLI option} * @param {boolean} [bail=true] - Whether to bail on first error. * @returns {Mocha} this * @chainable @@ -184,7 +184,7 @@ Mocha.prototype.bail = function(bail) { * Useful for generic setup code that must be included within test suite. * * @public - * @see {@link https://mochajs.org/#--file-file|CLI option} + * @see {@link /#-file-filedirectoryglob|CLI option} * @param {string} file - Pathname of file to be loaded. * @returns {Mocha} this * @chainable @@ -198,8 +198,8 @@ Mocha.prototype.addFile = function(file) { * Sets reporter to `reporter`, defaults to "spec". * * @public - * @see {@link https://mochajs.org/#-r---reporter-name|CLI option} - * @see {@link https://mochajs.org/#reporters|Reporters} + * @see {@link /#-reporter-name-r-name|CLI option} + * @see {@link /#reporters|Reporters} * @param {String|Function} reporter - Reporter name or constructor. * @param {Object} [reporterOptions] - Options used to configure the reporter. * @returns {Mocha} this @@ -265,8 +265,8 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { * Sets test UI `name`, defaults to "bdd". * * @public - * @see {@link https://mochajs.org/#-u---ui-name|CLI option} - * @see {@link https://mochajs.org/#interfaces|Interface DSLs} + * @see {@link /#-ui-name-u-name|CLI option} + * @see {@link /#interfaces|Interface DSLs} * @param {string|Function} [ui=bdd] - Interface name or class. * @returns {Mocha} this * @chainable @@ -404,7 +404,7 @@ Mocha.prototype.fgrep = function(str) { * Previous filter value will be overwritten on each call! * * @public - * @see {@link https://mochajs.org/#-g---grep-pattern|CLI option} + * @see {@link /#grep-regexp-g-regexp|CLI option} * @see {@link Mocha#fgrep} * @see {@link Mocha#invert} * @param {RegExp|String} re - Regular expression used to select tests. @@ -474,7 +474,7 @@ Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { * Enables checking for global variables leaked while running tests. * * @public - * @see {@link https://mochajs.org/#--check-leaks|CLI option} + * @see {@link /#-check-leaks|CLI option} * @see {@link Mocha#ignoreLeaks} * @return {Mocha} this * @chainable @@ -544,7 +544,7 @@ Mocha.prototype._growl = growl.notify; * Specifies whitelist of variable names to be expected in global scope. * * @public - * @see {@link https://mochajs.org/#-global-variable-name|CLI option} + * @see {@link /#-global-variable-name|CLI option} * @see {@link Mocha#checkLeaks} * @param {String[]|String} globals - Accepted global variable name(s). * @return {Mocha} this @@ -615,9 +615,8 @@ Mocha.prototype.hideDiff = function(hideDiff) { * If the value is `0`, timeouts will be disabled. * * @public - * @see {@link https://mochajs.org/#-t---timeout-ms|CLI option} - * @see {@link https://mochajs.org/#--no-timeouts|CLI option} - * @see {@link https://mochajs.org/#timeouts|Timeouts} + * @see {@link /#-timeout-ms-t-ms|CLI option} + * @see {@link /#timeouts|Timeouts} * @see {@link Mocha#enableTimeouts} * @param {number|string} msecs - Timeout threshold value. * @return {Mocha} this @@ -640,7 +639,7 @@ Mocha.prototype.timeout = function(msecs) { * Sets the number of times to retry failed tests. * * @public - * @see {@link https://mochajs.org/#retry-tests|Retry Tests} + * @see {@link /#retry-tests|Retry Tests} * @param {number} retry - Number of times to retry failed tests. * @return {Mocha} this * @chainable @@ -658,7 +657,7 @@ Mocha.prototype.retries = function(n) { * Sets slowness threshold value. * * @public - * @see {@link https://mochajs.org/#-s---slow-ms|CLI option} + * @see {@link /#-slow-ms-s-ms|CLI option} * @param {number} msecs - Slowness threshold value. * @return {Mocha} this * @chainable @@ -680,8 +679,7 @@ Mocha.prototype.slow = function(msecs) { * Enables or disables timeouts. * * @public - * @see {@link https://mochajs.org/#-t---timeout-ms|CLI option} - * @see {@link https://mochajs.org/#--no-timeouts|CLI option} + * @see {@link /#-timeout-ms-t-ms|CLI option} * @param {boolean} enableTimeouts - Whether to enable timeouts. * @return {Mocha} this * @chainable @@ -737,7 +735,7 @@ Mocha.prototype.allowUncaught = function() { * Used to perform asynch operations before any suites are run. * * @public - * @see {@link https://mochajs.org/#delayed-root-suite|delayed root suite} + * @see {@link /#delayed-root-suite|delayed root suite} * @returns {Mocha} this * @chainable */ diff --git a/lib/reporters/base.js b/lib/reporters/base.js index b1d026fcce..69db8f8ac7 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -307,7 +307,7 @@ function Base(runner, options) { * Outputs common epilogue used by many of the bundled reporters. * * @public - * @memberof Mocha.reporters.Base + * @memberof Mocha.reporters */ Base.prototype.epilogue = function() { var stats = this.stats; diff --git a/package-lock.json b/package-lock.json index 62eb962113..cd6c298e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -325,9 +325,9 @@ } }, "@mocha/docdash": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.1.tgz", - "integrity": "sha512-D6l+L2rItDsO2bcc2Fl/REKDaOZMMUB1VYuFdgrM2Kk02DMCnhzZWyuBfXyNWfh3YplR38AJlOifx0dHutYD6g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.2.tgz", + "integrity": "sha512-XQMLYVel+tWiNF9u74OX6GEzMbHh9WxrSRmOZjbmjRl5Gn1tdhNeGX5CA9wjf2OxdIe8RoJb63nqFM9wQVkdSA==", "dev": true, "requires": { "taffydb": "^2.7.3" @@ -421,6 +421,12 @@ "integrity": "sha512-J/tnbnj8HcsBgCe2apZbdUpQ7hs4d7oZNTYA5bekWdP0sr2NGsOpI/HRdDroEi209tEvTcTtxhD0FfED3DhEcw==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", @@ -493,9 +499,9 @@ } }, "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", "dev": true }, "acorn-dynamic-import": { @@ -723,7 +729,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "arch": { @@ -1791,7 +1797,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2045,7 +2051,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" }, "browser-sync": { "version": "2.26.5", @@ -2728,12 +2734,20 @@ "dev": true }, "catharsis": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", - "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "caw": { @@ -2889,7 +2903,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3559,7 +3573,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", "dev": true }, "cross-env": { @@ -4409,7 +4423,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" }, "diffie-hellman": { "version": "5.0.3", @@ -5062,7 +5076,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5089,7 +5103,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5135,7 +5149,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5398,7 +5412,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5426,7 +5440,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6883,7 +6897,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7490,7 +7504,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -7732,6 +7746,323 @@ } } }, + "hyperlink": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.3.1.tgz", + "integrity": "sha512-IVo2B4k0ITQTgOf095qF2+ye5ZMC4F6N06yipBYClQ+wSI6vMT+GisoASP620zdYdxqge12cA0tSbs/GXFUtkw==", + "dev": true, + "requires": { + "assetgraph": "^5.12.0", + "async": "^3.1.0", + "optimist": "^0.6.1", + "pretty-bytes": "^5.2.0", + "request": "^2.88.0", + "tap-render": "github:Munter/tap-render#0.1.7-patch4", + "urltools": "^0.4.1" + }, + "dependencies": { + "acorn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "assetgraph": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.12.0.tgz", + "integrity": "sha512-w1ZQlYGFcjpE8jbSuE/+rWTq5xKvMWnR/WcYmtwFIYqyq9Ts7x6n3Hn8D7nDK5PT7rvO6DGnzI5Jguad97CD/w==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.1", + "bluebird": "^3.5.1", + "chalk": "^2.0.1", + "common-path-prefix": "^1.0.0", + "createerror": "^1.3.0", + "css-font-parser-papandreou": "^0.2.3-patch1", + "css-font-weight-names": "0.2.1", + "css-list-helpers": "2.0.0", + "cssnano": "^4.1.10", + "data-urls": "^1.0.0", + "domspace": "^1.2.1", + "esanimate": "^1.1.0", + "escodegen": "^1.12.0", + "espurify": "^2.0.1", + "estraverse": "^4.3.0", + "estraverse-fb": "^1.3.2", + "font-family-papandreou": "^0.2.0-patch1", + "font-snapper": "^1.0.0", + "font-tracer": "^1.1.0", + "fontkit": "^1.7.7", + "gettemporaryfilepath": "^1.0.0", + "glob": "^7.0.5", + "html-minifier": "^4.0.0", + "imageinfo": "^1.0.4", + "jsdom": "^15.0.0", + "lines-and-columns": "^1.1.6", + "lodash": "4.17.15", + "memoizesync": "1.1.1", + "mkdirp": "^0.5.1", + "normalizeurl": "^1.0.0", + "perfectionist": "^2.4.0", + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.0", + "read-pkg-up": "^6.0.0", + "repeat-string": "^1.5.4", + "schemes": "^1.0.1", + "semver": "^6.0.0", + "sift": "^7.0.1", + "source-map": "~0.6.1", + "specificity": "^0.4.0", + "sw-precache": "^5.2.0", + "teepee": "^2.31.1", + "terser": "^4.0.0", + "urltools": "^0.4.1", + "xmldom": "^0.1.27" + } + }, + "async": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", + "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "jsdom": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", + "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^6.1.1", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.3.6", + "cssstyle": "^1.2.2", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.4", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", + "dev": true, + "requires": { + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", + "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "ws": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + } + } + }, "icc": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/icc/-/icc-1.0.0.tgz", @@ -7974,6 +8305,12 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -8315,7 +8652,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -8723,31 +9060,31 @@ "dev": true }, "jsdoc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", - "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", + "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", "dev": true, "requires": { "@babel/parser": "^7.4.4", "bluebird": "^3.5.4", - "catharsis": "^0.8.10", + "catharsis": "^0.8.11", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.0", "klaw": "^3.0.0", "markdown-it": "^8.4.2", "markdown-it-anchor": "^5.0.2", - "marked": "^0.6.2", + "marked": "^0.7.0", "mkdirp": "^0.5.1", - "requizzle": "^0.2.2", + "requizzle": "^0.2.3", "strip-json-comments": "^3.0.1", "taffydb": "2.6.2", "underscore": "~1.9.1" }, "dependencies": { "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "escape-string-regexp": { @@ -10172,7 +10509,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10279,9 +10616,9 @@ } }, "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, "matcher": { @@ -10493,7 +10830,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -10604,7 +10941,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -10813,7 +11150,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11093,7 +11430,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -11567,7 +11904,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { @@ -12312,7 +12649,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -12593,7 +12930,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -12963,7 +13300,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13069,7 +13406,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14080,12 +14417,20 @@ "dev": true }, "requizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", - "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "resolve": { @@ -14334,7 +14679,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -15977,6 +16322,23 @@ "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=", "dev": true }, + "tap-render": { + "version": "github:Munter/tap-render#c3a72d6260ee19cfd340d1e41d73a0edfdb29d94", + "from": "github:Munter/tap-render#0.1.7-patch4", + "dev": true, + "requires": { + "jsonify": "0.0.0", + "pause-stream": "0.0.7" + }, + "dependencies": { + "pause-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.7.tgz", + "integrity": "sha1-/kDjE8ZcDyqh0WeTPEJeTLJMtTc=", + "dev": true + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -16422,7 +16784,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -16642,6 +17004,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -17386,7 +17754,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "whatwg-encoding": { @@ -17491,6 +17859,14 @@ "requires": { "acorn": "^3.1.0", "acorn-globals": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } } }, "wordwrap": { @@ -17501,7 +17877,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package-scripts.js b/package-scripts.js index 7febdc016f..f4d1dc9845 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -266,7 +266,7 @@ module.exports = { docs: { default: { script: - 'nps docs.prebuild && nps docs.api && eleventy && nps docs.postbuild', + 'nps docs.prebuild && nps docs.api && eleventy && nps docs.linkcheck && nps docs.postbuild', description: 'Build documentation' }, prebuild: { @@ -274,6 +274,10 @@ module.exports = { description: 'Prepare system for doc building', hiddenFromHelp: true }, + linkcheck: { + script: + 'hyperlink -ri --canonicalroot https://mochajs.org --skip ".js.html#line" docs/_site/index.html' + }, postbuild: { script: 'buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --svgo --inlinehtmlimage 9400 --inlinehtmlscript 0 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js >> docs/_dist/_headers', diff --git a/package.json b/package.json index 07b81c9c7d..f53ea0ba15 100644 --- a/package.json +++ b/package.json @@ -539,7 +539,8 @@ "devDependencies": { "@11ty/eleventy": "^0.8.3", "@mocha/contributors": "^1.0.4", - "@mocha/docdash": "^2.1.1", + "@mocha/docdash": "^2.1.2", + "acorn": "^7.0.0", "assetgraph-builder": "^6.10.1", "autoprefixer": "^9.6.0", "browserify": "^16.2.3", @@ -560,7 +561,8 @@ "eslint-plugin-standard": "^4.0.0", "fs-extra": "^8.0.1", "husky": "^1.3.1", - "jsdoc": "^3.6.2", + "hyperlink": "^4.3.1", + "jsdoc": "^3.6.3", "karma": "^4.1.0", "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", From f15e9884eba81172e4d2990b5aeb44391b83443b Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 26 Aug 2019 10:54:03 +0200 Subject: [PATCH 1385/1771] Soft deprecate configuration via "mocha.opts" (#3968) --- docs/index.md | 8 ++++---- example/config/.mocharc.js | 2 +- example/config/.mocharc.json | 2 +- example/config/.mocharc.jsonc | 2 +- example/config/.mocharc.yml | 2 +- lib/cli/options.js | 4 ++++ lib/cli/run.js | 2 +- test/integration/options/opts.spec.js | 18 ++++++++++++++++++ 8 files changed, 31 insertions(+), 9 deletions(-) diff --git a/docs/index.md b/docs/index.md index 3e00e3468e..be1511ef9e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1065,7 +1065,7 @@ By default, Mocha will search for a config file if `--config` is not specified; ### `--opts ` -> _Updated in v6.0.0; added `--no-opts`._ +> _Deprecated._ Specify a path to [`mocha.opts`](#mochaopts). @@ -1636,14 +1636,14 @@ tests as shown below: > _New in v6.0.0_ -In addition to supporting the legacy [`mocha.opts`](#mochaopts) run-control format, Mocha now supports configuration files, typical of modern command-line tools, in several formats: +In addition to supporting the deprecated [`mocha.opts`](#mochaopts) run-control format, Mocha now supports configuration files, typical of modern command-line tools, in several formats: - **JavaScript**: Create a `.mocharc.js` in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. - **YAML**: Create a `.mocharc.yaml` (or `.mocharc.yml`) in your project's root directory. - **JSON**: Create a `.mocharc.json` (or `.mocharc.jsonc`) in your project's root directory. Comments — while not valid JSON — are allowed in this file, and will be ignored by Mocha. - **package.json**: Create a `mocha` property in your project's `package.json`. -Mocha suggests using one of the above strategies for configuration instead of the legacy `mocha.opts` format. +Mocha suggests using one of the above strategies for configuration instead of the deprecated `mocha.opts` format. ### Custom Locations @@ -1693,7 +1693,7 @@ Configurations can inherit from other modules using the `extends` keyword. See [ ## `mocha.opts` -> _Updated in v6.0.0; `mocha.opts` is now considered "legacy" — though not yet deprecated — and we recommend using a configuration file instead._ +> _`mocha.opts` file support is DEPRECATED and will be removed from a future version of Mocha. We recommend using a configuration file instead._ Mocha will attempt to load `"./test/mocha.opts"` as a run-control file of sorts. diff --git a/example/config/.mocharc.js b/example/config/.mocharc.js index 5d9c7fa770..9b58a28d51 100644 --- a/example/config/.mocharc.js +++ b/example/config/.mocharc.js @@ -7,7 +7,7 @@ module.exports = { diff: true, extension: ['js'], - opts: './test/mocha.opts', + opts: false, package: './package.json', reporter: 'spec', slow: 75, diff --git a/example/config/.mocharc.json b/example/config/.mocharc.json index 07f954da67..5fa8f762e8 100644 --- a/example/config/.mocharc.json +++ b/example/config/.mocharc.json @@ -5,7 +5,7 @@ { "diff": true, "extension": ["js"], - "opts": "./test/mocha.opts", + "opts": false, "package": "./package.json", "reporter": "spec", "slow": 75, diff --git a/example/config/.mocharc.jsonc b/example/config/.mocharc.jsonc index d86055f870..49152a186d 100644 --- a/example/config/.mocharc.jsonc +++ b/example/config/.mocharc.jsonc @@ -5,7 +5,7 @@ { "diff": true, "extension": ["js"], - "opts": "./test/mocha.opts", + "opts": false, "package": /* 📦 */ "./package.json", "reporter": /* 📋 */ "spec", "slow": 75, diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index 466b4956f1..4004d47720 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -28,7 +28,7 @@ ignore: inline-diffs: false # needs to be used with grep or fgrep # invert: false -opts: './test/mocha.opts' +opts: false recursive: false reporter: spec reporter-option: diff --git a/lib/cli/options.js b/lib/cli/options.js index ffbca06396..c87552c542 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -15,6 +15,7 @@ const mocharc = require('../mocharc.json'); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); +const {deprecate} = require('../utils'); const debug = require('debug')('mocha:cli:options'); const {isNodeFlag} = require('./node-flags'); @@ -196,6 +197,9 @@ const loadMochaOpts = (args = {}) => { // if there's an exception to catch here, I'm not sure what it is. // by attaching the `no-opts` arg, we avoid re-parsing of `mocha.opts`. if (mochaOpts) { + deprecate( + 'Configuration via mocha.opts is DEPRECATED and will be removed from a future version of Mocha. Use RC files or package.json instead.' + ); result = parse(parseMochaOpts(mochaOpts)); debug(`${filepath} parsed succesfully`); } diff --git a/lib/cli/run.js b/lib/cli/run.js index dc94c101a4..b0a16e6bdf 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -166,7 +166,7 @@ exports.builder = yargs => }, opts: { default: defaults.opts, - description: 'Path to `mocha.opts`', + description: 'Path to `mocha.opts` (DEPRECATED)', group: GROUPS.CONFIG, normalize: true, requiresArg: true diff --git a/test/integration/options/opts.spec.js b/test/integration/options/opts.spec.js index 51f49fec8b..e3d98581ed 100644 --- a/test/integration/options/opts.spec.js +++ b/test/integration/options/opts.spec.js @@ -10,6 +10,24 @@ describe('--opts', function() { var args = []; var fixture = path.join('options', 'opts'); + it('should print a deprecation warning', function(done) { + var mochaOpts = path.join('test', 'opts', 'mocha.opts'); + args = [resolvePath(fixture), '--opts', mochaOpts]; + invokeMocha( + args, + function(err, res) { + if (err) { + return done(err); + } + + expect(res, 'to have passed'); + expect(res.output, 'to contain', 'mocha.opts is DEPRECATED'); + done(); + }, + 'pipe' + ); + }); + it('should work despite nonexistent default options file', function(done) { args = []; runMochaJSON(fixture, args, function(err, res) { From d8ac68ff79d112e69ed40eabf574d2706bb13a44 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Sat, 31 Aug 2019 11:55:38 +0100 Subject: [PATCH 1386/1771] Adopt the OpenJSF Code of Conduct (#3971) * OJSF coc * update email --- .github/CODE_OF_CONDUCT.md | 54 +++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 2b4375ee2f..06fc2b30ed 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -33,14 +33,14 @@ community should be respectful when dealing with other members as well as with p We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren’t acceptable. This includes, but is not limited to: -* Violent threats or language directed against another person. -* Discriminatory jokes and language. -* Posting sexually explicit or violent material. -* Posting (or threatening to post) other people’s personally identifying information (“doxing”). -* Personal insults, especially those using racist or sexist terms. -* Unwelcome sexual attention. -* Advocating for, or encouraging, any of the above behavior. -* Repeated harassment of others. In general, if someone asks you to stop, then stop. +- Violent threats or language directed against another person. +- Discriminatory jokes and language. +- Posting sexually explicit or violent material. +- Posting (or threatening to post) other people’s personally identifying information (“doxing”). +- Personal insults, especially those using racist or sexist terms. +- Unwelcome sexual attention. +- Advocating for, or encouraging, any of the above behavior. +- Repeated harassment of others. In general, if someone asks you to stop, then stop. ## When we disagree, try to understand why @@ -55,4 +55,40 @@ Original text courtesy of the Speak Up! project and Django Project. ## QUESTIONS? -If you have questions, please see the FAQ. If that doesn’t answer your questions, feel free to email conduct@js.foundation. +If you have questions, please see the FAQ. If that doesn’t answer your questions, feel free to email report@lists.openjsf.org. + +# OpenJS Foundation Code of Conduct + +The OpenJS Foundation and its member projects use the Contributor +Covenant v1.4.1 as its Code of Conduct. Refer to the following +for the full text: + +- [english](https://www.contributor-covenant.org/version/1/4/code-of-conduct) +- [translations](https://www.contributor-covenant.org/translations) + +Refer to the section on reporting and escalation in this document for the specific emails that can be used to report and escalate issues. + +## Reporting + +### Project Spaces + +For reporting issues in spaces related to a member project please use the email provided by the project for reporting. Projects handle CoC issues related to the spaces that they maintain. Projects maintainers commit to: + +- maintain the confidentiality with regard to the reporter of an incident +- to participate in the path for escalation as outlined in + the section on Escalation when required. + +### Foundation Spaces + +For reporting issues in spaces managed by the OpenJS Foundation, for example, repositories within the OpenJS organization, use the email `report@lists.openjsf.org`. The Cross Project Council (CPC) is responsible for managing these reports and commits to: + +- maintain the confidentiality with regard to the reporter of an incident +- to participate in the path for escalation as outlined in + the section on Escalation when required. + +## Escalation + +The OpenJS Foundation maintains a Code of Conduct Panel (CoCP). This is a foundation-wide team established to manage escalation when a reporter believes that a report to a member project or the CPC has not been properly handled. In order to escalate to the CoCP send an email to `"coc-escalation@lists.openjsf.org`. + +For more information, refer to the full +[Code of Conduct governance document](https://github.com/openjs-foundation/bootstrap/blob/master/proposals/stage-1/CODE_OF_CONDUCT/FOUNDATION_CODE_OF_CONDUCT_REQUIREMENTS.md). From 802fb0593a9a4d094e2290582760c2b43529fbd1 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 3 Sep 2019 08:48:40 +0200 Subject: [PATCH 1387/1771] Deprecate "debug" and remove "--debug" / "--debug-brk" flags (#3890) --- bin/mocha | 51 +++------------- docs/index.md | 57 +++++++++--------- lib/cli/node-flags.js | 2 +- lib/cli/run.js | 2 +- test/integration/options/debug.spec.js | 80 -------------------------- test/node-unit/cli/node-flags.spec.js | 4 +- 6 files changed, 41 insertions(+), 155 deletions(-) delete mode 100644 test/integration/options/debug.spec.js diff --git a/bin/mocha b/bin/mocha index 865f5b1f07..4b0ab8ff86 100755 --- a/bin/mocha +++ b/bin/mocha @@ -10,7 +10,7 @@ * @private */ -const {deprecate, warn} = require('../lib/utils'); +const {deprecate} = require('../lib/utils'); const {loadOptions} = require('../lib/cli/options'); const { unparseNodeFlags, @@ -20,7 +20,6 @@ const { const unparse = require('yargs-unparser'); const debug = require('debug')('mocha:cli:mocha'); const {aliases} = require('../lib/cli/run-option-metadata'); -const nodeEnv = require('node-environment-flags'); const mochaArgs = {}; const nodeArgs = {}; @@ -63,51 +62,19 @@ Object.keys(opts).forEach(opt => { // Native debugger handling // see https://nodejs.org/api/debugger.html#debugger_debugger -// look for 'debug' or 'inspect' that would launch this debugger, +// look for 'inspect' or 'debug' that would launch this debugger, // remove it from Mocha's opts and prepend it to Node's opts. -// also coerce depending on Node.js version. // A deprecation warning will be printed by node, if applicable. // (mochaArgs._ are "positional" arguments, not prefixed with - or --) -if (/^(debug|inspect)$/.test(mochaArgs._[0])) { - const command = mochaArgs._.shift(); - disableTimeouts(command); - // don't conflict with inspector - ['debug', 'inspect', 'debug-brk', 'inspect-brk'] - .filter(opt => opt in nodeArgs || opt in mochaArgs) - .forEach(opt => { - warn(`command "${command}" provided; --${opt} ignored`); - delete nodeArgs[opt]; - delete mochaArgs[opt]; - }); - nodeArgs._ = [ - parseInt( - process.version - .slice(1) - .split('.') - .shift(), - 10 - ) >= 8 - ? 'inspect' - : 'debug' - ]; +if (mochaArgs._) { + const i = mochaArgs._.findIndex(val => val === 'inspect' || val === 'debug'); + if (i > -1) { + const [command] = mochaArgs._.splice(i, 1); + disableTimeouts('inspect'); + nodeArgs._ = [command]; + } } -// allow --debug to invoke --inspect on Node.js v8 or newer. -['debug', 'debug-brk'] - .filter(opt => opt in nodeArgs && !nodeEnv.has(opt)) - .forEach(opt => { - const newOpt = opt === 'debug' ? 'inspect' : 'inspect-brk'; - warn( - `"--${opt}" is not available in Node.js ${ - process.version - }; use "--${newOpt}" instead.` - ); - nodeArgs[newOpt] = nodeArgs[opt]; - mochaArgs.timeout = false; - debug(`--${opt} -> ${newOpt}`); - delete nodeArgs[opt]; - }); - // historical if (nodeArgs.gc) { deprecate( diff --git a/docs/index.md b/docs/index.md index be1511ef9e..50b5536aeb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -39,7 +39,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [config file support](#-config-path) - [mocha.opts file support](#-opts-path) - clickable suite titles to filter test execution -- [node debugger support](#-debug-inspect-debug-brk-inspect-brk-debug-inspect) +- [node debugger support](#-inspect-inspect-brk-inspect) - [detects multiple calls to `done()`](#detects-multiple-calls-to-done) - [use any assertion library you want](#assertions) - [extensible reporting, bundled with 9+ reporters](#reporters) @@ -828,8 +828,8 @@ mocha [spec..] Run tests with Mocha Commands - mocha debug [spec..] Run tests with Mocha [default] - mocha init create a client-side Mocha setup at + mocha inspect [spec..] Run tests with Mocha [default] + mocha init create a client-side Mocha setup at Rules & Behavior --allow-uncaught Allow uncaught errors to propagate [boolean] @@ -844,9 +844,9 @@ Rules & Behavior --global, --globals List of allowed global variables [array] --retries Retry failed tests this many times [number] --slow, -s Specify "slow" test threshold (in milliseconds) - [number] [default: 75] + [string] [default: 75] --timeout, -t, --timeouts Specify test timeout threshold (in milliseconds) - [number] [default: 2000] + [string] [default: 2000] --ui, -u Specify user interface [string] [default: "bdd"] Reporting & Output @@ -863,17 +863,18 @@ Reporting & Output -O () [array] Configuration - --config Path to config file [default: (nearest rc file)] - --opts Path to `mocha.opts` [string] [default: "./test/mocha.opts"] + --config Path to config file [string] [default: (nearest rc file)] + --opts Path to `mocha.opts` (DEPRECATED) + [string] [default: "./test/mocha.opts"] --package Path to package.json for config [string] File Handling - --ignore, --exclude Ignore file(s) or glob pattern(s) - [array] [default: (none)] --extension, --watch-extensions File extension(s) to load and/or watch [array] [default: js] --file Specify file(s) to be loaded prior to root suite execution [array] [default: (none)] + --ignore, --exclude Ignore file(s) or glob pattern(s) + [array] [default: (none)] --recursive Look for tests in subdirectories [boolean] --require, -r Require module [array] [default: (none)] --sort, -S Sort test files [boolean] @@ -890,10 +891,10 @@ Positional Arguments [array] [default: ["test"]] Other Options - --help, -h Show usage information & exit [boolean] - --version, -V Show version number & exit [boolean] - --list-interfaces List built-in user interfaces & exit [boolean] - --list-reporters List built-in reporters & exit [boolean] + --help, -h Show usage information & exit [boolean] + --version, -V Show version number & exit [boolean] + --list-interfaces List built-in user interfaces & exit [boolean] + --list-reporters List built-in reporters & exit [boolean] Mocha Resources Chat: https://gitter.im/mochajs/mocha @@ -987,7 +988,7 @@ Note: A test that executes for _half_ of the "slow" time will be highlighted _in ### `--timeout , -t ` -> _Update in v6.0.0: `--no-timeout` is implied when invoking Mocha using debug flags. It is equivalent to `--timeout 0`. `--timeout 99999999` is no longer needed._ +> _Update in v6.0.0: `--no-timeout` is implied when invoking Mocha using inspect flags. It is equivalent to `--timeout 0`. `--timeout 99999999` is no longer needed._ Specifies the test case timeout, defaulting to two (2) seconds (2000 milliseconds). Tests taking longer than this amount of time will be marked as failed. @@ -1079,14 +1080,6 @@ Specify an explicit path to a [`package.json` file](#configuring-mocha-nodejs) ( By default, Mocha looks for a `package.json` in the current working directory or nearest ancestor, and will use the first file found (regardless of whether it contains a `mocha` property); to suppress `package.json` lookup, use `--no-package`. -### `--ignore ` - -Explicitly ignore (exclude) one or more test files, directories or globs (e.g., `some/**/files*`) that would otherwise be loaded. - -Files specified using `--file` _are not affected_ by this option. - -Can be specified multiple times. - ### `--extension , --watch-extensions ` > _Updated in v6.0.0. Previously `--watch-extensions`, but now expanded to affect general test file loading behavior. `--watch-extensions` is now an alias_ @@ -1099,7 +1092,7 @@ Specifying `--extension` will _remove_ `.js` as a test file extension; use `--ex ### `--file ` -Explicitly _include_ a test file to be loaded before other test files files. Multiple uses of `--file` are allowed, and will be loaded in order given. +Explicitly _include_ a test file to be loaded before other test files. Multiple uses of `--file` are allowed, and will be loaded in order given. Useful if you want to declare, for example, hooks to be run before every test across all other test files. @@ -1107,6 +1100,14 @@ Files specified this way are not affected by `--sort` or `--recursive`. Files specified in this way should contain one or more suites, tests or hooks. If this is not the case, consider `--require` instead. +### `--ignore , --exclude ,` + +Explicitly ignore (exclude) one or more test files, directories or globs (e.g., `some/**/files*`) that would otherwise be loaded. + +Files specified using `--file` _are not affected_ by this option. + +Can be specified multiple times. + ### `--recursive` When looking for test files, recurse into subdirectories. @@ -1178,15 +1179,15 @@ Use the _inverse_ of the match specified by `--grep` or `fgrep`. Requires either `--grep` or `--fgrep` (but not both). -### `--debug, --inspect, --debug-brk, --inspect-brk, debug, inspect` +### `--inspect, --inspect-brk, inspect` -> _BREAKING CHANGE in v6.0.0; `-d` is no longer an alias for `--debug`. Other updates in v6.0.0: In versions of Node.js implementing `--inspect` and `--inspect-brk`, `--debug` and `--debug-brk` are respectively aliases for these two options. Likewise, `debug` (not `--debug`) is an alias for `inspect` (not `--inspect`) in Node.js versions where `debug` is deprecated._ +> _BREAKING CHANGE in v7.0.0; `--debug` / `--debug-brk` are removed and `debug` is deprecated._ -Enables Node.js' debugger or inspector. +Enables Node.js' inspector. -Use `--inspect` / `--inspect-brk` / `--debug` / `--debug-brk` to launch the V8 inspector for use with Chrome Dev Tools. +Use `--inspect` / `--inspect-brk` to launch the V8 inspector for use with Chrome Dev Tools. -Use `inspect` / `debug` to launch Node.js' internal debugger. +Use `inspect` to launch Node.js' internal debugger. All of these options are mutually exclusive. diff --git a/lib/cli/node-flags.js b/lib/cli/node-flags.js index feffaa93e2..8d378e1bf2 100644 --- a/lib/cli/node-flags.js +++ b/lib/cli/node-flags.js @@ -14,7 +14,7 @@ const unparse = require('yargs-unparser'); * @see {@link impliesNoTimeouts} * @private */ -const debugFlags = new Set(['debug', 'debug-brk', 'inspect', 'inspect-brk']); +const debugFlags = new Set(['inspect', 'inspect-brk']); /** * Mocha has historical support for various `node` and V8 flags which might not diff --git a/lib/cli/run.js b/lib/cli/run.js index b0a16e6bdf..9adb602ca3 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -38,7 +38,7 @@ const GROUPS = { CONFIG: 'Configuration' }; -exports.command = ['$0 [spec..]', 'debug [spec..]']; +exports.command = ['$0 [spec..]', 'inspect']; exports.describe = 'Run tests with Mocha'; diff --git a/test/integration/options/debug.spec.js b/test/integration/options/debug.spec.js deleted file mode 100644 index 297aee91f6..0000000000 --- a/test/integration/options/debug.spec.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; - -var helpers = require('../helpers'); -var invokeMocha = helpers.invokeMocha; -var DEFAULT_FIXTURE = helpers.DEFAULT_FIXTURE; - -describe('--debug', function() { - describe('Node.js v8+', function() { - before(function() { - if (process.version.substring(0, 2) === 'v6') { - this.skip(); - } - }); - - it('should invoke --inspect', function(done) { - invokeMocha( - ['--debug', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to contain output', /Debugger listening/i); - done(); - }, - 'pipe' - ); - }); - - it('should invoke --inspect-brk', function(done) { - var proc = invokeMocha( - ['--debug-brk', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to contain output', /Debugger listening/i); - done(); - }, - 'pipe' - ); - - // debugger must be manually killed - setTimeout(function() { - process.kill(proc.pid, 'SIGINT'); - }, 2000); - }); - - it('should respect custom host/port', function(done) { - invokeMocha( - ['--debug=127.0.0.1:9229', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect( - res, - 'to contain output', - /Debugger listening on .*127.0.0.1:9229/i - ); - done(); - }, - 'pipe' - ); - }); - - it('should warn about incorrect usage for version', function(done) { - invokeMocha( - ['--debug=127.0.0.1:9229', DEFAULT_FIXTURE], - function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to contain output', /"--debug" is not available/i); - done(); - }, - 'pipe' - ); - }); - }); -}); diff --git a/test/node-unit/cli/node-flags.spec.js b/test/node-unit/cli/node-flags.spec.js index 1347f256a9..9871088117 100644 --- a/test/node-unit/cli/node-flags.spec.js +++ b/test/node-unit/cli/node-flags.spec.js @@ -86,10 +86,8 @@ describe('node-flags', function() { }); describe('impliesNoTimeouts()', function() { - it('should return true for debug/inspect flags', function() { - expect(impliesNoTimeouts('debug'), 'to be true'); + it('should return true for inspect flags', function() { expect(impliesNoTimeouts('inspect'), 'to be true'); - expect(impliesNoTimeouts('debug-brk'), 'to be true'); expect(impliesNoTimeouts('inspect-brk'), 'to be true'); }); }); From 123a0d77beedad032aa6bba175de9eb724204913 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Mon, 9 Sep 2019 13:34:43 +0200 Subject: [PATCH 1388/1771] Improved watching with chokidar (#3980) Improved watching with chokidar. This change improves the file watching behavior and fixes #3912. * We introduce the `--watch-files` command line option. This option allows control over which files are and is separate and more powerful than `--extension`. Fixes #2702. * We introduce the `--watch-ignore` command line option that allows control over which files are not watched. Before this was hardcoded to `node_modules` and `.git`. See #2554. * The `chokidar` package now handles file watching. * New test files are picked up by the file watcher and run. Fixes #2176. * Watch hidden files based on extension --- docs/index.md | 34 ++- example/config/.mocharc.js | 4 +- example/config/.mocharc.json | 4 +- example/config/.mocharc.jsonc | 5 +- example/config/.mocharc.yml | 5 + lib/cli/run-helpers.js | 7 +- lib/cli/run-option-metadata.js | 7 +- lib/cli/run.js | 15 +- lib/cli/watch-run.js | 137 +++++++-- lib/mocharc.json | 3 +- lib/utils.js | 74 ----- package-lock.json | 398 ++++++++++++++++++------- package-scripts.js | 2 +- package.json | 4 +- test/integration/file-utils.spec.js | 24 -- test/integration/options/watch.spec.js | 168 ++++++++++- test/node-unit/cli/options.spec.js | 3 +- 17 files changed, 625 insertions(+), 269 deletions(-) diff --git a/docs/index.md b/docs/index.md index 50b5536aeb..7da5a1cc6f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1080,16 +1080,14 @@ Specify an explicit path to a [`package.json` file](#configuring-mocha-nodejs) ( By default, Mocha looks for a `package.json` in the current working directory or nearest ancestor, and will use the first file found (regardless of whether it contains a `mocha` property); to suppress `package.json` lookup, use `--no-package`. -### `--extension , --watch-extensions ` - -> _Updated in v6.0.0. Previously `--watch-extensions`, but now expanded to affect general test file loading behavior. `--watch-extensions` is now an alias_ +### `--extension ` Files having this extension will be considered test files. Defaults to `js`. -Affects `--watch` behavior. - Specifying `--extension` will _remove_ `.js` as a test file extension; use `--extension js` to re-add it. For example, to load `.mjs` and `.js` test files, you must supply `--extension mjs --extension js`. +The option can be given multiple times. The option accepts a comma-delimited list: `--extension a,b` is equivalent to `--extension a --extension b` + ### `--file ` Explicitly _include_ a test file to be loaded before other test files. Multiple uses of `--file` are allowed, and will be loaded in order given. @@ -1133,9 +1131,31 @@ Sort test files (by absolute path) using [Array.prototype.sort][mdn-array-sort]. ### `--watch, -w` -Executes tests on changes to JavaScript in the current working directory (and once initially). +Rerun tests on file changes. + +The `--watch-files` and `--watch-ignore` options can be used to control which files are watched for changes. + +### `--watch-files ` + +> _New in v7.0.0_ + +List of paths or globs to watch when `--watch` is set. If a file matching the given glob changes or is added or removed mocha will rerun all tests. + +If the path is a directory all files and subdirectories will be watched. + +By default all files in the current directory having one of the extensions provided by `--extension` and not contained in the `node_modules` or `.git` folders are watched. + +The option can be given multiple times. The option accepts a comma-delimited list: `--watch-files a,b` is equivalent to `--watch-files a --watch-files b` + +### `--watch-ignore ` + +> _New in v7.0.0_ + +List of paths or globs to exclude from watching. Defaults to `node_modules` and `.git`. + +To exclude all files in a directory it is preferable to use `foo/bar` instead of `foo/bar/**/*`. The latter will still watch the directory `foo/bar` but will ignore all changes to the content of that directory. -By default, only files with extension `.js` are watched. Use `--extension` to change this behavior. +The option can be given multiple times. The option accepts a comma-delimited list: `--watch-ignore a,b` is equivalent to `--watch-ignore a --watch-ignore b` ### `--fgrep , -f ` diff --git a/example/config/.mocharc.js b/example/config/.mocharc.js index 9b58a28d51..671520cd53 100644 --- a/example/config/.mocharc.js +++ b/example/config/.mocharc.js @@ -12,5 +12,7 @@ module.exports = { reporter: 'spec', slow: 75, timeout: 2000, - ui: 'bdd' + ui: 'bdd', + 'watch-files': ['lib/**/*.js', 'test/**/*.js'], + 'watch-ignore': ['lib/vendor'] }; diff --git a/example/config/.mocharc.json b/example/config/.mocharc.json index 5fa8f762e8..43a83e6b0f 100644 --- a/example/config/.mocharc.json +++ b/example/config/.mocharc.json @@ -10,5 +10,7 @@ "reporter": "spec", "slow": 75, "timeout": 2000, - "ui": "bdd" + "ui": "bdd", + "watch-files": ["lib/**/*.js", "test/**/*.js"], + "watch-ignore": ["lib/vendor"] } diff --git a/example/config/.mocharc.jsonc b/example/config/.mocharc.jsonc index 49152a186d..25a40b6821 100644 --- a/example/config/.mocharc.jsonc +++ b/example/config/.mocharc.jsonc @@ -10,5 +10,8 @@ "reporter": /* 📋 */ "spec", "slow": 75, "timeout": 2000, - "ui": "bdd" + "ui": "bdd", + // Camel-casing options are also accepted + "watchFiles": ["lib/**/*.js", "test/**/*.js"], + "watchIgnore": ["lib/vendor"] } diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index 4004d47720..226f8184ca 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -44,3 +44,8 @@ trace-warnings: true # node flags ok ui: bdd v8-stack-trace-limit: 100 # V8 flags are prepended with "v8-" watch: false +watch-files: + - 'lib/**/*.js' + - 'test/**/*.js' +watch-ignore: + - 'lib/vendor' diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 7b3c7aa4fe..6c662a665f 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -118,13 +118,14 @@ exports.runMocha = (mocha, options) => { const { watch = false, extension = [], - ui = 'bdd', exit = false, ignore = [], file = [], recursive = false, sort = false, - spec = [] + spec = [], + watchFiles, + watchIgnore } = options; const fileCollectParams = { @@ -137,7 +138,7 @@ exports.runMocha = (mocha, options) => { }; if (watch) { - watchRun(mocha, {ui}, fileCollectParams); + watchRun(mocha, {watchFiles, watchIgnore}, fileCollectParams); } else { exports.singleRun(mocha, {exit}, fileCollectParams); } diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index d146ceeca9..d0bc92ffbe 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -18,9 +18,11 @@ exports.types = { 'file', 'global', 'ignore', - 'require', 'reporter-option', - 'spec' + 'require', + 'spec', + 'watch-files', + 'watch-ignore' ], boolean: [ 'allow-uncaught', @@ -68,7 +70,6 @@ exports.aliases = { 'async-only': ['A'], bail: ['b'], color: ['c', 'colors'], - extension: ['watch-extensions'], fgrep: ['f'], global: ['globals'], grep: ['g'], diff --git a/lib/cli/run.js b/lib/cli/run.js index 9adb602ca3..e4e6ba2791 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -88,7 +88,7 @@ exports.builder = yargs => extension: { default: defaults.extension, defaultDescription: 'js', - description: 'File extension(s) to load and/or watch', + description: 'File extension(s) to load', group: GROUPS.FILES, requiresArg: true, coerce: list @@ -241,6 +241,19 @@ exports.builder = yargs => watch: { description: 'Watch files in the current working directory for changes', group: GROUPS.FILES + }, + 'watch-files': { + description: 'List of paths or globs to watch', + group: GROUPS.FILES, + requiresArg: true, + coerce: list + }, + 'watch-ignore': { + description: 'List of paths or globs to exclude from watching', + group: GROUPS.FILES, + requiresArg: true, + coerce: list, + default: defaults['watch-ignore'] } }) .positional('spec', { diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index e7ef34c632..32728c1061 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('../utils'); +const path = require('path'); +const chokidar = require('chokidar'); const Context = require('../context'); -const Mocha = require('../mocha'); const collectFiles = require('./collect-files'); /** @@ -16,18 +16,51 @@ const collectFiles = require('./collect-files'); * Run Mocha in "watch" mode * @param {Mocha} mocha - Mocha instance * @param {Object} opts - Options - * @param {string} opts.ui - User interface + * @param {string[]} [opts.watchFiles] - List of paths and patterns to + * watch. If not provided all files with an extension included in + * `fileColletionParams.extension` are watched. See first argument of + * `chokidar.watch`. + * @param {string[]} opts.watchIgnore - List of paths and patterns to + * exclude from watching. See `ignored` option of `chokidar`. * @param {Object} fileCollectParams - Parameters that control test * file collection. See `lib/cli/collect-files.js`. - * @param {string[]} fileCollectParams.extension - List of extensions to watch + * @param {string[]} fileCollectParams.extension - List of extensions + * to watch if `opts.watchFiles` is not given. * @private */ -module.exports = (mocha, {ui}, fileCollectParams) => { - let runner; - const files = collectFiles(fileCollectParams); +module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { + if (!watchFiles) { + watchFiles = fileCollectParams.extension.reduce( + (watchFiles, ext) => watchFiles.concat([`**/*.${ext}`, `**/.*.${ext}`]), + [] + ); + } + + const watcher = chokidar.watch(watchFiles, { + ignored: watchIgnore, + ignoreInitial: true + }); + + const rerunner = createRerunner(mocha, () => { + getWatchedFiles(watcher).forEach(file => { + delete require.cache[file]; + }); + mocha.files = collectFiles(fileCollectParams); + }); + + watcher.on('ready', () => { + rerunner.run(); + }); + + watcher.on('all', () => { + rerunner.scheduleRun(); + }); console.log(); hideCursor(); + process.on('exit', () => { + showCursor(); + }); process.on('SIGINT', () => { showCursor(); console.log('\n'); @@ -35,17 +68,30 @@ module.exports = (mocha, {ui}, fileCollectParams) => { // killed by SIGINT which has portable number 2. process.exit(128 + 2); }); +}; + +/** + * Create an object that allows you to rerun tests on the mocha + * instance. `beforeRun` is called everytime before `mocha.run()` is + * called. + * + * @param {Mocha} mocha - Mocha instance + * @param {function} beforeRun - Called just before `mocha.run()` + */ +const createRerunner = (mocha, beforeRun) => { + // Set to a `Runner` when mocha is running. Set to `null` when mocha is not + // running. + let runner = null; - const watchFiles = utils.files(process.cwd(), fileCollectParams.extension); - let runAgain = false; + let rerunScheduled = false; - const loadAndRun = () => { + const run = () => { try { - mocha.files = files; - runAgain = false; + beforeRun(); + resetMocha(mocha); runner = mocha.run(() => { runner = null; - if (runAgain) { + if (rerunScheduled) { rerun(); } }); @@ -54,29 +100,62 @@ module.exports = (mocha, {ui}, fileCollectParams) => { } }; - const purge = () => { - watchFiles.forEach(Mocha.unloadFile); - }; - - loadAndRun(); - - const rerun = () => { - purge(); - eraseLine(); - mocha.suite = mocha.suite.clone(); - mocha.suite.ctx = new Context(); - mocha.ui(ui); - loadAndRun(); - }; + const scheduleRun = () => { + if (rerunScheduled) { + return; + } - utils.watch(watchFiles, () => { - runAgain = true; + rerunScheduled = true; if (runner) { runner.abort(); } else { rerun(); } + }; + + const rerun = () => { + rerunScheduled = false; + eraseLine(); + run(); + }; + + return { + scheduleRun, + run + }; +}; + +/** + * Return the list of absolute paths watched by a chokidar watcher. + * + * @param watcher - Instance of a chokidar watcher + * @return {string[]} - List of absolute paths + */ +const getWatchedFiles = watcher => { + const watchedDirs = watcher.getWatched(); + let watchedFiles = []; + Object.keys(watchedDirs).forEach(dir => { + watchedFiles = watchedFiles.concat( + watchedDirs[dir].map(file => path.join(dir, file)) + ); }); + return watchedFiles; +}; + +/** + * Reset the internal state of the mocha instance so that tests can be rerun. + * + * @param {Mocha} mocha - Mocha instance + * @private + */ +const resetMocha = mocha => { + mocha.unloadFiles(); + mocha.suite = mocha.suite.clone(); + mocha.suite.ctx = new Context(); + // Registers a callback on `mocha.suite` that wires new context to the DSL + // (e.g. `describe`) that is exposed as globals when the test files are + // reloaded. + mocha.ui(mocha.options.ui); }; /** diff --git a/lib/mocharc.json b/lib/mocharc.json index b0cd266714..e6f5d99c5b 100644 --- a/lib/mocharc.json +++ b/lib/mocharc.json @@ -6,5 +6,6 @@ "reporter": "spec", "slow": 75, "timeout": 2000, - "ui": "bdd" + "ui": "bdd", + "watch-ignore": ["node_modules", ".git"] } diff --git a/lib/utils.js b/lib/utils.js index 996e843507..805d98d463 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -53,80 +53,6 @@ exports.isString = function(obj) { return typeof obj === 'string'; }; -/** - * Watch the given `files` for changes - * and invoke `fn(file)` on modification. - * - * @private - * @param {Array} files - * @param {Function} fn - */ -exports.watch = function(files, fn) { - var options = {interval: 100}; - var debug = require('debug')('mocha:watch'); - files.forEach(function(file) { - debug('file %s', file); - fs.watchFile(file, options, function(curr, prev) { - if (prev.mtime < curr.mtime) { - fn(file); - } - }); - }); -}; - -/** - * Predicate to screen `pathname` for further consideration. - * - * @description - * Returns false for pathname referencing: - *
                - *
              • 'npm' package installation directory - *
              • 'git' version control directory - *
              - * - * @private - * @param {string} pathname - File or directory name to screen - * @return {boolean} whether pathname should be further considered - * @example - * ['node_modules', 'test.js'].filter(considerFurther); // => ['test.js'] - */ -function considerFurther(pathname) { - var ignore = ['node_modules', '.git']; - - return !~ignore.indexOf(pathname); -} - -/** - * Lookup files in the given `dir`. - * - * @description - * Filenames are returned in _traversal_ order by the OS/filesystem. - * **Make no assumption that the names will be sorted in any fashion.** - * - * @private - * @param {string} dir - * @param {string[]} [exts=['js']] - * @param {Array} [ret=[]] - * @return {Array} - */ -exports.files = function(dir, exts, ret) { - ret = ret || []; - exts = exts || ['js']; - - fs.readdirSync(dir) - .filter(considerFurther) - .forEach(function(dirent) { - var pathname = path.join(dir, dirent); - if (fs.lstatSync(pathname).isDirectory()) { - exports.files(pathname, exts, ret); - } else if (hasMatchingExtname(pathname, exts)) { - ret.push(pathname); - } - }); - - return ret; -}; - /** * Compute a slug from the given `str`. * diff --git a/package-lock.json b/package-lock.json index cd6c298e00..ac164dbf11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -729,7 +729,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "arch": { @@ -823,7 +823,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1294,7 +1294,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1774,7 +1774,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1797,7 +1797,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -2051,7 +2051,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { "version": "2.26.5", @@ -2103,6 +2103,26 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -2140,6 +2160,15 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2325,7 +2354,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2379,7 +2408,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2662,7 +2691,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2858,33 +2887,100 @@ "dev": true }, "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.0" + "readdirp": "^3.1.1" }, "dependencies": { + "anymatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "optional": true + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "^2.1.1" } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "readdirp": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", + "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "requires": { + "picomatch": "^2.0.4" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -2903,7 +2999,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -2992,7 +3088,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3171,7 +3267,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3487,7 +3583,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3545,7 +3641,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3558,7 +3654,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3573,7 +3669,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, "cross-env": { @@ -3626,7 +3722,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -4250,7 +4346,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4423,11 +4519,11 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4597,7 +4693,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4890,7 +4986,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -5076,7 +5172,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5103,7 +5199,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5149,7 +5245,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5157,7 +5253,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5412,7 +5508,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5440,7 +5536,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6291,7 +6387,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6897,7 +6993,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7142,7 +7238,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7151,7 +7247,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7504,7 +7600,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -7553,7 +7649,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8501,8 +8597,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.0.2", @@ -8592,7 +8687,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8652,7 +8747,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9320,6 +9415,35 @@ "useragent": "2.3.0" }, "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "mime": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", @@ -9369,7 +9493,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10329,7 +10453,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10509,7 +10633,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10559,7 +10683,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10594,7 +10718,7 @@ "dependencies": { "commander": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -10705,7 +10829,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10732,7 +10856,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10767,7 +10891,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10785,7 +10909,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10830,7 +10954,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -10892,7 +11016,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -10941,7 +11065,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -10951,7 +11075,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -11150,7 +11274,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11343,8 +11467,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -11430,7 +11553,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -11760,6 +11883,27 @@ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", "dev": true }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -11786,6 +11930,16 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -11904,7 +12058,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "resolved": false, "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { @@ -12160,7 +12314,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12183,7 +12337,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12479,7 +12633,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12557,7 +12711,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12642,14 +12796,14 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -12684,9 +12838,14 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -12930,7 +13089,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { @@ -13300,7 +13459,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13975,7 +14134,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -14043,7 +14202,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14621,7 +14780,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14679,7 +14838,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -14732,7 +14891,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15006,7 +15165,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15041,7 +15200,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15667,7 +15826,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15772,7 +15931,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -15896,7 +16055,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16106,7 +16265,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -16189,7 +16348,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -16430,7 +16589,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16697,7 +16856,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16784,7 +16943,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -17456,9 +17615,9 @@ "dev": true }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "update-notifier": { @@ -17739,6 +17898,35 @@ "xtend": "^4.0.0" }, "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -17754,7 +17942,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-encoding": { @@ -17877,7 +18065,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package-scripts.js b/package-scripts.js index f4d1dc9845..6d9985b90d 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -23,7 +23,7 @@ function test(testName, mochaParams) { module.exports = { scripts: { build: { - script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' -o mocha.js`, + script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' --ignore chokidar -o mocha.js`, description: 'Build browser bundle' }, lint: { diff --git a/package.json b/package.json index f53ea0ba15..4a0ed10f11 100644 --- a/package.json +++ b/package.json @@ -514,6 +514,7 @@ "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", + "chokidar": "3.0.2", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", @@ -618,7 +619,8 @@ "fs": false, "glob": false, "path": false, - "supports-color": false + "supports-color": false, + "chokidar": false }, "prettier": { "singleQuote": true, diff --git a/test/integration/file-utils.spec.js b/test/integration/file-utils.spec.js index ae97b996e2..0b5b2e92fe 100644 --- a/test/integration/file-utils.spec.js +++ b/test/integration/file-utils.spec.js @@ -116,30 +116,6 @@ describe('file utils', function() { }); }); - describe('.files', function() { - it('should return broken symlink file path', function() { - if (!symlinkSupported) { - return this.skip(); - } - expect( - utils.files(tmpDir, ['js']), - 'to contain', - tmpFile('mocha-utils-link.js'), - tmpFile('mocha-utils.js') - ).and('to have length', 2); - - expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', true); - - fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob')); - - expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', false); - - expect(utils.files(tmpDir, ['js']), 'to equal', [ - tmpFile('mocha-utils-link.js') - ]); - }); - }); - afterEach(removeTempDir); function makeTempDir() { diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 5d9fb2f26a..0843380990 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -31,7 +31,95 @@ describe('--watch', function() { }); }); - it('reruns test when file matching extension is touched', function() { + it('reruns test when file matching --watch-files changes', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, 'dir/file.xyz'); + touchFile(watchedFile); + + return runMochaWatch( + [testFile, '--watch-files', 'dir/*.xyz'], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results.length, 'to equal', 2); + }); + }); + + it('reruns test when file matching --watch-files is added', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, 'lib/file.xyz'); + return runMochaWatch( + [testFile, '--watch-files', '**/*.xyz'], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results, 'to have length', 2); + }); + }); + + it('reruns test when file matching --watch-files is removed', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, 'lib/file.xyz'); + touchFile(watchedFile); + + return runMochaWatch( + [testFile, '--watch-files', 'lib/**/*.xyz'], + this.tempDir, + () => { + fs.removeSync(watchedFile); + } + ).then(results => { + expect(results, 'to have length', 2); + }); + }); + + it('does not rerun test when file not matching --watch-files is changed', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, 'dir/file.js'); + touchFile(watchedFile); + + return runMochaWatch( + [testFile, '--watch-files', 'dir/*.xyz'], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results.length, 'to equal', 1); + }); + }); + + it('picks up new test files when they are added', function() { + const testFile = path.join(this.tempDir, 'test/a.js'); + copyFixture('__default__', testFile); + + return runMochaWatch( + ['test/**/*.js', '--watch-files', 'test/**/*.js'], + this.tempDir, + () => { + const addedTestFile = path.join(this.tempDir, 'test/b.js'); + copyFixture('passing', addedTestFile); + } + ).then(results => { + expect(results, 'to have length', 2); + expect(results[0].passes, 'to have length', 1); + expect(results[1].passes, 'to have length', 3); + }); + }); + + it('reruns test when file matching --extension is changed', function() { const testFile = path.join(this.tempDir, 'test.js'); copyFixture('__default__', testFile); @@ -49,6 +137,24 @@ describe('--watch', function() { }); }); + it('reruns test when file starting with . and matching --extension is changed', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, '.file.xyz'); + touchFile(watchedFile); + + return runMochaWatch( + [testFile, '--extension', 'xyz,js'], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results, 'to have length', 2); + }); + }); + it('ignores files in "node_modules" and ".git" by default', function() { const testFile = path.join(this.tempDir, 'test.js'); copyFixture('__default__', testFile); @@ -75,17 +181,45 @@ describe('--watch', function() { }); }); + it('ignores files matching --watch-ignore', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + const watchedFile = path.join(this.tempDir, 'dir/file-to-ignore.xyz'); + touchFile(watchedFile); + + return runMochaWatch( + [ + testFile, + '--watch-files', + 'dir/*.xyz', + '--watch-ignore', + 'dir/*ignore*' + ], + this.tempDir, + () => { + touchFile(watchedFile); + } + ).then(results => { + expect(results.length, 'to equal', 1); + }); + }); + it('reloads test files when they change', function() { const testFile = path.join(this.tempDir, 'test.js'); copyFixture('options/watch/test-file-change', testFile); - return runMochaWatch([testFile], this.tempDir, () => { - replaceFileContents( - testFile, - 'testShouldFail = true', - 'testShouldFail = false' - ); - }).then(results => { + return runMochaWatch( + [testFile, '--watch-files', '**/*.js'], + this.tempDir, + () => { + replaceFileContents( + testFile, + 'testShouldFail = true', + 'testShouldFail = false' + ); + } + ).then(results => { expect(results, 'to have length', 2); expect(results[0].passes, 'to have length', 0); expect(results[0].failures, 'to have length', 1); @@ -101,13 +235,17 @@ describe('--watch', function() { const dependency = path.join(this.tempDir, 'lib', 'dependency.js'); copyFixture('options/watch/dependency', dependency); - return runMochaWatch([testFile], this.tempDir, () => { - replaceFileContents( - dependency, - 'module.exports.testShouldFail = false', - 'module.exports.testShouldFail = true' - ); - }).then(results => { + return runMochaWatch( + [testFile, '--watch-files', 'lib/**/*.js'], + this.tempDir, + () => { + replaceFileContents( + dependency, + 'module.exports.testShouldFail = false', + 'module.exports.testShouldFail = true' + ); + } + ).then(results => { expect(results, 'to have length', 2); expect(results[0].passes, 'to have length', 1); expect(results[0].failures, 'to have length', 0); diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 3c39cc7f09..84723bafda 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -28,8 +28,7 @@ const defaults = { timeouts: 1000, t: 1000, opts: '/default/path/to/mocha.opts', - extension: ['js'], - 'watch-extensions': ['js'] + extension: ['js'] }; describe('options', function() { From 6ec07d6d7f0cf5d76558fd64a6b70b2934148b58 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 10 Sep 2019 14:38:55 -0700 Subject: [PATCH 1389/1771] add OpenJS Foundation logo to website (#4008) * add OpenJS Foundation logo to website * fix flaky template Signed-off-by: Christopher Hiller --- docs/_includes/default.html | 45 +++++++++++++++--------- docs/css/style.css | 19 ++++++---- docs/images/openjsf-logo.svg | 68 ++++++++++++++++++++++++++++++++++++ docs/index.md | 2 +- 4 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 docs/images/openjsf-logo.svg diff --git a/docs/_includes/default.html b/docs/_includes/default.html index 0a2a60b11e..baf940c829 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.html @@ -22,27 +22,36 @@

              - +

              simple, flexible, fun

              {{ content }}
              - - + +
              @@ -50,7 +59,8 @@

              is licensed under a + href="https://creativecommons.org/licenses/by/4.0/" + > Creative Commons Attribution 4.0 International License.
              @@ -58,7 +68,8 @@

              diff --git a/docs/css/style.css b/docs/css/style.css index a7e6933f0f..d59160b852 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -174,10 +174,10 @@ code { line-height: 1.8; } -:not(pre)>code { +:not(pre) > code { background-color: #f5f2f0; border-radius: 3px; - padding: .2em .4em; + padding: 0.2em 0.4em; } pre { @@ -200,14 +200,19 @@ img.screenshot { } #matomoLogo { - display: block; - height: 176px; + display: block; + height: 176px; } .sponsorship { - display: flex; - justify-content: center; - margin-bottom: 60px; + display: flex; + justify-content: center; + margin-bottom: 60px; + align-items: center; +} + +.sponsorship a { + padding: 0 40px; } footer { diff --git a/docs/images/openjsf-logo.svg b/docs/images/openjsf-logo.svg new file mode 100644 index 0000000000..df9ab1f3b8 --- /dev/null +++ b/docs/images/openjsf-logo.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 7da5a1cc6f..98c665b4f7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1932,7 +1932,7 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [yargs-configobject-extends]: http://yargs.js.org/docs/#api-configobject-extends-keyword [zsh-globbing]: http://zsh.sourceforge.net/Doc/Release/Expansion.html#Recursive-Globbing - + [gitter]: https://gitter.im/mochajs/mocha From eed38d798270e230363abefd6934df8302c5f036 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 22 Sep 2019 08:38:30 +0200 Subject: [PATCH 1390/1771] Mocha constructor: some fixes and cleanup (#4004) --- docs/index.md | 2 +- lib/mocha.js | 79 +++++++------------ lib/runner.js | 2 +- test/unit/mocha.spec.js | 166 +++++++++++++++++++++------------------ test/unit/runner.spec.js | 1 + 5 files changed, 120 insertions(+), 130 deletions(-) diff --git a/docs/index.md b/docs/index.md index 98c665b4f7..5dac9ff173 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1569,7 +1569,7 @@ mocha.setup({ // Use "tdd" interface, ignore leaks, and force all tests to be asynchronous mocha.setup({ ui: 'tdd', - ignoreLeaks: true, + checkLeaks: false, // default asyncOnly: true }); ``` diff --git a/lib/mocha.js b/lib/mocha.js index 5582324b8a..6c8bf2561b 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -69,18 +69,18 @@ exports.Test = require('./test'); * @param {boolean} [options.allowUncaught] - Propagate uncaught errors? * @param {boolean} [options.asyncOnly] - Force `done` callback or promise? * @param {boolean} [options.bail] - Bail after first test failure? - * @param {boolean} [options.checkLeaks] - If true, check leaks. + * @param {boolean} [options.checkLeaks] - Check for global variable leaks? + * @param {boolean} [options.color] - Color TTY output from reporter? * @param {boolean} [options.delay] - Delay root suite execution? - * @param {boolean} [options.enableTimeouts] - Enable timeouts? + * @param {boolean} [options.diff] - Show diff on failure? * @param {string} [options.fgrep] - Test filter given string. * @param {boolean} [options.forbidOnly] - Tests marked `only` fail the suite? * @param {boolean} [options.forbidPending] - Pending tests fail the suite? - * @param {boolean} [options.fullStackTrace] - Full stacktrace upon failure? + * @param {boolean} [options.fullTrace] - Full stacktrace upon failure? * @param {string[]} [options.global] - Variables expected in global scope. * @param {RegExp|string} [options.grep] - Test filter given regular expression. * @param {boolean} [options.growl] - Enable desktop notifications? - * @param {boolean} [options.hideDiff] - Suppress diffs from failures? - * @param {boolean} [options.ignoreLeaks] - Ignore global leaks? + * @param {boolean} [options.inlineDiffs] - Display inline diffs? * @param {boolean} [options.invert] - Invert test filter matches? * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? * @param {string} [options.reporter] - Reporter name. @@ -89,8 +89,6 @@ exports.Test = require('./test'); * @param {number} [options.slow] - Slow threshold value. * @param {number|string} [options.timeout] - Timeout threshold value. * @param {string} [options.ui] - Interface name. - * @param {boolean} [options.color] - Color TTY output from reporter? - * @param {boolean} [options.useInlineDiffs] - Use inline diffs? */ function Mocha(options) { options = utils.assign({}, mocharc, options || {}); @@ -99,35 +97,14 @@ function Mocha(options) { // root suite this.suite = new exports.Suite('', new exports.Context(), true); - if ('useColors' in options) { - utils.deprecate( - 'useColors is DEPRECATED and will be removed from a future version of Mocha. Instead, use the "color" option' - ); - options.color = 'color' in options ? options.color : options.useColors; - } - - // Globals are passed in as options.global, with options.globals for backward compatibility. - options.globals = options.global || options.globals || []; - delete options.global; - this.grep(options.grep) .fgrep(options.fgrep) .ui(options.ui) .bail(options.bail) - .reporter(options.reporter, options.reporterOptions) - .useColors(options.color) + .reporter(options.reporter, options.reporterOption) .slow(options.slow) .useInlineDiffs(options.inlineDiffs) - .globals(options.globals); - - if ('enableTimeouts' in options) { - utils.deprecate( - 'enableTimeouts is DEPRECATED and will be removed from a future version of Mocha. Instead, use "timeout: false" to disable timeouts.' - ); - if (options.enableTimeouts === false) { - this.timeout(0); - } - } + .globals(options.global); // this guard exists because Suite#timeout does not consider `undefined` to be valid input if (typeof options.timeout !== 'undefined') { @@ -138,10 +115,6 @@ function Mocha(options) { this.retries(options.retries); } - if ('diff' in options) { - this.hideDiff(!options.diff); - } - [ 'allowUncaught', 'asyncOnly', @@ -257,6 +230,8 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { } this._reporter = _reporter; } + this.options.reporterOption = reporterOptions; + // alias option name is used in public reporters xunit/tap/progress this.options.reporterOptions = reporterOptions; return this; }; @@ -457,7 +432,7 @@ Mocha.prototype.invert = function() { * * @public * @see {@link Mocha#checkLeaks} - * @param {boolean} ignoreLeaks - Whether to ignore global leaks. + * @param {boolean} [ignoreLeaks=false] - Whether to ignore global leaks. * @return {Mocha} this * @chainable * @example @@ -466,7 +441,7 @@ Mocha.prototype.invert = function() { * mocha.ignoreLeaks(true); */ Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { - this.options.ignoreLeaks = Boolean(ignoreLeaks); + this.options.checkLeaks = !ignoreLeaks; return this; }; @@ -480,7 +455,7 @@ Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { * @chainable */ Mocha.prototype.checkLeaks = function() { - this.options.ignoreLeaks = false; + this.options.checkLeaks = true; return this; }; @@ -492,7 +467,7 @@ Mocha.prototype.checkLeaks = function() { * @chainable */ Mocha.prototype.fullTrace = function() { - this.options.fullStackTrace = true; + this.options.fullTrace = true; return this; }; @@ -555,7 +530,7 @@ Mocha.prototype._growl = growl.notify; * mocha.globals(['jQuery', 'MyLib']); */ Mocha.prototype.globals = function(globals) { - this.options.globals = this.options.globals + this.options.global = (this.options.global || []) .concat(globals) .filter(Boolean) .filter(function(elt, idx, arr) { @@ -574,7 +549,7 @@ Mocha.prototype.globals = function(globals) { */ Mocha.prototype.useColors = function(colors) { if (colors !== undefined) { - this.options.useColors = colors; + this.options.color = colors; } return this; }; @@ -584,12 +559,12 @@ Mocha.prototype.useColors = function(colors) { * in test failure output. * * @public - * @param {boolean} inlineDiffs - Whether to use inline diffs. + * @param {boolean} [inlineDiffs=false] - Whether to use inline diffs. * @return {Mocha} this * @chainable */ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { - this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; + this.options.inlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; @@ -597,12 +572,12 @@ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { * Determines if reporter should include diffs in test failure output. * * @public - * @param {boolean} hideDiff - Whether to hide diffs. + * @param {boolean} [hideDiff=false] - Whether to hide diffs. * @return {Mocha} this * @chainable */ Mocha.prototype.hideDiff = function(hideDiff) { - this.options.hideDiff = hideDiff !== undefined && hideDiff; + this.options.diff = !(hideDiff === true); return this; }; @@ -814,8 +789,8 @@ Mocha.prototype.run = function(fn) { var runner = new exports.Runner(suite, options.delay); createStatsCollector(runner); var reporter = new this._reporter(runner, options); - runner.ignoreLeaks = options.ignoreLeaks !== false; - runner.fullStackTrace = options.fullStackTrace; + runner.checkLeaks = options.checkLeaks === true; + runner.fullStackTrace = options.fullTrace; runner.asyncOnly = options.asyncOnly; runner.allowUncaught = options.allowUncaught; runner.forbidOnly = options.forbidOnly; @@ -823,17 +798,17 @@ Mocha.prototype.run = function(fn) { if (options.grep) { runner.grep(options.grep, options.invert); } - if (options.globals) { - runner.globals(options.globals); + if (options.global) { + runner.globals(options.global); } if (options.growl) { this._growl(runner); } - if (options.useColors !== undefined) { - exports.reporters.Base.useColors = options.useColors; + if (options.color !== undefined) { + exports.reporters.Base.useColors = options.color; } - exports.reporters.Base.inlineDiffs = options.useInlineDiffs; - exports.reporters.Base.hideDiff = options.hideDiff; + exports.reporters.Base.inlineDiffs = options.inlineDiffs; + exports.reporters.Base.hideDiff = !options.diff; function done(failures) { fn = fn || utils.noop; diff --git a/lib/runner.js b/lib/runner.js index 3ef0da1f4d..d8d8dd6fb8 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -244,7 +244,7 @@ Runner.prototype.globals = function(arr) { * @private */ Runner.prototype.checkGlobals = function(test) { - if (this.ignoreLeaks) { + if (!this.checkLeaks) { return; } var ok = this._globals; diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index ed99a3e257..648853feab 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -18,37 +18,12 @@ describe('Mocha', function() { describe('constructor', function() { beforeEach(function() { - sandbox.stub(Mocha.prototype, 'useColors').returnsThis(); - sandbox.stub(utils, 'deprecate'); sandbox.stub(Mocha.prototype, 'timeout').returnsThis(); sandbox.stub(Mocha.prototype, 'globals').returnsThis(); + sandbox.stub(Mocha.prototype, 'useInlineDiffs').returnsThis(); }); - describe('when "useColors" option is defined', function() { - it('should prefer "color" over "useColors"', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true, color: false}); - expect(Mocha.prototype.useColors, 'to have a call satisfying', [ - false - ]).and('was called once'); - }); - - it('should assign "useColors" to "color"', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true}); - expect(Mocha.prototype.useColors, 'to have a call satisfying', [ - true - ]).and('was called once'); - }); - - it('should call utils.deprecate()', function() { - // eslint-disable-next-line no-new - new Mocha({useColors: true}); - expect(utils.deprecate, 'was called once'); - }); - }); - - describe('when "timeout" option is `undefined`', function() { + describe('when "options.timeout" is `undefined`', function() { it('should not attempt to set timeout', function() { // eslint-disable-next-line no-new new Mocha({timeout: undefined}); @@ -56,7 +31,7 @@ describe('Mocha', function() { }); }); - describe('when "timeout" option is `false`', function() { + describe('when "options.timeout" is `false`', function() { it('should set a timeout of 0', function() { // eslint-disable-next-line no-new new Mocha({timeout: false}); @@ -74,34 +49,16 @@ describe('Mocha', function() { ['singular'] ]).and('was called once'); }); - it('should delete mocha.options.global', function() { - var mocha = new Mocha({global: ['singular']}); - expect(mocha.options.global, 'to be', undefined); - }); }); - describe('when "options.globals" is provided', function() { - it('should pass "options.globals" to #globals()', function() { + describe('when "options.inlineDiffs" is `undefined`', function() { + it('should set inlineDiffs to `true`', function() { // eslint-disable-next-line no-new - new Mocha({globals: ['plural']}); - expect(Mocha.prototype.globals, 'to have a call satisfying', [ - ['plural'] - ]).and('was called once'); - }); - }); - - describe('when "options.global" AND "options.globals" are provided', function() { - it('should pass "options.global" to #globals(), ignoring "options.globals"', function() { - // eslint-disable-next-line no-new - new Mocha({global: ['singular'], globals: ['plural']}); - expect(Mocha.prototype.globals, 'to have a call satisfying', [ - ['singular'] + new Mocha({inlineDiffs: true}); + expect(Mocha.prototype.useInlineDiffs, 'to have a call satisfying', [ + true ]).and('was called once'); }); - it('should delete mocha.options.global', function() { - var mocha = new Mocha({global: ['singular'], globals: ['plural']}); - expect(mocha.options.global, 'to be', undefined); - }); }); }); @@ -132,10 +89,10 @@ describe('Mocha', function() { }); describe('#checkLeaks()', function() { - it('should set the ignoreLeaks option to false', function() { + it('should set the checkLeaks option to true', function() { var mocha = new Mocha(opts); mocha.checkLeaks(); - expect(mocha.options, 'to have property', 'ignoreLeaks', false); + expect(mocha.options, 'to have property', 'checkLeaks', true); }); it('should be chainable', function() { @@ -157,11 +114,24 @@ describe('Mocha', function() { }); }); + describe('#enableTimeouts()', function() { + it('should set the suite._enableTimeouts to true if no argument', function() { + var mocha = new Mocha(opts); + mocha.enableTimeouts(); + expect(mocha.suite._enableTimeouts, 'to be', true); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.enableTimeouts(), 'to be', mocha); + }); + }); + describe('#fullTrace()', function() { - it('should set the fullStackTrace option to true', function() { + it('should set the fullTrace option to true', function() { var mocha = new Mocha(opts); mocha.fullTrace(); - expect(mocha.options, 'to have property', 'fullStackTrace', true); + expect(mocha.options, 'to have property', 'fullTrace', true); }); it('should be chainable', function() { @@ -173,7 +143,7 @@ describe('Mocha', function() { describe('#globals()', function() { it('should be an empty array initially', function() { var mocha = new Mocha(); - expect(mocha.options.globals, 'to be empty'); + expect(mocha.options.global, 'to be empty'); }); it('should be chainable', function() { @@ -185,13 +155,13 @@ describe('Mocha', function() { it('should not modify the whitelist when given empty string', function() { var mocha = new Mocha(opts); mocha.globals(''); - expect(mocha.options.globals, 'to be empty'); + expect(mocha.options.global, 'to be empty'); }); it('should not modify the whitelist when given empty array', function() { var mocha = new Mocha(opts); mocha.globals([]); - expect(mocha.options.globals, 'to be empty'); + expect(mocha.options.global, 'to be empty'); }); }); @@ -203,24 +173,24 @@ describe('Mocha', function() { it('should add string to the whitelist', function() { var mocha = new Mocha(opts); mocha.globals(elem); - expect(mocha.options.globals, 'to contain', elem); - expect(mocha.options.globals, 'to have length', 1); + expect(mocha.options.global, 'to contain', elem); + expect(mocha.options.global, 'to have length', 1); }); it('should add contents of string array to the whitelist', function() { var mocha = new Mocha(opts); var elems = [elem, elem2]; mocha.globals(elems); - expect(mocha.options.globals, 'to contain', elem, elem2); - expect(mocha.options.globals, 'to have length', elems.length); + expect(mocha.options.global, 'to contain', elem, elem2); + expect(mocha.options.global, 'to have length', elems.length); }); it('should not have duplicates', function() { var mocha = new Mocha({globals: [elem, elem2]}); var elems = [elem, elem2, elem3]; mocha.globals(elems); - expect(mocha.options.globals, 'to contain', elem, elem2, elem3); - expect(mocha.options.globals, 'to have length', elems.length); + expect(mocha.options.global, 'to contain', elem, elem2, elem3); + expect(mocha.options.global, 'to have length', elems.length); }); }); }); @@ -254,23 +224,48 @@ describe('Mocha', function() { }); }); + describe('#hideDiff()', function() { + it('should set the diff option to false when param equals true', function() { + var mocha = new Mocha(opts); + mocha.hideDiff(true); + expect(mocha.options, 'to have property', 'diff', false); + }); + + it('should set the diff option to true when param equals false', function() { + var mocha = new Mocha(opts); + mocha.hideDiff(false); + expect(mocha.options, 'to have property', 'diff', true); + }); + + it('should set the diff option to true when the param is undefined', function() { + var mocha = new Mocha(opts); + mocha.hideDiff(); + expect(mocha.options, 'to have property', 'diff', true); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.hideDiff(), 'to be', mocha); + }); + }); + describe('#ignoreLeaks()', function() { - it('should set the ignoreLeaks option to true when param equals true', function() { + it('should set the checkLeaks option to false when param equals true', function() { var mocha = new Mocha(opts); mocha.ignoreLeaks(true); - expect(mocha.options, 'to have property', 'ignoreLeaks', true); + expect(mocha.options, 'to have property', 'checkLeaks', false); }); - it('should set the ignoreLeaks option to false when param equals false', function() { + it('should set the checkLeaks option to true when param equals false', function() { var mocha = new Mocha(opts); mocha.ignoreLeaks(false); - expect(mocha.options, 'to have property', 'ignoreLeaks', false); + expect(mocha.options, 'to have property', 'checkLeaks', true); }); - it('should set the ignoreLeaks option to false when the param is undefined', function() { + it('should set the checkLeaks option to true when the param is undefined', function() { var mocha = new Mocha(opts); mocha.ignoreLeaks(); - expect(mocha.options, 'to have property', 'ignoreLeaks', false); + expect(mocha.options, 'to have property', 'checkLeaks', true); }); it('should be chainable', function() { @@ -357,23 +352,42 @@ describe('Mocha', function() { }); }); + describe('#useColors()', function() { + it('should set the color option to true', function() { + var mocha = new Mocha(opts); + mocha.useColors(true); + expect(mocha.options, 'to have property', 'color', true); + }); + + it('should not create the color property', function() { + var mocha = new Mocha(opts); + mocha.useColors(); + expect(mocha.options, 'not to have property', 'color'); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.useColors(), 'to be', mocha); + }); + }); + describe('#useInlineDiffs()', function() { - it('should set the useInlineDiffs option to true when param equals true', function() { + it('should set the inlineDiffs option to true when param equals true', function() { var mocha = new Mocha(opts); mocha.useInlineDiffs(true); - expect(mocha.options, 'to have property', 'useInlineDiffs', true); + expect(mocha.options, 'to have property', 'inlineDiffs', true); }); - it('should set the useInlineDiffs option to false when param equals false', function() { + it('should set the inlineDiffs option to false when param equals false', function() { var mocha = new Mocha(opts); mocha.useInlineDiffs(false); - expect(mocha.options, 'to have property', 'useInlineDiffs', false); + expect(mocha.options, 'to have property', 'inlineDiffs', false); }); - it('should set the useInlineDiffs option to false when the param is undefined', function() { + it('should set the inlineDiffs option to false when the param is undefined', function() { var mocha = new Mocha(opts); mocha.useInlineDiffs(); - expect(mocha.options, 'to have property', 'useInlineDiffs', false); + expect(mocha.options, 'to have property', 'inlineDiffs', false); }); it('should be chainable', function() { diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index ec2b8a0f34..31ac938b1f 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -23,6 +23,7 @@ describe('Runner', function() { beforeEach(function() { suite = new Suite('Suite', 'root'); runner = new Runner(suite); + runner.checkLeaks = true; sandbox = sinon.createSandbox(); }); From 5f8df0848aa52bb0f7a0844bcd3715012a6ecfd6 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 26 Sep 2019 07:32:14 +0200 Subject: [PATCH 1391/1771] uncaughtException: fix double EVENT_RUN_END events (#4025) abort runner instead of end event --- lib/runner.js | 2 +- .../fixtures/regression/issue-1327.fixture.js | 8 +++--- .../fixtures/uncaught-fatal.fixture.js | 25 +++++++++++++------ test/integration/regression.spec.js | 21 ++++++---------- test/integration/uncaught.spec.js | 21 ++++++---------- test/unit/runner.spec.js | 5 ++-- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index d8d8dd6fb8..e4bb329af3 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -860,7 +860,7 @@ Runner.prototype.uncaught = function(err) { } // bail - this.emit(constants.EVENT_RUN_END); + this.abort(); }; /** diff --git a/test/integration/fixtures/regression/issue-1327.fixture.js b/test/integration/fixtures/regression/issue-1327.fixture.js index e788278d6d..80c8eff0a5 100644 --- a/test/integration/fixtures/regression/issue-1327.fixture.js +++ b/test/integration/fixtures/regression/issue-1327.fixture.js @@ -1,17 +1,17 @@ 'use strict'; +// we cannot recover gracefully if a Runnable has already passed +// then fails asynchronously it('test 1', function () { - console.log('testbody1'); process.nextTick(function () { throw new Error('Too bad'); }); }); it('test 2', function () { - console.log('testbody2'); + throw new Error('should not run - test 2'); }); it('test 3', function () { - console.log('testbody3'); - throw new Error('OUCH'); + throw new Error('should not run - test 3'); }); diff --git a/test/integration/fixtures/uncaught-fatal.fixture.js b/test/integration/fixtures/uncaught-fatal.fixture.js index 10be283816..0419b441df 100644 --- a/test/integration/fixtures/uncaught-fatal.fixture.js +++ b/test/integration/fixtures/uncaught-fatal.fixture.js @@ -1,11 +1,22 @@ 'use strict'; -it('should bail if a successful test asynchronously fails', function(done) { - done(); - process.nextTick(function () { - throw new Error('global error'); - }); -}); +describe('fatal uncaught exception', function () { + describe('first suite', function () { + it('should bail if a successful test asynchronously fails', function (done) { + done(); + process.nextTick(function () { + throw new Error('global error'); + }); + }); -it('should not actually get run', function () { + it('should not actually get run', function () { + throw new Error('should never throw - first suite'); + }); + }); + + describe('second suite', function () { + it('should not actually get run', function () { + throw new Error('should never throw - second suite'); + }); + }); }); diff --git a/test/integration/regression.spec.js b/test/integration/regression.spec.js index ae4f4fba59..0682cdc353 100644 --- a/test/integration/regression.spec.js +++ b/test/integration/regression.spec.js @@ -4,22 +4,17 @@ var run = require('./helpers').runMocha; var runJSON = require('./helpers').runMochaJSON; describe('regressions', function() { - it('issue-1327: should run all 3 specs exactly once', function(done) { + it('issue-1327: should run the first test and then bail', function(done) { var args = []; - run('regression/issue-1327.fixture.js', args, function(err, res) { - var occurences = function(str) { - var pattern = new RegExp(str, 'g'); - return (res.output.match(pattern) || []).length; - }; - + runJSON('regression/issue-1327.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - expect(res, 'to have failed'); - expect(occurences('testbody1'), 'to be', 1); - expect(occurences('testbody2'), 'to be', 1); - expect(occurences('testbody3'), 'to be', 1); + expect(res, 'to have failed') + .and('to have passed test count', 1) + .and('to have failed test count', 1) + .and('to have passed test', 'test 1') + .and('to have failed test', 'test 1'); done(); }); }); diff --git a/test/integration/uncaught.spec.js b/test/integration/uncaught.spec.js index 42342923f0..a65c4b5097 100644 --- a/test/integration/uncaught.spec.js +++ b/test/integration/uncaught.spec.js @@ -50,23 +50,16 @@ describe('uncaught exceptions', function() { it('handles uncaught exceptions from which Mocha cannot recover', function(done) { run('uncaught-fatal.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 1); - assert.strictEqual(res.stats.failures, 1); - assert.strictEqual( - res.failures[0].title, - 'should bail if a successful test asynchronously fails' - ); - assert.strictEqual( - res.passes[0].title, - 'should bail if a successful test asynchronously fails' - ); + var testName = 'should bail if a successful test asynchronously fails'; + expect(res, 'to have failed') + .and('to have passed test count', 1) + .and('to have failed test count', 1) + .and('to have passed test', testName) + .and('to have failed test', testName); - assert.strictEqual(res.code, 1); done(); }); }); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 31ac938b1f..67043a98bb 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -831,15 +831,16 @@ describe('Runner', function() { ]).and('was called once'); }); - it('should notify run has ended', function() { + it('should abort the runner without emitting end event', function() { expect( function() { runner.uncaught(err); }, - 'to emit from', + 'not to emit from', runner, 'end' ); + expect(runner._abort, 'to be', true); }); }); From ba969625ebba17ddc762e729444520dc14c0f911 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Thu, 3 Oct 2019 15:55:25 +0100 Subject: [PATCH 1392/1771] updated CHANGELOG for v6.2.1 [ci skip] (#4041) --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f61ff11537..d60633dd65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +# 6.2.1 / 2019-09-29 + +## :bug: Fixes + +- [#3955](https://github.com/mochajs/mocha/issues/3955): tty.getWindowSize is not a function inside a "worker_threads" worker ([**@1999**](https://github.com/1999)) +- [#3970](https://github.com/mochajs/mocha/issues/3970): remove extraGlobals() ([**@juergba**](https://github.com/juergba)) +- [#3984](https://github.com/mochajs/mocha/issues/3984): Update yargs-unparser to v1.6.0 ([**@juergba**](https://github.com/juergba)) +- [#3983](https://github.com/mochajs/mocha/issues/3983): Package 'esm': spawn child-process for correct loading ([**@juergba**](https://github.com/juergba)) +- [#3986](https://github.com/mochajs/mocha/issues/3986): Update yargs to v13.3.0 and yargs-parser to v13.1.1 ([**@juergba**](https://github.com/juergba)) + +## :book: Documentation + +- [#3886](https://github.com/mochajs/mocha/issues/3886): fix styles on mochajs.org ([**@outsideris**](https://github.com/outsideris)) +- [#3966](https://github.com/mochajs/mocha/issues/3966): Remove jsdoc index.html placeholder from eleventy file structure and fix broken link in jsdoc tutorial ([**@Munter**](https://github.com/Munter)) +- [#3765](https://github.com/mochajs/mocha/issues/3765): Add Matomo to website ([**@MarioDiaz98**](https://github.com/MarioDiaz98)) +- [#3947](https://github.com/mochajs/mocha/issues/3947): Clarify effect of .skip() ([**@oliversalzburg**](https://github.com/oliversalzburg)) + # 6.2.0 / 2019-07-18 ## :tada: Enhancements From 3633a9062458d30d425d743bd0df65c1815b2908 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 8 Oct 2019 15:21:22 +0200 Subject: [PATCH 1393/1771] uncaughtException: fix "--allow-uncaught" with "this.skip()" (#4030) --- lib/runnable.js | 33 ++++----- lib/runner.js | 73 +++++++++++-------- .../allow-uncaught/this-skip-it.fixture.js | 21 ++++++ .../integration/options/allowUncaught.spec.js | 25 +++++++ test/unit/runnable.spec.js | 12 +-- 5 files changed, 111 insertions(+), 53 deletions(-) create mode 100644 test/integration/fixtures/options/allow-uncaught/this-skip-it.fixture.js create mode 100644 test/integration/options/allowUncaught.spec.js diff --git a/lib/runnable.js b/lib/runnable.js index 026ab06b40..2d0c428d46 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -135,7 +135,8 @@ Runnable.prototype.enableTimeouts = function(enabled) { * @public */ Runnable.prototype.skip = function() { - throw new Pending('sync skip'); + this.pending = true; + throw new Pending('sync skip; aborting execution'); }; /** @@ -343,34 +344,27 @@ Runnable.prototype.run = function(fn) { // allows skip() to be used in an explicit async context this.skip = function asyncSkip() { - done(new Pending('async skip call')); - // halt execution. the Runnable will be marked pending - // by the previous call, and the uncaught handler will ignore - // the failure. + this.pending = true; + done(); + // halt execution, the uncaught handler will ignore the failure. throw new Pending('async skip; aborting execution'); }; - if (this.allowUncaught) { - return callFnAsync(this.fn); - } try { callFnAsync(this.fn); } catch (err) { + // handles async runnables which actually run synchronously emitted = true; + if (err instanceof Pending) { + return; // done() is already called in this.skip() + } else if (this.allowUncaught) { + throw err; + } done(Runnable.toValueOrError(err)); } return; } - if (this.allowUncaught) { - if (this.isPending()) { - done(); - } else { - callFn(this.fn); - } - return; - } - // sync or promise-returning try { if (this.isPending()) { @@ -380,6 +374,11 @@ Runnable.prototype.run = function(fn) { } } catch (err) { emitted = true; + if (err instanceof Pending) { + return done(); + } else if (this.allowUncaught) { + throw err; + } done(Runnable.toValueOrError(err)); } diff --git a/lib/runner.js b/lib/runner.js index e4bb329af3..d1c00da30f 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -386,34 +386,30 @@ Runner.prototype.hook = function(name, fn) { if (testError) { self.fail(self.test, testError); } - if (err) { - if (err instanceof Pending) { - if (name === HOOK_TYPE_AFTER_ALL) { - utils.deprecate( - 'Skipping a test within an "after all" hook is DEPRECATED and will throw an exception in a future version of Mocha. ' + - 'Use a return statement or other means to abort hook execution.' - ); - } - if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { - if (self.test) { - self.test.pending = true; - } - } else { - suite.tests.forEach(function(test) { - test.pending = true; - }); - suite.suites.forEach(function(suite) { - suite.pending = true; - }); - // a pending hook won't be executed twice. - hook.pending = true; + // conditional this.skip() + if (hook.pending) { + if (name === HOOK_TYPE_AFTER_ALL) { + utils.deprecate( + 'Skipping a test within an "after all" hook is DEPRECATED and will throw an exception in a future version of Mocha. ' + + 'Use a return statement or other means to abort hook execution.' + ); + } + if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { + if (self.test) { + self.test.pending = true; } } else { - self.failHook(hook, err); - - // stop executing hooks, notify callee of hook err - return fn(err); + suite.tests.forEach(function(test) { + test.pending = true; + }); + suite.suites.forEach(function(suite) { + suite.pending = true; + }); } + } else if (err) { + self.failHook(hook, err); + // stop executing hooks, notify callee of hook err + return fn(err); } self.emit(constants.EVENT_HOOK_END, hook); delete hook.ctx.currentTest; @@ -525,6 +521,9 @@ Runner.prototype.runTest = function(fn) { test.asyncOnly = true; } test.on('error', function(err) { + if (err instanceof Pending) { + return; + } self.fail(test, err); }); if (this.allowUncaught) { @@ -652,14 +651,20 @@ Runner.prototype.runTests = function(suite, fn) { self.currentRunnable = self.test; self.runTest(function(err) { test = self.test; - if (err) { - var retry = test.currentRetry(); - if (err instanceof Pending && self.forbidPending) { + // conditional this.skip() + if (test.pending) { + if (self.forbidPending) { + test.isPending = alwaysFalse; self.fail(test, new Error('Pending test forbidden')); - } else if (err instanceof Pending) { - test.pending = true; + delete test.isPending; + } else { self.emit(constants.EVENT_TEST_PENDING, test); - } else if (retry < test.retries()) { + } + self.emit(constants.EVENT_TEST_END, test); + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } else if (err) { + var retry = test.currentRetry(); + if (retry < test.retries()) { var clonedTest = test.clone(); clonedTest.currentRetry(retry + 1); tests.unshift(clonedTest); @@ -910,6 +915,12 @@ Runner.prototype.run = function(fn) { this.on(constants.EVENT_RUN_END, function() { debug(constants.EVENT_RUN_END); process.removeListener('uncaughtException', uncaught); + process.on('uncaughtException', function(err) { + if (err instanceof Pending) { + return; + } + throw err; + }); fn(self.failures); }); diff --git a/test/integration/fixtures/options/allow-uncaught/this-skip-it.fixture.js b/test/integration/fixtures/options/allow-uncaught/this-skip-it.fixture.js new file mode 100644 index 0000000000..ce1c3b0a96 --- /dev/null +++ b/test/integration/fixtures/options/allow-uncaught/this-skip-it.fixture.js @@ -0,0 +1,21 @@ +'use strict'; + +describe('test suite', () => { + it('test1', function () { }); + it('test2', function (done) { + var self = this; + setTimeout(function () { + self.skip(); + throw new Error("should not throw"); + }, 10); + }); + it('test3', function () { + this.skip(); + throw new Error("should not throw"); + }); + it('test4', function () { }); + it('test5', function () { + this.skip(); + throw new Error("should not throw"); + }); +}); diff --git a/test/integration/options/allowUncaught.spec.js b/test/integration/options/allowUncaught.spec.js new file mode 100644 index 0000000000..a3d8739ffe --- /dev/null +++ b/test/integration/options/allowUncaught.spec.js @@ -0,0 +1,25 @@ +'use strict'; + +var path = require('path').posix; +var helpers = require('../helpers'); +var runMochaJSON = helpers.runMochaJSON; + +describe('--allow-uncaught', function() { + var args = ['--allow-uncaught']; + + it('should run with conditional `this.skip()`', function(done) { + var fixture = path.join('options', 'allow-uncaught', 'this-skip-it'); + runMochaJSON(fixture, args, function(err, res) { + if (err) { + return done(err); + } + + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and('to have pending test count', 3) + .and('to have passed test', 'test1', 'test4') + .and('to have pending test order', 'test2', 'test3', 'test5'); + done(); + }); + }); +}); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index f912bbaf54..40ccc12c7e 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -4,7 +4,6 @@ var Mocha = require('../../lib/mocha'); var Runnable = Mocha.Runnable; var Suite = Mocha.Suite; var sinon = require('sinon'); -var Pending = require('../../lib/pending'); var STATE_FAILED = Runnable.constants.STATE_FAILED; describe('Runnable(title, fn)', function() { @@ -644,13 +643,14 @@ describe('Runnable(title, fn)', function() { }); describe('if async', function() { - it('this.skip() should call callback with Pending', function(done) { + it('this.skip() should set runnable to pending', function(done) { var runnable = new Runnable('foo', function(done) { // normally "this" but it gets around having to muck with a context runnable.skip(); }); runnable.run(function(err) { - expect(err.constructor, 'to be', Pending); + expect(err, 'to be undefined'); + expect(runnable.pending, 'to be true'); done(); }); }); @@ -663,8 +663,10 @@ describe('Runnable(title, fn)', function() { aborted = false; }); runnable.run(function() { - expect(aborted, 'to be true'); - done(); + process.nextTick(function() { + expect(aborted, 'to be true'); + done(); + }); }); }); }); From 2de7c18569d66c9f5591fc8968d8ebc859ece5a7 Mon Sep 17 00:00:00 2001 From: EunChan Park Date: Wed, 9 Oct 2019 22:18:01 +0900 Subject: [PATCH 1394/1771] Fix HTMLCollection iteration to make unhide function work as expected (#4051) --- lib/reporters/html.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/reporters/html.js b/lib/reporters/html.js index d3f488a941..70e8698407 100644 --- a/lib/reporters/html.js +++ b/lib/reporters/html.js @@ -357,8 +357,8 @@ function hideSuitesWithout(classname) { */ function unhide() { var els = document.getElementsByClassName('suite hidden'); - for (var i = 0; i < els.length; ++i) { - els[i].className = els[i].className.replace('suite hidden', 'suite'); + while (els.length > 0) { + els[0].className = els[0].className.replace('suite hidden', 'suite'); } } From ec17f6315e0817bfb8e37279d31affc4ec108623 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Sun, 29 Sep 2019 13:09:19 +0100 Subject: [PATCH 1395/1771] Release v6.2.1 --- package-lock.json | 142 +++++++++++++++++++++++----------------------- package.json | 5 +- 2 files changed, 75 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac164dbf11..9c5218e37c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.0", + "version": "6.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -729,7 +729,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "arch": { @@ -823,7 +823,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1294,7 +1294,7 @@ }, "autolinker": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, @@ -1774,7 +1774,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1797,7 +1797,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2354,7 +2354,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2408,7 +2408,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2691,7 +2691,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -2999,7 +2999,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3088,7 +3088,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -3267,7 +3267,7 @@ "dependencies": { "convert-source-map": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, @@ -3583,7 +3583,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3641,7 +3641,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3654,7 +3654,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3669,7 +3669,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", "dev": true }, "cross-env": { @@ -3722,7 +3722,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -4346,7 +4346,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -4523,7 +4523,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4693,7 +4693,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -4986,7 +4986,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -5172,7 +5172,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5199,7 +5199,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5245,7 +5245,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5253,7 +5253,7 @@ }, "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -5508,7 +5508,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -5536,7 +5536,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6387,7 +6387,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -7238,7 +7238,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7247,7 +7247,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -7600,7 +7600,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -7649,7 +7649,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8687,7 +8687,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -8747,7 +8747,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9493,7 +9493,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10453,7 +10453,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10633,7 +10633,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10683,7 +10683,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10718,7 +10718,7 @@ "dependencies": { "commander": { "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -10829,7 +10829,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10856,7 +10856,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10891,7 +10891,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10909,7 +10909,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10954,7 +10954,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11065,7 +11065,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -11274,7 +11274,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11553,7 +11553,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -12058,7 +12058,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { @@ -12314,7 +12314,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12337,7 +12337,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12711,7 +12711,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12796,14 +12796,14 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -12845,7 +12845,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13089,7 +13089,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -13459,7 +13459,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -14134,7 +14134,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -14202,7 +14202,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14780,7 +14780,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14838,7 +14838,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -14891,7 +14891,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15165,7 +15165,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15200,7 +15200,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15826,7 +15826,7 @@ }, "split": { "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15931,7 +15931,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -16055,7 +16055,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16348,7 +16348,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -16589,7 +16589,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16856,7 +16856,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16943,7 +16943,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -17942,7 +17942,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "whatwg-encoding": { diff --git a/package.json b/package.json index 4a0ed10f11..3ea394b2e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.0", + "version": "6.2.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -130,6 +130,7 @@ "Di Wu ", "Dina Berry ", "Diogo Monteiro ", + "Dmitrii Sorin ", "Dmitriy Simushev ", "Dmitry Shirokov ", "Dmitry Sorin ", @@ -294,6 +295,7 @@ "Marc Kuo ", "Marc Udoff ", "Marcello Bastea-Forte ", + "Mario Díaz Ceñera <46492068+MarioDiaz98@users.noreply.github.com>", "Mark Banner ", "Mark Owsiak ", "Markus Tacker ", @@ -338,6 +340,7 @@ "Noshir Patel ", "not-an-aardvark ", "OlegTsyba ", + "Oliver Salzburg ", "olsonpm ", "omardelarosa ", "Oscar Godson ", From 006d7723ae1fd9aaa621a5986e5b9958429dd957 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 13 Oct 2019 00:16:06 -0700 Subject: [PATCH 1396/1771] special-case parsing of "require" in unparseNodeArgs(); closes #4035 (#4063) Signed-off-by: Christopher Hiller --- lib/cli/node-flags.js | 5 ++++- test/node-unit/cli/node-flags.spec.js | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/cli/node-flags.js b/lib/cli/node-flags.js index 8d378e1bf2..ea6389d947 100644 --- a/lib/cli/node-flags.js +++ b/lib/cli/node-flags.js @@ -68,6 +68,7 @@ exports.impliesNoTimeouts = flag => debugFlags.has(flag); /** * All non-strictly-boolean arguments to node--those with values--must specify those values using `=`, e.g., `--inspect=0.0.0.0`. * Unparse these arguments using `yargs-unparser` (which would result in `--inspect 0.0.0.0`), then supply `=` where we have values. + * Apparently --require in Node.js v8 does NOT want `=`. * There's probably an easier or more robust way to do this; fixes welcome * @param {Object} opts - Arguments object * @returns {string[]} Unparsed arguments using `=` to specify values @@ -79,7 +80,9 @@ exports.unparseNodeFlags = opts => { ? args .join(' ') .split(/\b/) - .map(arg => (arg === ' ' ? '=' : arg)) + .map((arg, index, args) => + arg === ' ' && args[index - 1] !== 'require' ? '=' : arg + ) .join('') .split(' ') : []; diff --git a/test/node-unit/cli/node-flags.spec.js b/test/node-unit/cli/node-flags.spec.js index 9871088117..4caabab570 100644 --- a/test/node-unit/cli/node-flags.spec.js +++ b/test/node-unit/cli/node-flags.spec.js @@ -132,5 +132,14 @@ describe('node-flags', function() { ['--v8-numeric-one=1', '--v8-boolean-one', '--v8-numeric-two=2'] ); }); + + it('should special-case "--require"', function() { + // note the only way for this to happen IN REAL LIFE is if you use "--require esm"; + // mocha eats all --require args otherwise. + expect(unparseNodeFlags({require: 'mcrib'}), 'to equal', [ + '--require', + 'mcrib' + ]); + }); }); }); From 2aef07ddb5aa17fb668fc9f4dd129086916b55c3 Mon Sep 17 00:00:00 2001 From: Mia Date: Sun, 13 Oct 2019 16:33:59 +0900 Subject: [PATCH 1397/1771] modify alt text of image from Backers to Sponsors inside Sponsors section in Readme (#4046) --- README.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 8128519691..95e155b284 100644 --- a/README.md +++ b/README.md @@ -58,26 +58,26 @@ Does your company use Mocha? Ask your manager or marketing team if your company would be interested in supporting our project. Support will allow the maintainers to dedicate more time for maintenance and new features for everyone. Also, your company's logo will show [on GitHub](https://github.com/mochajs/mocha#readme) and on [our site](https://mochajs.org) - who doesn't want a little extra exposure? [Here's the info](https://opencollective.com/mochajs#sponsor). -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/0/avatar)](https://opencollective.com/mochajs/sponsor/0/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/1/avatar)](https://opencollective.com/mochajs/sponsor/1/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/2/avatar)](https://opencollective.com/mochajs/sponsor/2/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/3/avatar)](https://opencollective.com/mochajs/sponsor/3/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/4/avatar)](https://opencollective.com/mochajs/sponsor/4/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/5/avatar)](https://opencollective.com/mochajs/sponsor/5/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/6/avatar)](https://opencollective.com/mochajs/sponsor/6/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/7/avatar)](https://opencollective.com/mochajs/sponsor/7/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/8/avatar)](https://opencollective.com/mochajs/sponsor/8/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/9/avatar)](https://opencollective.com/mochajs/sponsor/9/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/10/avatar)](https://opencollective.com/mochajs/sponsor/10/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/11/avatar)](https://opencollective.com/mochajs/sponsor/11/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/12/avatar)](https://opencollective.com/mochajs/sponsor/12/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/13/avatar)](https://opencollective.com/mochajs/sponsor/13/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/14/avatar)](https://opencollective.com/mochajs/sponsor/14/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/15/avatar)](https://opencollective.com/mochajs/sponsor/15/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/16/avatar)](https://opencollective.com/mochajs/sponsor/16/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/17/avatar)](https://opencollective.com/mochajs/sponsor/17/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/18/avatar)](https://opencollective.com/mochajs/sponsor/18/website) -[![MochaJS Backer](https://opencollective.com/mochajs/sponsor/19/avatar)](https://opencollective.com/mochajs/sponsor/19/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/0/avatar)](https://opencollective.com/mochajs/sponsor/0/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/1/avatar)](https://opencollective.com/mochajs/sponsor/1/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/2/avatar)](https://opencollective.com/mochajs/sponsor/2/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/3/avatar)](https://opencollective.com/mochajs/sponsor/3/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/4/avatar)](https://opencollective.com/mochajs/sponsor/4/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/5/avatar)](https://opencollective.com/mochajs/sponsor/5/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/6/avatar)](https://opencollective.com/mochajs/sponsor/6/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/7/avatar)](https://opencollective.com/mochajs/sponsor/7/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/8/avatar)](https://opencollective.com/mochajs/sponsor/8/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/9/avatar)](https://opencollective.com/mochajs/sponsor/9/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/10/avatar)](https://opencollective.com/mochajs/sponsor/10/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/11/avatar)](https://opencollective.com/mochajs/sponsor/11/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/12/avatar)](https://opencollective.com/mochajs/sponsor/12/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/13/avatar)](https://opencollective.com/mochajs/sponsor/13/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/14/avatar)](https://opencollective.com/mochajs/sponsor/14/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/15/avatar)](https://opencollective.com/mochajs/sponsor/15/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/16/avatar)](https://opencollective.com/mochajs/sponsor/16/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/17/avatar)](https://opencollective.com/mochajs/sponsor/17/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/18/avatar)](https://opencollective.com/mochajs/sponsor/18/website) +[![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/19/avatar)](https://opencollective.com/mochajs/sponsor/19/website) ## Development From f78e21f791f5270aaef586e3f60fa08b69cc2d86 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 13 Oct 2019 11:23:13 +0200 Subject: [PATCH 1398/1771] uncaughtException: report more than one exception per test (#4033) --- lib/reporters/base.js | 19 +++++++++++++++++-- test/reporters/base.spec.js | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 69db8f8ac7..e5ed0d4c61 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -197,6 +197,7 @@ var generateDiff = (exports.generateDiff = function(actual, expected) { * Error property */ exports.list = function(failures) { + var multipleErr, multipleTest; Base.consoleLog(); failures.forEach(function(test, i) { // format @@ -207,7 +208,16 @@ exports.list = function(failures) { // msg var msg; - var err = test.err; + var err; + if (test.err && test.err.multiple) { + if (multipleTest !== test) { + multipleTest = test; + multipleErr = [test.err].concat(test.err.multiple); + } + err = multipleErr.shift(); + } else { + err = test.err; + } var message; if (err.message && typeof err.message.toString === 'function') { message = err.message + ''; @@ -298,7 +308,12 @@ function Base(runner, options) { if (showDiff(err)) { stringifyDiffObjs(err); } - test.err = err; + // more than one error per test + if (test.err && err instanceof Error) { + test.err.multiple = (test.err.multiple || []).concat(err); + } else { + test.err = err; + } failures.push(test); }); } diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 80957c39aa..18867ae6fa 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -417,6 +417,22 @@ describe('Base reporter', function() { expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); + it('should list multiple Errors per test', function() { + var err = new Error('First Error'); + err.multiple = [new Error('Second Error - same test')]; + var test = makeTest(err); + + list([test, test]); + + var errOut = stdout.join('\n').trim(); + expect( + errOut, + 'to contain', + 'Error: First Error', + 'Error: Second Error - same test' + ); + }); + describe('when reporter output immune to user test changes', function() { var sandbox; var baseConsoleLog; From 3a0ef50d61fb923a2f9fe73162be4506e25112f2 Mon Sep 17 00:00:00 2001 From: Lindsay-Needs-Sleep <51773923+Lindsay-Needs-Sleep@users.noreply.github.com> Date: Mon, 14 Oct 2019 01:26:04 -0600 Subject: [PATCH 1399/1771] Improve reporter documentation for mocha in browser. (#4026) You can pass the constructor function of your custom reporter in options and mocha will use it. --- docs/index.md | 41 ++++++++++++++++++++++++++--------------- lib/mocha.js | 2 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/docs/index.md b/docs/index.md index 5dac9ff173..40d38aae84 100644 --- a/docs/index.md +++ b/docs/index.md @@ -869,17 +869,19 @@ Configuration --package Path to package.json for config [string] File Handling - --extension, --watch-extensions File extension(s) to load and/or watch - [array] [default: js] - --file Specify file(s) to be loaded prior to root - suite execution [array] [default: (none)] - --ignore, --exclude Ignore file(s) or glob pattern(s) + --extension File extension(s) to load [array] [default: js] + --file Specify file(s) to be loaded prior to root suite + execution [array] [default: (none)] + --ignore, --exclude Ignore file(s) or glob pattern(s) [array] [default: (none)] - --recursive Look for tests in subdirectories [boolean] - --require, -r Require module [array] [default: (none)] - --sort, -S Sort test files [boolean] - --watch, -w Watch files in the current working directory - for changes [boolean] + --recursive Look for tests in subdirectories [boolean] + --require, -r Require module [array] [default: (none)] + --sort, -S Sort test files [boolean] + --watch, -w Watch files in the current working directory for changes + [boolean] + --watch-files List of paths or globs to watch [array] + --watch-ignore List of paths or globs to exclude from watching + [array] [default: ["node_modules",".git"]] Test Filters --fgrep, -f Only run tests containing this string [string] @@ -1566,23 +1568,32 @@ mocha.setup({ ui: 'tdd' }); -// Use "tdd" interface, ignore leaks, and force all tests to be asynchronous +// Use "tdd" interface, check global leaks, and force all tests to be asynchronous mocha.setup({ ui: 'tdd', - checkLeaks: false, // default + checkLeaks: true, asyncOnly: true }); ``` ### Browser-specific Option(s) -The following option(s) _only_ function in a browser context: +Browser Mocha supports many, but not all [cli options](#command-line-usage). +To use a [cli option](#command-line-usage) that contains a "-", please convert the option to camel-case, (eg. `check-leaks` to `checkLeaks`). -`noHighlighting`: If set to `true`, do not attempt to use syntax highlighting on output test code. +#### Options that differ slightly from [cli options](#command-line-usage): + +`reporter` _{string|constructor}_ +You can pass a reporter's name or a custom reporter's constructor. You can find **recommended** reporters for the browser [here](#reporting). It is possible to use [built-in reporters](#reporters) as well. Their employment in browsers is neither recommended nor supported, open the console to see the test results. + +#### Options that _only_ function in browser context: + +`noHighlighting` _{boolean}_ +If set to `true`, do not attempt to use syntax highlighting on output test code. ### Reporting -The "HTML" reporter is what you see when running Mocha in the browser. It looks like this: +The "html" reporter is the default reporter when running Mocha in the browser. It looks like this: ![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} diff --git a/lib/mocha.js b/lib/mocha.js index 6c8bf2561b..839a523111 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -83,7 +83,7 @@ exports.Test = require('./test'); * @param {boolean} [options.inlineDiffs] - Display inline diffs? * @param {boolean} [options.invert] - Invert test filter matches? * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? - * @param {string} [options.reporter] - Reporter name. + * @param {string|constructor} [options.reporter] - Reporter name or constructor. * @param {Object} [options.reporterOption] - Reporter settings object. * @param {number} [options.retries] - Number of times to retry failed tests. * @param {number} [options.slow] - Slow threshold value. From 9584202f82a64bb8ab406a4363daa0b0ed6a8962 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 11 Oct 2019 17:04:29 -0700 Subject: [PATCH 1400/1771] npm audit fixes --- package-lock.json | 388 ++++++++++++++++++++++++---------------------- 1 file changed, 200 insertions(+), 188 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c5218e37c..be569422f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1060,6 +1060,12 @@ "strip-bom": "^3.0.0" } }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -1293,10 +1299,13 @@ "dev": true }, "autolinker": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", - "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", - "dev": true + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } }, "autoprefixer": { "version": "9.6.0", @@ -1354,13 +1363,21 @@ "dev": true }, "axios": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", - "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", "dev": true, "requires": { - "follow-redirects": "^1.2.5", - "is-buffer": "^1.1.5" + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } } }, "babel-runtime": { @@ -2054,12 +2071,12 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { - "version": "2.26.5", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.5.tgz", - "integrity": "sha512-zVa6MmadAFgl5Uk53Yy5cw5tGTO7xSGAWK3Yx70GJ1t5jK+r6B4q3xq+1XbYfLt1SbeFg7WoNWneNhMT4B9jFw==", + "version": "2.26.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", + "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", "dev": true, "requires": { - "browser-sync-client": "^2.26.4", + "browser-sync-client": "^2.26.6", "browser-sync-ui": "^2.26.4", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", @@ -2074,7 +2091,7 @@ "fs-extra": "3.0.1", "http-proxy": "1.15.2", "immutable": "^3", - "localtunnel": "1.9.1", + "localtunnel": "1.9.2", "micromatch": "^3.1.10", "opn": "5.3.0", "portscanner": "2.1.1", @@ -2180,7 +2197,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -2221,7 +2238,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2243,7 +2260,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -2253,9 +2270,9 @@ } }, "browser-sync-client": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.4.tgz", - "integrity": "sha512-mQiDp5/tf79VezDS5j/EExU4Ze6f5DQYuL0Z7VdJgBbNLTHDfkYGi2R620qc6HkY9XZA0m4/UwihT7J42RBIJA==", + "version": "2.26.6", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", + "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", "dev": true, "requires": { "etag": "1.8.1", @@ -3359,6 +3376,23 @@ "typedarray": "^0.0.6" } }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "condense-newlines": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", @@ -4860,15 +4894,15 @@ } }, "engine.io-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", - "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", @@ -4879,19 +4913,26 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } } } }, @@ -5423,10 +5464,13 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } }, "eslint-visitor-keys": { "version": "1.0.0", @@ -6235,12 +6279,29 @@ "dev": true }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "dev": true, "requires": { - "debug": "^3.2.6" + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "font-family-papandreou": { @@ -6462,8 +6523,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -6484,14 +6544,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6506,20 +6564,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -6636,8 +6691,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -6649,7 +6703,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6664,7 +6717,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6672,14 +6724,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6698,7 +6748,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -6779,8 +6828,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -6792,7 +6840,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -6878,8 +6925,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -6915,7 +6961,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6935,7 +6980,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6979,14 +7023,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -7342,6 +7384,29 @@ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "hamljs": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", @@ -7349,9 +7414,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", + "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7679,18 +7744,24 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", + "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -7853,7 +7924,7 @@ "optimist": "^0.6.1", "pretty-bytes": "^5.2.0", "request": "^2.88.0", - "tap-render": "github:Munter/tap-render#0.1.7-patch4", + "tap-render": "github:Munter/tap-render#c3a72d6260ee19cfd340d1e41d73a0edfdb29d94", "urltools": "^0.4.1" }, "dependencies": { @@ -9955,13 +10026,13 @@ } }, "localtunnel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.1.tgz", - "integrity": "sha512-HWrhOslklDvxgOGFLxi6fQVnvpl6XdX4sPscfqMZkzi3gtt9V7LKBWYvNUcpHSVvjwCQ6xzXacVvICNbNcyPnQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", + "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", "dev": true, "requires": { - "axios": "0.17.1", - "debug": "2.6.9", + "axios": "0.19.0", + "debug": "4.1.1", "openurl": "1.1.1", "yargs": "6.6.0" }, @@ -9990,12 +10061,12 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "invert-kv": { @@ -10022,15 +10093,9 @@ "invert-kv": "^1.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -10071,7 +10136,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10092,7 +10157,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10111,9 +10176,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash._reinterpolate": { @@ -11053,9 +11118,9 @@ "dev": true }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -11065,7 +11130,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -12235,7 +12300,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -14098,13 +14163,13 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", "dev": true, "requires": { "bytes": "3.1.0", - "http-errors": "1.7.2", + "http-errors": "1.7.3", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -14397,31 +14462,13 @@ } }, "remarkable": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", - "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", "dev": true, "requires": { - "argparse": "~0.1.15", - "autolinker": "~0.15.0" - }, - "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - } - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - } + "argparse": "^1.0.10", + "autolinker": "~0.28.0" } }, "remove-trailing-separator": { @@ -15129,9 +15176,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -15585,17 +15632,17 @@ "dev": true }, "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.3.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", @@ -15607,19 +15654,13 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -17239,13 +17280,13 @@ "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", + "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "2.20.0", "source-map": "~0.6.1" }, "dependencies": { @@ -17319,12 +17360,6 @@ "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - }, "unexpected": { "version": "10.40.2", "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.40.2.tgz", @@ -17441,38 +17476,15 @@ } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { From 143596fff258ae716d4f13743761a799c7c9b3f0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 18 Oct 2019 15:08:45 -0400 Subject: [PATCH 1401/1771] update CHANGELOG for v6.2.2 [ci skip] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d60633dd65..1f24d279f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# 6.2.2 / 2019-10-18 + +## :bug: Fixes + +- #4025: Fix duplicate `EVENT_RUN_END` events upon uncaught exception (@juergba) +- #4051: Fix "unhide" function in `html` reporter (browser) (@pec9399) +- #4063: Fix use of [esm](https://npm.im/esm) in Node.js v8.x (@boneskull) +- #4033: Fix output when multiple async exceptions are thrown (@juergba) + +## :book: Documentation + +- #4046: Site accessibility fixes (@Mia-jeong) +- #4026: Update docs for custom reporters in browser (@Lindsay-Needs-Sleep) +- #3971: Adopt new OpenJS Foundation Code of Conduct (@craigtaub) + # 6.2.1 / 2019-09-29 ## :bug: Fixes From 8a0b38babcca47e6c02c16223a992b88d836811b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 18 Oct 2019 15:10:15 -0400 Subject: [PATCH 1402/1771] 6.2.2 --- CHANGELOG.md | 14 +++++------ package-lock.json | 59 +++++++++++++++++++++++++++++++---------------- package.json | 5 +++- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f24d279f2..8236b4b21f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,16 @@ ## :bug: Fixes -- #4025: Fix duplicate `EVENT_RUN_END` events upon uncaught exception (@juergba) -- #4051: Fix "unhide" function in `html` reporter (browser) (@pec9399) -- #4063: Fix use of [esm](https://npm.im/esm) in Node.js v8.x (@boneskull) -- #4033: Fix output when multiple async exceptions are thrown (@juergba) +- [#4025](https://github.com/mochajs/mocha/issues/4025): Fix duplicate `EVENT_RUN_END` events upon uncaught exception ([**@juergba**](https://github.com/juergba)) +- [#4051](https://github.com/mochajs/mocha/issues/4051): Fix "unhide" function in `html` reporter (browser) ([**@pec9399**](https://github.com/pec9399)) +- [#4063](https://github.com/mochajs/mocha/issues/4063): Fix use of [esm](https://npm.im/esm) in Node.js v8.x ([**@boneskull**](https://github.com/boneskull)) +- [#4033](https://github.com/mochajs/mocha/issues/4033): Fix output when multiple async exceptions are thrown ([**@juergba**](https://github.com/juergba)) ## :book: Documentation -- #4046: Site accessibility fixes (@Mia-jeong) -- #4026: Update docs for custom reporters in browser (@Lindsay-Needs-Sleep) -- #3971: Adopt new OpenJS Foundation Code of Conduct (@craigtaub) +- [#4046](https://github.com/mochajs/mocha/issues/4046): Site accessibility fixes ([**@Mia-jeong**](https://github.com/Mia-jeong)) +- [#4026](https://github.com/mochajs/mocha/issues/4026): Update docs for custom reporters in browser ([**@Lindsay-Needs-Sleep**](https://github.com/Lindsay-Needs-Sleep)) +- [#3971](https://github.com/mochajs/mocha/issues/3971): Adopt new OpenJS Foundation Code of Conduct ([**@craigtaub**](https://github.com/craigtaub)) # 6.2.1 / 2019-09-29 diff --git a/package-lock.json b/package-lock.json index be569422f6..bc79521a75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.1", + "version": "6.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2197,7 +2197,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -2238,7 +2238,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2260,7 +2260,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -6523,7 +6523,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -6544,12 +6545,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6564,17 +6567,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6691,7 +6697,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6703,6 +6710,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6717,6 +6725,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6724,12 +6733,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6748,6 +6759,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6828,7 +6840,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6840,6 +6853,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6925,7 +6939,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6961,6 +6976,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6980,6 +6996,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7023,12 +7040,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -7924,7 +7943,7 @@ "optimist": "^0.6.1", "pretty-bytes": "^5.2.0", "request": "^2.88.0", - "tap-render": "github:Munter/tap-render#c3a72d6260ee19cfd340d1e41d73a0edfdb29d94", + "tap-render": "github:Munter/tap-render#0.1.7-patch4", "urltools": "^0.4.1" }, "dependencies": { @@ -10095,7 +10114,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -10136,7 +10155,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10157,7 +10176,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -12300,7 +12319,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { diff --git a/package.json b/package.json index 3ea394b2e5..6efa36bdd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.1", + "version": "6.2.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -147,6 +147,7 @@ "Enric Pallerols ", "Erik Eng ", "Eugene Tiutiunnyk ", + "EunChan Park ", "Fabio M. Costa ", "Fábio Santos ", "Fagner Brack ", @@ -286,6 +287,7 @@ "László Bácsi ", "Laurence Rowe ", "Liam Newman ", + "Lindsay-Needs-Sleep <51773923+Lindsay-Needs-Sleep@users.noreply.github.com>", "Linus Unnebäck ", "lodr ", "Long Ho ", @@ -312,6 +314,7 @@ "Max Goodman ", "Maximilian Antoni ", "Merrick Christensen ", + "Mia ", "Michael Demmer ", "Michael Jackson ", "Michael Olson ", From f73e7c681699a72a1b6b4d8db5c3af9ceccce66f Mon Sep 17 00:00:00 2001 From: Soobin Bak Date: Sun, 20 Oct 2019 02:04:18 +0900 Subject: [PATCH 1403/1771] 2595 Changed runMocha to runMochaJSON in test/integration (#4077) * duplicate-arguments * suit.spec.js * ui.spec.js * lint error fixed --- test/integration/duplicate-arguments.spec.js | 6 +++--- test/integration/options/ui.spec.js | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/test/integration/duplicate-arguments.spec.js b/test/integration/duplicate-arguments.spec.js index 28fd225d9b..6dc9d3979e 100644 --- a/test/integration/duplicate-arguments.spec.js +++ b/test/integration/duplicate-arguments.spec.js @@ -1,11 +1,11 @@ 'use strict'; -var runMocha = require('./helpers').runMocha; +var runMochaJSON = require('./helpers').runMochaJSON; describe('when non-array argument is provided multiple times', function() { describe('when the same argument name is used', function() { it('should prefer the last value', function(done) { - runMocha( + runMochaJSON( 'passing-sync', ['--no-async-only', '--async-only', '--no-async-only'], function(err, result) { @@ -21,7 +21,7 @@ describe('when non-array argument is provided multiple times', function() { describe('when a different argument name is used', function() { it('should prefer the last value', function(done) { - runMocha('passing-async', ['--timeout', '100', '-t', '10'], function( + runMochaJSON('passing-async', ['--timeout', '100', '-t', '10'], function( err, result ) { diff --git a/test/integration/options/ui.spec.js b/test/integration/options/ui.spec.js index 3d0aaf390c..7e3b6363b5 100644 --- a/test/integration/options/ui.spec.js +++ b/test/integration/options/ui.spec.js @@ -1,13 +1,16 @@ 'use strict'; var helpers = require('../helpers'); -var runMocha = helpers.runMocha; +var runMochaJSON = helpers.runMochaJSON; describe('--ui', function() { var simpleUiPath = require.resolve('../fixtures/simple-ui.fixture'); it('should load interface and run it', function(done) { - runMocha('test-for-simple-ui', ['--ui', simpleUiPath], function(err, res) { + runMochaJSON('test-for-simple-ui', ['--ui', simpleUiPath], function( + err, + res + ) { if (err) { done(err); return; @@ -18,7 +21,7 @@ describe('--ui', function() { }); it("should work if required and name added to Mocha's `interfaces` prop", function(done) { - runMocha( + runMochaJSON( 'test-for-simple-ui', ['--require', simpleUiPath, '--ui', 'simple-ui'], function(err, res) { From 503d0172a4b6a4edee900e7c6e67034959e1a359 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Sat, 2 Nov 2019 14:52:48 +0900 Subject: [PATCH 1404/1771] fix sponsors background color for readability (#3988) Signed-off-by: Outsider --- docs/_includes/sponsors.md | 5 +++-- docs/css/style.css | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/_includes/sponsors.md b/docs/_includes/sponsors.md index 86c24b88f1..257f9524b1 100644 --- a/docs/_includes/sponsors.md +++ b/docs/_includes/sponsors.md @@ -1,9 +1,10 @@ ## Sponsors -Use Mocha at Work? Ask your manager or marketing team if they'd help [support](https://opencollective.com/mochajs#support) our project. Your company's logo will also be displayed on [npmjs.com](http://npmjs.com/package/mocha) and our [GitHub repository](https://github.com/mochajs/mocha#sponsors). +Use Mocha at Work? Ask your manager or marketing team if they'd help [support](https://opencollective.com/mochajs#support) our project. Your company's logo will also be displayed on [npmjs.com](http://npmjs.com/package/mocha) and our [GitHub repository](https://github.com/mochajs/mocha#sponsors). -{% for i in (0..15) %}[![](https://opencollective.com/mochajs/sponsor/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} + +{% for i in (0..15) %}[![](https://opencollective.com/mochajs/sponsor/{{ i }}/avatar.png)](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="\_blank"} {% endfor %} {: .image-list .faded-images} diff --git a/docs/css/style.css b/docs/css/style.css index d59160b852..1eb9461bae 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -76,10 +76,11 @@ nav.badges a + a { .image-list { overflow: hidden; + text-align: center; } .image-list a { - float: left; + display: inline-block; margin: 6px; } @@ -88,6 +89,15 @@ nav.badges a + a { height: 64px; } +.faded-images { + background-color: #ddd; + border: 1px solid; + border-color: #ddd #ddd #ccc; + border-radius: 3px; + padding: 1em; + box-shadow: inset 0 0 10px #ccc; +} + .faded-images img { opacity: 0; transition: opacity 0.3s; From ec8e2f8b5e5dcb6857f52784b30047099d9b9eae Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 3 Nov 2019 10:13:46 +0100 Subject: [PATCH 1405/1771] Mocha constructor: improve browser setup (#4070) --- lib/mocha.js | 162 +++++++++++++++++++++++++------------ test/unit/mocha.spec.js | 171 ++++++++++++++++++++++++++++++++++------ 2 files changed, 261 insertions(+), 72 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 839a523111..d306f995cd 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -100,11 +100,9 @@ function Mocha(options) { this.grep(options.grep) .fgrep(options.fgrep) .ui(options.ui) - .bail(options.bail) .reporter(options.reporter, options.reporterOption) .slow(options.slow) - .useInlineDiffs(options.inlineDiffs) - .globals(options.global); + .global(options.global); // this guard exists because Suite#timeout does not consider `undefined` to be valid input if (typeof options.timeout !== 'undefined') { @@ -118,12 +116,16 @@ function Mocha(options) { [ 'allowUncaught', 'asyncOnly', + 'bail', 'checkLeaks', + 'color', 'delay', + 'diff', 'forbidOnly', 'forbidPending', 'fullTrace', 'growl', + 'inlineDiffs', 'invert' ].forEach(function(opt) { if (options[opt]) { @@ -136,16 +138,13 @@ function Mocha(options) { * Enables or disables bailing on the first failure. * * @public - * @see {@link /#-bail-b|CLI option} + * @see [CLI option](../#-bail-b) * @param {boolean} [bail=true] - Whether to bail on first error. * @returns {Mocha} this * @chainable */ Mocha.prototype.bail = function(bail) { - if (!arguments.length) { - bail = true; - } - this.suite.bail(bail); + this.suite.bail(bail !== false); return this; }; @@ -157,7 +156,7 @@ Mocha.prototype.bail = function(bail) { * Useful for generic setup code that must be included within test suite. * * @public - * @see {@link /#-file-filedirectoryglob|CLI option} + * @see [CLI option](../#-file-filedirectoryglob) * @param {string} file - Pathname of file to be loaded. * @returns {Mocha} this * @chainable @@ -171,8 +170,8 @@ Mocha.prototype.addFile = function(file) { * Sets reporter to `reporter`, defaults to "spec". * * @public - * @see {@link /#-reporter-name-r-name|CLI option} - * @see {@link /#reporters|Reporters} + * @see [CLI option](../#-reporter-name-r-name) + * @see [Reporters](../#reporters) * @param {String|Function} reporter - Reporter name or constructor. * @param {Object} [reporterOptions] - Options used to configure the reporter. * @returns {Mocha} this @@ -240,8 +239,8 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { * Sets test UI `name`, defaults to "bdd". * * @public - * @see {@link /#-ui-name-u-name|CLI option} - * @see {@link /#interfaces|Interface DSLs} + * @see [CLI option](../#-ui-name-u-name) + * @see [Interface DSLs](../#interfaces) * @param {string|Function} [ui=bdd] - Interface name or class. * @returns {Mocha} this * @chainable @@ -334,8 +333,6 @@ Mocha.unloadFile = function(file) { * Intended for consumers — not used internally * * @public - * @see {@link Mocha.unloadFile} - * @see {@link Mocha#loadFiles} * @see {@link Mocha#run} * @returns {Mocha} this * @chainable @@ -379,7 +376,7 @@ Mocha.prototype.fgrep = function(str) { * Previous filter value will be overwritten on each call! * * @public - * @see {@link /#grep-regexp-g-regexp|CLI option} + * @see [CLI option](../#-grep-regexp-g-regexp) * @see {@link Mocha#fgrep} * @see {@link Mocha#invert} * @param {RegExp|String} re - Regular expression used to select tests. @@ -430,32 +427,32 @@ Mocha.prototype.invert = function() { /** * Enables or disables ignoring global leaks. * + * @deprecated since v7.0.0 * @public * @see {@link Mocha#checkLeaks} * @param {boolean} [ignoreLeaks=false] - Whether to ignore global leaks. * @return {Mocha} this * @chainable - * @example - * - * // Ignore global leaks - * mocha.ignoreLeaks(true); */ Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { + utils.deprecate( + '"ignoreLeaks()" is DEPRECATED, please use "checkLeaks()" instead.' + ); this.options.checkLeaks = !ignoreLeaks; return this; }; /** - * Enables checking for global variables leaked while running tests. + * Enables or disables checking for global variables leaked while running tests. * * @public - * @see {@link /#-check-leaks|CLI option} - * @see {@link Mocha#ignoreLeaks} + * @see [CLI option](../#-check-leaks) + * @param {boolean} [checkLeaks=true] - Whether to check for global variable leaks. * @return {Mocha} this * @chainable */ -Mocha.prototype.checkLeaks = function() { - this.options.checkLeaks = true; +Mocha.prototype.checkLeaks = function(checkLeaks) { + this.options.checkLeaks = checkLeaks !== false; return this; }; @@ -463,11 +460,13 @@ Mocha.prototype.checkLeaks = function() { * Displays full stack trace upon test failure. * * @public + * @see [CLI option](../#-full-trace) + * @param {boolean} [fullTrace=true] - Whether to print full stacktrace upon failure. * @return {Mocha} this * @chainable */ -Mocha.prototype.fullTrace = function() { - this.options.fullTrace = true; +Mocha.prototype.fullTrace = function(fullTrace) { + this.options.fullTrace = fullTrace !== false; return this; }; @@ -475,8 +474,7 @@ Mocha.prototype.fullTrace = function() { * Enables desktop notification support if prerequisite software installed. * * @public - * @see {@link Mocha#isGrowlCapable} - * @see {@link Mocha#_growl} + * @see [CLI option](../#-growl-g) * @return {Mocha} this * @chainable */ @@ -519,68 +517,124 @@ Mocha.prototype._growl = growl.notify; * Specifies whitelist of variable names to be expected in global scope. * * @public - * @see {@link /#-global-variable-name|CLI option} + * @see [CLI option](../#-global-variable-name) * @see {@link Mocha#checkLeaks} - * @param {String[]|String} globals - Accepted global variable name(s). + * @param {String[]|String} global - Accepted global variable name(s). * @return {Mocha} this * @chainable * @example * * // Specify variables to be expected in global scope - * mocha.globals(['jQuery', 'MyLib']); + * mocha.global(['jQuery', 'MyLib']); */ -Mocha.prototype.globals = function(globals) { +Mocha.prototype.global = function(global) { this.options.global = (this.options.global || []) - .concat(globals) + .concat(global) .filter(Boolean) .filter(function(elt, idx, arr) { return arr.indexOf(elt) === idx; }); return this; }; +// for backwards compability, 'globals' is an alias of 'global' +Mocha.prototype.globals = Mocha.prototype.global; /** * Enables or disables TTY color output by screen-oriented reporters. * + * @deprecated since v7.0.0 * @public + * @see {@link Mocha#color} * @param {boolean} colors - Whether to enable color output. * @return {Mocha} this * @chainable */ Mocha.prototype.useColors = function(colors) { + utils.deprecate('"useColors()" is DEPRECATED, please use "color()" instead.'); if (colors !== undefined) { this.options.color = colors; } return this; }; +/** + * Enables or disables TTY color output by screen-oriented reporters. + * + * @public + * @see [CLI option](../#-color-c-colors) + * @param {boolean} [color=true] - Whether to enable color output. + * @return {Mocha} this + * @chainable + */ +Mocha.prototype.color = function(color) { + this.options.color = color !== false; + return this; +}; + /** * Determines if reporter should use inline diffs (rather than +/-) * in test failure output. * + * @deprecated since v7.0.0 * @public + * @see {@link Mocha#inlineDiffs} * @param {boolean} [inlineDiffs=false] - Whether to use inline diffs. * @return {Mocha} this * @chainable */ Mocha.prototype.useInlineDiffs = function(inlineDiffs) { + utils.deprecate( + '"useInlineDiffs()" is DEPRECATED, please use "inlineDiffs()" instead.' + ); this.options.inlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; +/** + * Enables or disables reporter to use inline diffs (rather than +/-) + * in test failure output. + * + * @public + * @see [CLI option](../#-inline-diffs) + * @param {boolean} [inlineDiffs=true] - Whether to use inline diffs. + * @return {Mocha} this + * @chainable + */ +Mocha.prototype.inlineDiffs = function(inlineDiffs) { + this.options.inlineDiffs = inlineDiffs !== false; + return this; +}; + /** * Determines if reporter should include diffs in test failure output. * + * @deprecated since v7.0.0 * @public + * @see {@link Mocha#diff} * @param {boolean} [hideDiff=false] - Whether to hide diffs. * @return {Mocha} this * @chainable */ Mocha.prototype.hideDiff = function(hideDiff) { + utils.deprecate('"hideDiff()" is DEPRECATED, please use "diff()" instead.'); this.options.diff = !(hideDiff === true); return this; }; +/** + * Enables or disables reporter to include diff in test failure output. + * + * @public + * @see [CLI option](../#-diff) + * @param {boolean} [diff=true] - Whether to show diff on failure. + * @return {Mocha} this + * @chainable + */ +Mocha.prototype.diff = function(diff) { + this.options.diff = diff !== false; + return this; +}; + /** * @summary * Sets timeout threshold value. @@ -590,8 +644,8 @@ Mocha.prototype.hideDiff = function(hideDiff) { * If the value is `0`, timeouts will be disabled. * * @public - * @see {@link /#-timeout-ms-t-ms|CLI option} - * @see {@link /#timeouts|Timeouts} + * @see [CLI option](../#-timeout-ms-t-ms) + * @see [Timeouts](../#timeouts) * @see {@link Mocha#enableTimeouts} * @param {number|string} msecs - Timeout threshold value. * @return {Mocha} this @@ -614,7 +668,8 @@ Mocha.prototype.timeout = function(msecs) { * Sets the number of times to retry failed tests. * * @public - * @see {@link /#retry-tests|Retry Tests} + * @see [CLI option](../#-retries-n) + * @see [Retry Tests](../#retry-tests) * @param {number} retry - Number of times to retry failed tests. * @return {Mocha} this * @chainable @@ -632,7 +687,7 @@ Mocha.prototype.retries = function(n) { * Sets slowness threshold value. * * @public - * @see {@link /#-slow-ms-s-ms|CLI option} + * @see [CLI option](../#-slow-ms-s-ms) * @param {number} msecs - Slowness threshold value. * @return {Mocha} this * @chainable @@ -654,7 +709,7 @@ Mocha.prototype.slow = function(msecs) { * Enables or disables timeouts. * * @public - * @see {@link /#-timeout-ms-t-ms|CLI option} + * @see [CLI option](../#-timeout-ms-t-ms) * @param {boolean} enableTimeouts - Whether to enable timeouts. * @return {Mocha} this * @chainable @@ -670,11 +725,13 @@ Mocha.prototype.enableTimeouts = function(enableTimeouts) { * Forces all tests to either accept a `done` callback or return a promise. * * @public + * @see [CLI option](../#-async-only-a) + * @param {boolean} [asyncOnly=true] - Wether to force `done` callback or promise. * @return {Mocha} this * @chainable */ -Mocha.prototype.asyncOnly = function() { - this.options.asyncOnly = true; +Mocha.prototype.asyncOnly = function(asyncOnly) { + this.options.asyncOnly = asyncOnly !== false; return this; }; @@ -691,14 +748,16 @@ Mocha.prototype.noHighlighting = function() { }; /** - * Enables uncaught errors to propagate (in browser). + * Enables or disables uncaught errors to propagate. * * @public + * @see [CLI option](../#-allow-uncaught) + * @param {boolean} [allowUncaught=true] - Whether to propagate uncaught errors. * @return {Mocha} this * @chainable */ -Mocha.prototype.allowUncaught = function() { - this.options.allowUncaught = true; +Mocha.prototype.allowUncaught = function(allowUncaught) { + this.options.allowUncaught = allowUncaught !== false; return this; }; @@ -710,7 +769,7 @@ Mocha.prototype.allowUncaught = function() { * Used to perform asynch operations before any suites are run. * * @public - * @see {@link /#delayed-root-suite|delayed root suite} + * @see [delayed root suite](../#delayed-root-suite) * @returns {Mocha} this * @chainable */ @@ -723,11 +782,13 @@ Mocha.prototype.delay = function delay() { * Causes tests marked `only` to fail the suite. * * @public + * @see [CLI option](../#-forbid-only) + * @param {boolean} [forbidOnly=true] - Whether tests marked `only` fail the suite. * @returns {Mocha} this * @chainable */ -Mocha.prototype.forbidOnly = function() { - this.options.forbidOnly = true; +Mocha.prototype.forbidOnly = function(forbidOnly) { + this.options.forbidOnly = forbidOnly !== false; return this; }; @@ -735,11 +796,13 @@ Mocha.prototype.forbidOnly = function() { * Causes pending tests and tests marked `skip` to fail the suite. * * @public + * @see [CLI option](../#-forbid-pending) + * @param {boolean} [forbidPending=true] - Whether pending tests fail the suite. * @returns {Mocha} this * @chainable */ -Mocha.prototype.forbidPending = function() { - this.options.forbidPending = true; +Mocha.prototype.forbidPending = function(forbidPending) { + this.options.forbidPending = forbidPending !== false; return this; }; @@ -773,7 +836,6 @@ Object.defineProperty(Mocha.prototype, 'version', { * the cache first! * * @public - * @see {@link Mocha#loadFiles} * @see {@link Mocha#unloadFiles} * @see {@link Runner#run} * @param {DoneCB} [fn] - Callback invoked when test execution completed. diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 648853feab..71d804814c 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -19,8 +19,7 @@ describe('Mocha', function() { describe('constructor', function() { beforeEach(function() { sandbox.stub(Mocha.prototype, 'timeout').returnsThis(); - sandbox.stub(Mocha.prototype, 'globals').returnsThis(); - sandbox.stub(Mocha.prototype, 'useInlineDiffs').returnsThis(); + sandbox.stub(Mocha.prototype, 'global').returnsThis(); }); describe('when "options.timeout" is `undefined`', function() { @@ -42,24 +41,14 @@ describe('Mocha', function() { }); describe('when "options.global" is provided', function() { - it('should pass "options.global" to #globals()', function() { + it('should pass "options.global" to #global()', function() { // eslint-disable-next-line no-new new Mocha({global: ['singular']}); - expect(Mocha.prototype.globals, 'to have a call satisfying', [ + expect(Mocha.prototype.global, 'to have a call satisfying', [ ['singular'] ]).and('was called once'); }); }); - - describe('when "options.inlineDiffs" is `undefined`', function() { - it('should set inlineDiffs to `true`', function() { - // eslint-disable-next-line no-new - new Mocha({inlineDiffs: true}); - expect(Mocha.prototype.useInlineDiffs, 'to have a call satisfying', [ - true - ]).and('was called once'); - }); - }); }); describe('#allowUncaught()', function() { @@ -69,12 +58,37 @@ describe('Mocha', function() { expect(mocha.options, 'to have property', 'allowUncaught', true); }); + it('should set the allowUncaught option to false', function() { + var mocha = new Mocha(opts); + mocha.allowUncaught(false); + expect(mocha.options, 'to have property', 'allowUncaught', false); + }); + it('should be chainable', function() { var mocha = new Mocha(opts); expect(mocha.allowUncaught(), 'to be', mocha); }); }); + describe('#asyncOnly()', function() { + it('should set the asyncOnly option to true', function() { + var mocha = new Mocha(opts); + mocha.asyncOnly(); + expect(mocha.options, 'to have property', 'asyncOnly', true); + }); + + it('should set the asyncOnly option to false', function() { + var mocha = new Mocha(opts); + mocha.asyncOnly(false); + expect(mocha.options, 'to have property', 'asyncOnly', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.asyncOnly(), 'to be', mocha); + }); + }); + describe('#bail()', function() { it('should set the suite._bail to true if there is no arguments', function() { var mocha = new Mocha(opts); @@ -82,6 +96,12 @@ describe('Mocha', function() { expect(mocha.suite._bail, 'to be', true); }); + it('should set the suite._bail to false', function() { + var mocha = new Mocha(opts); + mocha.bail(false); + expect(mocha.suite._bail, 'to be', false); + }); + it('should be chainable', function() { var mocha = new Mocha(opts); expect(mocha.bail(), 'to be', mocha); @@ -95,12 +115,37 @@ describe('Mocha', function() { expect(mocha.options, 'to have property', 'checkLeaks', true); }); + it('should set the checkLeaks option to false', function() { + var mocha = new Mocha(opts); + mocha.checkLeaks(false); + expect(mocha.options, 'to have property', 'checkLeaks', false); + }); + it('should be chainable', function() { var mocha = new Mocha(opts); expect(mocha.checkLeaks(), 'to be', mocha); }); }); + describe('#color()', function() { + it('should set the color option to true', function() { + var mocha = new Mocha(opts); + mocha.color(); + expect(mocha.options, 'to have property', 'color', true); + }); + + it('should set the color option to false', function() { + var mocha = new Mocha(opts); + mocha.color(false); + expect(mocha.options, 'to have property', 'color', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.color(), 'to be', mocha); + }); + }); + describe('#delay()', function() { it('should set the delay option to true', function() { var mocha = new Mocha(opts); @@ -127,6 +172,63 @@ describe('Mocha', function() { }); }); + describe('#diff()', function() { + it('should set the diff option to true', function() { + var mocha = new Mocha(opts); + mocha.diff(); + expect(mocha.options, 'to have property', 'diff', true); + }); + + it('should set the diff option to false', function() { + var mocha = new Mocha(opts); + mocha.diff(false); + expect(mocha.options, 'to have property', 'diff', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.diff(), 'to be', mocha); + }); + }); + + describe('#forbidOnly()', function() { + it('should set the forbidOnly option to true', function() { + var mocha = new Mocha(opts); + mocha.forbidOnly(); + expect(mocha.options, 'to have property', 'forbidOnly', true); + }); + + it('should set the forbidOnly option to false', function() { + var mocha = new Mocha(opts); + mocha.forbidOnly(false); + expect(mocha.options, 'to have property', 'forbidOnly', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.forbidOnly(), 'to be', mocha); + }); + }); + + describe('#forbidPending()', function() { + it('should set the forbidPending option to true', function() { + var mocha = new Mocha(opts); + mocha.forbidPending(); + expect(mocha.options, 'to have property', 'forbidPending', true); + }); + + it('should set the forbidPending option to false', function() { + var mocha = new Mocha(opts); + mocha.forbidPending(false); + expect(mocha.options, 'to have property', 'forbidPending', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.forbidPending(), 'to be', mocha); + }); + }); + describe('#fullTrace()', function() { it('should set the fullTrace option to true', function() { var mocha = new Mocha(opts); @@ -134,13 +236,19 @@ describe('Mocha', function() { expect(mocha.options, 'to have property', 'fullTrace', true); }); + it('should set the fullTrace option to false', function() { + var mocha = new Mocha(opts); + mocha.fullTrace(false); + expect(mocha.options, 'to have property', 'fullTrace', false); + }); + it('should be chainable', function() { var mocha = new Mocha(opts); expect(mocha.fullTrace(), 'to be', mocha); }); }); - describe('#globals()', function() { + describe('#global()', function() { it('should be an empty array initially', function() { var mocha = new Mocha(); expect(mocha.options.global, 'to be empty'); @@ -148,19 +256,19 @@ describe('Mocha', function() { it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.globals(), 'to be', mocha); + expect(mocha.global(), 'to be', mocha); }); describe('when argument is invalid', function() { it('should not modify the whitelist when given empty string', function() { var mocha = new Mocha(opts); - mocha.globals(''); + mocha.global(''); expect(mocha.options.global, 'to be empty'); }); it('should not modify the whitelist when given empty array', function() { var mocha = new Mocha(opts); - mocha.globals([]); + mocha.global([]); expect(mocha.options.global, 'to be empty'); }); }); @@ -172,7 +280,7 @@ describe('Mocha', function() { it('should add string to the whitelist', function() { var mocha = new Mocha(opts); - mocha.globals(elem); + mocha.global(elem); expect(mocha.options.global, 'to contain', elem); expect(mocha.options.global, 'to have length', 1); }); @@ -180,15 +288,15 @@ describe('Mocha', function() { it('should add contents of string array to the whitelist', function() { var mocha = new Mocha(opts); var elems = [elem, elem2]; - mocha.globals(elems); + mocha.global(elems); expect(mocha.options.global, 'to contain', elem, elem2); expect(mocha.options.global, 'to have length', elems.length); }); it('should not have duplicates', function() { - var mocha = new Mocha({globals: [elem, elem2]}); + var mocha = new Mocha({global: [elem, elem2]}); var elems = [elem, elem2, elem3]; - mocha.globals(elems); + mocha.global(elems); expect(mocha.options.global, 'to contain', elem, elem2, elem3); expect(mocha.options.global, 'to have length', elems.length); }); @@ -274,6 +382,25 @@ describe('Mocha', function() { }); }); + describe('#inlineDiffs()', function() { + it('should set the inlineDiffs option to true', function() { + var mocha = new Mocha(opts); + mocha.inlineDiffs(); + expect(mocha.options, 'to have property', 'inlineDiffs', true); + }); + + it('should set the inlineDiffs option to false', function() { + var mocha = new Mocha(opts); + mocha.inlineDiffs(false); + expect(mocha.options, 'to have property', 'inlineDiffs', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.inlineDiffs(), 'to be', mocha); + }); + }); + describe('#invert()', function() { it('should set the invert option to true', function() { var mocha = new Mocha(opts); From b9fbd69168183836f3f5b72e46e34005d6558e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Thu, 7 Nov 2019 09:51:00 +0100 Subject: [PATCH 1406/1771] Add funding information to package.json See https://github.com/npm/rfcs/blob/latest/accepted/0017-add-funding-support.md --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 6efa36bdd1..a39c349b78 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,10 @@ "tdd", "tap" ], + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + }, "author": "TJ Holowaychuk ", "contributors": [ "38elements ", From 46ca9ac55b57e15e04488a0437314cc1a6bbb366 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 22 Nov 2019 16:40:23 +0100 Subject: [PATCH 1407/1771] uncaughtException: fix when current test is pending (#4083) --- lib/runner.js | 16 ++++++++++--- .../allow-uncaught/propagate.fixture.js | 12 ++++++++++ .../fixtures/uncaught-pending.fixture.js | 15 ++++++++++++ .../integration/options/allowUncaught.spec.js | 21 +++++++++++++++++ test/integration/uncaught.spec.js | 23 +++++++++++++++++++ test/unit/runner.spec.js | 4 ++-- 6 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 test/integration/fixtures/options/allow-uncaught/propagate.fixture.js create mode 100644 test/integration/fixtures/uncaught-pending.fixture.js diff --git a/lib/runner.js b/lib/runner.js index d1c00da30f..374a6143bf 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -794,6 +794,10 @@ Runner.prototype.uncaught = function(err) { if (err instanceof Pending) { return; } + if (this.allowUncaught) { + throw err; + } + if (err) { debug('uncaught exception %O', err); } else { @@ -829,11 +833,17 @@ Runner.prototype.uncaught = function(err) { runnable.clearTimeout(); - // Ignore errors if already failed or pending - // See #3226 - if (runnable.isFailed() || runnable.isPending()) { + if (runnable.isFailed()) { + // Ignore error if already failed + return; + } else if (runnable.isPending()) { + // report 'pending test' retrospectively as failed + runnable.isPending = alwaysFalse; + this.fail(runnable, err); + delete runnable.isPending; return; } + // we cannot recover gracefully if a Runnable has already passed // then fails asynchronously var alreadyPassed = runnable.isPassed(); diff --git a/test/integration/fixtures/options/allow-uncaught/propagate.fixture.js b/test/integration/fixtures/options/allow-uncaught/propagate.fixture.js new file mode 100644 index 0000000000..86d926ed21 --- /dev/null +++ b/test/integration/fixtures/options/allow-uncaught/propagate.fixture.js @@ -0,0 +1,12 @@ +'use strict'; + +describe('Uncaught exception - throw and exit', () => { + it('test1', () => { + setTimeout(() => { + throw new Error('Uncaught error after test1'); + }, 1); + }); + it('test2', function () { }); + it('test3', function () { }); + it('test4', function () { }); +}); diff --git a/test/integration/fixtures/uncaught-pending.fixture.js b/test/integration/fixtures/uncaught-pending.fixture.js new file mode 100644 index 0000000000..593e0da251 --- /dev/null +++ b/test/integration/fixtures/uncaught-pending.fixture.js @@ -0,0 +1,15 @@ +'use strict'; + +describe('Uncaught exception within pending test', () => { + it('test1', function () { }); + + it('test2', function () { + process.nextTick(function () { + throw new Error('I am uncaught!'); + }); + this.skip(); + }); + + it('test3 - should run', function () { }); + it('test4 - should run', function () { }); +}); diff --git a/test/integration/options/allowUncaught.spec.js b/test/integration/options/allowUncaught.spec.js index a3d8739ffe..181aba1446 100644 --- a/test/integration/options/allowUncaught.spec.js +++ b/test/integration/options/allowUncaught.spec.js @@ -2,11 +2,32 @@ var path = require('path').posix; var helpers = require('../helpers'); +var runMocha = helpers.runMocha; var runMochaJSON = helpers.runMochaJSON; describe('--allow-uncaught', function() { var args = ['--allow-uncaught']; + it('should throw an uncaught error and exit process', function(done) { + var fixture = path.join('options', 'allow-uncaught', 'propagate'); + runMocha( + fixture, + args, + function(err, res) { + if (err) { + return done(err); + } + + expect(res.code, 'to be greater than', 0); + expect(res.output, 'to contain', 'Error: Uncaught error after test1'); + expect(res.passing, 'to be', 0); + expect(res.failing, 'to be', 0); + done(); + }, + {stdio: 'pipe'} + ); + }); + it('should run with conditional `this.skip()`', function(done) { var fixture = path.join('options', 'allow-uncaught', 'this-skip-it'); runMochaJSON(fixture, args, function(err, res) { diff --git a/test/integration/uncaught.spec.js b/test/integration/uncaught.spec.js index a65c4b5097..3b7e684925 100644 --- a/test/integration/uncaught.spec.js +++ b/test/integration/uncaught.spec.js @@ -63,4 +63,27 @@ describe('uncaught exceptions', function() { done(); }); }); + + it('handles uncaught exceptions within pending tests', function(done) { + run('uncaught-pending.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + + expect(res, 'to have failed') + .and('to have passed test count', 3) + .and('to have pending test count', 1) + .and('to have failed test count', 1) + .and( + 'to have passed test', + 'test1', + 'test3 - should run', + 'test4 - should run' + ) + .and('to have pending test order', 'test2') + .and('to have failed test', 'test2'); + + done(); + }); + }); }); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 67043a98bb..b3b3a903a5 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -811,9 +811,9 @@ describe('Runner', function() { sandbox.stub(runnable, 'isPending').returns(true); }); - it('should not attempt to fail', function() { + it('should attempt to fail', function() { runner.uncaught(err); - expect(runner.fail, 'was not called'); + expect(runner.fail, 'was called once'); }); }); From dca588da9a78b526454544c7e30891b1a3346e5a Mon Sep 17 00:00:00 2001 From: Peter Schmidt Date: Sat, 23 Nov 2019 03:54:34 +1100 Subject: [PATCH 1408/1771] docs: Replace :coffee: with emoji (#4092) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95e155b284..6e08396307 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Mocha test framework

              -

              :coffee: Simple, flexible, fun JavaScript test framework for Node.js & The Browser :coffee:

              +

              ☕️ Simple, flexible, fun JavaScript test framework for Node.js & The Browser ☕️

              Build Status Coverage Status FOSSA Status Gitter OpenCollective OpenCollective

              From 2de0618b56a43601d58c4e3ae3fcda2c14e11257 Mon Sep 17 00:00:00 2001 From: SheetJSDev Date: Mon, 18 Nov 2019 19:12:04 -0500 Subject: [PATCH 1409/1771] Add GH Funding Metadata --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..c63669a48e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: mochajs From 2e9c28a62ce38af104029673fc853f2fe00e5ed2 Mon Sep 17 00:00:00 2001 From: HyunSangHan Date: Sun, 13 Oct 2019 15:17:59 +0900 Subject: [PATCH 1410/1771] Change sh to bash for code block --- docs/index.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/index.md b/docs/index.md index 40d38aae84..4aea617d29 100644 --- a/docs/index.md +++ b/docs/index.md @@ -88,13 +88,13 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in Install with [npm][] globally: -```sh +```bash $ npm install --global mocha ``` or as a development dependency for your project: -```sh +```bash $ npm install --save-dev mocha ``` @@ -102,7 +102,7 @@ $ npm install --save-dev mocha ## Getting Started -```sh +```bash $ npm install mocha $ mkdir test $ $EDITOR test/test.js # or open with your favorite editor @@ -123,7 +123,7 @@ describe('Array', function() { Back in the terminal: -```sh +```bash $ ./node_modules/mocha/bin/mocha Array @@ -144,7 +144,7 @@ Set up a test script in package.json: Then run tests with: -```sh +```bash $ npm test ``` @@ -203,7 +203,7 @@ it('double done', function(done) { Running the above test will give you the below error message: -```sh +```bash $ ./node_modules/.bin/mocha mocha.test.js @@ -728,7 +728,7 @@ describe('add()', function() { The above code will produce a suite with three specs: -```sh +```bash $ mocha add() @@ -1621,7 +1621,7 @@ Instructions for doing so can be found [here][mocha-wiki-growl]. Enable Mocha's desktop notifications as follows: -```sh +```bash $ mocha --growl ``` @@ -1740,7 +1740,7 @@ As such, actual command-line arguments will take precedence over the defaults. For example, suppose you have the following `mocha.opts` file: -```sh +```bash # mocha.opts --require should --reporter dot @@ -1752,7 +1752,7 @@ library, and use `bdd` as the interface. With this, you may then invoke `mocha` with additional arguments, here changing the reporter to `list` and setting the slow threshold to half a second: -```sh +```bash $ mocha --reporter list --slow 500 ``` @@ -1766,13 +1766,13 @@ your tests in `test/` folder. If you want to include subdirectories, pass the To configure where `mocha` looks for tests, you may pass your own glob: -```sh +```bash $ mocha --recursive "./spec/*.js" ``` Some shells support recursive matching by using the globstar (`**`) wildcard. Bash >= 4.3 supports this with the [`globstar` option][bash-globbing] which [must be enabled](https://github.com/mochajs/mocha/pull/3348#issuecomment-383937247) to get the same results as passing the `--recursive` option ([ZSH][zsh-globbing] and [Fish][fish-globbing] support this by default). With recursive matching enabled, the following is the same as passing `--recursive`: -```sh +```bash $ mocha "./spec/**/*.js" ``` @@ -1857,7 +1857,7 @@ Real live example code: To run Mocha's tests, you will need GNU Make or compatible; Cygwin should work. -```sh +```bash $ cd /path/to/mocha $ npm install $ npm test From ebdee973a1c8f048bdb9d62dbfec8b55791fea95 Mon Sep 17 00:00:00 2001 From: Jan-Philip Gehrcke Date: Sat, 23 Nov 2019 09:41:27 -0800 Subject: [PATCH 1411/1771] docs: clarify invalid usage of done() (#4101) When I first read "anything else will cause a failed test" I considered that this might be a typo, and that this should say "a passed test" instead, because after all setting "no error" could mean "no error", right? I then understood that this sentence could also mean that "anything else is a programmer error", i.e. a bug and I was hoping that in _that_ case a clear error would be thrown. I tried things out and indeed found that the latter is the case > Error: done() invoked with non-Error: true This patch attempts to clarify that this is indeed all about a programmer error. --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 4aea617d29..d3d53a0e94 100644 --- a/docs/index.md +++ b/docs/index.md @@ -234,7 +234,7 @@ Mocha allows you to use any assertion library you wish. In the above example, we ## Asynchronous Code -Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()`, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else will cause a failed test. +Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()`, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). ```js describe('User', function() { From 2e816fe61272bb856583ae7daa96de2510b0386f Mon Sep 17 00:00:00 2001 From: HYUNSANG HAN Date: Sun, 24 Nov 2019 03:55:56 +0900 Subject: [PATCH 1412/1771] Add a description for installing GraphicsMagick or ImageMagick in docs/README.md (#4045) * Add a troubleshooting in README for an error about gm * Solve linting * Change dirname from local to anonymous in the example error message * Add mentioning ImageMagick --- docs/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/README.md b/docs/README.md index 203fa2e091..b9f8da6d45 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,6 +19,21 @@ _So you wanna build the site?_ - The content lives in `docs/index.md`; everything else is markup, scripts, assets, etc. - This file (`docs/README.md`) should _not_ be included in the build. - `docs/_dist` is where the deployed site lives. `docs/_site` is essentially a build step. These directories are _not_ under version control. +- If you get the error message below when running `npm start docs`, follow [this guide](https://www.npmjs.com/package/gm) to install GraphicsMagick or ImageMagick. + +```console +⚠ WARN: docs/_site/images/matomo-logo.png: Error executing Stream: The gm stream ended without emitting any data +(node:45255) UnhandledPromiseRejectionWarning: Error: docs/_site/images/matomo-logo.png: Error executing Stream: The gm stream ended without emitting any data + at Socket.stdout.on.once (/Users/username/mocha/node_modules/express-processimage/lib/getFilterInfosAndTargetContentTypeFromQueryString.js:821:31) + at Object.onceWrapper (events.js:286:20) + at Socket.emit (events.js:203:15) + at endReadableNT (_stream_readable.js:1145:12) + at process._tickCallback (internal/process/next_tick.js:63:19) +(node:45255) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2) +(node:45255) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. +cp: docs/_dist/_headers: No such file or directory +``` + - See `package-scripts.js` for details on what the builds are actually doing; especially see [markdown-magic](https://npm.im/markdown-magic) for how we're dynamically inserting information into `docs/index.md`. ## License From 47dcc5f325e31267fad47e2b14e27707d7db7528 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 26 Nov 2019 17:49:32 +0100 Subject: [PATCH 1413/1771] make uncaughtException test more stable (#4107) --- test/integration/fixtures/uncaught.fixture.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/integration/fixtures/uncaught.fixture.js b/test/integration/fixtures/uncaught.fixture.js index 6a2ded880c..2ef817001b 100644 --- a/test/integration/fixtures/uncaught.fixture.js +++ b/test/integration/fixtures/uncaught.fixture.js @@ -6,17 +6,17 @@ */ it('fails exactly once when a global error is thrown first', function (done) { - setTimeout(function () { + process.nextTick(function () { throw new Error('global error'); - }, 0); + }); }); it('fails exactly once when a global error is thrown second', function (done) { - setTimeout(function () { + process.nextTick(function () { done(new Error('test error')); - }, 0); + }); - setTimeout(function () { + process.nextTick(function () { throw new Error('global error'); - }, 0); + }); }); From e4e126f184e95a38b135f554616f9c028427f588 Mon Sep 17 00:00:00 2001 From: juergba Date: Tue, 26 Nov 2019 18:08:07 +0100 Subject: [PATCH 1414/1771] add Node v13 to CI test matrix --- .travis.yml | 8 +++++++- appveyor.yml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5fb2bdb701..adc8c5e874 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ stages: # defaults language: node_js -node_js: '12' +node_js: '13' addons: apt: packages: @@ -41,6 +41,9 @@ jobs: - &node script: npm start test.node + node_js: '12' + + - <<: *node node_js: '10' - <<: *node @@ -74,6 +77,9 @@ jobs: - ~/.npm - node_modules # npm install, unlike npm ci, doesn't wipe node_modules + - <<: *smoke + node_js: '12' + - <<: *smoke node_js: '10' diff --git a/appveyor.yml b/appveyor.yml index 4feecb1635..821ef90349 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,6 +12,7 @@ shallow_clone: true clone_depth: 1 environment: matrix: + - nodejs_version: '13' - nodejs_version: '12' - nodejs_version: '10' - nodejs_version: '8' From 2f10309e16123aae49c58cc29c1bf5de77d147fa Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 29 Nov 2019 19:56:27 +0100 Subject: [PATCH 1415/1771] Update Chokidar to v3.3.0 --- lib/cli/watch-run.js | 7 +-- package-lock.json | 104 +++++++++++++++++++++---------------------- package.json | 2 +- 3 files changed, 54 insertions(+), 59 deletions(-) diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index 32728c1061..dbb66ca4d4 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -30,10 +30,7 @@ const collectFiles = require('./collect-files'); */ module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { if (!watchFiles) { - watchFiles = fileCollectParams.extension.reduce( - (watchFiles, ext) => watchFiles.concat([`**/*.${ext}`, `**/.*.${ext}`]), - [] - ); + watchFiles = fileCollectParams.extension.map(ext => `**/*.${ext}`); } const watcher = chokidar.watch(watchFiles, { @@ -64,8 +61,6 @@ module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { process.on('SIGINT', () => { showCursor(); console.log('\n'); - // By UNIX/Posix convention this indicates that the process was - // killed by SIGINT which has portable number 2. process.exit(128 + 2); }); }; diff --git a/package-lock.json b/package-lock.json index bc79521a75..1893272bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -572,9 +572,9 @@ "dev": true }, "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -2068,7 +2068,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" }, "browser-sync": { "version": "2.26.7", @@ -2904,24 +2904,24 @@ "dev": true }, "chokidar": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", - "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", - "requires": { - "anymatch": "^3.0.1", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.1.1" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" }, "dependencies": { "anymatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", - "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2949,15 +2949,15 @@ } }, "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "optional": true }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "requires": { "is-glob": "^4.0.1" } @@ -2984,9 +2984,9 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "readdirp": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", - "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "requires": { "picomatch": "^2.0.4" } @@ -4553,7 +4553,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" }, "diffie-hellman": { "version": "5.0.3", @@ -7054,7 +7054,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7433,9 +7433,9 @@ "dev": true }, "handlebars": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", - "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7840,12 +7840,12 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" } }, @@ -11100,7 +11100,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { @@ -11159,7 +11159,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12717,7 +12717,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12923,9 +12923,9 @@ "dev": true }, "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" }, "pify": { "version": "2.3.0", @@ -16325,7 +16325,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -17299,20 +17299,20 @@ "dev": true }, "uglify-js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", - "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.0.tgz", + "integrity": "sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA==", "dev": true, "optional": true, "requires": { - "commander": "2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true }, @@ -18096,7 +18096,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index a39c349b78..7715078e88 100644 --- a/package.json +++ b/package.json @@ -524,7 +524,7 @@ "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", - "chokidar": "3.0.2", + "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", From 8c5ed3a80ee38418e680522d12c55df08ca5aa8e Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 2 Dec 2019 13:19:59 +0100 Subject: [PATCH 1416/1771] Update eslint parsing to ES2017 --- .eslintrc.yml | 4 ++-- karma.conf.js | 4 +++- package-scripts.js | 2 +- package.json | 5 +++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index a668139868..b47ddca1a3 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -29,7 +29,7 @@ overrides: - test/integration/helpers.js - lib/growl.js parserOptions: - ecmaVersion: 6 + ecmaVersion: 2017 env: browser: no @@ -77,7 +77,7 @@ overrides: - files: - test/**/*.mjs parserOptions: - ecmaVersion: 6 + ecmaVersion: 2017 sourceType: module - files: diff --git a/karma.conf.js b/karma.conf.js index 82e934bbc7..b0c713856c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -31,8 +31,10 @@ module.exports = config => { browserify: { debug: true, configure: function configure(b) { - b.ignore('glob') + b.ignore('./lib/cli/*.js') + .ignore('chokidar') .ignore('fs') + .ignore('glob') .ignore('path') .ignore('supports-color') .on('bundled', (err, content) => { diff --git a/package-scripts.js b/package-scripts.js index 6d9985b90d..0e414e1542 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -23,7 +23,7 @@ function test(testName, mochaParams) { module.exports = { scripts: { build: { - script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' --ignore chokidar -o mocha.js`, + script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore './lib/cli/*.js' --ignore 'chokidar' --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' -o mocha.js`, description: 'Build browser bundle' }, lint: { diff --git a/package.json b/package.json index 7715078e88..3135e39f89 100644 --- a/package.json +++ b/package.json @@ -626,11 +626,12 @@ "./index.js": "./browser-entry.js", "./lib/growl.js": "./lib/browser/growl.js", "tty": "./lib/browser/tty.js", + "./lib/cli/*.js": false, + "chokidar": false, "fs": false, "glob": false, "path": false, - "supports-color": false, - "chokidar": false + "supports-color": false }, "prettier": { "singleQuote": true, From 03b58f25afff19f35c4179a6f7e9adb02671d90a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 3 Dec 2019 12:41:49 -0800 Subject: [PATCH 1417/1771] initial draft of project charter [ci skip]; closes #4087 PR: #4088 --- PROJECT_CHARTER.md | 107 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 PROJECT_CHARTER.md diff --git a/PROJECT_CHARTER.md b/PROJECT_CHARTER.md new file mode 100644 index 0000000000..1f3e92e943 --- /dev/null +++ b/PROJECT_CHARTER.md @@ -0,0 +1,107 @@ +# Mocha Charter + +This project charter serves as a statement of scope and objectives for the **Mocha** project. + +## §1: Guiding Principles + +The **Mocha** project is part of the [OpenJS Foundation], which operates transparently, openly, collaboratively, and ethically. Project proposals, timelines, and status must not merely be open, but also easily visible to outsiders. + +## §2: Scope + +**Mocha** is a unopinionated, _general-purpose testing framework_ for the JavaScript community. **Mocha** favors flexibility over rigidity, stability over disruption, and deliberation over agility. **Mocha** aims to do one thing, and do it well. **Mocha** will strive to evolve with the needs of the community, but will make every effort not to abandon its current users in doing so. + +### §2.1: In-Scope + +- APIs ("interfaces") to write and organize tests written in JavaScript or compile-to-JavaScript languages +- Command-line executable to run tests in a Node.js-based terminal environment +- API to run tests in a browser environment +- Output test results and errors (provide "reporters") to: + - Terminal + - File + - Browser + - Memory +- APIs to extend functionality +- File-based and code-based configuration +- Internal test coverage for all of the above +- Documentation including (but not limited to): + - Website ([https://mochajs.org](https://mochajs.org)) contents and design + - Test-writing and test-organizing APIs + - Reporters + - [Extensible APIs](https://mochajs.org/api) + - Tutorials and [code samples](https://github.com/mochajs/mocha-examples) + - Command-line execution and options + - Browser-based execution and options + - [Project administration](https://github.com/mochajs/admin) + - [Contribution guide](https://github.com/mochajs/mocha/blob/master/.github/CONTRIBUTING.md) +- General support for multiple levels of tests, including (but not limited to): + - Unit tests + - Integration tests + - Functional/end-to-end tests + - Operational readiness tests +- Tool configuration for project tests, build, documentation or website deployment +- Bespoke tools, if needed +- LTS (long-term support) policies, processes, and release cadence +- Third-party service integrations (e.g., bots, CI servers, SCM) +- Project-endorsed spaces for collaboration (chat rooms, mailing lists, forums, etc.) +- Project-maintained social media, if any + +### §2.2: Out-of-Scope + +- [Test assertions](https://wikipedia.org/wiki/Test_assertion) and [mocks](https://en.wikipedia.org/wiki/Mock_object) or related +- Compatibility with other 3rd-party libraries not hosted under GitHub's [mochajs organization](https://github.com/mochajs) unless explicitly stated in [§2: Scope](#%c2%a72-scope) + - Note: _existence of "official" code samples does not imply explicit support_ + - Efforts must be made to retain compatibility with popular libraries, frameworks and tools, but not at the expense of Mocha itself +- Use within _unmaintained_ versions of Node.js +- Use within browsers not meeting a threshold decided upon by maintainers +- Use within non-Node.js or non-browser environments, unless otherwise explicitly stated in [§2: Scope](#%c2%a72-scope) +- "Unofficial" collaboration or Q&A spaces (including Stack Overflow and Quora) +- Certain classes of contributions: + - Bug fixes or enhancements without associated test coverage + - Features having limited general-purpose use (as determined by maintainers) + - Bug fixes which "break" more users than are affected by the bug itself, _regardless_ of "correctness" + - Breaking changes to API without demonstrated need, especially those which would cause correct, currently-passing tests to fail + - Changes that significantly negatively impact performance without demonstrated need + - Code reviews, issue comments or pull requests which are dogmatic, demanding, or excessively critical as to discourage contributions by others + - Those which violate Mocha's [Code of Conduct] + +## §3: Relationship with OpenJS Foundation CPC + +Technical leadership for the projects within the [OpenJS Foundation] is delegated to the projects through their project charters by the [OpenJS Foundation Cross-Project Council](https://openjsf.org/about/governance/) (CPC). In the case of the Mocha project, it is delegated exclusively to the maintainers of Mocha. The OpenJS Foundation's business leadership is the Board of Directors. + +Changes to the following **cannot** unilaterally be applied by project leadership, and must be ratified by the CPC: + +- Mocha's Project Charter (this document) +- Mocha's [Code of Conduct] +- Mocha's licenses: [MIT](https://github.com/mochajs/mocha/blob/master/LICENSE) (for code) and [CC-BY-4.0](https://github.com/mochajs/mocha/blob/master/docs/LICENSE-CC-BY-4.0) (for documentation/website) + +### §3.1: Other Formal Project Relationships + +Section Intentionally Left Blank + +## §4: Mocha's Governing Body + +Mocha is governed by its maintainers. See [MAINTAINERS.md] for more information. + +## §5: Roles & Responsibilities + +The roles and responsibilities of Mocha's maintainers are described in [MAINTAINERS.md]. + +### §5.1: Project Operations & Management + +Project operations and processes are described in [MAINTAINERS.md]. + +### §5.2: Decision-making, Voting, and/or Elections + +Mocha uses a loose consensus-seeking process, described in [MAINTAINERS.md]. + +### §5.3: Other Project Roles + +Section Intentionally Left Blank + +## §6: Definitions + +Section Intentionally Left Blank + +[openjs foundation]: https://openjsf.org +[maintainers.md]: https://github.com/mochajs/mocha/blob/master/MAINTAINERS.md +[code of conduct]: https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md From aab855538fe23720f59f577b4f71d18c5298e4aa Mon Sep 17 00:00:00 2001 From: Robert Kieffer Date: Fri, 13 Dec 2019 03:41:07 -0800 Subject: [PATCH 1418/1771] Type "rs\n" to restart tests, fixes #871 (#3979) * Type "rs\n" to restart tests, fixes #871 Although the `--watch` feature is somewhat controversial (see #1780), is there any reason not to make it a little easier to use in the meantime? This adds nodemon's shortcut (`rs\n`) for manually restarting. * fix lint errors, add unit test * write to mochaProcess.stdin * Trigger travis build * add documentation * restore trailing whitespace * empty commit (to rerun tests) --- README.md | 8 ++++---- docs/index.md | 2 ++ lib/cli/watch-run.js | 11 +++++++++++ test/integration/options/watch.spec.js | 15 +++++++++++++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6e08396307..3dc8ac25d0 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ ## Sponsors -Does your company use Mocha? Ask your manager or marketing team if your company would be interested in supporting our project. Support will allow the maintainers to dedicate more time for maintenance and new features for everyone. Also, your company's logo will show [on GitHub](https://github.com/mochajs/mocha#readme) and on [our site](https://mochajs.org) - who doesn't want a little extra exposure? [Here's the info](https://opencollective.com/mochajs#sponsor). +Does your company use Mocha? Ask your manager or marketing team if your company would be interested in supporting our project. Support will allow the maintainers to dedicate more time for maintenance and new features for everyone. Also, your company's logo will show [on GitHub](https://github.com/mochajs/mocha#readme) and on [our site](https://mochajs.org) - who doesn't want a little extra exposure? [Here's the info](https://opencollective.com/mochajs#sponsor). [![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/0/avatar)](https://opencollective.com/mochajs/sponsor/0/website) [![MochaJS Sponsor](https://opencollective.com/mochajs/sponsor/1/avatar)](https://opencollective.com/mochajs/sponsor/1/website) @@ -83,12 +83,12 @@ Does your company use Mocha? Ask your manager or marketing team if your company You might want to know that: -- Mocha is the *most-depended-upon* module on npm (source: [libraries.io](https://libraries.io/search?order=desc&platforms=NPM&sort=dependents_count)), and -- Mocha is an *independent* open-source project, maintained exclusively by volunteers. +- Mocha is the _most-depended-upon_ module on npm (source: [libraries.io](https://libraries.io/search?order=desc&platforms=NPM&sort=dependents_count)), and +- Mocha is an _independent_ open-source project, maintained exclusively by volunteers. You might want to help: -- New to contributing to Mocha? Check out this list of [good first issues](https://github.com/mochajs/mocha/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue) +- New to contributing to Mocha? Check out this list of [good first issues](https://github.com/mochajs/mocha/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue) - Mocha could use a hand with [these issues](https://github.com/mochajs/mocha/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) - The [maintainer's handbook](https://github.com/mochajs/mocha/blob/master/MAINTAINERS.md) explains how things get done diff --git a/docs/index.md b/docs/index.md index d3d53a0e94..788dbf1e52 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1137,6 +1137,8 @@ Rerun tests on file changes. The `--watch-files` and `--watch-ignore` options can be used to control which files are watched for changes. +Tests may be rerun manually by typing ⓡ ⓢ ⏎ (same shortcut as `nodemon`). + ### `--watch-files ` > _New in v7.0.0_ diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index dbb66ca4d4..b35a906959 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -63,6 +63,17 @@ module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { console.log('\n'); process.exit(128 + 2); }); + + // Keyboard shortcut for restarting when "rs\n" is typed (ala Nodemon) + process.stdin.resume(); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', data => { + const str = data + .toString() + .trim() + .toLowerCase(); + if (str === 'rs') rerunner.scheduleRun(); + }); }; /** diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 0843380990..f5cd382dee 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -137,6 +137,17 @@ describe('--watch', function() { }); }); + it('reruns when "rs\\n" typed', function() { + const testFile = path.join(this.tempDir, 'test.js'); + copyFixture('__default__', testFile); + + return runMochaWatch([testFile], this.tempDir, mochaProcess => { + mochaProcess.stdin.write('rs\n'); + }).then(results => { + expect(results, 'to have length', 2); + }); + }); + it('reruns test when file starting with . and matching --extension is changed', function() { const testFile = path.join(this.tempDir, 'test.js'); copyFixture('__default__', testFile); @@ -282,11 +293,11 @@ describe('--watch', function() { function runMochaWatch(args, cwd, change) { const [mochaProcess, resultPromise] = helpers.invokeMochaAsync( [...args, '--watch', '--reporter', 'json'], - {cwd} + {cwd, stdio: 'pipe'} ); return sleep(1000) - .then(() => change()) + .then(() => change(mochaProcess)) .then(() => sleep(1000)) .then(() => { mochaProcess.kill('SIGINT'); From d4adfa6364dff21c37e8632c3bfc9288c9938f42 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 15 Dec 2019 10:26:39 +0100 Subject: [PATCH 1419/1771] Fix timeout handling with `--inspect-brk`/`--inspect` --- bin/mocha | 4 +++- .../fixtures/options/slow-test.fixture.js | 4 ++-- test/integration/options/timeout.spec.js | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/bin/mocha b/bin/mocha index 4b0ab8ff86..9c63463790 100755 --- a/bin/mocha +++ b/bin/mocha @@ -54,12 +54,14 @@ const trimV8Option = value => Object.keys(opts).forEach(opt => { if (isNodeFlag(opt)) { nodeArgs[trimV8Option(opt)] = opts[opt]; - disableTimeouts(opt); } else { mochaArgs[opt] = opts[opt]; } }); +// disable 'timeout' for debugFlags +Object.keys(nodeArgs).forEach(opt => disableTimeouts(opt)); + // Native debugger handling // see https://nodejs.org/api/debugger.html#debugger_debugger // look for 'inspect' or 'debug' that would launch this debugger, diff --git a/test/integration/fixtures/options/slow-test.fixture.js b/test/integration/fixtures/options/slow-test.fixture.js index f15cb6d9dd..952e656743 100644 --- a/test/integration/fixtures/options/slow-test.fixture.js +++ b/test/integration/fixtures/options/slow-test.fixture.js @@ -5,7 +5,7 @@ describe('a suite', function() { setTimeout(done, 500); }); - it('should succeed in 1.5s', function(done) { - setTimeout(done, 1500); + it('should succeed in 1.1s', function(done) { + setTimeout(done, 1100); }); }); diff --git a/test/integration/options/timeout.spec.js b/test/integration/options/timeout.spec.js index ac786da54d..4470c8b310 100644 --- a/test/integration/options/timeout.spec.js +++ b/test/integration/options/timeout.spec.js @@ -49,4 +49,19 @@ describe('--timeout', function() { done(); }); }); + + it('should disable timeout with --inspect', function(done) { + var fixture = 'options/slow-test'; + runMochaJSON(fixture, ['--inspect', '--timeout', '200'], function( + err, + res + ) { + if (err) { + done(err); + return; + } + expect(res, 'to have passed').and('to have passed test count', 2); + done(); + }); + }); }); From 25363e628af793841e2911f61b64b95bf8c6ebaf Mon Sep 17 00:00:00 2001 From: Saerom Bang Date: Sun, 15 Dec 2019 19:03:51 +0900 Subject: [PATCH 1420/1771] Changed docs index.md on Typescript and Babel link (#4129) --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 788dbf1e52..1da20d7263 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1883,14 +1883,14 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [connect-test-output]: https://github.com/senchalabs/connect/blob/90a725343c2945aaee637e799b1cd11e065b2bff/tests.md [emacs]: https://www.gnu.org/software/emacs/ [emacs-mocha.el]: https://github.com/scottaj/mocha.el -[example-babel]: https://github.com/mochajs/mocha-examples/tree/master/babel +[example-babel]: https://github.com/mochajs/mocha-examples/tree/master/packages/babel [example-connect-test]: https://github.com/senchalabs/connect/tree/master/test [example-express-test]: https://github.com/visionmedia/express/tree/master/test [example-mocha-test]: https://github.com/mochajs/mocha/tree/master/test [example-mocha-config]: https://github.com/mochajs/mocha/tree/master/example/config [example-superagent-test]: https://github.com/visionmedia/superagent/tree/master/test/node [example-third-party-reporter]: https://github.com/mochajs/mocha-examples/tree/master/third-party-reporter -[example-typescript]: https://github.com/mochajs/mocha-examples/tree/master/typescript +[example-typescript]: https://github.com/mochajs/mocha-examples/tree/master/packages/typescript [example-websocket.io-test]: https://github.com/LearnBoost/websocket.io/tree/master/test [expect.js]: https://github.com/LearnBoost/expect.js [expresso]: https://github.com/tj/expresso From d9f5079b3b26c61fec3329a902dea00ccc961f70 Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Mon, 16 Dec 2019 08:00:02 +0000 Subject: [PATCH 1421/1771] Update node-environment-flags to 1.0.6 (#4118) node-environment-flags 1.0.5 and lower do not contain a LICENSE file which can make compliance difficult. --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1893272bf4..83e2141110 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11374,18 +11374,18 @@ } }, "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, diff --git a/package.json b/package.json index 3135e39f89..378a91a8ba 100644 --- a/package.json +++ b/package.json @@ -537,7 +537,7 @@ "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", - "node-environment-flags": "1.0.5", + "node-environment-flags": "1.0.6", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", From 1412dc80d87d0479f7f1d60202da2b33c90eb939 Mon Sep 17 00:00:00 2001 From: Rens Groothuijsen Date: Sun, 22 Dec 2019 16:21:35 +0100 Subject: [PATCH 1422/1771] XUnit reporter should handle exceptions during diff generation (#4068) --- lib/reporters/base.js | 20 +++++++++++++++----- lib/reporters/xunit.js | 6 +++--- test/reporters/xunit.spec.js | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index e5ed0d4c61..ea259445e3 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -154,14 +154,14 @@ exports.cursor = { } }; -function showDiff(err) { +var showDiff = (exports.showDiff = function(err) { return ( err && err.showDiff !== false && sameType(err.actual, err.expected) && err.expected !== undefined ); -} +}); function stringifyDiffObjs(err) { if (!utils.isString(err.actual) || !utils.isString(err.expected)) { @@ -182,9 +182,19 @@ function stringifyDiffObjs(err) { * @return {string} Diff */ var generateDiff = (exports.generateDiff = function(actual, expected) { - return exports.inlineDiffs - ? inlineDiff(actual, expected) - : unifiedDiff(actual, expected); + try { + return exports.inlineDiffs + ? inlineDiff(actual, expected) + : unifiedDiff(actual, expected); + } catch (err) { + var msg = + '\n ' + + color('diff added', '+ expected') + + ' ' + + color('diff removed', '- actual: failed to generate Mocha diff') + + '\n'; + return msg; + } }); /** diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 6c9c937be8..da366cdaa1 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -163,9 +163,9 @@ XUnit.prototype.test = function(test) { if (test.state === STATE_FAILED) { var err = test.err; var diff = - Base.hideDiff || !err.actual || !err.expected - ? '' - : '\n' + Base.generateDiff(err.actual, err.expected); + !Base.hideDiff && Base.showDiff(err) + ? '\n' + Base.generateDiff(err.actual, err.expected) + : ''; this.write( tag( 'testcase', diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 2d05312fae..736f9d1112 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -350,6 +350,42 @@ describe('XUnit reporter', function() { ''; expect(expectedWrite, 'to be', expectedTag); }); + + it('should handle non-string diff values', function() { + var runner = new EventEmitter(); + createStatsCollector(runner); + var xunit = new XUnit(runner); + + var expectedTest = { + state: STATE_FAILED, + title: expectedTitle, + parent: { + fullTitle: function() { + return expectedClassName; + } + }, + duration: 1000, + err: { + actual: 1, + expected: 2, + message: expectedMessage, + stack: expectedStack + } + }; + + sandbox.stub(xunit, 'write').callsFake(function(str) { + expectedWrite += str; + }); + + runner.emit(EVENT_TEST_FAIL, expectedTest, expectedTest.err); + runner.emit(EVENT_RUN_END); + sandbox.restore(); + + var expectedDiff = + '\n + expected - actual\n\n -1\n +2\n '; + + expect(expectedWrite, 'to contain', expectedDiff); + }); }); describe('on test pending', function() { From 24c22bef53e4539dd17b0d3b2123953bb8a3a883 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 1 Jan 2020 09:36:31 +0100 Subject: [PATCH 1423/1771] Fix hook pattern of this.skip() in beforeEach hooks (#3741) --- lib/runner.js | 28 ++++++++--- .../pending/skip-async-beforeEach.fixture.js | 46 ++++++++++++++---- .../skip-sync-beforeEach-cond.fixture.js | 28 +++++++++++ .../pending/skip-sync-beforeEach.fixture.js | 40 ++++++++++++++-- test/integration/pending.spec.js | 48 ++++++++++++++----- 5 files changed, 157 insertions(+), 33 deletions(-) create mode 100644 test/integration/fixtures/pending/skip-sync-beforeEach-cond.fixture.js diff --git a/lib/runner.js b/lib/runner.js index 374a6143bf..5f148d8abd 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -315,8 +315,7 @@ Runner.prototype.fail = function(test, err) { * - Failed `before each` hook skips remaining tests in a * suite and jumps to corresponding `after each` hook, * which is run only once - * - Failed `after` hook does not alter - * execution order + * - Failed `after` hook does not alter execution order * - Failed `after each` hook skips remaining tests in a * suite and subsuites, but executes other `after each` * hooks @@ -386,7 +385,7 @@ Runner.prototype.hook = function(name, fn) { if (testError) { self.fail(self.test, testError); } - // conditional this.skip() + // conditional skip if (hook.pending) { if (name === HOOK_TYPE_AFTER_ALL) { utils.deprecate( @@ -394,11 +393,20 @@ Runner.prototype.hook = function(name, fn) { 'Use a return statement or other means to abort hook execution.' ); } - if (name === HOOK_TYPE_BEFORE_EACH || name === HOOK_TYPE_AFTER_EACH) { + if (name === HOOK_TYPE_AFTER_EACH) { + // TODO define and implement use case if (self.test) { self.test.pending = true; } + } else if (name === HOOK_TYPE_BEFORE_EACH) { + if (self.test) { + self.test.pending = true; + } + self.emit(constants.EVENT_HOOK_END, hook); + hook.pending = false; // activates hook for next test + return fn(new Error('abort hookDown')); } else { + // TODO throw error for afterAll suite.tests.forEach(function(test) { test.pending = true; }); @@ -619,6 +627,7 @@ Runner.prototype.runTests = function(suite, fn) { return; } + // static skip, no hooks are executed if (test.isPending()) { if (self.forbidPending) { test.isPending = alwaysFalse; @@ -634,6 +643,7 @@ Runner.prototype.runTests = function(suite, fn) { // execute test and hook(s) self.emit(constants.EVENT_TEST_BEGIN, (self.test = test)); self.hookDown(HOOK_TYPE_BEFORE_EACH, function(err, errSuite) { + // conditional skip within beforeEach if (test.isPending()) { if (self.forbidPending) { test.isPending = alwaysFalse; @@ -643,7 +653,13 @@ Runner.prototype.runTests = function(suite, fn) { self.emit(constants.EVENT_TEST_PENDING, test); } self.emit(constants.EVENT_TEST_END, test); - return next(); + // skip inner afterEach hooks below errSuite level + var origSuite = self.suite; + self.suite = errSuite; + return self.hookUp(HOOK_TYPE_AFTER_EACH, function(e, eSuite) { + self.suite = origSuite; + next(e, eSuite); + }); } if (err) { return hookErr(err, errSuite, false); @@ -651,7 +667,7 @@ Runner.prototype.runTests = function(suite, fn) { self.currentRunnable = self.test; self.runTest(function(err) { test = self.test; - // conditional this.skip() + // conditional skip within it if (test.pending) { if (self.forbidPending) { test.isPending = alwaysFalse; diff --git a/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js b/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js index a450e44bdd..73f188d100 100644 --- a/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js +++ b/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js @@ -1,20 +1,48 @@ 'use strict'; +var assert = require('assert'); -describe('skip in beforeEach', function () { - beforeEach(function (done) { +describe('skip in beforeEach', function() { + var runOrder = []; + beforeEach(function(done) { + runOrder.push('beforeEach'); var self = this; - setTimeout(function () { + setTimeout(function() { self.skip(); // done() is not required - }, 0); + }, 10); }); - it('should skip this test-1', function () { + it('should skip this test-1', function() { throw new Error('never run this test'); }); - it('should skip this test-2', function () { - throw new Error('never run this test'); + + describe('inner', function() { + beforeEach(function() { + runOrder.push('should not run'); + }); + + it('should skip this test-2', function() { + throw new Error('never run this test'); + }); + it('should skip this test-3', function() { + throw new Error('never run this test'); + }); + + afterEach(function() { + runOrder.push('should not run'); + }); }); - it('should skip this test-3', function () { - throw new Error('never run this test'); + + afterEach(function() { + runOrder.push('afterEach'); + }); + after(function() { + runOrder.push('after'); + assert.deepStrictEqual(runOrder, [ + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'after' + ]); + throw new Error('should throw this error'); }); }); diff --git a/test/integration/fixtures/pending/skip-sync-beforeEach-cond.fixture.js b/test/integration/fixtures/pending/skip-sync-beforeEach-cond.fixture.js new file mode 100644 index 0000000000..ff7d3c8ea6 --- /dev/null +++ b/test/integration/fixtures/pending/skip-sync-beforeEach-cond.fixture.js @@ -0,0 +1,28 @@ +'use strict'; + +describe('skip conditionally in beforeEach', function() { + var n = 1; + beforeEach(function() { + if (n !== 2) { + this.skip(); + } + }); + + it('should skip this test-1', function() { + throw new Error('never run this test'); + }); + it('should run this test-2', function() {}); + + describe('inner suite', function() { + it('should skip this test-3', function() { + throw new Error('never run this test'); + }); + }); + + afterEach(function() { n++; }); + after(function() { + if (n === 4) { + throw new Error('should throw this error'); + } + }); +}); diff --git a/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js b/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js index 2312265613..43ad644224 100644 --- a/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js +++ b/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js @@ -1,15 +1,45 @@ 'use strict'; +var assert = require('assert'); -describe('skip in beforeEach', function () { - beforeEach(function () { +describe('skip in beforeEach', function() { + var runOrder = []; + beforeEach(function() { + runOrder.push('beforeEach'); this.skip(); }); - it('should never run this test', function () { + it('should skip this test-1', function() { throw new Error('never run this test'); }); - it('should never run this test', function () { - throw new Error('never run this test'); + describe('inner', function() { + beforeEach(function() { + runOrder.push('should not run'); + }); + + it('should skip this test-2', function() { + throw new Error('never run this test'); + }); + it('should skip this test-3', function() { + throw new Error('never run this test'); + }); + + afterEach(function() { + runOrder.push('should not run'); + }); + }); + + afterEach(function() { + runOrder.push('afterEach'); + }); + after(function() { + runOrder.push('after'); + assert.deepStrictEqual(runOrder, [ + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'beforeEach', 'afterEach', + 'after' + ]); + throw new Error('should throw this error'); }); }); diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index 98620c8c9a..3232fb0805 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -170,18 +170,40 @@ describe('pending', function() { describe('in beforeEach', function() { it('should skip all suite specs', function(done) { - run('pending/skip-sync-beforeEach.fixture.js', args, function( - err, - res - ) { + var fixture = 'pending/skip-sync-beforeEach.fixture.js'; + run(fixture, args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 2); - assert.strictEqual(res.stats.passes, 0); - assert.strictEqual(res.stats.failures, 0); - assert.strictEqual(res.code, 0); + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 3) + .and( + 'to have pending test order', + 'should skip this test-1', + 'should skip this test-2', + 'should skip this test-3' + ) + .and('to have passed test count', 0); + done(); + }); + }); + it('should skip only two suite specs', function(done) { + var fixture = 'pending/skip-sync-beforeEach-cond.fixture.js'; + run(fixture, args, function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 2) + .and( + 'to have pending test order', + 'should skip this test-1', + 'should skip this test-3' + ) + .and('to have passed test count', 1) + .and('to have passed test', 'should run this test-2'); done(); }); }); @@ -287,8 +309,8 @@ describe('pending', function() { if (err) { return done(err); } - expect(res, 'to have passed') - .and('to have passed test count', 0) + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) .and('to have pending test count', 3) .and( 'to have pending test order', @@ -296,7 +318,7 @@ describe('pending', function() { 'should skip this test-2', 'should skip this test-3' ) - .and('to have failed test count', 0); + .and('to have passed test count', 0); done(); }); }); From 3bd2d28bfc99b5f71efc9ef332ae9ac4a5d90de8 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 3 Jan 2020 17:12:32 +0100 Subject: [PATCH 1424/1771] Forbid this.skip() within afterAll hooks (#4136) --- docs/index.md | 4 +-- lib/runner.js | 19 +++++----- .../pending/skip-sync-after.fixture.js | 3 +- test/integration/pending.spec.js | 35 +++++++++---------- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/docs/index.md b/docs/index.md index 1da20d7263..99de60f738 100644 --- a/docs/index.md +++ b/docs/index.md @@ -666,9 +666,9 @@ describe('outer', function() { }); ``` -Skipping a test within an "after all" hook is deprecated and will throw an exception in a future version of Mocha. Use a return statement or other means to abort hook execution. +> _Updated in v7.0.0. Skipping a test within an "after all" hook is disallowed and will throw an exception. Use a return statement or other means to abort hook execution._ -> Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and hooks. +Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and hooks. ## Retry Tests diff --git a/lib/runner.js b/lib/runner.js index 5f148d8abd..3340567f26 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -24,8 +24,9 @@ var sQuote = utils.sQuote; var stackFilter = utils.stackTraceFilter(); var stringify = utils.stringify; var type = utils.type; -var createInvalidExceptionError = require('./errors') - .createInvalidExceptionError; +var errors = require('./errors'); +var createInvalidExceptionError = errors.createInvalidExceptionError; +var createUnsupportedError = errors.createUnsupportedError; /** * Non-enumerable globals. @@ -387,12 +388,6 @@ Runner.prototype.hook = function(name, fn) { } // conditional skip if (hook.pending) { - if (name === HOOK_TYPE_AFTER_ALL) { - utils.deprecate( - 'Skipping a test within an "after all" hook is DEPRECATED and will throw an exception in a future version of Mocha. ' + - 'Use a return statement or other means to abort hook execution.' - ); - } if (name === HOOK_TYPE_AFTER_EACH) { // TODO define and implement use case if (self.test) { @@ -405,14 +400,18 @@ Runner.prototype.hook = function(name, fn) { self.emit(constants.EVENT_HOOK_END, hook); hook.pending = false; // activates hook for next test return fn(new Error('abort hookDown')); - } else { - // TODO throw error for afterAll + } else if (name === HOOK_TYPE_BEFORE_ALL) { suite.tests.forEach(function(test) { test.pending = true; }); suite.suites.forEach(function(suite) { suite.pending = true; }); + } else { + hook.pending = false; + var errForbid = createUnsupportedError('`this.skip` forbidden'); + self.failHook(hook, errForbid); + return fn(errForbid); } } else if (err) { self.failHook(hook, err); diff --git a/test/integration/fixtures/pending/skip-sync-after.fixture.js b/test/integration/fixtures/pending/skip-sync-after.fixture.js index 45c6521f3c..8a2420619b 100644 --- a/test/integration/fixtures/pending/skip-sync-after.fixture.js +++ b/test/integration/fixtures/pending/skip-sync-after.fixture.js @@ -3,9 +3,8 @@ describe('skip in after', function () { it('should run this test-1', function () {}); - after('should print DeprecationWarning', function () { + after('should throw "this.skip forbidden"', function () { this.skip(); - throw new Error('never throws this error'); }); describe('inner suite', function () { diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index 3232fb0805..7179ff187b 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -73,24 +73,23 @@ describe('pending', function() { }); describe('in after', function() { - it('should run all tests', function(done) { - runMocha( - 'pending/skip-sync-after.fixture.js', - args, - function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to have passed').and('to satisfy', { - passing: 3, - failing: 0, - pending: 0, - output: expect.it('to contain', '"after all" hook is DEPRECATED') - }); - done(); - }, - 'pipe' - ); + it('should throw, but run all tests', function(done) { + run('pending/skip-sync-after.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with error', '`this.skip` forbidden') + .and('to have failed test count', 1) + .and('to have pending test count', 0) + .and('to have passed test count', 3) + .and( + 'to have passed test order', + 'should run this test-1', + 'should run this test-2', + 'should run this test-3' + ); + done(); + }); }); }); From 35cf39b14eae6dbd1fb364c215093095d5912ebc Mon Sep 17 00:00:00 2001 From: Hugo Kim Date: Sat, 4 Jan 2020 02:18:55 +0900 Subject: [PATCH 1425/1771] Add reporter alias names to docs (#4127) --- docs/index.md | 58 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/docs/index.md b/docs/index.md index 99de60f738..df24f6853e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1376,69 +1376,91 @@ Mocha reporters adjust to the terminal window, and always disable ANSI-escape co ### Spec -This is the default reporter. The "spec" reporter outputs a hierarchical view nested just as the test cases are. +Alias: `Spec`, `spec` + +This is the default reporter. The Spec reporter outputs a hierarchical view nested just as the test cases are. ![spec reporter](images/reporter-spec.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Dot Matrix -The dot matrix (or "dot") reporter is simply a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. +Alias: `Dot`, `dot` + +The Dot Matrix reporter is simply a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. ![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Nyan -The "nyan" reporter is exactly what you might expect: +Alias: `Nyan`, `nyan` + +The Nyan reporter is exactly what you might expect: ![js nyan cat reporter](images/reporter-nyan.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### TAP +Alias: `TAP`, `tap` + The TAP reporter emits lines for a [Test-Anything-Protocol][] consumer. ![test anything protocol](images/reporter-tap.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Landing Strip -The Landing Strip (`landing`) reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw +Alias: `Landing`, `landing` + +The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw ![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### List -The "list" reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at the bottom of the output. +Alias: `List`, `list` + +The List reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at the bottom of the output. ![list reporter](images/reporter-list.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Progress -The "progress" reporter implements a simple progress-bar: +Alias: `Progress`, `progress` + +The Progress reporter implements a simple progress-bar: ![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### JSON -The "JSON" reporter outputs a single large JSON object when the tests have completed (failures or not). +Alias: `JSON`, `json` + +The JSON reporter outputs a single large JSON object when the tests have completed (failures or not). ![json reporter](images/reporter-json.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### JSON Stream -The "JSON stream" reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. +Alias: `JSONStream`, `json-stream` + +The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. ![json stream reporter](images/reporter-json-stream.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Min -The "min" reporter displays the summary only, while still outputting errors on failure. This reporter works great with `--watch` as it clears the terminal in order to keep your test summary at the top. +Alias: `Min`, `min` + +The Min reporter displays the summary only, while still outputting errors on failure. This reporter works great with `--watch` as it clears the terminal in order to keep your test summary at the top. ![min reporter](images/reporter-min.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} ### Doc -The "doc" reporter outputs a hierarchical HTML body representation of your tests. Wrap it with a header, footer, and some styling, then you have some fantastic documentation! +Alias: `Doc`, `doc` + +The Doc reporter outputs a hierarchical HTML body representation of your tests. Wrap it with a header, footer, and some styling, then you have some fantastic documentation! ![doc reporter](images/reporter-doc.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} @@ -1485,18 +1507,22 @@ View SuperAgent's [Makefile][superagent-makefile] for reference. ### Markdown -The "markdown" reporter generates a markdown TOC and body for your test suite. +Alias: `Markdown`, `markdown` + +The Markdown reporter generates a markdown TOC and body for your test suite. This is great if you want to use the tests as documentation within a Github wiki page, or a markdown file in the repository that Github can render. For example, here is the Connect [test output][connect-test-output]. ### XUnit -The `xunit` reporter is also available. It outputs an XUnit-compatible XML document, often applicable in CI servers. +Alias: `XUnit`, `xunit` + +The XUnit reporter is also available. It outputs an XUnit-compatible XML document, often applicable in CI servers. -By default, it will output to the console. To write directly to a file, use `--reporter-options output=filename.xml`. +By default, it will output to the console. To write directly to a file, use `--reporter-option output=filename.xml`. -To specify custom report title, use `--reporter-options suiteName="Custom name"`. +To specify custom report title, use `--reporter-option suiteName="Custom name"`. ### Third-Party Reporters @@ -1509,6 +1535,8 @@ Examples: ### HTML Reporter +Alias: `HTML`, `html` + **The HTML reporter is not intended for use on the command-line.** ## Running Mocha in the Browser @@ -1889,7 +1917,7 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [example-mocha-test]: https://github.com/mochajs/mocha/tree/master/test [example-mocha-config]: https://github.com/mochajs/mocha/tree/master/example/config [example-superagent-test]: https://github.com/visionmedia/superagent/tree/master/test/node -[example-third-party-reporter]: https://github.com/mochajs/mocha-examples/tree/master/third-party-reporter +[example-third-party-reporter]: https://github.com/mochajs/mocha-examples/tree/master/packages/third-party-reporter [example-typescript]: https://github.com/mochajs/mocha-examples/tree/master/packages/typescript [example-websocket.io-test]: https://github.com/LearnBoost/websocket.io/tree/master/test [expect.js]: https://github.com/LearnBoost/expect.js From 99e085f1fb924deeb87290adb476f4e375e72392 Mon Sep 17 00:00:00 2001 From: juergba Date: Sat, 4 Jan 2020 10:52:42 +0100 Subject: [PATCH 1426/1771] update CHANGELOG for v7.0.0 [ci skip] --- CHANGELOG.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8236b4b21f..d2f1f52f74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,62 @@ +# 7.0.0 / 2020-01-05 + +## :boom: Breaking Changes + +- #3885: **Drop Node.js v6.x support** (@mojosoeun) +- #3890: Remove Node.js debug-related flags `--debug`/`--debug-brk` and deprecate `debug` argument (@juergba) +- #3962: Changes to command-line options (@ParkSB): + - `--list-interfaces` replaces `--interfaces` + - `--list-reporters` replaces `--reporters` +- Hook pattern of `this.skip()` (@juergba): + - #3859: When conditionally skipping in a `it` test, related `afterEach` hooks are now executed + - #3741: When conditionally skipping in a `beforeEach` hook, subsequent inner `beforeEach` hooks are now skipped and related `afterEach` hooks are executed + - #4136: Disallow `this.skip()` within `after` hooks +- #3967: Remove deprecated `getOptions()` and `lib/cli/options.js` (@juergba) +- #4083: Uncaught exception in `pending` test: don't swallow, but retrospectively fail the test for correct exit code (@juergba) +- #4004: Align `Mocha` constructor's option names with command-line options (@juergba) + +## :tada: Enhancements + +- #3980: Refactor and improve `--watch` mode with chokidar (@geigerzaehler): + - adds command-line options `--watch-files` and `--watch-ignore` + - removes `--watch-extensions` +- #3979: Type "rs\n" to restart tests (@broofa) + +## :fax: Deprecations + +These are _soft_-deprecated, and will emit a warning upon use. Support will be removed in (likely) the next major version of Mocha: + +- #3968: Deprecate legacy configuration via `mocha.opts` (@juergba) + +## :bug: Fixes + +- #4125: Fix timeout handling with `--inspect-brk`/`--inspect` (@juergba) +- #4070: `Mocha` constructor: improve browser setup (@juergba) +- #4068: XUnit reporter should handle exceptions during diff generation (@rgroothuijsen) +- #4030: Fix `--allow-uncaught` with `this.skip()` (@juergba) + +## :mag: Coverage + +- #4109: Add Node.js v13.x to CI test matrix (@juergba) + +## :book: Documentation + +- #4129: Fix broken links (@SaeromB) +- #4127: Add reporter alias names to docs (@khg0712) +- #4101: Clarify invalid usage of `done()` (@jgehrcke) +- #4092: Replace `:coffee:` with emoji ☕️ (@pzrq) +- #4088: Initial draft of project charter (@boneskull) +- #4066: Change `sh` to `bash` for code block in docs/index.md (@HyunSangHan) +- #4045: Update README.md concerning GraphicsMagick installation (@HyunSangHan) +- #3988: Fix sponsors background color for readability (@outsideris) + +## :nut_and_bolt: Other + +- #4118: Update node-environment-flags to 1.0.6 (@kylef) +- #4097: Add GH Funding Metadata (@SheetJSDev) +- #4089: Add funding information to `package.json` (@Munter) +- #4077: Improve integration tests (@soobing) + # 6.2.2 / 2019-10-18 ## :bug: Fixes From 69339a3e7710a790b106b922ce53fcb87772f689 Mon Sep 17 00:00:00 2001 From: juergba Date: Sat, 4 Jan 2020 18:43:48 +0100 Subject: [PATCH 1427/1771] Release v7.0.0 --- CHANGELOG.md | 60 +++++++++++++++++++++++------------------------ package-lock.json | 2 +- package.json | 15 +++++++++++- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2f1f52f74..998c625ff2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,60 +2,60 @@ ## :boom: Breaking Changes -- #3885: **Drop Node.js v6.x support** (@mojosoeun) -- #3890: Remove Node.js debug-related flags `--debug`/`--debug-brk` and deprecate `debug` argument (@juergba) -- #3962: Changes to command-line options (@ParkSB): +- [#3885](https://github.com/mochajs/mocha/issues/3885): **Drop Node.js v6.x support** ([**@mojosoeun**](https://github.com/mojosoeun)) +- [#3890](https://github.com/mochajs/mocha/issues/3890): Remove Node.js debug-related flags `--debug`/`--debug-brk` and deprecate `debug` argument ([**@juergba**](https://github.com/juergba)) +- [#3962](https://github.com/mochajs/mocha/issues/3962): Changes to command-line options ([**@ParkSB**](https://github.com/ParkSB)): - `--list-interfaces` replaces `--interfaces` - `--list-reporters` replaces `--reporters` -- Hook pattern of `this.skip()` (@juergba): - - #3859: When conditionally skipping in a `it` test, related `afterEach` hooks are now executed - - #3741: When conditionally skipping in a `beforeEach` hook, subsequent inner `beforeEach` hooks are now skipped and related `afterEach` hooks are executed - - #4136: Disallow `this.skip()` within `after` hooks -- #3967: Remove deprecated `getOptions()` and `lib/cli/options.js` (@juergba) -- #4083: Uncaught exception in `pending` test: don't swallow, but retrospectively fail the test for correct exit code (@juergba) -- #4004: Align `Mocha` constructor's option names with command-line options (@juergba) +- Hook pattern of `this.skip()` ([**@juergba**](https://github.com/juergba)): + - [#3859](https://github.com/mochajs/mocha/issues/3859): When conditionally skipping in a `it` test, related `afterEach` hooks are now executed + - [#3741](https://github.com/mochajs/mocha/issues/3741): When conditionally skipping in a `beforeEach` hook, subsequent inner `beforeEach` hooks are now skipped and related `afterEach` hooks are executed + - [#4136](https://github.com/mochajs/mocha/issues/4136): Disallow `this.skip()` within `after` hooks +- [#3967](https://github.com/mochajs/mocha/issues/3967): Remove deprecated `getOptions()` and `lib/cli/options.js` ([**@juergba**](https://github.com/juergba)) +- [#4083](https://github.com/mochajs/mocha/issues/4083): Uncaught exception in `pending` test: don't swallow, but retrospectively fail the test for correct exit code ([**@juergba**](https://github.com/juergba)) +- [#4004](https://github.com/mochajs/mocha/issues/4004): Align `Mocha` constructor's option names with command-line options ([**@juergba**](https://github.com/juergba)) ## :tada: Enhancements -- #3980: Refactor and improve `--watch` mode with chokidar (@geigerzaehler): +- [#3980](https://github.com/mochajs/mocha/issues/3980): Refactor and improve `--watch` mode with chokidar ([**@geigerzaehler**](https://github.com/geigerzaehler)): - adds command-line options `--watch-files` and `--watch-ignore` - removes `--watch-extensions` -- #3979: Type "rs\n" to restart tests (@broofa) +- [#3979](https://github.com/mochajs/mocha/issues/3979): Type "rs\\n" to restart tests ([**@broofa**](https://github.com/broofa)) ## :fax: Deprecations These are _soft_-deprecated, and will emit a warning upon use. Support will be removed in (likely) the next major version of Mocha: -- #3968: Deprecate legacy configuration via `mocha.opts` (@juergba) +- [#3968](https://github.com/mochajs/mocha/issues/3968): Deprecate legacy configuration via `mocha.opts` ([**@juergba**](https://github.com/juergba)) ## :bug: Fixes -- #4125: Fix timeout handling with `--inspect-brk`/`--inspect` (@juergba) -- #4070: `Mocha` constructor: improve browser setup (@juergba) -- #4068: XUnit reporter should handle exceptions during diff generation (@rgroothuijsen) -- #4030: Fix `--allow-uncaught` with `this.skip()` (@juergba) +- [#4125](https://github.com/mochajs/mocha/issues/4125): Fix timeout handling with `--inspect-brk`/`--inspect` ([**@juergba**](https://github.com/juergba)) +- [#4070](https://github.com/mochajs/mocha/issues/4070): `Mocha` constructor: improve browser setup ([**@juergba**](https://github.com/juergba)) +- [#4068](https://github.com/mochajs/mocha/issues/4068): XUnit reporter should handle exceptions during diff generation ([**@rgroothuijsen**](https://github.com/rgroothuijsen)) +- [#4030](https://github.com/mochajs/mocha/issues/4030): Fix `--allow-uncaught` with `this.skip()` ([**@juergba**](https://github.com/juergba)) ## :mag: Coverage -- #4109: Add Node.js v13.x to CI test matrix (@juergba) +- [#4109](https://github.com/mochajs/mocha/issues/4109): Add Node.js v13.x to CI test matrix ([**@juergba**](https://github.com/juergba)) ## :book: Documentation -- #4129: Fix broken links (@SaeromB) -- #4127: Add reporter alias names to docs (@khg0712) -- #4101: Clarify invalid usage of `done()` (@jgehrcke) -- #4092: Replace `:coffee:` with emoji ☕️ (@pzrq) -- #4088: Initial draft of project charter (@boneskull) -- #4066: Change `sh` to `bash` for code block in docs/index.md (@HyunSangHan) -- #4045: Update README.md concerning GraphicsMagick installation (@HyunSangHan) -- #3988: Fix sponsors background color for readability (@outsideris) +- [#4129](https://github.com/mochajs/mocha/issues/4129): Fix broken links ([**@SaeromB**](https://github.com/SaeromB)) +- [#4127](https://github.com/mochajs/mocha/issues/4127): Add reporter alias names to docs ([**@khg0712**](https://github.com/khg0712)) +- [#4101](https://github.com/mochajs/mocha/issues/4101): Clarify invalid usage of `done()` ([**@jgehrcke**](https://github.com/jgehrcke)) +- [#4092](https://github.com/mochajs/mocha/issues/4092): Replace `:coffee:` with emoji ☕️ ([**@pzrq**](https://github.com/pzrq)) +- [#4088](https://github.com/mochajs/mocha/issues/4088): Initial draft of project charter ([**@boneskull**](https://github.com/boneskull)) +- [#4066](https://github.com/mochajs/mocha/issues/4066): Change `sh` to `bash` for code block in docs/index.md ([**@HyunSangHan**](https://github.com/HyunSangHan)) +- [#4045](https://github.com/mochajs/mocha/issues/4045): Update README.md concerning GraphicsMagick installation ([**@HyunSangHan**](https://github.com/HyunSangHan)) +- [#3988](https://github.com/mochajs/mocha/issues/3988): Fix sponsors background color for readability ([**@outsideris**](https://github.com/outsideris)) ## :nut_and_bolt: Other -- #4118: Update node-environment-flags to 1.0.6 (@kylef) -- #4097: Add GH Funding Metadata (@SheetJSDev) -- #4089: Add funding information to `package.json` (@Munter) -- #4077: Improve integration tests (@soobing) +- [#4118](https://github.com/mochajs/mocha/issues/4118): Update node-environment-flags to 1.0.6 ([**@kylef**](https://github.com/kylef)) +- [#4097](https://github.com/mochajs/mocha/issues/4097): Add GH Funding Metadata ([**@SheetJSDev**](https://github.com/SheetJSDev)) +- [#4089](https://github.com/mochajs/mocha/issues/4089): Add funding information to `package.json` ([**@Munter**](https://github.com/Munter)) +- [#4077](https://github.com/mochajs/mocha/issues/4077): Improve integration tests ([**@soobing**](https://github.com/soobing)) # 6.2.2 / 2019-10-18 diff --git a/package-lock.json b/package-lock.json index 83e2141110..e66be18a00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.2", + "version": "7.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 378a91a8ba..aa77237f94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "6.2.2", + "version": "7.0.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -197,6 +197,9 @@ "hokaccha ", "Honza Javorek ", "Hugo Giraudel ", + "Hugo Kim ", + "HYUNSANG HAN ", + "HyunSangHan ", "Ian Storm Taylor ", "Ian W. Remmel ", "Ian Young ", @@ -220,6 +223,7 @@ "Jan Kopriva ", "Jan Krems ", "Jan Lehnardt ", + "Jan-Philip Gehrcke ", "Jason Barry ", "Jason Lai ", "Jason Leyba ", @@ -285,6 +289,7 @@ "Konstantin Käfer ", "Kris Rasmussen ", "Kunal Nagpal ", + "Kyle Fuller ", "Kyle Mitchell ", "lakmeer ", "Lane Kelly ", @@ -355,6 +360,7 @@ "oveddan ", "P. Roebuck ", "Panu Horsmalahti ", + "Park Seong-beom ", "Parker Moore ", "Pascal ", "Pat Finnigan ", @@ -365,6 +371,7 @@ "Pete Hawkins ", "Peter Müller ", "Peter Rust ", + "Peter Schmidt ", "Phil Sung ", "Philip M. White ", "Piotr Kuczynski ", @@ -377,6 +384,7 @@ "R56 ", "Raynos ", "Refael Ackermann ", + "Rens Groothuijsen ", "Rich Trott ", "Richard Dingwall ", "Richard Knop ", @@ -385,6 +393,7 @@ "Rob Loach ", "Rob Raux ", "Rob Wu ", + "Robert Kieffer ", "Robert Rossmann ", "Romain Prieto ", "Roman Neuhauser ", @@ -399,6 +408,7 @@ "Ryan Tablada ", "Ryunosuke SATO ", "ryym ", + "Saerom Bang ", "Salehen Shovon Rahman ", "Sam Mussell ", "samuel goldszmidt ", @@ -415,6 +425,7 @@ "Sergio Santoro ", "Shaine Hatch ", "Shawn Krisman ", + "SheetJSDev ", "Shinnosuke Watanabe ", "silentcloud ", "Silvio Massari ", @@ -426,6 +437,8 @@ "slyg ", "Soel ", "solodynamo ", + "Sona Lee ", + "Soobin Bak ", "Sorin Iclanzan ", "Standa Opichal ", "startswithaj ", From 7d78f209c6a4f8ef4eba584fe10515fd3901830e Mon Sep 17 00:00:00 2001 From: KyoungWan Date: Fri, 10 Jan 2020 22:36:15 +0900 Subject: [PATCH 1428/1771] Broken links in docs (#4140) * docs: change link of 'should' in index.md * docs: shorten links of npm packages in index.md --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index df24f6853e..756faf0ecf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1955,8 +1955,8 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [npm-glob]: https://www.npmjs.com/package/glob [npm-growl]: https://npm.im/growl [npm-mocha-lcov-reporter]: https://npm.im/mocha-lcov-reporter -[npm-mochawesome]: https://www.npmjs.com/package/mochawesome -[npm-should.js]: https://npm.im/should.js +[npm-mochawesome]: https://npm.im/mochawesome +[npm-should.js]: https://npm.im/should [npm-supports-color]: https://npm.im/supports-color [npm-ts-node]: https://npm.im/ts-node [npm-wtfnode]: https://npm.im/wtfnode From 0e1ccbb915ba8c2f73134af5bebd357f3329b9b7 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 11 Jan 2020 13:01:04 +0100 Subject: [PATCH 1429/1771] Fix leaking global 'uncaughtException' handler (#4147) --- lib/runner.js | 21 ++++++++++++------- .../fixtures/uncaught/listeners.fixture.js | 12 +++++++++++ test/integration/uncaught.spec.js | 12 +++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 test/integration/fixtures/uncaught/listeners.fixture.js diff --git a/lib/runner.js b/lib/runner.js index 3340567f26..948a9b9021 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -800,7 +800,7 @@ Runner.prototype.runSuite = function(suite, fn) { }; /** - * Handle uncaught exceptions. + * Handle uncaught exceptions within runner. * * @param {Error} err * @private @@ -893,6 +893,17 @@ Runner.prototype.uncaught = function(err) { this.abort(); }; +/** + * Handle uncaught exceptions after runner's end event. + * + * @param {Error} err + * @private + */ +Runner.prototype.uncaughtEnd = function uncaughtEnd(err) { + if (err instanceof Pending) return; + throw err; +}; + /** * Run the root suite and invoke `fn(failures)` * on completion. @@ -940,16 +951,12 @@ Runner.prototype.run = function(fn) { this.on(constants.EVENT_RUN_END, function() { debug(constants.EVENT_RUN_END); process.removeListener('uncaughtException', uncaught); - process.on('uncaughtException', function(err) { - if (err instanceof Pending) { - return; - } - throw err; - }); + process.on('uncaughtException', self.uncaughtEnd); fn(self.failures); }); // uncaught exception + process.removeListener('uncaughtException', self.uncaughtEnd); process.on('uncaughtException', uncaught); if (this._delay) { diff --git a/test/integration/fixtures/uncaught/listeners.fixture.js b/test/integration/fixtures/uncaught/listeners.fixture.js new file mode 100644 index 0000000000..3ad398cfe0 --- /dev/null +++ b/test/integration/fixtures/uncaught/listeners.fixture.js @@ -0,0 +1,12 @@ +'use strict'; + +const assert = require('assert'); +const mocha = require("../../../../lib/mocha"); + +for (let i = 0; i < 15; i++) { + const r = new mocha.Runner(new mocha.Suite("" + i, undefined)); + r.run(); +} + +assert.equal(process.listenerCount('uncaughtException'), 1); +assert.equal(process.listeners('uncaughtException')[0].name, 'uncaughtEnd'); diff --git a/test/integration/uncaught.spec.js b/test/integration/uncaught.spec.js index 3b7e684925..7d673b1eaa 100644 --- a/test/integration/uncaught.spec.js +++ b/test/integration/uncaught.spec.js @@ -86,4 +86,16 @@ describe('uncaught exceptions', function() { done(); }); }); + + it('removes uncaught exceptions handlers correctly', function(done) { + run('uncaught/listeners.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + + expect(res, 'to have passed').and('to have passed test count', 0); + + done(); + }); + }); }); From 579fd09db39a55b44c1f553df05c918bc62867be Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 7 Jan 2020 14:07:42 -0800 Subject: [PATCH 1430/1771] update copyright & trademark notices per OJSF; closes #4145 - made footer responsive - made matomo & openjsf logos responsive - remove `target="_blank"` since people can decide if they want to open a tab --- LICENSE | 2 +- README.md | 2 +- docs/_includes/default.html | 113 ++++++++++++++++++++++++++++-------- docs/css/style.css | 81 +++++++++++++++++++++----- 4 files changed, 160 insertions(+), 38 deletions(-) diff --git a/LICENSE b/LICENSE index 9ab23f6873..90f3bfd849 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2011-2018 JS Foundation and contributors, https://js.foundation +Copyright (c) 2011-2020 OpenJS Foundation and contributors, https://openjsf.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.md b/README.md index 3dc8ac25d0..68634e1f10 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,6 @@ Finally, come [chat with the maintainers](https://gitter.im/mochajs/contributors ## License -[MIT](LICENSE) +Copyright 2011-2020 OpenJS Foundation and contributors. Licensed [MIT](https://github.com/mochajs/mocha/blob/master/LICENSE). [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha?ref=badge_large) diff --git a/docs/_includes/default.html b/docs/_includes/default.html index baf940c829..476b96a64d 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.html @@ -31,18 +31,13 @@

              {{ content }}
              diff --git a/docs/css/style.css b/docs/css/style.css index 1eb9461bae..f9bfc27a75 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -209,9 +209,17 @@ img.screenshot { max-width: 100%; } -#matomoLogo { +.sponsorship a { + display: flex; + justify-content: center; + align-items: center; +} + +.sponsorship a img { display: block; - height: 176px; + object-fit: cover; + width: 100%; + height: 100%; } .sponsorship { @@ -228,18 +236,39 @@ img.screenshot { footer { background-color: #eee; border-top: 1px solid #ddd; - padding: 50px 0; - text-align: right; -} - -footer div { + padding: 50px 30px; color: #888; font-size: 0.8em; - margin-right: 30px; } -.last-modified { +#last-modified { + text-align: right; font-style: italic; + font-size: 0.7em; +} + +#copyright-notice { + max-width: 66%; +} + +#openjsf-links { + margin: 0; + padding: 0; + box-sizing: initial; + columns: initial; +} + +#openjsf-links li { + display: inline; /* displays list horizontally */ + border: none; + list-style: none; + margin: initial; + padding: initial; +} + +/* displays each list item with a "|" between */ +#openjsf-links li + li:before { + content: ' | '; } .dl-inline dt, @@ -257,6 +286,27 @@ footer div { display: block; } +blockquote { + border-left: 1px solid #eee; + padding: 10px; +} + +@media all and (max-width: 900px) { + #copyright-notice { + max-width: initial; + } + + #openjsf-links { + width: 50%; + column-count: 2; + column-rule: 1px solid #dedede; + } + + #openjsf-links li + li:before { + content: initial; + } +} + @media all and (max-width: 600px) { #tag { margin-top: 0; @@ -272,9 +322,14 @@ footer div { margin: 20px -11px; padding: 10px; } -} -blockquote { - border-left: 1px solid #eee; - padding: 10px; + /* this list is too long for smaller displays */ + #openjsf-links { + width: 100%; + columns: initial; + } + + #openjsf-links li { + display: block; + } } From a24683fd9273d0896a177d70c2368ada4f2c4882 Mon Sep 17 00:00:00 2001 From: Zirak Date: Sun, 19 Jan 2020 14:22:46 +0200 Subject: [PATCH 1431/1771] Throw a descriptive error when a non-function is given to a runnable (#4133) Given a test such as: ```js it('foobars', 4); ``` mocha used to throw the following error: `fn.call is not a function`. While technically true, I have personally spent some minutes of my life chasing what looked like a bug in the test itself, and not in the call to `it`. A more descriptive error message helps bring attention to where the problem originates. (Thanks to [ssube](https://github.com/ssube) for helping with the error wording.) --- lib/runnable.js | 9 +++++++++ test/unit/runnable.spec.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/runnable.js b/lib/runnable.js index 2d0c428d46..0346b36346 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -338,6 +338,15 @@ Runnable.prototype.run = function(fn) { // for .resetTimeout() this.callback = done; + if (this.fn && typeof this.fn.call !== 'function') { + done( + new TypeError( + 'A runnable must be passed a function as its second argument.' + ) + ); + return; + } + // explicit async with `done` argument if (this.async) { this.resetTimeout(); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index 40ccc12c7e..2c079c3b40 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -670,6 +670,20 @@ describe('Runnable(title, fn)', function() { }); }); }); + + describe('when fn is not a function', function() { + it('should throw an error', function() { + var runnable = new Runnable('foo', 4); + + runnable.run(function(err) { + expect( + err.message, + 'to be', + 'A runnable must be passed a function as its second argument.' + ); + }); + }); + }); }); describe('#isFailed()', function() { From 9c10adab3340abd8baff147cb595256234d88de6 Mon Sep 17 00:00:00 2001 From: Christian Holm Date: Mon, 20 Jan 2020 15:24:00 +0100 Subject: [PATCH 1432/1771] Fix backwards compability break for reporterOptions --- lib/mocha.js | 5 ++++- test/unit/mocha.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/mocha.js b/lib/mocha.js index d306f995cd..0b43004abc 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -100,7 +100,10 @@ function Mocha(options) { this.grep(options.grep) .fgrep(options.fgrep) .ui(options.ui) - .reporter(options.reporter, options.reporterOption) + .reporter( + options.reporter, + options.reporterOption || options.reporterOptions // reporterOptions was previously the only way to specify options to reporter + ) .slow(options.slow) .global(options.global); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 71d804814c..33cd0fdb8e 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -446,6 +446,30 @@ describe('Mocha', function() { var mocha = new Mocha(opts); expect(mocha.reporter(), 'to be', mocha); }); + + it('should keep reporterOption on options', function() { + var mocha = new Mocha({ + reporter: 'spec', + reporterOption: { + foo: 'bar' + } + }); + expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); + // To support the legacy property name that can be used by reporters + expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); + }); + + it('should support legacy reporterOptions', function() { + var mocha = new Mocha({ + reporter: 'spec', + reporterOptions: { + foo: 'bar' + } + }); + expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); + // To support the legacy property name that can be used by reporters + expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); + }); }); describe('#run(fn)', function() { From c0f1d1456dbc068f0552a5ceaed0d9b95e940ce1 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 23 Jan 2020 10:45:07 +0100 Subject: [PATCH 1433/1771] uncaughtException: fix recovery when current test is still running (#4150) --- lib/runnable.js | 2 +- lib/runner.js | 54 ++----- .../fixtures/uncaught/recover.fixture.js | 28 ++++ test/integration/hook-err.spec.js | 5 +- test/integration/uncaught.spec.js | 29 +++- test/unit/runner.spec.js | 140 +++++++----------- 6 files changed, 122 insertions(+), 136 deletions(-) create mode 100644 test/integration/fixtures/uncaught/recover.fixture.js diff --git a/lib/runnable.js b/lib/runnable.js index 0346b36346..7d3011dc86 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -335,7 +335,7 @@ Runnable.prototype.run = function(fn) { fn(err); } - // for .resetTimeout() + // for .resetTimeout() and Runner#uncaught() this.callback = done; if (this.fn && typeof this.fn.call !== 'function') { diff --git a/lib/runner.js b/lib/runner.js index 948a9b9021..bf1d14b183 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -724,7 +724,6 @@ Runner.prototype.runSuite = function(suite, fn) { var i = 0; var self = this; var total = this.grepTotal(suite); - var afterAllHookCalled = false; debug('run suite %s', suite.fullTitle()); @@ -772,21 +771,13 @@ Runner.prototype.runSuite = function(suite, fn) { self.suite = suite; self.nextSuite = next; - if (afterAllHookCalled) { - fn(errSuite); - } else { - // mark that the afterAll block has been called once - // and so can be skipped if there is an error in it. - afterAllHookCalled = true; - - // remove reference to test - delete self.test; + // remove reference to test + delete self.test; - self.hook(HOOK_TYPE_AFTER_ALL, function() { - self.emit(constants.EVENT_SUITE_END, suite); - fn(errSuite); - }); - } + self.hook(HOOK_TYPE_AFTER_ALL, function() { + self.emit(constants.EVENT_SUITE_END, suite); + fn(errSuite); + }); } this.nextSuite = next; @@ -861,36 +852,13 @@ Runner.prototype.uncaught = function(err) { // we cannot recover gracefully if a Runnable has already passed // then fails asynchronously - var alreadyPassed = runnable.isPassed(); - // this will change the state to "failed" regardless of the current value - this.fail(runnable, err); - if (!alreadyPassed) { - // recover from test - if (runnable.type === constants.EVENT_TEST_BEGIN) { - this.emit(constants.EVENT_TEST_END, runnable); - this.hookUp(HOOK_TYPE_AFTER_EACH, this.next); - return; - } + if (runnable.isPassed()) { + this.fail(runnable, err); + this.abort(); + } else { debug(runnable); - - // recover from hooks - var errSuite = this.suite; - - // XXX how about a less awful way to determine this? - // if hook failure is in afterEach block - if (runnable.fullTitle().indexOf('after each') > -1) { - return this.hookErr(err, errSuite, true); - } - // if hook failure is in beforeEach block - if (runnable.fullTitle().indexOf('before each') > -1) { - return this.hookErr(err, errSuite, false); - } - // if hook failure is in after or before blocks - return this.nextSuite(errSuite); + return runnable.callback(err); } - - // bail - this.abort(); }; /** diff --git a/test/integration/fixtures/uncaught/recover.fixture.js b/test/integration/fixtures/uncaught/recover.fixture.js new file mode 100644 index 0000000000..945decb045 --- /dev/null +++ b/test/integration/fixtures/uncaught/recover.fixture.js @@ -0,0 +1,28 @@ +'use strict'; +const assert = require('assert'); + +describe('uncaught', function() { + var hookOrder = []; + it('throw delayed error', (done) => { + setTimeout(() => { + throw new Error('Whoops!'); + }, 10) + setTimeout(done, 10); + }); + it('should wait 15ms', (done) => { + setTimeout(done, 15); + }); + it('test 3', () => { }); + + afterEach(function() { + hookOrder.push(this.currentTest.title); + }); + after(function() { + hookOrder.push('after'); + assert.deepEqual( + hookOrder, + ['throw delayed error', 'should wait 15ms', 'test 3', 'after'] + ); + throw new Error('should get upto here and throw'); + }); +}); diff --git a/test/integration/hook-err.spec.js b/test/integration/hook-err.spec.js index 55604851ef..d5fe6e858d 100644 --- a/test/integration/hook-err.spec.js +++ b/test/integration/hook-err.spec.js @@ -194,7 +194,10 @@ describe('hook error handling', function() { run('hooks/before-hook-async-error-tip.fixture.js', onlyErrorTitle()) ); it('should verify results', function() { - expect(lines, 'to equal', ['1) spec 2', '"before all" hook:']); + expect(lines, 'to equal', [ + '1) spec 2', + '"before all" hook for "skipped":' + ]); }); }); diff --git a/test/integration/uncaught.spec.js b/test/integration/uncaught.spec.js index 7d673b1eaa..5b193280bc 100644 --- a/test/integration/uncaught.spec.js +++ b/test/integration/uncaught.spec.js @@ -17,7 +17,7 @@ describe('uncaught exceptions', function() { assert.strictEqual( res.failures[0].fullTitle, - 'uncaught "before each" hook' + 'uncaught "before each" hook for "test"' ); assert.strictEqual(res.code, 1); done(); @@ -87,6 +87,33 @@ describe('uncaught exceptions', function() { }); }); + it('handles uncaught exceptions within open tests', function(done) { + run('uncaught/recover.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + + expect( + res, + 'to have failed with error', + 'Whoops!', + 'Whoops!', // JSON reporter does not show the second error message + 'should get upto here and throw' + ) + .and('to have passed test count', 2) + .and('to have failed test count', 3) + .and('to have passed test', 'should wait 15ms', 'test 3') + .and( + 'to have failed test', + 'throw delayed error', + 'throw delayed error', + '"after all" hook for "test 3"' + ); + + done(); + }); + }); + it('removes uncaught exceptions handlers correctly', function(done) { run('uncaught/listeners.fixture.js', args, function(err, res) { if (err) { diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index b3b3a903a5..b36cbb04bf 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -3,6 +3,7 @@ var path = require('path'); var sinon = require('sinon'); var Mocha = require('../../lib/mocha'); +var Pending = require('../../lib/pending'); var Suite = Mocha.Suite; var Runner = Mocha.Runner; var Test = Mocha.Test; @@ -12,6 +13,7 @@ var noop = Mocha.utils.noop; var EVENT_HOOK_BEGIN = Runner.constants.EVENT_HOOK_BEGIN; var EVENT_TEST_FAIL = Runner.constants.EVENT_TEST_FAIL; var EVENT_TEST_RETRY = Runner.constants.EVENT_TEST_RETRY; +var EVENT_TEST_END = Runner.constants.EVENT_TEST_END; var EVENT_RUN_END = Runner.constants.EVENT_RUN_END; var STATE_FAILED = Runnable.constants.STATE_FAILED; @@ -444,6 +446,13 @@ describe('Runner', function() { }); }); + describe('.runTest(fn)', function() { + it('should return when no tests to run', function() { + runner.test = undefined; + expect(runner.runTest(noop), 'to be undefined'); + }); + }); + describe('allowUncaught', function() { it('should allow unhandled errors to propagate through', function() { var newRunner = new Runner(suite); @@ -690,6 +699,20 @@ describe('Runner', function() { sandbox.stub(runner, 'fail'); }); + describe('when allow-uncaught is set to true', function() { + it('should propagate error and throw', function() { + var err = new Error('should rethrow err'); + runner.allowUncaught = true; + expect( + function() { + runner.uncaught(err); + }, + 'to throw', + 'should rethrow err' + ); + }); + }); + describe('when provided an object argument', function() { describe('when argument is not an Error', function() { var err; @@ -713,6 +736,13 @@ describe('Runner', function() { }); }); + describe('when argument is a Pending', function() { + it('should ignore argument and return', function() { + var err = new Pending(); + expect(runner.uncaught(err), 'to be undefined'); + }); + }); + describe('when argument is an Error', function() { var err; beforeEach(function() { @@ -783,14 +813,10 @@ describe('Runner', function() { runnable.parent = runner.suite; sandbox.stub(runnable, 'clearTimeout'); runner.currentRunnable = runnable; - runner.nextSuite = sandbox.spy(); - }); - - afterEach(function() { - delete runner.nextSuite; }); it('should clear any pending timeouts', function() { + runnable.callback = sandbox.fake(); runner.uncaught(err); expect(runnable.clearTimeout, 'was called times', 1); }); @@ -844,75 +870,35 @@ describe('Runner', function() { }); }); - describe('when the current Runnable is currently running', function() { + describe('when the current Runnable is still running', function() { describe('when the current Runnable is a Test', function() { beforeEach(function() { runnable = new Test('goomba', noop); runnable.parent = runner.suite; runner.currentRunnable = runnable; - sandbox.stub(runner, 'hookUp'); - runner.next = sandbox.spy(); + runnable.callback = sandbox.fake(); }); - afterEach(function() { - delete runner.next; - }); - - it('should fail with the current Runnable and the error', function() { + it('should run callback(err) to handle failing and hooks', function() { runner.uncaught(err); - expect(runner.fail, 'to have all calls satisfying', [ - expect.it('to be', runnable), + expect(runner.fail, 'was not called'); + expect(runnable.callback, 'to have all calls satisfying', [ err ]).and('was called once'); }); - it('should notify test has ended', function() { - expect( - function() { - runner.uncaught(err); - }, - 'to emit from', - runner, - 'test end', - runnable - ); - }); - - it('should not notify run has ended', function() { + it('should not notify test has ended', function() { expect( function() { runner.uncaught(err); }, 'not to emit from', runner, - 'end' + EVENT_TEST_END ); }); - it('should call any remaining "after each" hooks', function() { - runner.uncaught(err); - expect(runner.hookUp, 'to have all calls satisfying', [ - 'afterEach', - expect.it('to be', runner.next) - ]).and('was called once'); - }); - }); - - describe('when the current Runnable is a "before all" or "after all" hook', function() { - beforeEach(function() { - runnable = new Hook('', noop); - runnable.parent = runner.suite; - runner.currentRunnable = runnable; - }); - - it('should continue to the next suite', function() { - runner.uncaught(err); - expect(runner.nextSuite, 'to have all calls satisfying', [ - runner.suite - ]).and('was called once'); - }); - it('should not notify run has ended', function() { expect( function() { @@ -920,64 +906,38 @@ describe('Runner', function() { }, 'not to emit from', runner, - 'end' + EVENT_RUN_END ); }); }); - describe('when the current Runnable is a "before each" hook', function() { + describe('when the current Runnable is a Hook', function() { beforeEach(function() { - runnable = new Hook('before each', noop); + runnable = new Hook(); runnable.parent = runner.suite; runner.currentRunnable = runnable; - runner.hookErr = sandbox.spy(); + runnable.callback = sandbox.fake(); }); - afterEach(function() { - delete runner.hookErr; - }); - - it('should associate its failure with the current test', function() { + it('should run callback(err) to handle failing hook pattern', function() { runner.uncaught(err); - expect(runner.hookErr, 'to have all calls satisfying', [ - err, - runner.suite, - false + + expect(runner.fail, 'was not called'); + expect(runnable.callback, 'to have all calls satisfying', [ + err ]).and('was called once'); }); - it('should not notify run has ended', function() { + it('should not notify test has ended', function() { expect( function() { runner.uncaught(err); }, 'not to emit from', runner, - 'end' + EVENT_TEST_END ); }); - }); - - describe('when the current Runnable is an "after each" hook', function() { - beforeEach(function() { - runnable = new Hook('after each', noop); - runnable.parent = runner.suite; - runner.currentRunnable = runnable; - runner.hookErr = sandbox.spy(); - }); - - afterEach(function() { - delete runner.hookErr; - }); - - it('should associate its failure with the current test', function() { - runner.uncaught(err); - expect(runner.hookErr, 'to have all calls satisfying', [ - err, - runner.suite, - true - ]).and('was called once'); - }); it('should not notify run has ended', function() { expect( @@ -986,7 +946,7 @@ describe('Runner', function() { }, 'not to emit from', runner, - 'end' + EVENT_RUN_END ); }); }); From 0be3f78491bbbcdc4dcea660ee7bfd557a225d9c Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 26 Jan 2020 06:52:47 +0100 Subject: [PATCH 1434/1771] Fix exception when skipping tests programmatically (#4165) --- lib/runner.js | 2 +- .../fixtures/pending/programmatic.fixture.js | 8 ++++++ test/integration/helpers.js | 15 +++++++++++ test/integration/pending.spec.js | 26 ++++++++++++++++--- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 test/integration/fixtures/pending/programmatic.fixture.js diff --git a/lib/runner.js b/lib/runner.js index bf1d14b183..ceb1a24a4f 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -654,7 +654,7 @@ Runner.prototype.runTests = function(suite, fn) { self.emit(constants.EVENT_TEST_END, test); // skip inner afterEach hooks below errSuite level var origSuite = self.suite; - self.suite = errSuite; + self.suite = errSuite || self.suite; return self.hookUp(HOOK_TYPE_AFTER_EACH, function(e, eSuite) { self.suite = origSuite; next(e, eSuite); diff --git a/test/integration/fixtures/pending/programmatic.fixture.js b/test/integration/fixtures/pending/programmatic.fixture.js new file mode 100644 index 0000000000..65720be64c --- /dev/null +++ b/test/integration/fixtures/pending/programmatic.fixture.js @@ -0,0 +1,8 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({reporter: 'json'}); +mocha.addFile("./test/integration/fixtures/__default__.fixture.js"); + +const runner = mocha.run(); +runner.on('test', function (test) { test.pending = true; }); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 78251c986b..0d65e91e6b 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -143,6 +143,8 @@ module.exports = { invokeMochaAsync: invokeMochaAsync, + invokeNode: invokeNode, + /** * Resolves the path to a fixture to the full path. */ @@ -227,6 +229,19 @@ function invokeMochaAsync(args, opts) { return [mochaProcess, resultPromise]; } +/** + * Invokes Node without Mocha binary with the given arguments, + * when Mocha is used programmatically. + */ +function invokeNode(args, fn, opts) { + if (typeof args === 'function') { + opts = fn; + fn = args; + args = []; + } + return _spawnMochaWithListeners(args, fn, opts); +} + function invokeSubMocha(args, fn, opts) { if (typeof args === 'function') { opts = fn; diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index 7179ff187b..ae6a57f0ca 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -1,9 +1,12 @@ 'use strict'; var assert = require('assert'); -var run = require('./helpers').runMochaJSON; -var runMocha = require('./helpers').runMocha; -var splitRegExp = require('./helpers').splitRegExp; +var helpers = require('./helpers'); +var run = helpers.runMochaJSON; +var runMocha = helpers.runMocha; +var splitRegExp = helpers.splitRegExp; +var invokeNode = helpers.invokeNode; +var toJSONRunResult = helpers.toJSONRunResult; var args = []; describe('pending', function() { @@ -323,4 +326,21 @@ describe('pending', function() { }); }); }); + + describe('programmatic usage', function() { + it('should skip the test by listening to test event', function(done) { + var path = require.resolve('./fixtures/pending/programmatic.fixture.js'); + invokeNode([path], function(err, res) { + if (err) { + return done(err); + } + var result = toJSONRunResult(res); + expect(result, 'to have passed') + .and('to have passed test count', 0) + .and('to have pending test count', 1) + .and('to have pending test order', 'should succeed'); + done(); + }); + }); + }); }); From 2277958e32f48bed10f0cb2ceaf01e7b8045af35 Mon Sep 17 00:00:00 2001 From: juergba Date: Fri, 24 Jan 2020 17:38:28 +0100 Subject: [PATCH 1435/1771] update CHANGELOG for v7.0.1 [ci skip] --- CHANGELOG.md | 1362 +------------------------ docs/changelogs/CHANGELOG_V3_older.md | 1258 +++++++++++++++++++++++ docs/changelogs/CHANGELOG_V4.md | 84 ++ 3 files changed, 1360 insertions(+), 1344 deletions(-) create mode 100644 docs/changelogs/CHANGELOG_V3_older.md create mode 100644 docs/changelogs/CHANGELOG_V4.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 998c625ff2..007a71d5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# 7.0.1 / 2020-01-25 + +## :bug: Fixes + +- #4165: Fix exception when skipping tests programmatically (@juergba) +- #4153: Restore backwards compatibility for `reporterOptions` (@holm) +- #4150: Fix recovery of an open test upon uncaught exception (@juergba) +- #4147: Fix regression of leaking uncaught exception handler (@juergba) + +## :book: Documentation + +- #4146: Update copyright & trademark notices per OJSF (@boneskull) +- #4140: Fix broken links (@KyoungWan) + +## :nut_and_bolt: Other + +- #4133: Print more descriptive error message (@Zirak) + # 7.0.0 / 2020-01-05 ## :boom: Breaking Changes @@ -561,1347 +579,3 @@ Welcome [@vkarpov15](https://github.com/vkarpov15) to the team! - [#3185](https://github.com/mochajs/mocha/issues/3185): Add Node.js v9 to build matrix; remove v7 ([@xxczaki](https://github.com/xxczaki)) - [#3172](https://github.com/mochajs/mocha/issues/3172): Markdown linting ([@boneskull](https://github.com/boneskull)) - Test & Netlify updates ([@Munter](https://github.com/munter), [@boneskull](https://github.com/boneskull)) - -# 4.1.0 / 2017-12-28 - -This is mainly a "housekeeping" release. - -Welcome [@Bamieh](https://github.com/Bamieh) and [@xxczaki](https://github.com/xxczaki) to the team! - -## :bug: Fixes - -- [#2661](https://github.com/mochajs/mocha/issues/2661): `progress` reporter now accepts reporter options ([@canoztokmak](https://github.com/canoztokmak)) -- [#3142](https://github.com/mochajs/mocha/issues/3142): `xit` in `bdd` interface now properly returns its `Test` object ([@Bamieh](https://github.com/Bamieh)) -- [#3075](https://github.com/mochajs/mocha/pull/3075): Diffs now computed eagerly to avoid misinformation when reported ([@abrady0](https://github.com/abrady0)) -- [#2745](https://github.com/mochajs/mocha/issues/2745): `--help` will now help you even if you have a `mocha.opts` ([@Zarel](https://github.com/Zarel)) - -## :tada: Enhancements - -- [#2514](https://github.com/mochajs/mocha/issues/2514): The `--no-diff` flag will completely disable diff output ([@CapacitorSet](https://github.com/CapacitorSet)) -- [#3058](https://github.com/mochajs/mocha/issues/3058): All "setters" in Mocha's API are now also "getters" if called without arguments ([@makepanic](https://github.com/makepanic)) - -## :book: Documentation - -- [#3170](https://github.com/mochajs/mocha/pull/3170): Optimization and site speed improvements ([@Munter](https://github.com/munter)) -- [#2987](https://github.com/mochajs/mocha/issues/2987): Moved the old [site repo](https://github.com/mochajs/mochajs.github.io) into the main repo under `docs/` ([@boneskull](https://github.com/boneskull)) -- [#2896](https://github.com/mochajs/mocha/issues/2896): Add [maintainer guide](https://github.com/mochajs/mocha/blob/master/MAINTAINERS.md) ([@boneskull](https://github.com/boneskull)) -- Various fixes and updates ([@xxczaki](https://github.com/xxczaki), [@maty21](https://github.com/maty21), [@leedm777](https://github.com/leedm777)) - -## :nut_and_bolt: Other - -- Test improvements and fixes ([@eugenet8k](https://github.com/eugenet8k), [@ngeor](https://github.com/ngeor), [@38elements](https://github.com/38elements), [@Gerhut](https://github.com/Gerhut), [@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) -- Refactoring and cruft excision ([@38elements](https://github.com/38elements), [@Bamieh](https://github.com/Bamieh), [@finnigantime](https://github.com/finnigantime), [@boneskull](https://github.com/boneskull)) - -# 4.0.1 / 2017-10-05 - -## :bug: Fixes - -- [#3051](https://github.com/mochajs/mocha/pull/3051): Upgrade Growl to v1.10.3 to fix its [peer dep problems](https://github.com/tj/node-growl/pull/68) ([@dpogue](https://github.com/dpogue)) - -# 4.0.0 / 2017-10-02 - -You might want to read this before filing a new bug! :stuck_out_tongue_closed_eyes: - -## :boom: Breaking Changes - -For more info, please [read this article](https://boneskull.com/mocha-v4-nears-release/). - -### Compatibility - -- [#3016](https://github.com/mochajs/mocha/issues/3016): Drop support for unmaintained versions of Node.js ([@boneskull](https://github.com/boneskull)): - - 0.10.x - - 0.11.x - - 0.12.x - - iojs (any) - - 5.x.x -- [#2979](https://github.com/mochajs/mocha/issues/2979): Drop support for non-ES5-compliant browsers ([@boneskull](https://github.com/boneskull)): - - IE7 - - IE8 - - PhantomJS 1.x -- [#2615](https://github.com/mochajs/mocha/issues/2615): Drop Bower support; old versions (3.x, etc.) will remain available ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) - -### Default Behavior - -- [#2879](https://github.com/mochajs/mocha/issues/2879): By default, Mocha will no longer force the process to exit once all tests complete. This means any test code (or code under test) which would normally prevent `node` from exiting will do so when run in Mocha. Supply the `--exit` flag to revert to pre-v4.0.0 behavior ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) - -### Reporter Output - -- [#2095](https://github.com/mochajs/mocha/issues/2095): Remove `stdout:` prefix from browser reporter logs ([@skeggse](https://github.com/skeggse)) -- [#2295](https://github.com/mochajs/mocha/issues/2295): Add separator in "unified diff" output ([@olsonpm](https://github.com/olsonpm)) -- [#2686](https://github.com/mochajs/mocha/issues/2686): Print failure message when `--forbid-pending` or `--forbid-only` is specified ([@ScottFreeCode](https://github.com/ScottFreeCode)) -- [#2814](https://github.com/mochajs/mocha/pull/2814): Indent contexts for better readability when reporting failures ([@charlierudolph](https://github.com/charlierudolph)) - -## :-1: Deprecations - -- [#2493](https://github.com/mochajs/mocha/issues/2493): The `--compilers` command-line option is now soft-deprecated and will emit a warning on `STDERR`. Read [this](https://github.com/mochajs/mocha/wiki/compilers-deprecation) for more info and workarounds ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) - -## :tada: Enhancements - -- [#2628](https://github.com/mochajs/mocha/issues/2628): Allow override of default test suite name in XUnit reporter ([@ngeor](https://github.com/ngeor)) - -## :book: Documentation - -- [#3020](https://github.com/mochajs/mocha/pull/3020): Link to CLA in `README.md` and `CONTRIBUTING.md` ([@skeggse](https://github.com/skeggse)) - -## :nut_and_bolt: Other - -- [#2890](https://github.com/mochajs/mocha/issues/2890): Speed up build by (re-)consolidating SauceLabs tests ([@boneskull](https://github.com/boneskull)) - -# 3.5.3 / 2017-09-11 - -## :bug: Fixes - -- [#3003](https://github.com/mochajs/mocha/pull/3003): Fix invalid entities in xUnit reporter first appearing in v3.5.1 ([@jkrems](https://github.com/jkrems)) - -# 3.5.2 / 2017-09-10 - -## :bug: Fixes - -- [#3001](https://github.com/mochajs/mocha/pull/3001): Fix AMD-related failures first appearing in v3.5.1 ([@boneskull](https://github.com/boneskull)) - -# 3.5.1 / 2017-09-09 - -## :newspaper: News - -- :mega: Mocha is now sponsoring [PDXNode](http://pdxnode.org)! If you're in the [Portland](https://wikipedia.org/wiki/Portland,_Oregon) area, come check out the monthly talks and hack nights! - -## :bug: Fixes - -- [#2997](https://github.com/mochajs/mocha/pull/2997): Fix missing `xit` export for "require" interface ([@solodynamo](https://github.com/solodynamo)) -- [#2957](https://github.com/mochajs/mocha/pull/2957): Fix unicode character handling in XUnit reporter failures ([@jkrems](https://github.com/jkrems)) - -## :nut_and_bolt: Other - -- [#2986](https://github.com/mochajs/mocha/pull/2986): Add issue and PR templates ([@kungapal](https://github.com/kungapal)) -- [#2918](https://github.com/mochajs/mocha/pull/2918): Drop bash dependency for glob-related tests ([@ScottFreeCode](https://github.com/ScottFreeCode)) -- [#2922](https://github.com/mochajs/mocha/pull/2922): Improve `--compilers` coverage ([@ScottFreeCode](https://github.com/ScottFreeCode)) -- [#2981](https://github.com/mochajs/mocha/pull/2981): Fix tpyos and spelling errors ([@jsoref](https://github.com/jsoref)) - -# 3.5.0 / 2017-07-31 - -## :newspaper: News - -- Mocha now has a [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) (thanks [@kungapal](https://github.com/kungapal)!). -- Old issues and PRs are now being marked "stale" by [Probot's "Stale" plugin](https://github.com/probot/stale). If an issue is marked as such, and you would like to see it remain open, simply add a new comment to the ticket or PR. -- **WARNING**: Support for non-ES5-compliant environments will be dropped starting with version 4.0.0 of Mocha! - -## :lock: Security Fixes - -- [#2860](https://github.com/mochajs/mocha/pull/2860): Address [CVE-2015-8315](https://nodesecurity.io/advisories/46) via upgrade of [debug](https://npm.im/debug) ([@boneskull](https://github.com/boneskull)) - -## :tada: Enhancements - -- [#2696](https://github.com/mochajs/mocha/pull/2696): Add `--forbid-only` and `--forbid-pending` flags. Use these in CI or hooks to ensure tests aren't accidentally being skipped! ([@charlierudolph](https://github.com/charlierudolph)) -- [#2813](https://github.com/mochajs/mocha/pull/2813): Support Node.js 8's `--napi-modules` flag ([@jupp0r](https://github.com/jupp0r)) - -## :nut_and_bolt: Other - -- Various CI-and-test-related fixes and improvements ([@boneskull](https://github.com/boneskull), [@dasilvacontin](https://github.com/dasilvacontin), [@PopradiArpad](https://github.com/PopradiArpad), [@Munter](https://github.com/munter), [@ScottFreeCode](https://github.com/ScottFreeCode)) -- "Officially" support Node.js 8 ([@elergy](https://github.com/elergy)) - -# 3.4.2 / 2017-05-24 - -## :bug: Fixes - -- [#2802](https://github.com/mochajs/mocha/issues/2802): Remove call to deprecated `os.tmpDir` ([@makepanic](https://github.com/makepanic)) -- [#2820](https://github.com/mochajs/mocha/pull/2820): Eagerly set `process.exitCode` ([@chrisleck](https://github.com/chrisleck)) - -## :nut_and_bolt: Other - -- [#2807](https://github.com/mochajs/mocha/pull/2807): Move linting into an npm script ([@Munter](https://github.com/munter)) - -# 3.4.1 / 2017-05-14 - -Fixed a publishing mishap with git's autocrlf settings. - -# 3.4.0 / 2017-05-14 - -Mocha is now moving to a quicker release schedule: when non-breaking changes are merged, a release should happen that week. - -This week's highlights: - -- `allowUncaught` added to commandline as `--allow-uncaught` (and bugfixed) -- warning-related Node flags - -## :tada: Enhancements - -- [#2793](https://github.com/mochajs/mocha/pull/2793), [#2697](https://github.com/mochajs/mocha/pull/2697): add --allowUncaught to Node.js ([@lrowe](https://github.com/lrowe)) -- [#2733](https://github.com/mochajs/mocha/pull/2733): Add `--no-warnings` and `--trace-warnings` flags ([@sonicdoe](https://github.com/sonicdoe)) - -## :bug: Fixes - -- [#2793](https://github.com/mochajs/mocha/pull/2793), [#2697](https://github.com/mochajs/mocha/pull/2697): fix broken allowUncaught ([@lrowe](https://github.com/lrowe)) - -## :nut_and_bolt: Other - -- [#2778](https://github.com/mochajs/mocha/pull/2778): Add license report and scan status ([@xizhao](https://github.com/xizhao)) -- [#2794](https://github.com/mochajs/mocha/pull/2794): no special case for macOS running Karma locally ([@boneskull](https://github.com/boneskull)) -- [#2795](https://github.com/mochajs/mocha/pull/2795): reverts use of semistandard directly ([#2648](https://github.com/mochajs/mocha/pull/2648)) ([@boneskull](https://github.com/boneskull)) - -# 3.3.0 / 2017-04-24 - -Thanks to all our contributors, maintainers, sponsors, and users! ❤️ - -As highlights: - -- We've got coverage now! -- Testing is looking less flaky \\o/. -- No more nitpicking about "mocha.js" build on PRs. - -## :tada: Enhancements - -- [#2659](https://github.com/mochajs/mocha/pull/2659): Adds support for loading reporter from an absolute or relative path ([@sul4bh](https://github.com/sul4bh)) -- [#2769](https://github.com/mochajs/mocha/pull/2769): Support `--inspect-brk` on command-line ([@igwejk](https://github.com/igwejk)) - -## :bug: Fixes - -- [#2662](https://github.com/mochajs/mocha/pull/2662): Replace unicode chars w/ hex codes in HTML reporter ([@rotemdan](https://github.com/rotemdan)) - -## :mag: Coverage - -- [#2672](https://github.com/mochajs/mocha/pull/2672): Add coverage for node tests ([@c089](https://github.com/c089), [@Munter](https://github.com/munter)) -- [#2680](https://github.com/mochajs/mocha/pull/2680): Increase tests coverage for base reporter ([@epallerols](https://github.com/epallerols)) -- [#2690](https://github.com/mochajs/mocha/pull/2690): Increase tests coverage for doc reporter ([@craigtaub](https://github.com/craigtaub)) -- [#2701](https://github.com/mochajs/mocha/pull/2701): Increase tests coverage for landing, min, tap and list reporters ([@craigtaub](https://github.com/craigtaub)) -- [#2691](https://github.com/mochajs/mocha/pull/2691): Increase tests coverage for spec + dot reporters ([@craigtaub](https://github.com/craigtaub)) -- [#2698](https://github.com/mochajs/mocha/pull/2698): Increase tests coverage for xunit reporter ([@craigtaub](https://github.com/craigtaub)) -- [#2699](https://github.com/mochajs/mocha/pull/2699): Increase tests coverage for json-stream, markdown and progress reporters ([@craigtaub](https://github.com/craigtaub)) -- [#2703](https://github.com/mochajs/mocha/pull/2703): Cover .some() function in utils.js with tests ([@seppevs](https://github.com/seppevs)) -- [#2773](https://github.com/mochajs/mocha/pull/2773): Add tests for loading reporters w/ relative/absolute paths ([@sul4bh](https://github.com/sul4bh)) - -## :nut_and_bolt: Other - -- Remove bin/.eslintrc; ensure execs are linted ([@boneskull](https://github.com/boneskull)) -- [#2542](https://github.com/mochajs/mocha/issues/2542): Expand CONTRIBUTING.md ([@boneskull](https://github.com/boneskull)) -- [#2660](https://github.com/mochajs/mocha/pull/2660): Double timeouts on integration tests ([@Munter](https://github.com/munter)) -- [#2653](https://github.com/mochajs/mocha/pull/2653): Update copyright year ([@Scottkao85], [@Munter](https://github.com/munter)) -- [#2621](https://github.com/mochajs/mocha/pull/2621): Update dependencies to enable Greenkeeper ([@boneskull](https://github.com/boneskull), [@greenkeeper](https://github.com/greenkeeper)) -- [#2625](https://github.com/mochajs/mocha/pull/2625): Use trusty container in travis-ci; use "artifacts" addon ([@boneskull](https://github.com/boneskull)) -- [#2670](https://github.com/mochajs/mocha/pull/2670): doc(CONTRIBUTING): fix link to org members ([@coderbyheart](https://github.com/coderbyheart)) -- Add Mocha propaganda to README.md ([@boneskull](https://github.com/boneskull)) -- [#2470](https://github.com/mochajs/mocha/pull/2470): Avoid test flake in "delay" test ([@boneskull](https://github.com/boneskull)) -- [#2675](https://github.com/mochajs/mocha/pull/2675): Limit browser concurrency on sauce ([@boneskull](https://github.com/boneskull)) -- [#2669](https://github.com/mochajs/mocha/pull/2669): Use temporary test-only build of mocha.js for browsers tests ([@Munter](https://github.com/munter)) -- Fix "projects" link in README.md ([@boneskull](https://github.com/boneskull)) -- [#2678](https://github.com/mochajs/mocha/pull/2678): Chore(Saucelabs): test on IE9, IE10 and IE11 ([@coderbyheart](https://github.com/coderbyheart)) -- [#2648](https://github.com/mochajs/mocha/pull/2648): Use `semistandard` directly ([@kt3k](https://github.com/kt3k)) -- [#2727](https://github.com/mochajs/mocha/pull/2727): Make the build reproducible ([@lamby](https://github.com/lamby)) - -# 3.2.0 / 2016-11-24 - -## :newspaper: News - -### Mocha is now a JS Foundation Project! - -Mocha is proud to have joined the [JS Foundation](https://js.foundation). For more information, [read the announcement](https://js.foundation/announcements/2016/10/17/Linux-Foundation-Unites-JavaScript-Community-Open-Web-Development/). - -### Contributor License Agreement - -Under the foundation, all contributors to Mocha must sign the [JS Foundation CLA](https://js.foundation/CLA/) before their code can be merged. When sending a PR--if you have not already signed the CLA--a friendly bot will ask you to do so. - -Mocha remains licensed under the [MIT license](https://github.com/mochajs/mocha/blob/master/LICENSE). - -## :bug: Bug Fix - -- [#2535](https://github.com/mochajs/mocha/issues/2535): Fix crash when `--watch` encounters broken symlinks ([@villesau](https://github.com/villesau)) -- [#2593](https://github.com/mochajs/mocha/pull/2593): Fix (old) regression; incorrect symbol shown in `list` reporter ([@Aldaviva](https://github.com/Aldaviva)) -- [#2584](https://github.com/mochajs/mocha/issues/2584): Fix potential error when running XUnit reporter ([@vobujs](https://github.com/vobujs)) - -## :tada: Enhancement - -- [#2294](https://github.com/mochajs/mocha/issues/2294): Improve timeout error messaging ([@jeversmann](https://github.com/jeversmann), [@boneskull](https://github.com/boneskull)) -- [#2520](https://github.com/mochajs/mocha/pull/2520): Add info about `--inspect` flag to CLI help ([@ughitsaaron](https://github.com/ughitsaaron)) - -## :nut_and_bolt: Other - -- [#2570](https://github.com/mochajs/mocha/issues/2570): Use [karma-mocha](https://npmjs.com/package/karma-mocha) proper ([@boneskull](https://github.com/boneskull)) -- Licenses updated to reflect new copyright, add link to license and browser matrix to `README.md` ([@boneskull](https://github.com/boneskull), [@ScottFreeCode](https://github.com/ScottFreeCode), [@dasilvacontin](https://github.com/dasilvacontin)) - -Thanks to all our contributors, sponsors and backers! Keep on the lookout for a public roadmap and new contribution guide coming soon. - -# 3.1.2 / 2016-10-10 - -## :bug: Bug Fix - -- [#2528](https://github.com/mochajs/mocha/issues/2528): Recovery gracefully if an `Error`'s `stack` property isn't writable ([@boneskull](https://github.com/boneskull)) - -# 3.1.1 / 2016-10-09 - -## :bug: Bug Fix - -- [#1417](https://github.com/mochajs/mocha/issues/1417): Don't report `done()` was called multiple times when it wasn't ([@frankleonrose](https://github.com/frankleonrose)) - -## :nut_and_bolt: Other - -- [#2490](https://github.com/mochajs/mocha/issues/2490): Lint with [semistandard](https://npmjs.com/package/semistandard) config ([@makepanic](https://github.com/makepanic)) -- [#2525](https://github.com/mochajs/mocha/issues/2525): Lint all `.js` files ([@boneskull](https://github.com/boneskull)) -- [#2524](https://github.com/mochajs/mocha/issues/2524): Provide workaround for developers unable to run browser tests on macOS Sierra ([@boneskull](https://github.com/boneskull)) - -# 3.1.0 / 2016-09-27 - -## :tada: Enhancement - -- [#2357](https://github.com/mochajs/mocha/issues/2357): Support `--inspect` on command-line ([@simov](https://github.com/simov)) -- [#2194](https://github.com/mochajs/mocha/issues/2194): Human-friendly error if no files are matched on command-line ([@Munter](https://github.com/munter)) -- [#1744](https://github.com/mochajs/mocha/issues/1744): Human-friendly error if a Suite has no callback (BDD/TDD only) ([@anton](https://github.com/anton)) - -## :bug: Bug Fix - -- [#2488](https://github.com/mochajs/mocha/issues/2488): Fix case in which _variables beginning with lowercase "D"_ may not have been reported properly as global leaks ([@JustATrick](https://github.com/JustATrick)) :laughing: -- [#2465](https://github.com/mochajs/mocha/issues/2465): Always halt execution in async function when `this.skip()` is called ([@boneskull](https://github.com/boneskull)) -- [#2445](https://github.com/mochajs/mocha/pull/2445): Exits with expected code 130 when `SIGINT` encountered; exit code can no longer rollover at 256 ([@Munter](https://github.com/munter)) -- [#2315](https://github.com/mochajs/mocha/issues/2315): Fix uncaught TypeError thrown from callback stack ([@1999](https://github.com/1999)) -- Fix broken `only()`/`skip()` in IE7/IE8 ([@boneskull](https://github.com/boneskull)) -- [#2502](https://github.com/mochajs/mocha/issues/2502): Fix broken stack trace filter on Node.js under Windows ([@boneskull](https://github.com/boneskull)) -- [#2496](https://github.com/mochajs/mocha/issues/2496): Fix diff output for objects instantiated with `String` constructor ([more](https://youtrack.jetbrains.com/issue/WEB-23383)) ([@boneskull](https://github.com/boneskull)) - -# 3.0.2 / 2016-08-08 - -## :bug: Bug Fix - -- [#2424](https://github.com/mochajs/mocha/issues/2424): Fix error loading Mocha via Require.js ([@boneskull](https://github.com/boneskull)) -- [#2417](https://github.com/mochajs/mocha/issues/2417): Fix execution of _deeply_ nested `describe.only()` suites ([@not-an-aardvark](https://github.com/not-an-aardvark)) -- Remove references to `json-cov` and `html-cov` reporters in CLI ([@boneskull](https://github.com/boneskull)) - -# 3.0.1 / 2016-08-03 - -## :bug: Bug Fix - -- [#2406](https://github.com/mochajs/mocha/issues/2406): Restore execution of nested `describe.only()` suites ([@not-an-aardvark](https://github.com/not-an-aardvark)) - -# 3.0.0 / 2016-07-31 - -## :boom: Breaking Changes - -- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8**. - -- :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). - -- `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy: - -- To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, _and_ returns a `Promise`, Mocha will now throw an exception: - - \```js - const assert = require('assert'); - - it('should complete this test', function (done) { - return new Promise(function (resolve) { - assert.ok(true); - resolve(); - }) - .then(done); - }); - \``` - - The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`. - -- When a test timeout value _greater than_ `2147483648` is specified in any context (`--timeout`, `mocha.setup()`, per-suite, per-test, etc.), the timeout will be _disabled_ and the test(s) will be allowed to run indefinitely. This is equivalent to specifying a timeout value of `0`. See [MDN](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) for reasoning. - -- The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests. - -- Mocha no longer supports [component](https://www.npmjs.com/package/component). - -- The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed. - -- `spec` reporter now omits leading carriage returns (`\r`) in non-TTY environment. - -## :tada: Enhancements - -- [#808](https://github.com/mochajs/mocha/issues/808): Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m](https://github.com/a8m)) -- [#2000](https://github.com/mochajs/mocha/pull/2000): Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable](https://github.com/elliottcable)) -- [#1632](https://github.com/mochajs/mocha/issues/1632): Throw a useful exception when a suite or test lacks a title. ([@a8m](https://github.com/a8m)) -- [#1481](https://github.com/mochajs/mocha/issues/1481): Better `.only()` behavior. ([@a8m](https://github.com/a8m)) -- [#2334](https://github.com/mochajs/mocha/issues/2334): Allow `this.skip()` in async tests and hooks. ([@boneskull](https://github.com/boneskull)) -- [#1320](https://github.com/mochajs/mocha/pull/1320): Throw a useful exception when test resolution method is overspecified. ([@jugglinmike](https://github.com/jugglinmike)) -- [#2364](https://github.com/mochajs/mocha/pull/2364): Support `--preserve-symlinks`. ([@rosswarren](https://github.com/rosswarren)) - -## :bug: Bug Fixes - -- [#2259](https://github.com/mochajs/mocha/pull/2259): Restore ES3 compatibility. Specifically, support an environment lacking `Date.prototype.toISOString()`, `JSON`, or has a non-standard implementation of `JSON`. ([@ndhoule](https://github.com/ndhoule), [@boneskull](https://github.com/boneskull)) -- [#2286](https://github.com/mochajs/mocha/issues/2286): Fix `after()` failing to execute if test skipped using `this.skip()` in `beforeEach()`; no longer marks the entire suite as "pending". ([@dasilvacontin](https://github.com/dasilvacontin), [@boneskull](https://github.com/boneskull)) -- [#2208](https://github.com/mochajs/mocha/pull/2208): Fix function name display in `markdown` and `html` (browser) reporters. ([@ScottFreeCode](https://github.com/ScottFreeCode)) -- [#2299](https://github.com/mochajs/mocha/pull/2299): Fix progress bar in `html` (browser) reporter. ([@AviVahl](https://github.com/avivahl)) -- [#2307](https://github.com/mochajs/mocha/pull/2307): Fix `doc` reporter crashing when test fails. ([@jleyba](https://github.com/jleyba)) -- [#2323](https://github.com/mochajs/mocha/issues/2323): Ensure browser entry point (`browser-entry.js`) is published to npm (for use with bundlers). ([@boneskull](https://github.com/boneskull)) -- [#2310](https://github.com/mochajs/mocha/issues/2310): Ensure custom reporter with an absolute path works in Windows. ([@silentcloud](https://github.com/silentcloud)) -- [#2311](https://github.com/mochajs/mocha/issues/2311): Fix problem wherein calling `this.slow()` without a value would blast any previously set value. ([@boneskull](https://github.com/boneskull)) -- [#1813](https://github.com/mochajs/mocha/issues/1813): Ensure Mocha's own test suite will run in Windows. ([@tswaters](https://github.com/tswaters), [@TimothyGu](https://github.com/timothygu), [@boneskull](https://github.com/boneskull)) -- [#2317](https://github.com/mochajs/mocha/issues/2317): Ensure all interfaces are displayed in `--help` on CLI. ([@ScottFreeCode](https://github.com/ScottFreeCode)) -- [#1644](https://github.com/mochajs/mocha/issues/1644): Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae](https://github.com/callumacrae), [@boneskull](https://github.com/boneskull)) -- [#2361](https://github.com/mochajs/mocha/pull/2361): Don't truncate name of thrown anonymous exception. ([@boneskull](https://github.com/boneskull)) -- [#2367](https://github.com/mochajs/mocha/pull/2367): Fix invalid CSS. ([@bensontrent](https://github.com/bensontrent)) -- [#2401](https://github.com/mochajs/mocha/pull/2401): Remove carriage return before each test line in spec reporter. ([@Munter](https://github.com/munter)) - -## :nut_and_bolt: Other - -- Upgrade production dependencies to address security advisories (and because now we can): `glob`, `commander`, `escape-string-regexp`, and `supports-color`. ([@boneskull](https://github.com/boneskull), [@RobLoach](https://github.com/robloach)) -- Add Windows to CI. ([@boneskull](https://github.com/boneskull), [@TimothyGu](https://github.com/timothygu)) -- Ensure appropriate `engines` field in `package.json`. ([@shinnn](https://github.com/shinnn), [@boneskull](https://github.com/boneskull)) -- [#2348](https://github.com/mochajs/mocha/issues/2348): Upgrade ESLint to v2 ([@anthony-redfox](https://github.com/anthony-redfox)) - -We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! - -:shipit: - -# 2.5.3 / 2016-05-25 - -- [#2112](https://github.com/mochajs/mocha/pull/2112) - Fix HTML reporter regression causing duplicate error output ([@danielstjules](https://github.com/danielstjules) via [`6d24063`](https://github.com/mochajs/mocha/commit/6d24063)) -- [#2119](https://github.com/mochajs/mocha/pull/2119) - Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation ([@jimenglish81](https://github.com/jimenglish81) via [`9e93efc`](https://github.com/mochajs/mocha/commit/9e93efc)) - -# 2.5.2 / 2016-05-24 - -- [#2178](https://github.com/mochajs/mocha/pull/2178) - Avoid double and triple xUnit XML escaping ([@graingert](https://github.com/graingert) via [`49b5ff1`](https://github.com/mochajs/mocha/commit/49b5ff1)) - -# 2.5.1 / 2016-05-23 - -- Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull](https://github.com/boneskull) via [`bd9450b`](https://github.com/mochajs/mocha/commit/bd9450b)) - -Thanks [**@entertainyou**](https://github.com/entertainyou), [**@SimenB**](https://github.com/SimenB), [**@just-paja**](https://github.com/just-paja) for the heads-up. - -# 2.5.0 / 2016-05-23 - -This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases). - -## Browser Tests in CI - -We now run unit tests against PhantomJS v1.x and an assortment of browsers on [SauceLabs](https://saucelabs.com), including: - -- Internet Explorer v8.0 -- Chrome (latest) -- Firefox (latest) -- Safari (latest) -- Microsoft Edge (latest) - -To accomplish this, we now run Mocha's unit tests (and a handful of integration tests) via [Karma](https://npmjs.com/package/karma) and a modified [karma-mocha](https://npmjs.com/package/karma-mocha). Along the way, we had to solve issue [#880](https://github.com/mochajs/mocha/issues/880) (apologies to [**@mderijcke**](https://github.com/mderijcke) and [**@sukima**](https://github.com/sukima) who had PRs addressing this), as well as replace most usages of [should](https://npmjs.com/package/should) with [expect.js](https://npmjs.com/package/expect.js) for IE8. - -Going forward, when sending PRs, your code will _only_ run against PhantomJS v1.x (and not hit SauceLabs) [because security](https://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests). - -## Node.js 6.x - -Node.js 6.x "just worked" before, but now it's in the CI matrix, so it's "officially" supported. Mocha _still retains support_ for Node.js 0.8.x. - -## "Minor" Release - -You'll see mostly bug fixes below, but also a couple features--as such, it's a "minor" release. - -## TYVM - -Thanks to everyone who contributed, and our fabulous [sponsors and backers](https://opencollective.com/mochajs)! - -- [#2079](https://github.com/mochajs/mocha/issues/2079) - Add browser checks to CI; update [browserify](https://npmjs.com/package/browserify) to v13.0.0 ([@dasilvacontin](https://github.com/dasilvacontin), [@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull) via [`c04c1d7`](https://github.com/mochajs/mocha/commit/c04c1d7), [`0b1e9b3`](https://github.com/mochajs/mocha/commit/0b1e9b3), [`0dde0fa`](https://github.com/mochajs/mocha/commit/0dde0fa), [`f8a3d86`](https://github.com/mochajs/mocha/commit/f8a3d86), [`9e8cbaa`](https://github.com/mochajs/mocha/commit/9e8cbaa)) -- [#880](https://github.com/mochajs/mocha/issues/880) - Make Mocha browserifyable ([@boneskull](https://github.com/boneskull) via [`524862b`](https://github.com/mochajs/mocha/commit/524862b)) -- [#2121](https://github.com/mochajs/mocha/issues/2121) - Update [glob](https://npmjs.com/package/glob) to v3.2.11 ([@astorije](https://github.com/astorije) via [`7920fc4`](https://github.com/mochajs/mocha/commit/7920fc4)) -- [#2126](https://github.com/mochajs/mocha/issues/2126) - Fix dupe error messages in stack trace filter ([@Turbo87](https://github.com/Turbo87) via [`4301caa`](https://github.com/mochajs/mocha/commit/4301caa)) -- [#2109](https://github.com/mochajs/mocha/issues/2109) - Fix certain diffs when objects cannot be coerced into primitives ([@joshlory](https://github.com/joshlory) via [`61fbb7f`](https://github.com/mochajs/mocha/commit/61fbb7f)) -- [#1827](https://github.com/mochajs/mocha/pull/1827) - Fix TWBS/`mocha.css` collisions ([@irnc](https://github.com/irnc) via [`0543798`](https://github.com/mochajs/mocha/commit/0543798)) -- [#1760](https://github.com/mochajs/mocha/issues/1760), [#1936](https://github.com/mochajs/mocha/issues/1936) - Fix `this.skip()` in HTML reporter ([@mislav](https://github.com/mislav) via [`cb4248b`](https://github.com/mochajs/mocha/commit/cb4248b)) -- [#2115](https://github.com/mochajs/mocha/pull/2115) - Fix exceptions thrown from hooks in HTML reporter ([@danielstjules](https://github.com/danielstjules) via [`e290bc0`](https://github.com/mochajs/mocha/commit/e290bc0)) -- [#2089](https://github.com/mochajs/mocha/issues/2089) - Handle Symbol values in `util.stringify()` ([@ryym](https://github.com/ryym) via [`ea61d05`](https://github.com/mochajs/mocha/commit/ea61d05)) -- [#2097](https://github.com/mochajs/mocha/pull/2097) - Fix diff for objects overriding `Object.prototype.hasOwnProperty` ([@mantoni](https://github.com/mantoni) via [`b20fdfe`](https://github.com/mochajs/mocha/commit/b20fdfe)) -- [#2101](https://github.com/mochajs/mocha/pull/2101) - Properly handle non-string "messages" thrown from assertion libraries ([@jkimbo](https://github.com/jkimbo) via [`9c41051`](https://github.com/mochajs/mocha/commit/9c41051)) -- [#2124](https://github.com/mochajs/mocha/pull/2124) - Update [growl](https://npmjs.com/package/growl) ([@benjamine](https://github.com/benjamine) via [`9ae6a85`](https://github.com/mochajs/mocha/commit/9ae6a85)) -- [#2162](https://github.com/mochajs/mocha/pull/2162), [#2205](https://github.com/mochajs/mocha/pull/2205) - JSDoc fixes ([@OlegTsyba](https://github.com/OlegTsyba) via [`8031f20`](https://github.com/mochajs/mocha/commit/8031f20), [@ScottFreeCode](https://github.com/ScottFreeCode) via [`f83b1d9`](https://github.com/mochajs/mocha/commit/f83b1d9)) -- [#2132](https://github.com/mochajs/mocha/issues/2132) - Remove Growl-related cruft ([@julienw](https://github.com/julienw) via [`00d6469`](https://github.com/mochajs/mocha/commit/00d6469)) -- [#2172](https://github.com/mochajs/mocha/pull/2172) - Add [OpenCollective](https://opencollective.com) badge, sponsors & backers ([@xdamman](https://github.com/xdamman), [@boneskull](https://github.com/boneskull) via [`caee94f`](https://github.com/mochajs/mocha/commit/caee94f)) -- [#1841](https://github.com/mochajs/mocha/pull/1841) - Add new logo, banner assets ([@dasilvacontin](https://github.com/dasilvacontin) via [`00fd0e1`](https://github.com/mochajs/mocha/commit/00fd0e1)) -- [#2214](https://github.com/mochajs/mocha/pull/2214) - Update `README.md` header ([@dasilvacontin](https://github.com/dasilvacontin) via [`c0f9be2`](https://github.com/mochajs/mocha/commit/c0f9be2)) -- [#2236](https://github.com/mochajs/mocha/pull/2236) - Better checks for Node.js v0.8 compatibility in CI ([@dasilvacontin](https://github.com/dasilvacontin) via [`ba5637d`](https://github.com/mochajs/mocha/commit/ba5637d)) -- [#2239](https://github.com/mochajs/mocha/issues/2239) - Add Node.js v6.x to CI matrix ([@boneskull](https://github.com/boneskull) via [`3904da4`](https://github.com/mochajs/mocha/commit/3904da4)) - -# 2.4.5 / 2016-01-28 - -- [#2080](https://github.com/mochajs/mocha/issues/2080), [#2078](https://github.com/mochajs/mocha/issues/2078), [#2072](https://github.com/mochajs/mocha/pull/2072), [#2073](https://github.com/mochajs/mocha/pull/2073), [#1200](https://github.com/mochajs/mocha/issues/1200) - Revert changes to console colors in changeset [1192914](https://github.com/mochajs/mocha/commit/119291449cd03a11cdeda9e37cf718a69a012896) and subsequent related changes thereafter. Restores compatibility with IE8 & PhantomJS. See also [mantoni/mochify.js#129](https://github.com/mantoni/mochify.js/issues/129) and [openlayers/ol3#4746](https://github.com/openlayers/ol3/pull/4746) ([@boneskull](https://github.com/boneskull)) -- [#2082](https://github.com/mochajs/mocha/pull/2082) - Fix several test assertions ([@mislav](https://github.com/mislav)) - -# 2.4.4 / 2016-01-27 - -- [#2080](https://github.com/mochajs/mocha/issues/2080) - Fix broken RequireJS compatibility ([@boneskull](https://github.com/boneskull)) - -# 2.4.3 / 2016-01-27 - -- [#2078](https://github.com/mochajs/mocha/issues/2078) - Fix broken IE8 ([@boneskull](https://github.com/boneskull)) - -# 2.4.2 / 2016-01-26 - -- [#2053](https://github.com/mochajs/mocha/pull/2053) - Fix web worker compatibility ([@mislav](https://github.com/mislav)) -- [#2072](https://github.com/mochajs/mocha/pull/2072) - Fix Windows color output ([@thedark1337](https://github.com/thedark1337)) -- [#2073](https://github.com/mochajs/mocha/pull/2073) - Fix colors in `progress` and `landing` reporters ([@gyandeeps](https://github.com/gyandeeps)) - -# 2.4.1 / 2016-01-26 - -- [#2067](https://github.com/mochajs/mocha/pull/2067) - Fix HTML/doc reporter regressions ([@danielstjules](https://github.com/danielstjules)) - -# 2.4.0 / 2016-01-25 - -- [#1945](https://github.com/mochajs/mocha/pull/1945) - Correctly skip tests when skipping in suite's before() ([@ryanshawty](https://github.com/ryanshawty)) -- [#2056](https://github.com/mochajs/mocha/pull/2056) - chore(license): update license year to 2016 ([@pra85](https://github.com/pra85)) -- [#2048](https://github.com/mochajs/mocha/pull/2048) - Fix `this.skip` from spec with HTML reporter ([@mislav](https://github.com/mislav)) -- [#2033](https://github.com/mochajs/mocha/pull/2033) - Update tests for newer versions of should.js ([@tomhughes](https://github.com/tomhughes)) -- [#2037](https://github.com/mochajs/mocha/pull/2037) - Fix for memory leak caused by referenced to deferred test ([@bd82](https://github.com/bd82)) -- [#2038](https://github.com/mochajs/mocha/pull/2038) - Also run Travis-CI on node.js 4 & 5 ([@bd82](https://github.com/bd82)) -- [#2028](https://github.com/mochajs/mocha/pull/2028) - Remove reference to test before afterAll hook runs ([@stonelgh](https://github.com/stonelgh)) -- Bump mkdirp to 0.5.1 to support strict mode ([@danielstjules](https://github.com/danielstjules)) -- [#1977](https://github.com/mochajs/mocha/pull/1977) - safely stringify PhantomJS undefined value ([@ahamid](https://github.com/ahamid)) -- Add the ability to retry tests ([@@longlho]) -- [#1982](https://github.com/mochajs/mocha/pull/1982) - Enable --log-timer-events option [@Alaneor](https://github.com/Alaneor) -- Fix [#1980](https://github.com/mochajs/mocha/issues/1980): Load mocha.opts from bin/mocha and bin/\_mocha ([@danielstjules](https://github.com/danielstjules)) -- [#1976](https://github.com/mochajs/mocha/pull/1976) - Simplify function call ([@iclanzan](https://github.com/iclanzan)) -- [#1963](https://github.com/mochajs/mocha/pull/1963) - Add support --perf-basic-prof ([@robraux](https://github.com/robraux)) -- [#1981](https://github.com/mochajs/mocha/pull/1981) - Fix HTML reporter handling of done and exceptions ([@Standard8](https://github.com/Standard8)) -- [#1993](https://github.com/mochajs/mocha/pull/1993) - propagate "file" property for "exports" interface ([@segrey](https://github.com/segrey)) -- [#1999](https://github.com/mochajs/mocha/pull/1999) - Add support for strict mode ([@tmont](https://github.com/tmont)) -- [#2005](https://github.com/mochajs/mocha/pull/2005) - XUnit Reporter Writes to stdout, falls back to console.log ([@jonnyreeves](https://github.com/jonnyreeves)) -- [#2021](https://github.com/mochajs/mocha/pull/2021) - Fix non ES5 compliant regexp ([@zetaben](https://github.com/zetaben)) -- [#1965] - Don't double install BDD UI ([@cowboyd](https://github.com/cowboyd)) -- [#1995](https://github.com/mochajs/mocha/pull/1995) - Make sure the xunit output dir exists before writing to it ([@ianwremmel](https://github.com/ianwremmel)) -- Use chalk for the base reporter colors; closes [#1200](https://github.com/mochajs/mocha/issues/1200) ([@boneskull](https://github.com/boneskull)) -- Fix requiring custom interfaces ([@jgkim](https://github.com/jgkim)) -- [#1967](https://github.com/mochajs/mocha/pull/1967) Silence Bluebird js warnings ([@krisr](https://github.com/krisr)) - -# 2.3.4 / 2015-11-15 - -- Update debug dependency to 2.2.0 -- remove duplication of mocha.opts on process.argv -- Fix typo in test/reporters/nyan.js - -# 2.3.3 / 2015-09-19 - -- [#1875](https://github.com/mochajs/mocha/issues/1875) - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules](https://github.com/danielstjules)) -- [#1864](https://github.com/mochajs/mocha/issues/1864) - Fix xunit missing output with --reporter-options output ([@danielstjules](https://github.com/danielstjules)) -- [#1846](https://github.com/mochajs/mocha/issues/1846) - Support all harmony flags ([@danielstjules](https://github.com/danielstjules)) -- Fix fragile xunit reporter spec ([@danielstjules](https://github.com/danielstjules)) -- [#1669](https://github.com/mochajs/mocha/issues/1669) - Fix catch uncaught errors outside test suite execution ([@danielstjules](https://github.com/danielstjules)) -- [#1868](https://github.com/mochajs/mocha/issues/1868) - Revert jade to support npm < v1.3.7 ([@danielstjules](https://github.com/danielstjules)) -- [#1766](https://github.com/mochajs/mocha/issues/1766) - Don't remove modules/components from stack trace in the browser ([@danielstjules](https://github.com/danielstjules)) -- [#1798](https://github.com/mochajs/mocha/issues/1798) - Fix correctly attribute mutiple done err with hooks ([@danielstjules](https://github.com/danielstjules)) -- Fix use utils.reduce for IE8 compatibility ([@wsw0108](https://github.com/wsw0108)) -- Some linting errors fixed by [@danielstjules](https://github.com/danielstjules) -- Call the inspect() function if message is not set ([@kevinburke](https://github.com/kevinburke)) - -# 2.3.2 / 2015-09-07 - -- [#1868](https://github.com/mochajs/mocha/issues/1868) - Fix compatibility with older versions of NPM ([@boneskull](https://github.com/boneskull)) - -# 2.3.1 / 2015-09-06 - -- [#1812](https://github.com/mochajs/mocha/issues/1812) - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows]) - -# 2.3.0 / 2015-08-30 - -- [#553](https://github.com/mochajs/mocha/issues/553) - added --allowUncaught option ([@amsul](https://github.com/amsul)) -- [#1490](https://github.com/mochajs/mocha/issues/1490) - Allow --async-only to be satisfied by returning a promise ([@jlai](https://github.com/jlai)) -- [#1829](https://github.com/mochajs/mocha/issues/1829) - support --max-old-space-size ([@gigadude](https://github.com/gigadude)) -- [#1811](https://github.com/mochajs/mocha/issues/1811) - upgrade Jade dependency ([@outsideris](https://github.com/outsideris)) -- [#1769](https://github.com/mochajs/mocha/issues/1769) - Fix async hook error handling ([@ajaykodali](https://github.com/ajaykodali)) -- [#1230](https://github.com/mochajs/mocha/issues/1230) - More descriptive beforeEach/afterEach messages ([@duncanbeevers](https://github.com/duncanbeevers)) -- [#1787](https://github.com/mochajs/mocha/issues/1787) - Scope loading behaviour instead of using early return ([@aryeguy](https://github.com/aryeguy)) -- [#1789](https://github.com/mochajs/mocha/issues/1789) - Fix: html-runner crashing ([@sunesimonsen](https://github.com/sunesimonsen)) -- [#1749](https://github.com/mochajs/mocha/issues/1749) - Fix maximum call stack error on large amount of tests ([@tinganho](https://github.com/tinganho)) -- [#1230](https://github.com/mochajs/mocha/issues/1230) - Decorate failed hook titles with test title ([@duncanbeevers](https://github.com/duncanbeevers)) -- [#1260](https://github.com/mochajs/mocha/issues/1260) - Build using Browserify ([@ndhoule](https://github.com/ndhoule)) -- [#1728](https://github.com/mochajs/mocha/issues/1728) - Don't use `__proto__` ([@ndhoule](https://github.com/ndhoule)) -- [#1781](https://github.com/mochajs/mocha/issues/1781) - Fix hook error tests ([@glenjamin](https://github.com/glenjamin)) -- [#1754](https://github.com/mochajs/mocha/issues/1754) - Allow boolean --reporter-options ([@papandreou](https://github.com/papandreou)) -- [#1766](https://github.com/mochajs/mocha/issues/1766) - Fix overly aggressive stack suppression ([@moll](https://github.com/moll)) -- [#1752](https://github.com/mochajs/mocha/issues/1752) - Avoid potential infinite loop ([@gsilk](https://github.com/gsilk)) -- [#1761](https://github.com/mochajs/mocha/issues/1761) - Fix problems running under PhantomJS ([@chromakode](https://github.com/chromakode)) -- [#1700](https://github.com/mochajs/mocha/issues/1700) - Fix more problems running under PhantomJS ([@jbnicolai](https://github.com/jbnicolai)) -- [#1774](https://github.com/mochajs/mocha/issues/1774) - Support escaped spaces in CLI options ([@adamgruber](https://github.com/adamgruber)) -- [#1687](https://github.com/mochajs/mocha/issues/1687) - Fix HTML reporter links with special chars ([@benvinegar](https://github.com/benvinegar)) -- [#1359](https://github.com/mochajs/mocha/issues/1359) - Adopt code style and enforce it using ESLint ([@ndhoule](https://github.com/ndhoule) w/ assist from [@jbnicolai](https://github.com/jbnicolai) & [@boneskull](https://github.com/boneskull)) -- various refactors ([@jbnicolai](https://github.com/jbnicolai)) -- [#1758](https://github.com/mochajs/mocha/issues/1758) - Add cross-frame compatible Error checking ([@outdooricon](https://github.com/outdooricon)) -- [#1741](https://github.com/mochajs/mocha/issues/1741) - Remove moot `version` property from bower.json ([@kkirsche](https://github.com/kkirsche)) -- [#1739](https://github.com/mochajs/mocha/issues/1739) - Improve `HISTORY.md` ([@rstacruz](https://github.com/rstacruz)) -- [#1730](https://github.com/mochajs/mocha/issues/1730) - Support more io.js flags ([@ryedog](https://github.com/ryedog)) -- [#1349](https://github.com/mochajs/mocha/issues/1349) - Allow HTML in HTML reporter errors ([@papandreou](https://github.com/papandreou) / [@sunesimonsen](https://github.com/sunesimonsen)) -- [#1572](https://github.com/mochajs/mocha/issues/1572) - Prevent default browser behavior for failure/pass links ([@jschilli](https://github.com/jschilli)) -- [#1630](https://github.com/mochajs/mocha/issues/1630) - Support underscored harmony flags ([@dominicbarnes](https://github.com/dominicbarnes)) -- [#1718](https://github.com/mochajs/mocha/issues/1718) - Support more harmony flags ([@slyg](https://github.com/slyg)) -- [#1689](https://github.com/mochajs/mocha/issues/1689) - Add stack to JSON-stream reporter ([@jonathandelgado](https://github.com/jonathandelgado)) -- [#1654](https://github.com/mochajs/mocha/issues/1654) - Fix `ReferenceError` "location is not defined" ([@jakemmarsh](https://github.com/jakemmarsh)) - -# 2.2.5 / 2015-05-14 - -- [#1699](https://github.com/mochajs/mocha/issues/1699) - Upgrade jsdiff to v1.4.0 ([@nylen](https://github.com/nylen)) -- [#1648](https://github.com/mochajs/mocha/issues/1648) - fix diff background colors in the console ([@nylen](https://github.com/nylen)) -- [#1327](https://github.com/mochajs/mocha/issues/1327) - fix tests running twice, a regression issue. ([#1686](https://github.com/mochajs/mocha/issues/1686), [@danielstjules](https://github.com/danielstjules)) -- [#1675](https://github.com/mochajs/mocha/issues/1675) - add integration tests ([@danielstjules](https://github.com/danielstjules)) -- [#1682](https://github.com/mochajs/mocha/issues/1682) - use a valid SPDX license identifier in package.json ([@kemitchell](https://github.com/kemitchell)) -- [#1660](https://github.com/mochajs/mocha/issues/1660) - fix assertion of invalid dates ([#1661](https://github.com/mochajs/mocha/issues/1661), [@a8m](https://github.com/a8m)) -- [#1241](https://github.com/mochajs/mocha/issues/1241) - fix issue with multiline diffs appearing as single line ([#1655](https://github.com/mochajs/mocha/issues/1655), [@a8m](https://github.com/a8m)) - -# 2.2.4 / 2015-04-08 - -- Load mocha.opts in \_mocha for now (close [#1645](https://github.com/mochajs/mocha/issues/1645)) - -# 2.2.3 / 2015-04-07 - -- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) -- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) -- fix(reporter/base): don't show diffs for errors without expectation -- fix(reporter/base): don't assume error message is first line of stack -- improve: dry up reporter/base test -- fix(reporter/base): explicitly ignore showDiff [#1614](https://github.com/mochajs/mocha/issues/1614) -- Add iojs to travis build -- Pass `--allow-natives-syntax` flag to node. -- Support --harmony_classes flag for io.js -- Fix 1556: Update utils.clean to handle newlines in func declarations -- Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers -- Fix 1585: make \_mocha executable again -- chore(package.json): add a8m as a contributor -- Fixed broken link on html-cov reporter -- support --es_staging flag -- fix issue where menu overlaps content. -- update contributors in package.json -- Remove trailing whitespace from reporter output -- Remove contributors list from readme -- log third-party reporter errors -- [Fix] Exclude not own properties when looping on options -- fix: support node args in mocha.opts (close [#1573](https://github.com/mochajs/mocha/issues/1573)) -- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) - -# 2.2.1 / 2015-03-09 - -- Fix passing of args intended for node/iojs. - -# 2.2.0 / 2015-03-06 - -- Update mocha.js -- Add --fgrep. Use grep for RegExp, fgrep for str -- Ignore async global errors after spec resolution -- Fixing errors that prevent mocha.js from loading in the browser - fixes [#1558](https://github.com/mochajs/mocha/issues/1558) -- fix(utils): issue [#1558](https://github.com/mochajs/mocha/issues/1558) + make -- add ability to delay root suite; closes [#362](https://github.com/mochajs/mocha/issues/362), closes [#1124](https://github.com/mochajs/mocha/issues/1124) -- fix insanity in http tests -- update travis: add node 0.12, add gitter, remove slack -- building -- resolve [#1548](https://github.com/mochajs/mocha/issues/1548): ensure the environment's "node" executable is used -- reporters/base: use supports-color to detect colorable term -- travis: use docker containers -- small fix: commander option for --expose-gc -- Ignore asynchronous errors after global failure -- Improve error output when a test fails with a non-error -- updated travis badge, uses svg instead of img -- Allow skip from test context for [#332](https://github.com/mochajs/mocha/issues/332) -- [JSHINT] Unnecessary semicolon fixed in bin/\_mocha -- Added a reminder about the done() callback to test timeout error messages -- fixes [#1496](https://github.com/mochajs/mocha/issues/1496), in Mocha.run(fn), check if fn exists before executing it, added tests too -- Add Harmony Proxy flag for iojs -- test(utils|ms|\*): test existing units -- add support for some iojs flags -- fix(utils.stringify): issue [#1229](https://github.com/mochajs/mocha/issues/1229), diff viewer -- Remove slack link -- Prevent multiple 'grep=' querystring params in html reporter -- Use grep as regexp (close [#1381](https://github.com/mochajs/mocha/issues/1381)) -- utils.stringify should handle objects without an Object prototype -- in runnable test, comparing to undefined error's message rather than a literal -- Fix test running output truncation on async STDIO -- amended for deprecated customFds option in child_process - -# 2.1.0 / 2014-12-23 - -- showDiff: don’t stringify strings -- Clean up unused module dependencies. -- Filter zero-length strings from mocha.opts -- only write to stdout in reporters -- Revert "only write to stdout in reporters" -- Print colored output only to a tty -- update summary in README.md -- rename Readme.md/History.md to README.md/HISTORY.md because neurotic -- add .mailmap to fix "git shortlog" or "git summary" output -- fixes [#1461](https://github.com/mochajs/mocha/issues/1461): nyan-reporter now respects Base.useColors, fixed bug where Base.color would not return a string when str wasn't a string. -- Use existing test URL builder in failed replay links -- modify .travis.yml: use travis_retry; closes [#1449](https://github.com/mochajs/mocha/issues/1449) -- fix -t 0 behavior; closes [#1446](https://github.com/mochajs/mocha/issues/1446) -- fix tests (whoops) -- improve diff behavior -- Preserve pathname when linking to individual tests -- Fix test -- Tiny typo in comments fixed -- after hooks now being called on failed tests when using bail, fixes [#1093](https://github.com/mochajs/mocha/issues/1093) -- fix throwing undefined/null now makes tests fail, fixes [#1395](https://github.com/mochajs/mocha/issues/1395) -- compiler extensions are added as watched extensions, removed non-standard extensions from watch regex, resolves [#1221](https://github.com/mochajs/mocha/issues/1221) -- prefix/namespace for suite titles in markdown reporter, fixes [#554](https://github.com/mochajs/mocha/issues/554) -- fix more bad markdown in CONTRIBUTING.md -- fix bad markdown in CONTRIBUTING.md -- add setImmediate/clearImmediate to globals; closes [#1435](https://github.com/mochajs/mocha/issues/1435) -- Fix buffer diffs (closes [#1132](https://github.com/mochajs/mocha/issues/1132), closes [#1433](https://github.com/mochajs/mocha/issues/1433)) -- add a CONTRIBUTING.md. closes [#882](https://github.com/mochajs/mocha/issues/882) -- fix intermittent build failures (maybe). closes [#1407](https://github.com/mochajs/mocha/issues/1407) -- add Slack notification to .travis.yml -- Fix slack link -- Add slack room to readme -- Update maintainers -- update maintainers and contributors -- resolves [#1393](https://github.com/mochajs/mocha/issues/1393): kill children with more effort on SIGINT -- xunit reporter support for optionally writing to a file -- if a reporter has a .done method, call it before exiting -- add support for reporter options -- only write to stdout in reporters - -# 2.0.0 / 2014-10-21 - -- remove: support for node 0.6.x, 0.4.x -- fix: landing reporter with non ansi characters ([#211](https://github.com/mochajs/mocha/issues/211)) -- fix: html reporter - preserve query params when navigating to suites/tests ([#1358](https://github.com/mochajs/mocha/issues/1358)) -- fix: json stream reporter add error message to failed test -- fix: fixes for visionmedia -> mochajs -- fix: use stdio, fixes node deprecation warnings ([#1391](https://github.com/mochajs/mocha/issues/1391)) - -# 1.21.5 / 2014-10-11 - -- fix: build for NodeJS v0.6.x -- fix: do not attempt to highlight syntax when non-HTML reporter is used -- update: escape-string-regexp to 1.0.2. -- fix: botched indentation in canonicalize() -- fix: .gitignore: ignore .patch and .diff files -- fix: changed 'Catched' to 'Caught' in uncaught exception error handler messages -- add: `pending` field for json reporter -- fix: Runner.prototype.uncaught: don't double-end runnables that already have a state. -- fix: --recursive, broken by [`f0facd2`](https://github.com/mochajs/mocha/commit/f0facd2e) -- update: replaces escapeRegexp with the escape-string-regexp package. -- update: commander to 2.3.0. -- update: diff to 1.0.8. -- fix: ability to disable syntax highlighting ([#1329](https://github.com/mochajs/mocha/issues/1329)) -- fix: added empty object to errorJSON() call to catch when no error is present -- fix: never time out after calling enableTimeouts(false) -- fix: timeout(0) will work at suite level ([#1300](https://github.com/mochajs/mocha/issues/1300)) -- Fix for --watch+only() issue ([#888](https://github.com/mochajs/mocha/issues/888) ) -- fix: respect err.showDiff, add Base reporter test ([#810](https://github.com/mochajs/mocha/issues/810)) - -# 1.22.1-3 / 2014-07-27 - -- fix: disabling timeouts with this.timeout(0) ([#1301](https://github.com/mochajs/mocha/issues/1301)) - -# 1.22.1-3 / 2014-07-27 - -- fix: local uis and reporters ([#1288](https://github.com/mochajs/mocha/issues/1288)) -- fix: building 1.21.0's changes in the browser ([#1284](https://github.com/mochajs/mocha/issues/1284)) - -# 1.21.0 / 2014-07-23 - -- add: --no-timeouts option ([#1262](https://github.com/mochajs/mocha/issues/1262), [#1268](https://github.com/mochajs/mocha/issues/1268)) -- add: --\*- deprecation node flags ([#1217](https://github.com/mochajs/mocha/issues/1217)) -- add: --watch-extensions argument ([#1247](https://github.com/mochajs/mocha/issues/1247)) -- change: spec reporter is default ([#1228](https://github.com/mochajs/mocha/issues/1228)) -- fix: diff output showing incorrect +/- ([#1182](https://github.com/mochajs/mocha/issues/1182)) -- fix: diffs of circular structures ([#1179](https://github.com/mochajs/mocha/issues/1179)) -- fix: re-render the progress bar when progress has changed only ([#1151](https://github.com/mochajs/mocha/issues/1151)) -- fix support for environments with global and window ([#1159](https://github.com/mochajs/mocha/issues/1159)) -- fix: reverting to previously defined onerror handler ([#1178](https://github.com/mochajs/mocha/issues/1178)) -- fix: stringify non error objects passed to done() ([#1270](https://github.com/mochajs/mocha/issues/1270)) -- fix: using local ui, reporters ([#1267](https://github.com/mochajs/mocha/issues/1267)) -- fix: cleaning es6 arrows ([#1176](https://github.com/mochajs/mocha/issues/1176)) -- fix: don't include attrs in failure tag for xunit ([#1244](https://github.com/mochajs/mocha/issues/1244)) -- fix: fail tests that return a promise if promise is rejected w/o a reason ([#1224](https://github.com/mochajs/mocha/issues/1224)) -- fix: showing failed tests in doc reporter ([#1117](https://github.com/mochajs/mocha/issues/1117)) -- fix: dot reporter dots being off ([#1204](https://github.com/mochajs/mocha/issues/1204)) -- fix: catch empty throws ([#1219](https://github.com/mochajs/mocha/issues/1219)) -- fix: honoring timeout for sync operations ([#1242](https://github.com/mochajs/mocha/issues/1242)) -- update: growl to 1.8.0 - -# 1.20.1 / 2014-06-03 - -- update: should dev dependency to ~4.0.0 ([#1231](https://github.com/mochajs/mocha/issues/1231)) - -# 1.20.0 / 2014-05-28 - -- add: filenames to suite objects ([#1222](https://github.com/mochajs/mocha/issues/1222)) - -# 1.19.0 / 2014-05-17 - -- add: browser script option to package.json -- add: export file in Mocha.Test objects ([#1174](https://github.com/mochajs/mocha/issues/1174)) -- add: add docs for wrapped node flags -- fix: mocha.run() to return error status in browser ([#1216](https://github.com/mochajs/mocha/issues/1216)) -- fix: clean() to show failure details ([#1205](https://github.com/mochajs/mocha/issues/1205)) -- fix: regex that generates html for new keyword ([#1201](https://github.com/mochajs/mocha/issues/1201)) -- fix: sibling suites have inherited but separate contexts ([#1164](https://github.com/mochajs/mocha/issues/1164)) - -# 1.18.2 / 2014-03-18 - -- fix: html runner was prevented from using #mocha as the default root el ([#1162](https://github.com/mochajs/mocha/issues/1162)) - -# 1.18.1 / 2014-03-18 - -- fix: named before/after hooks in bdd, tdd, qunit interfaces ([#1161](https://github.com/mochajs/mocha/issues/1161)) - -# 1.18.0 / 2014-03-13 - -- add: promise support ([#329](https://github.com/mochajs/mocha/issues/329)) -- add: named before/after hooks ([#966](https://github.com/mochajs/mocha/issues/966)) - -# 1.17.1 / 2014-01-22 - -- fix: expected messages in should.js (should.js#168) -- fix: expect errno global in node versions < v0.9.11 ([#1111](https://github.com/mochajs/mocha/issues/1111)) -- fix: unreliable checkGlobals optimization ([#1110](https://github.com/mochajs/mocha/issues/1110)) - -# 1.17.0 / 2014-01-09 - -- add: able to require globals (describe, it, etc.) through mocha ([#1077](https://github.com/mochajs/mocha/issues/1077)) -- fix: abort previous run on --watch change ([#1100](https://github.com/mochajs/mocha/issues/1100)) -- fix: reset context for each --watch triggered run ([#1099](https://github.com/mochajs/mocha/issues/1099)) -- fix: error when cli can't resolve path or pattern ([#799](https://github.com/mochajs/mocha/issues/799)) -- fix: canonicalize objects before stringifying and diffing them ([#1079](https://github.com/mochajs/mocha/issues/1079)) -- fix: make CR call behave like carriage return for non tty ([#1087](https://github.com/mochajs/mocha/issues/1087)) - -# 1.16.2 / 2013-12-23 - -- fix: couple issues with ie 8 ([#1082](https://github.com/mochajs/mocha/issues/1082), [#1081](https://github.com/mochajs/mocha/issues/1081)) -- fix: issue running the xunit reporter in browsers ([#1068](https://github.com/mochajs/mocha/issues/1068)) -- fix: issue with firefox < 3.5 ([#725](https://github.com/mochajs/mocha/issues/725)) - -# 1.16.1 / 2013-12-19 - -- fix: recompiled for missed changes from the last release - -# 1.16.0 / 2013-12-19 - -- add: Runnable.globals(arr) for per test global whitelist ([#1046](https://github.com/mochajs/mocha/issues/1046)) -- add: mocha.throwError(err) for assertion libs to call ([#985](https://github.com/mochajs/mocha/issues/985)) -- remove: --watch's spinner ([#806](https://github.com/mochajs/mocha/issues/806)) -- fix: duplicate test output for multi-line specs in spec reporter ([#1006](https://github.com/mochajs/mocha/issues/1006)) -- fix: gracefully exit on SIGINT ([#1063](https://github.com/mochajs/mocha/issues/1063)) -- fix expose the specified ui only in the browser ([#984](https://github.com/mochajs/mocha/issues/984)) -- fix: ensure process exit code is preserved when using --no-exit ([#1059](https://github.com/mochajs/mocha/issues/1059)) -- fix: return true from window.onerror handler ([#868](https://github.com/mochajs/mocha/issues/868)) -- fix: xunit reporter to use process.stdout.write ([#1068](https://github.com/mochajs/mocha/issues/1068)) -- fix: utils.clean(str) indentation ([#761](https://github.com/mochajs/mocha/issues/761)) -- fix: xunit reporter returning test duration a NaN ([#1039](https://github.com/mochajs/mocha/issues/1039)) - -# 1.15.1 / 2013-12-03 - -- fix: recompiled for missed changes from the last release - -# 1.15.0 / 2013-12-02 - -- add: `--no-exit` to prevent `process.exit()` ([#1018](https://github.com/mochajs/mocha/issues/1018)) -- fix: using inline diffs ([#1044](https://github.com/mochajs/mocha/issues/1044)) -- fix: show pending test details in xunit reporter ([#1051](https://github.com/mochajs/mocha/issues/1051)) -- fix: faster global leak detection ([#1024](https://github.com/mochajs/mocha/issues/1024)) -- fix: yui compression ([#1035](https://github.com/mochajs/mocha/issues/1035)) -- fix: wrapping long lines in test results ([#1030](https://github.com/mochajs/mocha/issues/1030), [#1031](https://github.com/mochajs/mocha/issues/1031)) -- fix: handle errors in hooks ([#1043](https://github.com/mochajs/mocha/issues/1043)) - -# 1.14.0 / 2013-11-02 - -- add: unified diff ([#862](https://github.com/mochajs/mocha/issues/862)) -- add: set MOCHA_COLORS env var to use colors ([#965](https://github.com/mochajs/mocha/issues/965)) -- add: able to override tests links in html reporters ([#776](https://github.com/mochajs/mocha/issues/776)) -- remove: teamcity reporter ([#954](https://github.com/mochajs/mocha/issues/954)) -- update: commander dependency to 2.0.0 ([#1010](https://github.com/mochajs/mocha/issues/1010)) -- fix: mocha --ui will try to require the ui if not built in, as --reporter does ([#1022](https://github.com/mochajs/mocha/issues/1022)) -- fix: send cursor commands only if isatty ([#184](https://github.com/mochajs/mocha/issues/184), [#1003](https://github.com/mochajs/mocha/issues/1003)) -- fix: include assertion message in base reporter ([#993](https://github.com/mochajs/mocha/issues/993), [#991](https://github.com/mochajs/mocha/issues/991)) -- fix: consistent return of it, it.only, and describe, describe.only ([#840](https://github.com/mochajs/mocha/issues/840)) - -# 1.13.0 / 2013-09-15 - -- add: sort test files with --sort ([#813](https://github.com/mochajs/mocha/issues/813)) -- update: diff dependency to 1.0.7 -- update: glob dependency to 3.2.3 ([#927](https://github.com/mochajs/mocha/issues/927)) -- fix: diffs show whitespace differences ([#976](https://github.com/mochajs/mocha/issues/976)) -- fix: improve global leaks ([#783](https://github.com/mochajs/mocha/issues/783)) -- fix: firefox window.getInterface leak -- fix: accessing iframe via window[iframeIndex] leak -- fix: faster global leak checking -- fix: reporter pending css selector ([#970](https://github.com/mochajs/mocha/issues/970)) - -# 1.12.1 / 2013-08-29 - -- remove test.js from .gitignore -- update included version of ms.js - -# 1.12.0 / 2013-07-01 - -- add: prevent diffs for differing types. Closes [#900](https://github.com/mochajs/mocha/issues/900) -- add `Mocha.process` hack for phantomjs -- fix: use compilers with requires -- fix regexps in diffs. Closes [#890](https://github.com/mochajs/mocha/issues/890) -- fix xunit NaN on failure. Closes [#894](https://github.com/mochajs/mocha/issues/894) -- fix: strip tab indentation in `clean` utility method -- fix: textmate bundle installation - -# 1.11.0 / 2013-06-12 - -- add --prof support -- add --harmony support -- add --harmony-generators support -- add "Uncaught " prefix to uncaught exceptions -- add web workers support -- add `suite.skip()` -- change to output # of pending / passing even on failures. Closes [#872](https://github.com/mochajs/mocha/issues/872) -- fix: prevent hooks from being called if we are bailing -- fix `this.timeout(0)` - -# 1.10.0 / 2013-05-21 - -- add add better globbing support for windows via `glob` module -- add support to pass through flags such as --debug-brk=1234. Closes [#852](https://github.com/mochajs/mocha/issues/852) -- add test.only, test.skip to qunit interface -- change to always use word-based diffs for now. Closes [#733](https://github.com/mochajs/mocha/issues/733) -- change `mocha init` tests.html to index.html -- fix `process` global leak in the browser -- fix: use resolve() instead of join() for --require -- fix: filterLeaks() condition to not consider indices in global object as leaks -- fix: restrict mocha.css styling to #mocha id -- fix: save timer references to avoid Sinon interfering in the browser build. - -# 1.9.0 / 2013-04-03 - -- add improved setImmediate implementation -- replace --ignore-leaks with --check-leaks -- change default of ignoreLeaks to true. Closes [#791](https://github.com/mochajs/mocha/issues/791) -- remove scrolling for HTML reporter -- fix retina support -- fix tmbundle, restrict to js scope - -# 1.8.2 / 2013-03-11 - -- add `setImmediate` support for 0.10.x -- fix mocha -w spinner on windows - -# 1.8.1 / 2013-01-09 - -- fix .bail() arity check causing it to default to true - -# 1.8.0 / 2013-01-08 - -- add Mocha() options bail support -- add `Mocha#bail()` method -- add instanceof check back for inheriting from Error -- add component.json -- add diff.js to browser build -- update growl -- fix TAP reporter failures comment :D - -# 1.7.4 / 2012-12-06 - -- add total number of passes and failures to TAP -- remove .bind() calls. re [#680](https://github.com/mochajs/mocha/issues/680) -- fix indexOf. Closes [#680](https://github.com/mochajs/mocha/issues/680) - -# 1.7.3 / 2012-11-30 - -- fix uncaught error support for the browser -- revert uncaught "fix" which breaks node - -# 1.7.2 / 2012-11-28 - -- fix uncaught errors to expose the original error message - -# 1.7.0 / 2012-11-07 - -- add `--async-only` support to prevent false positives for missing `done()` -- add sorting by filename in code coverage -- add HTML 5 doctype to browser template. -- add play button to html reporter to rerun a single test -- add `this.timeout(ms)` as Suite#timeout(ms). Closes [#599](https://github.com/mochajs/mocha/issues/599) -- update growl dependency to 1.6.x -- fix encoding of test-case ?grep. Closes [#637](https://github.com/mochajs/mocha/issues/637) -- fix unicode chars on windows -- fix dom globals in Opera/IE. Closes [#243](https://github.com/mochajs/mocha/issues/243) -- fix markdown reporter a tags -- fix `this.timeout("5s")` support - -# 1.6.0 / 2012-10-02 - -- add object diffs when `err.showDiff` is present -- add hiding of empty suites when pass/failures are toggled -- add faster `.length` checks to `checkGlobals()` before performing the filter - -# 1.5.0 / 2012-09-21 - -- add `ms()` to `.slow()` and `.timeout()` -- add `Mocha#checkLeaks()` to re-enable global leak checks -- add `this.slow()` option [aheckmann] -- add tab, CR, LF to error diffs for now -- add faster `.checkGlobals()` solution [guille] -- remove `fn.call()` from reduce util -- remove `fn.call()` from filter util -- fix forEach. Closes [#582](https://github.com/mochajs/mocha/issues/582) -- fix relaying of signals [TooTallNate] -- fix TAP reporter grep number - -# 1.4.2 / 2012-09-01 - -- add support to multiple `Mocha#globals()` calls, and strings -- add `mocha.reporter()` constructor support [jfirebaugh] -- add `mocha.timeout()` -- move query-string parser to utils.js -- move highlight code to utils.js -- fix third-party reporter support [exogen] -- fix client-side API to match node-side [jfirebaugh] -- fix mocha in iframe [joliss] - -# 1.4.1 / 2012-08-28 - -- add missing `Markdown` export -- fix `Mocha#grep()`, escape regexp strings -- fix reference error when `devicePixelRatio` is not defined. Closes [#549](https://github.com/mochajs/mocha/issues/549) - -# 1.4.0 / 2012-08-22 - -- add mkdir -p to `mocha init`. Closes [#539](https://github.com/mochajs/mocha/issues/539) -- add `.only()`. Closes [#524](https://github.com/mochajs/mocha/issues/524) -- add `.skip()`. Closes [#524](https://github.com/mochajs/mocha/issues/524) -- change str.trim() to use utils.trim(). Closes [#533](https://github.com/mochajs/mocha/issues/533) -- fix HTML progress indicator retina display -- fix url-encoding of click-to-grep HTML functionality - -# 1.3.2 / 2012-08-01 - -- fix exports double-execution regression. Closes [#531](https://github.com/mochajs/mocha/issues/531) - -# 1.3.1 / 2012-08-01 - -- add passes/failures toggling to HTML reporter -- add pending state to `xit()` and `xdescribe()` [Brian Moore] -- add the [**@charset**](https://github.com/charset) "UTF-8"; to fix [#522](https://github.com/mochajs/mocha/issues/522) with FireFox. [Jonathan Creamer] -- add border-bottom to #stats links -- add check for runnable in `Runner#uncaught()`. Closes [#494](https://github.com/mochajs/mocha/issues/494) -- add 0.4 and 0.6 back to travis.yml -- add `-E, --growl-errors` to growl on failures only -- add prefixes to debug() names. Closes [#497](https://github.com/mochajs/mocha/issues/497) -- add `Mocha#invert()` to js api -- change dot reporter to use sexy unicode dots -- fix error when clicking pending test in HTML reporter -- fix `make tm` - -# 1.3.0 / 2012-07-05 - -- add window scrolling to `HTML` reporter -- add v8 `--trace-*` option support -- add support for custom reports via `--reporter MODULE` -- add `--invert` switch to invert `--grep` matches -- fix export of `Nyan` reporter. Closes [#495](https://github.com/mochajs/mocha/issues/495) -- fix escaping of `HTML` suite titles. Closes [#486](https://github.com/mochajs/mocha/issues/486) -- fix `done()` called multiple times with an error test -- change `--grep` - regexp escape the input - -# 1.2.2 / 2012-06-28 - -- Added 0.8.0 support - -# 1.2.1 / 2012-06-25 - -- Added `this.test.error(err)` support to after each hooks. Closes [#287](https://github.com/mochajs/mocha/issues/287) -- Added: export top-level suite on global mocha object (mocha.suite). Closes [#448](https://github.com/mochajs/mocha/issues/448) -- Fixed `js` code block format error in markdown reporter -- Fixed deprecation warning when using `path.existsSync` -- Fixed --globals with wildcard -- Fixed chars in nyan when his head moves back -- Remove `--growl` from test/mocha.opts. Closes [#289](https://github.com/mochajs/mocha/issues/289) - -# 1.2.0 / 2012-06-17 - -- Added `nyan` reporter [Atsuya Takagi] -- Added `mocha init ` to copy client files -- Added "specify" synonym for "it" [domenic] -- Added global leak wildcard support [nathanbowser] -- Fixed runner emitter leak. closes [#432](https://github.com/mochajs/mocha/issues/432) -- Fixed omission of .js extension. Closes [#454](https://github.com/mochajs/mocha/issues/454) - -# 1.1.0 / 2012-05-30 - -- Added: check each `mocha(1)` arg for directories to walk -- Added `--recursive` [tricknotes] -- Added `context` for BDD [hokaccha] -- Added styling for new clickable titles -- Added clickable suite titles to HTML reporter -- Added warning when strings are thrown as errors -- Changed: green arrows again in HTML reporter styling -- Changed ul/li elements instead of divs for better copy-and-pasting [joliss] -- Fixed issue [#325](https://github.com/mochajs/mocha/issues/325) - add better grep support to js api -- Fixed: save timer references to avoid Sinon interfering. - -# 1.0.3 / 2012-04-30 - -- Fixed string diff newlines -- Fixed: removed mocha.css target. Closes [#401](https://github.com/mochajs/mocha/issues/401) - -# 1.0.2 / 2012-04-25 - -- Added HTML reporter duration. Closes [#47](https://github.com/mochajs/mocha/issues/47) -- Fixed: one postMessage event listener [exogen] -- Fixed: allow --globals to be used multiple times. Closes [#100](https://github.com/mochajs/mocha/issues/100) [brendannee] -- Fixed [#158](https://github.com/mochajs/mocha/issues/158): removes jquery include from browser tests -- Fixed grep. Closes [#372](https://github.com/mochajs/mocha/issues/372) [brendannee] -- Fixed [#166](https://github.com/mochajs/mocha/issues/166) - When grepping don't display the empty suites -- Removed test/browser/style.css. Closes [#385](https://github.com/mochajs/mocha/issues/385) - -# 1.0.1 / 2012-04-04 - -- Fixed `.timeout()` in hooks -- Fixed: allow callback for `mocha.run()` in client version -- Fixed browser hook error display. Closes [#361](https://github.com/mochajs/mocha/issues/361) - -# 1.0.0 / 2012-03-24 - -- Added js API. Closes [#265](https://github.com/mochajs/mocha/issues/265) -- Added: initial run of tests with `--watch`. Closes [#345](https://github.com/mochajs/mocha/issues/345) -- Added: mark `location` as a global on the CS. Closes [#311](https://github.com/mochajs/mocha/issues/311) -- Added `markdown` reporter (github flavour) -- Added: scrolling menu to coverage.html. Closes [#335](https://github.com/mochajs/mocha/issues/335) -- Added source line to html report for Safari [Tyson Tate] -- Added "min" reporter, useful for `--watch` [Jakub Nešetřil] -- Added support for arbitrary compilers via . Closes [#338](https://github.com/mochajs/mocha/issues/338) [Ian Young] -- Added Teamcity export to lib/reporters/index [Michael Riley] -- Fixed chopping of first char in error reporting. Closes [#334](https://github.com/mochajs/mocha/issues/334) [reported by topfunky] -- Fixed terrible FF / Opera stack traces - -# 0.14.1 / 2012-03-06 - -- Added lib-cov to _.npmignore_ -- Added reporter to `mocha.run([reporter])` as argument -- Added some margin-top to the HTML reporter -- Removed jQuery dependency -- Fixed `--watch`: purge require cache. Closes [#266](https://github.com/mochajs/mocha/issues/266) - -# 0.14.0 / 2012-03-01 - -- Added string diff support for terminal reporters - -# 0.13.0 / 2012-02-23 - -- Added preliminary test coverage support. Closes [#5](https://github.com/mochajs/mocha/issues/5) -- Added `HTMLCov` reporter -- Added `JSONCov` reporter [kunklejr] -- Added `xdescribe()` and `xit()` to the BDD interface. Closes [#263](https://github.com/mochajs/mocha/issues/263) (docs \* Changed: make json reporter output pretty json -- Fixed node-inspector support, swapped `--debug` for `debug` to match node. Closes [#247](https://github.com/mochajs/mocha/issues/247) - -# 0.12.1 / 2012-02-14 - -- Added `npm docs mocha` support [TooTallNate] -- Added a `Context` object used for hook and test-case this. Closes [#253](https://github.com/mochajs/mocha/issues/253) -- Fixed `Suite#clone()` `.ctx` reference. Closes [#262](https://github.com/mochajs/mocha/issues/262) - -# 0.12.0 / 2012-02-02 - -- Added .coffee `--watch` support. Closes [#242](https://github.com/mochajs/mocha/issues/242) -- Added support to `--require` files relative to the CWD. Closes [#241](https://github.com/mochajs/mocha/issues/241) -- Added quick n dirty syntax highlighting. Closes [#248](https://github.com/mochajs/mocha/issues/248) -- Changed: made HTML progress indicator smaller -- Fixed xunit errors attribute [dhendo] - -# 0.10.2 / 2012-01-21 - -- Fixed suite count in reporter stats. Closes [#222](https://github.com/mochajs/mocha/issues/222) -- Fixed `done()` after timeout error reporting [Phil Sung] -- Changed the 0-based errors to 1 - -# 0.10.1 / 2012-01-17 - -- Added support for node 0.7.x -- Fixed absolute path support. Closes [#215](https://github.com/mochajs/mocha/issues/215) [kompiro] -- Fixed `--no-colors` option [Jussi Virtanen] -- Fixed Arial CSS typo in the correct file - -# 0.10.0 / 2012-01-13 - -- Added `-b, --bail` to exit on first exception [guillermo] -- Added support for `-gc` / `--expose-gc` [TooTallNate] -- Added `qunit`-inspired interface -- Added MIT LICENSE. Closes [#194](https://github.com/mochajs/mocha/issues/194) -- Added: `--watch` all .js in the CWD. Closes [#139](https://github.com/mochajs/mocha/issues/139) -- Fixed `self.test` reference in runner. Closes [#189](https://github.com/mochajs/mocha/issues/189) -- Fixed double reporting of uncaught exceptions after timeout. Closes [#195](https://github.com/mochajs/mocha/issues/195) - -# 0.8.2 / 2012-01-05 - -- Added test-case context support. Closes [#113](https://github.com/mochajs/mocha/issues/113) -- Fixed exit status. Closes [#187](https://github.com/mochajs/mocha/issues/187) -- Update commander. Closes [#190](https://github.com/mochajs/mocha/issues/190) - -# 0.8.1 / 2011-12-30 - -- Fixed reporting of uncaught exceptions. Closes [#183](https://github.com/mochajs/mocha/issues/183) -- Fixed error message defaulting [indutny] -- Changed mocha(1) from bash to node for windows [Nathan Rajlich] - -# 0.8.0 / 2011-12-28 - -- Added `XUnit` reporter [FeeFighters/visionmedia] -- Added `say(1)` notification support [Maciej Małecki] -- Changed: fail when done() is invoked with a non-Error. Closes [#171](https://github.com/mochajs/mocha/issues/171) -- Fixed `err.stack`, defaulting to message. Closes [#180](https://github.com/mochajs/mocha/issues/180) -- Fixed: `make tm` mkdir -p the dest. Closes [#137](https://github.com/mochajs/mocha/issues/137) -- Fixed mocha(1) --help bin name -- Fixed `-d` for `--debug` support - -# 0.7.1 / 2011-12-22 - -- Removed `mocha-debug(1)`, use `mocha --debug` -- Fixed CWD relative requires -- Fixed growl issue on windows [Raynos] -- Fixed: platform specific line endings [TooTallNate] -- Fixed: escape strings in HTML reporter. Closes [#164](https://github.com/mochajs/mocha/issues/164) - -# 0.7.0 / 2011-12-18 - -- Added support for IE{7,8} [guille] -- Changed: better browser nextTick implementation [guille] - -# 0.6.0 / 2011-12-18 - -- Added setZeroTimeout timeout for browser (nicer stack traces). Closes [#153](https://github.com/mochajs/mocha/issues/153) -- Added "view source" on hover for HTML reporter to make it obvious -- Changed: replace custom growl with growl lib -- Fixed duplicate reporting for HTML reporter. Closes [#154](https://github.com/mochajs/mocha/issues/154) -- Fixed silent hook errors in the HTML reporter. Closes [#150](https://github.com/mochajs/mocha/issues/150) - -# 0.5.0 / 2011-12-14 - -- Added: push node_modules directory onto module.paths for relative require Closes [#93](https://github.com/mochajs/mocha/issues/93) -- Added teamcity reporter [blindsey] -- Fixed: recover from uncaught exceptions for tests. Closes [#94](https://github.com/mochajs/mocha/issues/94) -- Fixed: only emit "test end" for uncaught within test, not hook - -# 0.4.0 / 2011-12-14 - -- Added support for test-specific timeouts via `this.timeout(0)`. Closes [#134](https://github.com/mochajs/mocha/issues/134) -- Added guillermo's client-side EventEmitter. Closes [#132](https://github.com/mochajs/mocha/issues/132) -- Added progress indicator to the HTML reporter -- Fixed slow browser tests. Closes [#135](https://github.com/mochajs/mocha/issues/135) -- Fixed "suite" color for light terminals -- Fixed `require()` leak spotted by [guillermo] - -# 0.3.6 / 2011-12-09 - -- Removed suite merging (for now) - -# 0.3.5 / 2011-12-08 - -- Added support for `window.onerror` [guillermo] -- Fixed: clear timeout on uncaught exceptions. Closes [#131](https://github.com/mochajs/mocha/issues/131) [guillermo] -- Added `mocha.css` to PHONY list. -- Added `mocha.js` to PHONY list. - -# 0.3.4 / 2011-12-08 - -- Added: allow `done()` to be called with non-Error -- Added: return Runner from `mocha.run()`. Closes [#126](https://github.com/mochajs/mocha/issues/126) -- Fixed: run afterEach even on failures. Closes [#125](https://github.com/mochajs/mocha/issues/125) -- Fixed clobbering of current runnable. Closes [#121](https://github.com/mochajs/mocha/issues/121) - -# 0.3.3 / 2011-12-08 - -- Fixed hook timeouts. Closes [#120](https://github.com/mochajs/mocha/issues/120) -- Fixed uncaught exceptions in hooks - -# 0.3.2 / 2011-12-05 - -- Fixed weird reporting when `err.message` is not present - -# 0.3.1 / 2011-12-04 - -- Fixed hook event emitter leak. Closes [#117](https://github.com/mochajs/mocha/issues/117) -- Fixed: export `Spec` constructor. Closes [#116](https://github.com/mochajs/mocha/issues/116) - -# 0.3.0 / 2011-12-04 - -- Added `-w, --watch`. Closes [#72](https://github.com/mochajs/mocha/issues/72) -- Added `--ignore-leaks` to ignore global leak checking -- Added browser `?grep=pattern` support -- Added `--globals ` to specify accepted globals. Closes [#99](https://github.com/mochajs/mocha/issues/99) -- Fixed `mocha-debug(1)` on some systems. Closes [#232](https://github.com/mochajs/mocha/issues/232) -- Fixed growl total, use `runner.total` - -# 0.2.0 / 2011-11-30 - -- Added `--globals ` to specify accepted globals. Closes [#99](https://github.com/mochajs/mocha/issues/99) -- Fixed funky highlighting of messages. Closes [#97](https://github.com/mochajs/mocha/issues/97) -- Fixed `mocha-debug(1)`. Closes [#232](https://github.com/mochajs/mocha/issues/232) -- Fixed growl total, use runner.total - -# 0.1.0 / 2011-11-29 - -- Added `suiteSetup` and `suiteTeardown` to TDD interface [David Henderson] -- Added growl icons. Closes [#84](https://github.com/mochajs/mocha/issues/84) -- Fixed coffee-script support - -# 0.0.8 / 2011-11-25 - -- Fixed: use `Runner#total` for accurate reporting - -# 0.0.7 / 2011-11-25 - -- Added `Hook` -- Added `Runnable` -- Changed: `Test` is `Runnable` -- Fixed global leak reporting in hooks -- Fixed: > 2 calls to done() only report the error once -- Fixed: clear timer on failure. Closes [#80](https://github.com/mochajs/mocha/issues/80) - -# 0.0.6 / 2011-11-25 - -- Fixed return on immediate async error. Closes [#80](https://github.com/mochajs/mocha/issues/80) - -# 0.0.5 / 2011-11-24 - -- Fixed: make mocha.opts whitespace less picky [kkaefer] - -# 0.0.4 / 2011-11-24 - -- Added `--interfaces` -- Added `--reporters` -- Added `-c, --colors`. Closes [#69](https://github.com/mochajs/mocha/issues/69) -- Fixed hook timeouts - -# 0.0.3 / 2011-11-23 - -- Added `-C, --no-colors` to explicitly disable -- Added coffee-script support - -# 0.0.2 / 2011-11-22 - -- Fixed global leak detection due to Safari bind() change -- Fixed: escape html entities in Doc reporter -- Fixed: escape html entities in HTML reporter -- Fixed pending test support for HTML reporter. Closes [#66](https://github.com/mochajs/mocha/issues/66) - -# 0.0.1 / 2011-11-22 - -- Added `--timeout` second shorthand support, ex `--timeout 3s`. -- Fixed "test end" event for uncaughtExceptions. Closes [#61](https://github.com/mochajs/mocha/issues/61) - -# 0.0.1-alpha6 / 2011-11-19 - -- Added travis CI support (needs enabling when public) -- Added preliminary browser support -- Added `make mocha.css` target. Closes [#45](https://github.com/mochajs/mocha/issues/45) -- Added stack trace to TAP errors. Closes [#52](https://github.com/mochajs/mocha/issues/52) -- Renamed tearDown to teardown. Closes [#49](https://github.com/mochajs/mocha/issues/49) -- Fixed: cascading hooksc. Closes [#30](https://github.com/mochajs/mocha/issues/30) -- Fixed some colors for non-tty -- Fixed errors thrown in sync test-cases due to nextTick -- Fixed Base.window.width... again give precedence to 0.6.x - -# 0.0.1-alpha5 / 2011-11-17 - -- Added `doc` reporter. Closes [#33](https://github.com/mochajs/mocha/issues/33) -- Added suite merging. Closes [#28](https://github.com/mochajs/mocha/issues/28) -- Added TextMate bundle and `make tm`. Closes [#20](https://github.com/mochajs/mocha/issues/20) - -# 0.0.1-alpha4 / 2011-11-15 - -- Fixed getWindowSize() for 0.4.x - -# 0.0.1-alpha3 / 2011-11-15 - -- Added `-s, --slow ` to specify "slow" test threshold -- Added `mocha-debug(1)` -- Added `mocha.opts` support. Closes [#31](https://github.com/mochajs/mocha/issues/31) -- Added: default [files] to _test/\*.js_ -- Added protection against multiple calls to `done()`. Closes [#35](https://github.com/mochajs/mocha/issues/35) -- Changed: bright yellow for slow Dot reporter tests - -# 0.0.1-alpha2 / 2011-11-08 - -- Missed this one :) - -# 0.0.1-alpha1 / 2011-11-08 - -- Initial release diff --git a/docs/changelogs/CHANGELOG_V3_older.md b/docs/changelogs/CHANGELOG_V3_older.md new file mode 100644 index 0000000000..d9ca257f05 --- /dev/null +++ b/docs/changelogs/CHANGELOG_V3_older.md @@ -0,0 +1,1258 @@ +# 3.5.3 / 2017-09-11 + +## :bug: Fixes + +- [#3003](https://github.com/mochajs/mocha/pull/3003): Fix invalid entities in xUnit reporter first appearing in v3.5.1 ([@jkrems](https://github.com/jkrems)) + +# 3.5.2 / 2017-09-10 + +## :bug: Fixes + +- [#3001](https://github.com/mochajs/mocha/pull/3001): Fix AMD-related failures first appearing in v3.5.1 ([@boneskull](https://github.com/boneskull)) + +# 3.5.1 / 2017-09-09 + +## :newspaper: News + +- :mega: Mocha is now sponsoring [PDXNode](http://pdxnode.org)! If you're in the [Portland](https://wikipedia.org/wiki/Portland,_Oregon) area, come check out the monthly talks and hack nights! + +## :bug: Fixes + +- [#2997](https://github.com/mochajs/mocha/pull/2997): Fix missing `xit` export for "require" interface ([@solodynamo](https://github.com/solodynamo)) +- [#2957](https://github.com/mochajs/mocha/pull/2957): Fix unicode character handling in XUnit reporter failures ([@jkrems](https://github.com/jkrems)) + +## :nut_and_bolt: Other + +- [#2986](https://github.com/mochajs/mocha/pull/2986): Add issue and PR templates ([@kungapal](https://github.com/kungapal)) +- [#2918](https://github.com/mochajs/mocha/pull/2918): Drop bash dependency for glob-related tests ([@ScottFreeCode](https://github.com/ScottFreeCode)) +- [#2922](https://github.com/mochajs/mocha/pull/2922): Improve `--compilers` coverage ([@ScottFreeCode](https://github.com/ScottFreeCode)) +- [#2981](https://github.com/mochajs/mocha/pull/2981): Fix tpyos and spelling errors ([@jsoref](https://github.com/jsoref)) + +# 3.5.0 / 2017-07-31 + +## :newspaper: News + +- Mocha now has a [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) (thanks [@kungapal](https://github.com/kungapal)!). +- Old issues and PRs are now being marked "stale" by [Probot's "Stale" plugin](https://github.com/probot/stale). If an issue is marked as such, and you would like to see it remain open, simply add a new comment to the ticket or PR. +- **WARNING**: Support for non-ES5-compliant environments will be dropped starting with version 4.0.0 of Mocha! + +## :lock: Security Fixes + +- [#2860](https://github.com/mochajs/mocha/pull/2860): Address [CVE-2015-8315](https://nodesecurity.io/advisories/46) via upgrade of [debug](https://npm.im/debug) ([@boneskull](https://github.com/boneskull)) + +## :tada: Enhancements + +- [#2696](https://github.com/mochajs/mocha/pull/2696): Add `--forbid-only` and `--forbid-pending` flags. Use these in CI or hooks to ensure tests aren't accidentally being skipped! ([@charlierudolph](https://github.com/charlierudolph)) +- [#2813](https://github.com/mochajs/mocha/pull/2813): Support Node.js 8's `--napi-modules` flag ([@jupp0r](https://github.com/jupp0r)) + +## :nut_and_bolt: Other + +- Various CI-and-test-related fixes and improvements ([@boneskull](https://github.com/boneskull), [@dasilvacontin](https://github.com/dasilvacontin), [@PopradiArpad](https://github.com/PopradiArpad), [@Munter](https://github.com/munter), [@ScottFreeCode](https://github.com/ScottFreeCode)) +- "Officially" support Node.js 8 ([@elergy](https://github.com/elergy)) + +# 3.4.2 / 2017-05-24 + +## :bug: Fixes + +- [#2802](https://github.com/mochajs/mocha/issues/2802): Remove call to deprecated `os.tmpDir` ([@makepanic](https://github.com/makepanic)) +- [#2820](https://github.com/mochajs/mocha/pull/2820): Eagerly set `process.exitCode` ([@chrisleck](https://github.com/chrisleck)) + +## :nut_and_bolt: Other + +- [#2807](https://github.com/mochajs/mocha/pull/2807): Move linting into an npm script ([@Munter](https://github.com/munter)) + +# 3.4.1 / 2017-05-14 + +Fixed a publishing mishap with git's autocrlf settings. + +# 3.4.0 / 2017-05-14 + +Mocha is now moving to a quicker release schedule: when non-breaking changes are merged, a release should happen that week. + +This week's highlights: + +- `allowUncaught` added to commandline as `--allow-uncaught` (and bugfixed) +- warning-related Node flags + +## :tada: Enhancements + +- [#2793](https://github.com/mochajs/mocha/pull/2793), [#2697](https://github.com/mochajs/mocha/pull/2697): add --allowUncaught to Node.js ([@lrowe](https://github.com/lrowe)) +- [#2733](https://github.com/mochajs/mocha/pull/2733): Add `--no-warnings` and `--trace-warnings` flags ([@sonicdoe](https://github.com/sonicdoe)) + +## :bug: Fixes + +- [#2793](https://github.com/mochajs/mocha/pull/2793), [#2697](https://github.com/mochajs/mocha/pull/2697): fix broken allowUncaught ([@lrowe](https://github.com/lrowe)) + +## :nut_and_bolt: Other + +- [#2778](https://github.com/mochajs/mocha/pull/2778): Add license report and scan status ([@xizhao](https://github.com/xizhao)) +- [#2794](https://github.com/mochajs/mocha/pull/2794): no special case for macOS running Karma locally ([@boneskull](https://github.com/boneskull)) +- [#2795](https://github.com/mochajs/mocha/pull/2795): reverts use of semistandard directly ([#2648](https://github.com/mochajs/mocha/pull/2648)) ([@boneskull](https://github.com/boneskull)) + +# 3.3.0 / 2017-04-24 + +Thanks to all our contributors, maintainers, sponsors, and users! ❤️ + +As highlights: + +- We've got coverage now! +- Testing is looking less flaky \\o/. +- No more nitpicking about "mocha.js" build on PRs. + +## :tada: Enhancements + +- [#2659](https://github.com/mochajs/mocha/pull/2659): Adds support for loading reporter from an absolute or relative path ([@sul4bh](https://github.com/sul4bh)) +- [#2769](https://github.com/mochajs/mocha/pull/2769): Support `--inspect-brk` on command-line ([@igwejk](https://github.com/igwejk)) + +## :bug: Fixes + +- [#2662](https://github.com/mochajs/mocha/pull/2662): Replace unicode chars w/ hex codes in HTML reporter ([@rotemdan](https://github.com/rotemdan)) + +## :mag: Coverage + +- [#2672](https://github.com/mochajs/mocha/pull/2672): Add coverage for node tests ([@c089](https://github.com/c089), [@Munter](https://github.com/munter)) +- [#2680](https://github.com/mochajs/mocha/pull/2680): Increase tests coverage for base reporter ([@epallerols](https://github.com/epallerols)) +- [#2690](https://github.com/mochajs/mocha/pull/2690): Increase tests coverage for doc reporter ([@craigtaub](https://github.com/craigtaub)) +- [#2701](https://github.com/mochajs/mocha/pull/2701): Increase tests coverage for landing, min, tap and list reporters ([@craigtaub](https://github.com/craigtaub)) +- [#2691](https://github.com/mochajs/mocha/pull/2691): Increase tests coverage for spec + dot reporters ([@craigtaub](https://github.com/craigtaub)) +- [#2698](https://github.com/mochajs/mocha/pull/2698): Increase tests coverage for xunit reporter ([@craigtaub](https://github.com/craigtaub)) +- [#2699](https://github.com/mochajs/mocha/pull/2699): Increase tests coverage for json-stream, markdown and progress reporters ([@craigtaub](https://github.com/craigtaub)) +- [#2703](https://github.com/mochajs/mocha/pull/2703): Cover .some() function in utils.js with tests ([@seppevs](https://github.com/seppevs)) +- [#2773](https://github.com/mochajs/mocha/pull/2773): Add tests for loading reporters w/ relative/absolute paths ([@sul4bh](https://github.com/sul4bh)) + +## :nut_and_bolt: Other + +- Remove bin/.eslintrc; ensure execs are linted ([@boneskull](https://github.com/boneskull)) +- [#2542](https://github.com/mochajs/mocha/issues/2542): Expand CONTRIBUTING.md ([@boneskull](https://github.com/boneskull)) +- [#2660](https://github.com/mochajs/mocha/pull/2660): Double timeouts on integration tests ([@Munter](https://github.com/munter)) +- [#2653](https://github.com/mochajs/mocha/pull/2653): Update copyright year ([@Scottkao85], [@Munter](https://github.com/munter)) +- [#2621](https://github.com/mochajs/mocha/pull/2621): Update dependencies to enable Greenkeeper ([@boneskull](https://github.com/boneskull), [@greenkeeper](https://github.com/greenkeeper)) +- [#2625](https://github.com/mochajs/mocha/pull/2625): Use trusty container in travis-ci; use "artifacts" addon ([@boneskull](https://github.com/boneskull)) +- [#2670](https://github.com/mochajs/mocha/pull/2670): doc(CONTRIBUTING): fix link to org members ([@coderbyheart](https://github.com/coderbyheart)) +- Add Mocha propaganda to README.md ([@boneskull](https://github.com/boneskull)) +- [#2470](https://github.com/mochajs/mocha/pull/2470): Avoid test flake in "delay" test ([@boneskull](https://github.com/boneskull)) +- [#2675](https://github.com/mochajs/mocha/pull/2675): Limit browser concurrency on sauce ([@boneskull](https://github.com/boneskull)) +- [#2669](https://github.com/mochajs/mocha/pull/2669): Use temporary test-only build of mocha.js for browsers tests ([@Munter](https://github.com/munter)) +- Fix "projects" link in README.md ([@boneskull](https://github.com/boneskull)) +- [#2678](https://github.com/mochajs/mocha/pull/2678): Chore(Saucelabs): test on IE9, IE10 and IE11 ([@coderbyheart](https://github.com/coderbyheart)) +- [#2648](https://github.com/mochajs/mocha/pull/2648): Use `semistandard` directly ([@kt3k](https://github.com/kt3k)) +- [#2727](https://github.com/mochajs/mocha/pull/2727): Make the build reproducible ([@lamby](https://github.com/lamby)) + +# 3.2.0 / 2016-11-24 + +## :newspaper: News + +### Mocha is now a JS Foundation Project! + +Mocha is proud to have joined the [JS Foundation](https://js.foundation). For more information, [read the announcement](https://js.foundation/announcements/2016/10/17/Linux-Foundation-Unites-JavaScript-Community-Open-Web-Development/). + +### Contributor License Agreement + +Under the foundation, all contributors to Mocha must sign the [JS Foundation CLA](https://js.foundation/CLA/) before their code can be merged. When sending a PR--if you have not already signed the CLA--a friendly bot will ask you to do so. + +Mocha remains licensed under the [MIT license](https://github.com/mochajs/mocha/blob/master/LICENSE). + +## :bug: Bug Fix + +- [#2535](https://github.com/mochajs/mocha/issues/2535): Fix crash when `--watch` encounters broken symlinks ([@villesau](https://github.com/villesau)) +- [#2593](https://github.com/mochajs/mocha/pull/2593): Fix (old) regression; incorrect symbol shown in `list` reporter ([@Aldaviva](https://github.com/Aldaviva)) +- [#2584](https://github.com/mochajs/mocha/issues/2584): Fix potential error when running XUnit reporter ([@vobujs](https://github.com/vobujs)) + +## :tada: Enhancement + +- [#2294](https://github.com/mochajs/mocha/issues/2294): Improve timeout error messaging ([@jeversmann](https://github.com/jeversmann), [@boneskull](https://github.com/boneskull)) +- [#2520](https://github.com/mochajs/mocha/pull/2520): Add info about `--inspect` flag to CLI help ([@ughitsaaron](https://github.com/ughitsaaron)) + +## :nut_and_bolt: Other + +- [#2570](https://github.com/mochajs/mocha/issues/2570): Use [karma-mocha](https://npmjs.com/package/karma-mocha) proper ([@boneskull](https://github.com/boneskull)) +- Licenses updated to reflect new copyright, add link to license and browser matrix to `README.md` ([@boneskull](https://github.com/boneskull), [@ScottFreeCode](https://github.com/ScottFreeCode), [@dasilvacontin](https://github.com/dasilvacontin)) + +Thanks to all our contributors, sponsors and backers! Keep on the lookout for a public roadmap and new contribution guide coming soon. + +# 3.1.2 / 2016-10-10 + +## :bug: Bug Fix + +- [#2528](https://github.com/mochajs/mocha/issues/2528): Recovery gracefully if an `Error`'s `stack` property isn't writable ([@boneskull](https://github.com/boneskull)) + +# 3.1.1 / 2016-10-09 + +## :bug: Bug Fix + +- [#1417](https://github.com/mochajs/mocha/issues/1417): Don't report `done()` was called multiple times when it wasn't ([@frankleonrose](https://github.com/frankleonrose)) + +## :nut_and_bolt: Other + +- [#2490](https://github.com/mochajs/mocha/issues/2490): Lint with [semistandard](https://npmjs.com/package/semistandard) config ([@makepanic](https://github.com/makepanic)) +- [#2525](https://github.com/mochajs/mocha/issues/2525): Lint all `.js` files ([@boneskull](https://github.com/boneskull)) +- [#2524](https://github.com/mochajs/mocha/issues/2524): Provide workaround for developers unable to run browser tests on macOS Sierra ([@boneskull](https://github.com/boneskull)) + +# 3.1.0 / 2016-09-27 + +## :tada: Enhancement + +- [#2357](https://github.com/mochajs/mocha/issues/2357): Support `--inspect` on command-line ([@simov](https://github.com/simov)) +- [#2194](https://github.com/mochajs/mocha/issues/2194): Human-friendly error if no files are matched on command-line ([@Munter](https://github.com/munter)) +- [#1744](https://github.com/mochajs/mocha/issues/1744): Human-friendly error if a Suite has no callback (BDD/TDD only) ([@anton](https://github.com/anton)) + +## :bug: Bug Fix + +- [#2488](https://github.com/mochajs/mocha/issues/2488): Fix case in which _variables beginning with lowercase "D"_ may not have been reported properly as global leaks ([@JustATrick](https://github.com/JustATrick)) :laughing: +- [#2465](https://github.com/mochajs/mocha/issues/2465): Always halt execution in async function when `this.skip()` is called ([@boneskull](https://github.com/boneskull)) +- [#2445](https://github.com/mochajs/mocha/pull/2445): Exits with expected code 130 when `SIGINT` encountered; exit code can no longer rollover at 256 ([@Munter](https://github.com/munter)) +- [#2315](https://github.com/mochajs/mocha/issues/2315): Fix uncaught TypeError thrown from callback stack ([@1999](https://github.com/1999)) +- Fix broken `only()`/`skip()` in IE7/IE8 ([@boneskull](https://github.com/boneskull)) +- [#2502](https://github.com/mochajs/mocha/issues/2502): Fix broken stack trace filter on Node.js under Windows ([@boneskull](https://github.com/boneskull)) +- [#2496](https://github.com/mochajs/mocha/issues/2496): Fix diff output for objects instantiated with `String` constructor ([more](https://youtrack.jetbrains.com/issue/WEB-23383)) ([@boneskull](https://github.com/boneskull)) + +# 3.0.2 / 2016-08-08 + +## :bug: Bug Fix + +- [#2424](https://github.com/mochajs/mocha/issues/2424): Fix error loading Mocha via Require.js ([@boneskull](https://github.com/boneskull)) +- [#2417](https://github.com/mochajs/mocha/issues/2417): Fix execution of _deeply_ nested `describe.only()` suites ([@not-an-aardvark](https://github.com/not-an-aardvark)) +- Remove references to `json-cov` and `html-cov` reporters in CLI ([@boneskull](https://github.com/boneskull)) + +# 3.0.1 / 2016-08-03 + +## :bug: Bug Fix + +- [#2406](https://github.com/mochajs/mocha/issues/2406): Restore execution of nested `describe.only()` suites ([@not-an-aardvark](https://github.com/not-an-aardvark)) + +# 3.0.0 / 2016-07-31 + +## :boom: Breaking Changes + +- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8**. + +- :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`). + +- `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy: + +- To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, _and_ returns a `Promise`, Mocha will now throw an exception: + + \```js + const assert = require('assert'); + + it('should complete this test', function (done) { + return new Promise(function (resolve) { + assert.ok(true); + resolve(); + }) + .then(done); + }); + \``` + + The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`. + +- When a test timeout value _greater than_ `2147483648` is specified in any context (`--timeout`, `mocha.setup()`, per-suite, per-test, etc.), the timeout will be _disabled_ and the test(s) will be allowed to run indefinitely. This is equivalent to specifying a timeout value of `0`. See [MDN](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) for reasoning. + +- The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests. + +- Mocha no longer supports [component](https://www.npmjs.com/package/component). + +- The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed. + +- `spec` reporter now omits leading carriage returns (`\r`) in non-TTY environment. + +## :tada: Enhancements + +- [#808](https://github.com/mochajs/mocha/issues/808): Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m](https://github.com/a8m)) +- [#2000](https://github.com/mochajs/mocha/pull/2000): Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable](https://github.com/elliottcable)) +- [#1632](https://github.com/mochajs/mocha/issues/1632): Throw a useful exception when a suite or test lacks a title. ([@a8m](https://github.com/a8m)) +- [#1481](https://github.com/mochajs/mocha/issues/1481): Better `.only()` behavior. ([@a8m](https://github.com/a8m)) +- [#2334](https://github.com/mochajs/mocha/issues/2334): Allow `this.skip()` in async tests and hooks. ([@boneskull](https://github.com/boneskull)) +- [#1320](https://github.com/mochajs/mocha/pull/1320): Throw a useful exception when test resolution method is overspecified. ([@jugglinmike](https://github.com/jugglinmike)) +- [#2364](https://github.com/mochajs/mocha/pull/2364): Support `--preserve-symlinks`. ([@rosswarren](https://github.com/rosswarren)) + +## :bug: Bug Fixes + +- [#2259](https://github.com/mochajs/mocha/pull/2259): Restore ES3 compatibility. Specifically, support an environment lacking `Date.prototype.toISOString()`, `JSON`, or has a non-standard implementation of `JSON`. ([@ndhoule](https://github.com/ndhoule), [@boneskull](https://github.com/boneskull)) +- [#2286](https://github.com/mochajs/mocha/issues/2286): Fix `after()` failing to execute if test skipped using `this.skip()` in `beforeEach()`; no longer marks the entire suite as "pending". ([@dasilvacontin](https://github.com/dasilvacontin), [@boneskull](https://github.com/boneskull)) +- [#2208](https://github.com/mochajs/mocha/pull/2208): Fix function name display in `markdown` and `html` (browser) reporters. ([@ScottFreeCode](https://github.com/ScottFreeCode)) +- [#2299](https://github.com/mochajs/mocha/pull/2299): Fix progress bar in `html` (browser) reporter. ([@AviVahl](https://github.com/avivahl)) +- [#2307](https://github.com/mochajs/mocha/pull/2307): Fix `doc` reporter crashing when test fails. ([@jleyba](https://github.com/jleyba)) +- [#2323](https://github.com/mochajs/mocha/issues/2323): Ensure browser entry point (`browser-entry.js`) is published to npm (for use with bundlers). ([@boneskull](https://github.com/boneskull)) +- [#2310](https://github.com/mochajs/mocha/issues/2310): Ensure custom reporter with an absolute path works in Windows. ([@silentcloud](https://github.com/silentcloud)) +- [#2311](https://github.com/mochajs/mocha/issues/2311): Fix problem wherein calling `this.slow()` without a value would blast any previously set value. ([@boneskull](https://github.com/boneskull)) +- [#1813](https://github.com/mochajs/mocha/issues/1813): Ensure Mocha's own test suite will run in Windows. ([@tswaters](https://github.com/tswaters), [@TimothyGu](https://github.com/timothygu), [@boneskull](https://github.com/boneskull)) +- [#2317](https://github.com/mochajs/mocha/issues/2317): Ensure all interfaces are displayed in `--help` on CLI. ([@ScottFreeCode](https://github.com/ScottFreeCode)) +- [#1644](https://github.com/mochajs/mocha/issues/1644): Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae](https://github.com/callumacrae), [@boneskull](https://github.com/boneskull)) +- [#2361](https://github.com/mochajs/mocha/pull/2361): Don't truncate name of thrown anonymous exception. ([@boneskull](https://github.com/boneskull)) +- [#2367](https://github.com/mochajs/mocha/pull/2367): Fix invalid CSS. ([@bensontrent](https://github.com/bensontrent)) +- [#2401](https://github.com/mochajs/mocha/pull/2401): Remove carriage return before each test line in spec reporter. ([@Munter](https://github.com/munter)) + +## :nut_and_bolt: Other + +- Upgrade production dependencies to address security advisories (and because now we can): `glob`, `commander`, `escape-string-regexp`, and `supports-color`. ([@boneskull](https://github.com/boneskull), [@RobLoach](https://github.com/robloach)) +- Add Windows to CI. ([@boneskull](https://github.com/boneskull), [@TimothyGu](https://github.com/timothygu)) +- Ensure appropriate `engines` field in `package.json`. ([@shinnn](https://github.com/shinnn), [@boneskull](https://github.com/boneskull)) +- [#2348](https://github.com/mochajs/mocha/issues/2348): Upgrade ESLint to v2 ([@anthony-redfox](https://github.com/anthony-redfox)) + +We :heart: our [backers and sponsors](https://opencollective.com/mochajs)! + +:shipit: + +# 2.5.3 / 2016-05-25 + +- [#2112](https://github.com/mochajs/mocha/pull/2112) - Fix HTML reporter regression causing duplicate error output ([@danielstjules](https://github.com/danielstjules) via [`6d24063`](https://github.com/mochajs/mocha/commit/6d24063)) +- [#2119](https://github.com/mochajs/mocha/pull/2119) - Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation ([@jimenglish81](https://github.com/jimenglish81) via [`9e93efc`](https://github.com/mochajs/mocha/commit/9e93efc)) + +# 2.5.2 / 2016-05-24 + +- [#2178](https://github.com/mochajs/mocha/pull/2178) - Avoid double and triple xUnit XML escaping ([@graingert](https://github.com/graingert) via [`49b5ff1`](https://github.com/mochajs/mocha/commit/49b5ff1)) + +# 2.5.1 / 2016-05-23 + +- Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull](https://github.com/boneskull) via [`bd9450b`](https://github.com/mochajs/mocha/commit/bd9450b)) + +Thanks [**@entertainyou**](https://github.com/entertainyou), [**@SimenB**](https://github.com/SimenB), [**@just-paja**](https://github.com/just-paja) for the heads-up. + +# 2.5.0 / 2016-05-23 + +This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases). + +## Browser Tests in CI + +We now run unit tests against PhantomJS v1.x and an assortment of browsers on [SauceLabs](https://saucelabs.com), including: + +- Internet Explorer v8.0 +- Chrome (latest) +- Firefox (latest) +- Safari (latest) +- Microsoft Edge (latest) + +To accomplish this, we now run Mocha's unit tests (and a handful of integration tests) via [Karma](https://npmjs.com/package/karma) and a modified [karma-mocha](https://npmjs.com/package/karma-mocha). Along the way, we had to solve issue [#880](https://github.com/mochajs/mocha/issues/880) (apologies to [**@mderijcke**](https://github.com/mderijcke) and [**@sukima**](https://github.com/sukima) who had PRs addressing this), as well as replace most usages of [should](https://npmjs.com/package/should) with [expect.js](https://npmjs.com/package/expect.js) for IE8. + +Going forward, when sending PRs, your code will _only_ run against PhantomJS v1.x (and not hit SauceLabs) [because security](https://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests). + +## Node.js 6.x + +Node.js 6.x "just worked" before, but now it's in the CI matrix, so it's "officially" supported. Mocha _still retains support_ for Node.js 0.8.x. + +## "Minor" Release + +You'll see mostly bug fixes below, but also a couple features--as such, it's a "minor" release. + +## TYVM + +Thanks to everyone who contributed, and our fabulous [sponsors and backers](https://opencollective.com/mochajs)! + +- [#2079](https://github.com/mochajs/mocha/issues/2079) - Add browser checks to CI; update [browserify](https://npmjs.com/package/browserify) to v13.0.0 ([@dasilvacontin](https://github.com/dasilvacontin), [@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull) via [`c04c1d7`](https://github.com/mochajs/mocha/commit/c04c1d7), [`0b1e9b3`](https://github.com/mochajs/mocha/commit/0b1e9b3), [`0dde0fa`](https://github.com/mochajs/mocha/commit/0dde0fa), [`f8a3d86`](https://github.com/mochajs/mocha/commit/f8a3d86), [`9e8cbaa`](https://github.com/mochajs/mocha/commit/9e8cbaa)) +- [#880](https://github.com/mochajs/mocha/issues/880) - Make Mocha browserifyable ([@boneskull](https://github.com/boneskull) via [`524862b`](https://github.com/mochajs/mocha/commit/524862b)) +- [#2121](https://github.com/mochajs/mocha/issues/2121) - Update [glob](https://npmjs.com/package/glob) to v3.2.11 ([@astorije](https://github.com/astorije) via [`7920fc4`](https://github.com/mochajs/mocha/commit/7920fc4)) +- [#2126](https://github.com/mochajs/mocha/issues/2126) - Fix dupe error messages in stack trace filter ([@Turbo87](https://github.com/Turbo87) via [`4301caa`](https://github.com/mochajs/mocha/commit/4301caa)) +- [#2109](https://github.com/mochajs/mocha/issues/2109) - Fix certain diffs when objects cannot be coerced into primitives ([@joshlory](https://github.com/joshlory) via [`61fbb7f`](https://github.com/mochajs/mocha/commit/61fbb7f)) +- [#1827](https://github.com/mochajs/mocha/pull/1827) - Fix TWBS/`mocha.css` collisions ([@irnc](https://github.com/irnc) via [`0543798`](https://github.com/mochajs/mocha/commit/0543798)) +- [#1760](https://github.com/mochajs/mocha/issues/1760), [#1936](https://github.com/mochajs/mocha/issues/1936) - Fix `this.skip()` in HTML reporter ([@mislav](https://github.com/mislav) via [`cb4248b`](https://github.com/mochajs/mocha/commit/cb4248b)) +- [#2115](https://github.com/mochajs/mocha/pull/2115) - Fix exceptions thrown from hooks in HTML reporter ([@danielstjules](https://github.com/danielstjules) via [`e290bc0`](https://github.com/mochajs/mocha/commit/e290bc0)) +- [#2089](https://github.com/mochajs/mocha/issues/2089) - Handle Symbol values in `util.stringify()` ([@ryym](https://github.com/ryym) via [`ea61d05`](https://github.com/mochajs/mocha/commit/ea61d05)) +- [#2097](https://github.com/mochajs/mocha/pull/2097) - Fix diff for objects overriding `Object.prototype.hasOwnProperty` ([@mantoni](https://github.com/mantoni) via [`b20fdfe`](https://github.com/mochajs/mocha/commit/b20fdfe)) +- [#2101](https://github.com/mochajs/mocha/pull/2101) - Properly handle non-string "messages" thrown from assertion libraries ([@jkimbo](https://github.com/jkimbo) via [`9c41051`](https://github.com/mochajs/mocha/commit/9c41051)) +- [#2124](https://github.com/mochajs/mocha/pull/2124) - Update [growl](https://npmjs.com/package/growl) ([@benjamine](https://github.com/benjamine) via [`9ae6a85`](https://github.com/mochajs/mocha/commit/9ae6a85)) +- [#2162](https://github.com/mochajs/mocha/pull/2162), [#2205](https://github.com/mochajs/mocha/pull/2205) - JSDoc fixes ([@OlegTsyba](https://github.com/OlegTsyba) via [`8031f20`](https://github.com/mochajs/mocha/commit/8031f20), [@ScottFreeCode](https://github.com/ScottFreeCode) via [`f83b1d9`](https://github.com/mochajs/mocha/commit/f83b1d9)) +- [#2132](https://github.com/mochajs/mocha/issues/2132) - Remove Growl-related cruft ([@julienw](https://github.com/julienw) via [`00d6469`](https://github.com/mochajs/mocha/commit/00d6469)) +- [#2172](https://github.com/mochajs/mocha/pull/2172) - Add [OpenCollective](https://opencollective.com) badge, sponsors & backers ([@xdamman](https://github.com/xdamman), [@boneskull](https://github.com/boneskull) via [`caee94f`](https://github.com/mochajs/mocha/commit/caee94f)) +- [#1841](https://github.com/mochajs/mocha/pull/1841) - Add new logo, banner assets ([@dasilvacontin](https://github.com/dasilvacontin) via [`00fd0e1`](https://github.com/mochajs/mocha/commit/00fd0e1)) +- [#2214](https://github.com/mochajs/mocha/pull/2214) - Update `README.md` header ([@dasilvacontin](https://github.com/dasilvacontin) via [`c0f9be2`](https://github.com/mochajs/mocha/commit/c0f9be2)) +- [#2236](https://github.com/mochajs/mocha/pull/2236) - Better checks for Node.js v0.8 compatibility in CI ([@dasilvacontin](https://github.com/dasilvacontin) via [`ba5637d`](https://github.com/mochajs/mocha/commit/ba5637d)) +- [#2239](https://github.com/mochajs/mocha/issues/2239) - Add Node.js v6.x to CI matrix ([@boneskull](https://github.com/boneskull) via [`3904da4`](https://github.com/mochajs/mocha/commit/3904da4)) + +# 2.4.5 / 2016-01-28 + +- [#2080](https://github.com/mochajs/mocha/issues/2080), [#2078](https://github.com/mochajs/mocha/issues/2078), [#2072](https://github.com/mochajs/mocha/pull/2072), [#2073](https://github.com/mochajs/mocha/pull/2073), [#1200](https://github.com/mochajs/mocha/issues/1200) - Revert changes to console colors in changeset [1192914](https://github.com/mochajs/mocha/commit/119291449cd03a11cdeda9e37cf718a69a012896) and subsequent related changes thereafter. Restores compatibility with IE8 & PhantomJS. See also [mantoni/mochify.js#129](https://github.com/mantoni/mochify.js/issues/129) and [openlayers/ol3#4746](https://github.com/openlayers/ol3/pull/4746) ([@boneskull](https://github.com/boneskull)) +- [#2082](https://github.com/mochajs/mocha/pull/2082) - Fix several test assertions ([@mislav](https://github.com/mislav)) + +# 2.4.4 / 2016-01-27 + +- [#2080](https://github.com/mochajs/mocha/issues/2080) - Fix broken RequireJS compatibility ([@boneskull](https://github.com/boneskull)) + +# 2.4.3 / 2016-01-27 + +- [#2078](https://github.com/mochajs/mocha/issues/2078) - Fix broken IE8 ([@boneskull](https://github.com/boneskull)) + +# 2.4.2 / 2016-01-26 + +- [#2053](https://github.com/mochajs/mocha/pull/2053) - Fix web worker compatibility ([@mislav](https://github.com/mislav)) +- [#2072](https://github.com/mochajs/mocha/pull/2072) - Fix Windows color output ([@thedark1337](https://github.com/thedark1337)) +- [#2073](https://github.com/mochajs/mocha/pull/2073) - Fix colors in `progress` and `landing` reporters ([@gyandeeps](https://github.com/gyandeeps)) + +# 2.4.1 / 2016-01-26 + +- [#2067](https://github.com/mochajs/mocha/pull/2067) - Fix HTML/doc reporter regressions ([@danielstjules](https://github.com/danielstjules)) + +# 2.4.0 / 2016-01-25 + +- [#1945](https://github.com/mochajs/mocha/pull/1945) - Correctly skip tests when skipping in suite's before() ([@ryanshawty](https://github.com/ryanshawty)) +- [#2056](https://github.com/mochajs/mocha/pull/2056) - chore(license): update license year to 2016 ([@pra85](https://github.com/pra85)) +- [#2048](https://github.com/mochajs/mocha/pull/2048) - Fix `this.skip` from spec with HTML reporter ([@mislav](https://github.com/mislav)) +- [#2033](https://github.com/mochajs/mocha/pull/2033) - Update tests for newer versions of should.js ([@tomhughes](https://github.com/tomhughes)) +- [#2037](https://github.com/mochajs/mocha/pull/2037) - Fix for memory leak caused by referenced to deferred test ([@bd82](https://github.com/bd82)) +- [#2038](https://github.com/mochajs/mocha/pull/2038) - Also run Travis-CI on node.js 4 & 5 ([@bd82](https://github.com/bd82)) +- [#2028](https://github.com/mochajs/mocha/pull/2028) - Remove reference to test before afterAll hook runs ([@stonelgh](https://github.com/stonelgh)) +- Bump mkdirp to 0.5.1 to support strict mode ([@danielstjules](https://github.com/danielstjules)) +- [#1977](https://github.com/mochajs/mocha/pull/1977) - safely stringify PhantomJS undefined value ([@ahamid](https://github.com/ahamid)) +- Add the ability to retry tests ([@@longlho]) +- [#1982](https://github.com/mochajs/mocha/pull/1982) - Enable --log-timer-events option [@Alaneor](https://github.com/Alaneor) +- Fix [#1980](https://github.com/mochajs/mocha/issues/1980): Load mocha.opts from bin/mocha and bin/\_mocha ([@danielstjules](https://github.com/danielstjules)) +- [#1976](https://github.com/mochajs/mocha/pull/1976) - Simplify function call ([@iclanzan](https://github.com/iclanzan)) +- [#1963](https://github.com/mochajs/mocha/pull/1963) - Add support --perf-basic-prof ([@robraux](https://github.com/robraux)) +- [#1981](https://github.com/mochajs/mocha/pull/1981) - Fix HTML reporter handling of done and exceptions ([@Standard8](https://github.com/Standard8)) +- [#1993](https://github.com/mochajs/mocha/pull/1993) - propagate "file" property for "exports" interface ([@segrey](https://github.com/segrey)) +- [#1999](https://github.com/mochajs/mocha/pull/1999) - Add support for strict mode ([@tmont](https://github.com/tmont)) +- [#2005](https://github.com/mochajs/mocha/pull/2005) - XUnit Reporter Writes to stdout, falls back to console.log ([@jonnyreeves](https://github.com/jonnyreeves)) +- [#2021](https://github.com/mochajs/mocha/pull/2021) - Fix non ES5 compliant regexp ([@zetaben](https://github.com/zetaben)) +- [#1965] - Don't double install BDD UI ([@cowboyd](https://github.com/cowboyd)) +- [#1995](https://github.com/mochajs/mocha/pull/1995) - Make sure the xunit output dir exists before writing to it ([@ianwremmel](https://github.com/ianwremmel)) +- Use chalk for the base reporter colors; closes [#1200](https://github.com/mochajs/mocha/issues/1200) ([@boneskull](https://github.com/boneskull)) +- Fix requiring custom interfaces ([@jgkim](https://github.com/jgkim)) +- [#1967](https://github.com/mochajs/mocha/pull/1967) Silence Bluebird js warnings ([@krisr](https://github.com/krisr)) + +# 2.3.4 / 2015-11-15 + +- Update debug dependency to 2.2.0 +- remove duplication of mocha.opts on process.argv +- Fix typo in test/reporters/nyan.js + +# 2.3.3 / 2015-09-19 + +- [#1875](https://github.com/mochajs/mocha/issues/1875) - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules](https://github.com/danielstjules)) +- [#1864](https://github.com/mochajs/mocha/issues/1864) - Fix xunit missing output with --reporter-options output ([@danielstjules](https://github.com/danielstjules)) +- [#1846](https://github.com/mochajs/mocha/issues/1846) - Support all harmony flags ([@danielstjules](https://github.com/danielstjules)) +- Fix fragile xunit reporter spec ([@danielstjules](https://github.com/danielstjules)) +- [#1669](https://github.com/mochajs/mocha/issues/1669) - Fix catch uncaught errors outside test suite execution ([@danielstjules](https://github.com/danielstjules)) +- [#1868](https://github.com/mochajs/mocha/issues/1868) - Revert jade to support npm < v1.3.7 ([@danielstjules](https://github.com/danielstjules)) +- [#1766](https://github.com/mochajs/mocha/issues/1766) - Don't remove modules/components from stack trace in the browser ([@danielstjules](https://github.com/danielstjules)) +- [#1798](https://github.com/mochajs/mocha/issues/1798) - Fix correctly attribute mutiple done err with hooks ([@danielstjules](https://github.com/danielstjules)) +- Fix use utils.reduce for IE8 compatibility ([@wsw0108](https://github.com/wsw0108)) +- Some linting errors fixed by [@danielstjules](https://github.com/danielstjules) +- Call the inspect() function if message is not set ([@kevinburke](https://github.com/kevinburke)) + +# 2.3.2 / 2015-09-07 + +- [#1868](https://github.com/mochajs/mocha/issues/1868) - Fix compatibility with older versions of NPM ([@boneskull](https://github.com/boneskull)) + +# 2.3.1 / 2015-09-06 + +- [#1812](https://github.com/mochajs/mocha/issues/1812) - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows]) + +# 2.3.0 / 2015-08-30 + +- [#553](https://github.com/mochajs/mocha/issues/553) - added --allowUncaught option ([@amsul](https://github.com/amsul)) +- [#1490](https://github.com/mochajs/mocha/issues/1490) - Allow --async-only to be satisfied by returning a promise ([@jlai](https://github.com/jlai)) +- [#1829](https://github.com/mochajs/mocha/issues/1829) - support --max-old-space-size ([@gigadude](https://github.com/gigadude)) +- [#1811](https://github.com/mochajs/mocha/issues/1811) - upgrade Jade dependency ([@outsideris](https://github.com/outsideris)) +- [#1769](https://github.com/mochajs/mocha/issues/1769) - Fix async hook error handling ([@ajaykodali](https://github.com/ajaykodali)) +- [#1230](https://github.com/mochajs/mocha/issues/1230) - More descriptive beforeEach/afterEach messages ([@duncanbeevers](https://github.com/duncanbeevers)) +- [#1787](https://github.com/mochajs/mocha/issues/1787) - Scope loading behaviour instead of using early return ([@aryeguy](https://github.com/aryeguy)) +- [#1789](https://github.com/mochajs/mocha/issues/1789) - Fix: html-runner crashing ([@sunesimonsen](https://github.com/sunesimonsen)) +- [#1749](https://github.com/mochajs/mocha/issues/1749) - Fix maximum call stack error on large amount of tests ([@tinganho](https://github.com/tinganho)) +- [#1230](https://github.com/mochajs/mocha/issues/1230) - Decorate failed hook titles with test title ([@duncanbeevers](https://github.com/duncanbeevers)) +- [#1260](https://github.com/mochajs/mocha/issues/1260) - Build using Browserify ([@ndhoule](https://github.com/ndhoule)) +- [#1728](https://github.com/mochajs/mocha/issues/1728) - Don't use `__proto__` ([@ndhoule](https://github.com/ndhoule)) +- [#1781](https://github.com/mochajs/mocha/issues/1781) - Fix hook error tests ([@glenjamin](https://github.com/glenjamin)) +- [#1754](https://github.com/mochajs/mocha/issues/1754) - Allow boolean --reporter-options ([@papandreou](https://github.com/papandreou)) +- [#1766](https://github.com/mochajs/mocha/issues/1766) - Fix overly aggressive stack suppression ([@moll](https://github.com/moll)) +- [#1752](https://github.com/mochajs/mocha/issues/1752) - Avoid potential infinite loop ([@gsilk](https://github.com/gsilk)) +- [#1761](https://github.com/mochajs/mocha/issues/1761) - Fix problems running under PhantomJS ([@chromakode](https://github.com/chromakode)) +- [#1700](https://github.com/mochajs/mocha/issues/1700) - Fix more problems running under PhantomJS ([@jbnicolai](https://github.com/jbnicolai)) +- [#1774](https://github.com/mochajs/mocha/issues/1774) - Support escaped spaces in CLI options ([@adamgruber](https://github.com/adamgruber)) +- [#1687](https://github.com/mochajs/mocha/issues/1687) - Fix HTML reporter links with special chars ([@benvinegar](https://github.com/benvinegar)) +- [#1359](https://github.com/mochajs/mocha/issues/1359) - Adopt code style and enforce it using ESLint ([@ndhoule](https://github.com/ndhoule) w/ assist from [@jbnicolai](https://github.com/jbnicolai) & [@boneskull](https://github.com/boneskull)) +- various refactors ([@jbnicolai](https://github.com/jbnicolai)) +- [#1758](https://github.com/mochajs/mocha/issues/1758) - Add cross-frame compatible Error checking ([@outdooricon](https://github.com/outdooricon)) +- [#1741](https://github.com/mochajs/mocha/issues/1741) - Remove moot `version` property from bower.json ([@kkirsche](https://github.com/kkirsche)) +- [#1739](https://github.com/mochajs/mocha/issues/1739) - Improve `HISTORY.md` ([@rstacruz](https://github.com/rstacruz)) +- [#1730](https://github.com/mochajs/mocha/issues/1730) - Support more io.js flags ([@ryedog](https://github.com/ryedog)) +- [#1349](https://github.com/mochajs/mocha/issues/1349) - Allow HTML in HTML reporter errors ([@papandreou](https://github.com/papandreou) / [@sunesimonsen](https://github.com/sunesimonsen)) +- [#1572](https://github.com/mochajs/mocha/issues/1572) - Prevent default browser behavior for failure/pass links ([@jschilli](https://github.com/jschilli)) +- [#1630](https://github.com/mochajs/mocha/issues/1630) - Support underscored harmony flags ([@dominicbarnes](https://github.com/dominicbarnes)) +- [#1718](https://github.com/mochajs/mocha/issues/1718) - Support more harmony flags ([@slyg](https://github.com/slyg)) +- [#1689](https://github.com/mochajs/mocha/issues/1689) - Add stack to JSON-stream reporter ([@jonathandelgado](https://github.com/jonathandelgado)) +- [#1654](https://github.com/mochajs/mocha/issues/1654) - Fix `ReferenceError` "location is not defined" ([@jakemmarsh](https://github.com/jakemmarsh)) + +# 2.2.5 / 2015-05-14 + +- [#1699](https://github.com/mochajs/mocha/issues/1699) - Upgrade jsdiff to v1.4.0 ([@nylen](https://github.com/nylen)) +- [#1648](https://github.com/mochajs/mocha/issues/1648) - fix diff background colors in the console ([@nylen](https://github.com/nylen)) +- [#1327](https://github.com/mochajs/mocha/issues/1327) - fix tests running twice, a regression issue. ([#1686](https://github.com/mochajs/mocha/issues/1686), [@danielstjules](https://github.com/danielstjules)) +- [#1675](https://github.com/mochajs/mocha/issues/1675) - add integration tests ([@danielstjules](https://github.com/danielstjules)) +- [#1682](https://github.com/mochajs/mocha/issues/1682) - use a valid SPDX license identifier in package.json ([@kemitchell](https://github.com/kemitchell)) +- [#1660](https://github.com/mochajs/mocha/issues/1660) - fix assertion of invalid dates ([#1661](https://github.com/mochajs/mocha/issues/1661), [@a8m](https://github.com/a8m)) +- [#1241](https://github.com/mochajs/mocha/issues/1241) - fix issue with multiline diffs appearing as single line ([#1655](https://github.com/mochajs/mocha/issues/1655), [@a8m](https://github.com/a8m)) + +# 2.2.4 / 2015-04-08 + +- Load mocha.opts in \_mocha for now (close [#1645](https://github.com/mochajs/mocha/issues/1645)) + +# 2.2.3 / 2015-04-07 + +- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) +- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) +- fix(reporter/base): don't show diffs for errors without expectation +- fix(reporter/base): don't assume error message is first line of stack +- improve: dry up reporter/base test +- fix(reporter/base): explicitly ignore showDiff [#1614](https://github.com/mochajs/mocha/issues/1614) +- Add iojs to travis build +- Pass `--allow-natives-syntax` flag to node. +- Support --harmony_classes flag for io.js +- Fix 1556: Update utils.clean to handle newlines in func declarations +- Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers +- Fix 1585: make \_mocha executable again +- chore(package.json): add a8m as a contributor +- Fixed broken link on html-cov reporter +- support --es_staging flag +- fix issue where menu overlaps content. +- update contributors in package.json +- Remove trailing whitespace from reporter output +- Remove contributors list from readme +- log third-party reporter errors +- [Fix] Exclude not own properties when looping on options +- fix: support node args in mocha.opts (close [#1573](https://github.com/mochajs/mocha/issues/1573)) +- fix(reporter/base): string diff - issue [#1241](https://github.com/mochajs/mocha/issues/1241) + +# 2.2.1 / 2015-03-09 + +- Fix passing of args intended for node/iojs. + +# 2.2.0 / 2015-03-06 + +- Update mocha.js +- Add --fgrep. Use grep for RegExp, fgrep for str +- Ignore async global errors after spec resolution +- Fixing errors that prevent mocha.js from loading in the browser - fixes [#1558](https://github.com/mochajs/mocha/issues/1558) +- fix(utils): issue [#1558](https://github.com/mochajs/mocha/issues/1558) + make +- add ability to delay root suite; closes [#362](https://github.com/mochajs/mocha/issues/362), closes [#1124](https://github.com/mochajs/mocha/issues/1124) +- fix insanity in http tests +- update travis: add node 0.12, add gitter, remove slack +- building +- resolve [#1548](https://github.com/mochajs/mocha/issues/1548): ensure the environment's "node" executable is used +- reporters/base: use supports-color to detect colorable term +- travis: use docker containers +- small fix: commander option for --expose-gc +- Ignore asynchronous errors after global failure +- Improve error output when a test fails with a non-error +- updated travis badge, uses svg instead of img +- Allow skip from test context for [#332](https://github.com/mochajs/mocha/issues/332) +- [JSHINT] Unnecessary semicolon fixed in bin/\_mocha +- Added a reminder about the done() callback to test timeout error messages +- fixes [#1496](https://github.com/mochajs/mocha/issues/1496), in Mocha.run(fn), check if fn exists before executing it, added tests too +- Add Harmony Proxy flag for iojs +- test(utils|ms|\*): test existing units +- add support for some iojs flags +- fix(utils.stringify): issue [#1229](https://github.com/mochajs/mocha/issues/1229), diff viewer +- Remove slack link +- Prevent multiple 'grep=' querystring params in html reporter +- Use grep as regexp (close [#1381](https://github.com/mochajs/mocha/issues/1381)) +- utils.stringify should handle objects without an Object prototype +- in runnable test, comparing to undefined error's message rather than a literal +- Fix test running output truncation on async STDIO +- amended for deprecated customFds option in child_process + +# 2.1.0 / 2014-12-23 + +- showDiff: don’t stringify strings +- Clean up unused module dependencies. +- Filter zero-length strings from mocha.opts +- only write to stdout in reporters +- Revert "only write to stdout in reporters" +- Print colored output only to a tty +- update summary in README.md +- rename Readme.md/History.md to README.md/HISTORY.md because neurotic +- add .mailmap to fix "git shortlog" or "git summary" output +- fixes [#1461](https://github.com/mochajs/mocha/issues/1461): nyan-reporter now respects Base.useColors, fixed bug where Base.color would not return a string when str wasn't a string. +- Use existing test URL builder in failed replay links +- modify .travis.yml: use travis_retry; closes [#1449](https://github.com/mochajs/mocha/issues/1449) +- fix -t 0 behavior; closes [#1446](https://github.com/mochajs/mocha/issues/1446) +- fix tests (whoops) +- improve diff behavior +- Preserve pathname when linking to individual tests +- Fix test +- Tiny typo in comments fixed +- after hooks now being called on failed tests when using bail, fixes [#1093](https://github.com/mochajs/mocha/issues/1093) +- fix throwing undefined/null now makes tests fail, fixes [#1395](https://github.com/mochajs/mocha/issues/1395) +- compiler extensions are added as watched extensions, removed non-standard extensions from watch regex, resolves [#1221](https://github.com/mochajs/mocha/issues/1221) +- prefix/namespace for suite titles in markdown reporter, fixes [#554](https://github.com/mochajs/mocha/issues/554) +- fix more bad markdown in CONTRIBUTING.md +- fix bad markdown in CONTRIBUTING.md +- add setImmediate/clearImmediate to globals; closes [#1435](https://github.com/mochajs/mocha/issues/1435) +- Fix buffer diffs (closes [#1132](https://github.com/mochajs/mocha/issues/1132), closes [#1433](https://github.com/mochajs/mocha/issues/1433)) +- add a CONTRIBUTING.md. closes [#882](https://github.com/mochajs/mocha/issues/882) +- fix intermittent build failures (maybe). closes [#1407](https://github.com/mochajs/mocha/issues/1407) +- add Slack notification to .travis.yml +- Fix slack link +- Add slack room to readme +- Update maintainers +- update maintainers and contributors +- resolves [#1393](https://github.com/mochajs/mocha/issues/1393): kill children with more effort on SIGINT +- xunit reporter support for optionally writing to a file +- if a reporter has a .done method, call it before exiting +- add support for reporter options +- only write to stdout in reporters + +# 2.0.0 / 2014-10-21 + +- remove: support for node 0.6.x, 0.4.x +- fix: landing reporter with non ansi characters ([#211](https://github.com/mochajs/mocha/issues/211)) +- fix: html reporter - preserve query params when navigating to suites/tests ([#1358](https://github.com/mochajs/mocha/issues/1358)) +- fix: json stream reporter add error message to failed test +- fix: fixes for visionmedia -> mochajs +- fix: use stdio, fixes node deprecation warnings ([#1391](https://github.com/mochajs/mocha/issues/1391)) + +# 1.21.5 / 2014-10-11 + +- fix: build for NodeJS v0.6.x +- fix: do not attempt to highlight syntax when non-HTML reporter is used +- update: escape-string-regexp to 1.0.2. +- fix: botched indentation in canonicalize() +- fix: .gitignore: ignore .patch and .diff files +- fix: changed 'Catched' to 'Caught' in uncaught exception error handler messages +- add: `pending` field for json reporter +- fix: Runner.prototype.uncaught: don't double-end runnables that already have a state. +- fix: --recursive, broken by [`f0facd2`](https://github.com/mochajs/mocha/commit/f0facd2e) +- update: replaces escapeRegexp with the escape-string-regexp package. +- update: commander to 2.3.0. +- update: diff to 1.0.8. +- fix: ability to disable syntax highlighting ([#1329](https://github.com/mochajs/mocha/issues/1329)) +- fix: added empty object to errorJSON() call to catch when no error is present +- fix: never time out after calling enableTimeouts(false) +- fix: timeout(0) will work at suite level ([#1300](https://github.com/mochajs/mocha/issues/1300)) +- Fix for --watch+only() issue ([#888](https://github.com/mochajs/mocha/issues/888) ) +- fix: respect err.showDiff, add Base reporter test ([#810](https://github.com/mochajs/mocha/issues/810)) + +# 1.22.1-3 / 2014-07-27 + +- fix: disabling timeouts with this.timeout(0) ([#1301](https://github.com/mochajs/mocha/issues/1301)) + +# 1.22.1-3 / 2014-07-27 + +- fix: local uis and reporters ([#1288](https://github.com/mochajs/mocha/issues/1288)) +- fix: building 1.21.0's changes in the browser ([#1284](https://github.com/mochajs/mocha/issues/1284)) + +# 1.21.0 / 2014-07-23 + +- add: --no-timeouts option ([#1262](https://github.com/mochajs/mocha/issues/1262), [#1268](https://github.com/mochajs/mocha/issues/1268)) +- add: --\*- deprecation node flags ([#1217](https://github.com/mochajs/mocha/issues/1217)) +- add: --watch-extensions argument ([#1247](https://github.com/mochajs/mocha/issues/1247)) +- change: spec reporter is default ([#1228](https://github.com/mochajs/mocha/issues/1228)) +- fix: diff output showing incorrect +/- ([#1182](https://github.com/mochajs/mocha/issues/1182)) +- fix: diffs of circular structures ([#1179](https://github.com/mochajs/mocha/issues/1179)) +- fix: re-render the progress bar when progress has changed only ([#1151](https://github.com/mochajs/mocha/issues/1151)) +- fix support for environments with global and window ([#1159](https://github.com/mochajs/mocha/issues/1159)) +- fix: reverting to previously defined onerror handler ([#1178](https://github.com/mochajs/mocha/issues/1178)) +- fix: stringify non error objects passed to done() ([#1270](https://github.com/mochajs/mocha/issues/1270)) +- fix: using local ui, reporters ([#1267](https://github.com/mochajs/mocha/issues/1267)) +- fix: cleaning es6 arrows ([#1176](https://github.com/mochajs/mocha/issues/1176)) +- fix: don't include attrs in failure tag for xunit ([#1244](https://github.com/mochajs/mocha/issues/1244)) +- fix: fail tests that return a promise if promise is rejected w/o a reason ([#1224](https://github.com/mochajs/mocha/issues/1224)) +- fix: showing failed tests in doc reporter ([#1117](https://github.com/mochajs/mocha/issues/1117)) +- fix: dot reporter dots being off ([#1204](https://github.com/mochajs/mocha/issues/1204)) +- fix: catch empty throws ([#1219](https://github.com/mochajs/mocha/issues/1219)) +- fix: honoring timeout for sync operations ([#1242](https://github.com/mochajs/mocha/issues/1242)) +- update: growl to 1.8.0 + +# 1.20.1 / 2014-06-03 + +- update: should dev dependency to ~4.0.0 ([#1231](https://github.com/mochajs/mocha/issues/1231)) + +# 1.20.0 / 2014-05-28 + +- add: filenames to suite objects ([#1222](https://github.com/mochajs/mocha/issues/1222)) + +# 1.19.0 / 2014-05-17 + +- add: browser script option to package.json +- add: export file in Mocha.Test objects ([#1174](https://github.com/mochajs/mocha/issues/1174)) +- add: add docs for wrapped node flags +- fix: mocha.run() to return error status in browser ([#1216](https://github.com/mochajs/mocha/issues/1216)) +- fix: clean() to show failure details ([#1205](https://github.com/mochajs/mocha/issues/1205)) +- fix: regex that generates html for new keyword ([#1201](https://github.com/mochajs/mocha/issues/1201)) +- fix: sibling suites have inherited but separate contexts ([#1164](https://github.com/mochajs/mocha/issues/1164)) + +# 1.18.2 / 2014-03-18 + +- fix: html runner was prevented from using #mocha as the default root el ([#1162](https://github.com/mochajs/mocha/issues/1162)) + +# 1.18.1 / 2014-03-18 + +- fix: named before/after hooks in bdd, tdd, qunit interfaces ([#1161](https://github.com/mochajs/mocha/issues/1161)) + +# 1.18.0 / 2014-03-13 + +- add: promise support ([#329](https://github.com/mochajs/mocha/issues/329)) +- add: named before/after hooks ([#966](https://github.com/mochajs/mocha/issues/966)) + +# 1.17.1 / 2014-01-22 + +- fix: expected messages in should.js (should.js#168) +- fix: expect errno global in node versions < v0.9.11 ([#1111](https://github.com/mochajs/mocha/issues/1111)) +- fix: unreliable checkGlobals optimization ([#1110](https://github.com/mochajs/mocha/issues/1110)) + +# 1.17.0 / 2014-01-09 + +- add: able to require globals (describe, it, etc.) through mocha ([#1077](https://github.com/mochajs/mocha/issues/1077)) +- fix: abort previous run on --watch change ([#1100](https://github.com/mochajs/mocha/issues/1100)) +- fix: reset context for each --watch triggered run ([#1099](https://github.com/mochajs/mocha/issues/1099)) +- fix: error when cli can't resolve path or pattern ([#799](https://github.com/mochajs/mocha/issues/799)) +- fix: canonicalize objects before stringifying and diffing them ([#1079](https://github.com/mochajs/mocha/issues/1079)) +- fix: make CR call behave like carriage return for non tty ([#1087](https://github.com/mochajs/mocha/issues/1087)) + +# 1.16.2 / 2013-12-23 + +- fix: couple issues with ie 8 ([#1082](https://github.com/mochajs/mocha/issues/1082), [#1081](https://github.com/mochajs/mocha/issues/1081)) +- fix: issue running the xunit reporter in browsers ([#1068](https://github.com/mochajs/mocha/issues/1068)) +- fix: issue with firefox < 3.5 ([#725](https://github.com/mochajs/mocha/issues/725)) + +# 1.16.1 / 2013-12-19 + +- fix: recompiled for missed changes from the last release + +# 1.16.0 / 2013-12-19 + +- add: Runnable.globals(arr) for per test global whitelist ([#1046](https://github.com/mochajs/mocha/issues/1046)) +- add: mocha.throwError(err) for assertion libs to call ([#985](https://github.com/mochajs/mocha/issues/985)) +- remove: --watch's spinner ([#806](https://github.com/mochajs/mocha/issues/806)) +- fix: duplicate test output for multi-line specs in spec reporter ([#1006](https://github.com/mochajs/mocha/issues/1006)) +- fix: gracefully exit on SIGINT ([#1063](https://github.com/mochajs/mocha/issues/1063)) +- fix expose the specified ui only in the browser ([#984](https://github.com/mochajs/mocha/issues/984)) +- fix: ensure process exit code is preserved when using --no-exit ([#1059](https://github.com/mochajs/mocha/issues/1059)) +- fix: return true from window.onerror handler ([#868](https://github.com/mochajs/mocha/issues/868)) +- fix: xunit reporter to use process.stdout.write ([#1068](https://github.com/mochajs/mocha/issues/1068)) +- fix: utils.clean(str) indentation ([#761](https://github.com/mochajs/mocha/issues/761)) +- fix: xunit reporter returning test duration a NaN ([#1039](https://github.com/mochajs/mocha/issues/1039)) + +# 1.15.1 / 2013-12-03 + +- fix: recompiled for missed changes from the last release + +# 1.15.0 / 2013-12-02 + +- add: `--no-exit` to prevent `process.exit()` ([#1018](https://github.com/mochajs/mocha/issues/1018)) +- fix: using inline diffs ([#1044](https://github.com/mochajs/mocha/issues/1044)) +- fix: show pending test details in xunit reporter ([#1051](https://github.com/mochajs/mocha/issues/1051)) +- fix: faster global leak detection ([#1024](https://github.com/mochajs/mocha/issues/1024)) +- fix: yui compression ([#1035](https://github.com/mochajs/mocha/issues/1035)) +- fix: wrapping long lines in test results ([#1030](https://github.com/mochajs/mocha/issues/1030), [#1031](https://github.com/mochajs/mocha/issues/1031)) +- fix: handle errors in hooks ([#1043](https://github.com/mochajs/mocha/issues/1043)) + +# 1.14.0 / 2013-11-02 + +- add: unified diff ([#862](https://github.com/mochajs/mocha/issues/862)) +- add: set MOCHA_COLORS env var to use colors ([#965](https://github.com/mochajs/mocha/issues/965)) +- add: able to override tests links in html reporters ([#776](https://github.com/mochajs/mocha/issues/776)) +- remove: teamcity reporter ([#954](https://github.com/mochajs/mocha/issues/954)) +- update: commander dependency to 2.0.0 ([#1010](https://github.com/mochajs/mocha/issues/1010)) +- fix: mocha --ui will try to require the ui if not built in, as --reporter does ([#1022](https://github.com/mochajs/mocha/issues/1022)) +- fix: send cursor commands only if isatty ([#184](https://github.com/mochajs/mocha/issues/184), [#1003](https://github.com/mochajs/mocha/issues/1003)) +- fix: include assertion message in base reporter ([#993](https://github.com/mochajs/mocha/issues/993), [#991](https://github.com/mochajs/mocha/issues/991)) +- fix: consistent return of it, it.only, and describe, describe.only ([#840](https://github.com/mochajs/mocha/issues/840)) + +# 1.13.0 / 2013-09-15 + +- add: sort test files with --sort ([#813](https://github.com/mochajs/mocha/issues/813)) +- update: diff dependency to 1.0.7 +- update: glob dependency to 3.2.3 ([#927](https://github.com/mochajs/mocha/issues/927)) +- fix: diffs show whitespace differences ([#976](https://github.com/mochajs/mocha/issues/976)) +- fix: improve global leaks ([#783](https://github.com/mochajs/mocha/issues/783)) +- fix: firefox window.getInterface leak +- fix: accessing iframe via window[iframeIndex] leak +- fix: faster global leak checking +- fix: reporter pending css selector ([#970](https://github.com/mochajs/mocha/issues/970)) + +# 1.12.1 / 2013-08-29 + +- remove test.js from .gitignore +- update included version of ms.js + +# 1.12.0 / 2013-07-01 + +- add: prevent diffs for differing types. Closes [#900](https://github.com/mochajs/mocha/issues/900) +- add `Mocha.process` hack for phantomjs +- fix: use compilers with requires +- fix regexps in diffs. Closes [#890](https://github.com/mochajs/mocha/issues/890) +- fix xunit NaN on failure. Closes [#894](https://github.com/mochajs/mocha/issues/894) +- fix: strip tab indentation in `clean` utility method +- fix: textmate bundle installation + +# 1.11.0 / 2013-06-12 + +- add --prof support +- add --harmony support +- add --harmony-generators support +- add "Uncaught " prefix to uncaught exceptions +- add web workers support +- add `suite.skip()` +- change to output # of pending / passing even on failures. Closes [#872](https://github.com/mochajs/mocha/issues/872) +- fix: prevent hooks from being called if we are bailing +- fix `this.timeout(0)` + +# 1.10.0 / 2013-05-21 + +- add add better globbing support for windows via `glob` module +- add support to pass through flags such as --debug-brk=1234. Closes [#852](https://github.com/mochajs/mocha/issues/852) +- add test.only, test.skip to qunit interface +- change to always use word-based diffs for now. Closes [#733](https://github.com/mochajs/mocha/issues/733) +- change `mocha init` tests.html to index.html +- fix `process` global leak in the browser +- fix: use resolve() instead of join() for --require +- fix: filterLeaks() condition to not consider indices in global object as leaks +- fix: restrict mocha.css styling to #mocha id +- fix: save timer references to avoid Sinon interfering in the browser build. + +# 1.9.0 / 2013-04-03 + +- add improved setImmediate implementation +- replace --ignore-leaks with --check-leaks +- change default of ignoreLeaks to true. Closes [#791](https://github.com/mochajs/mocha/issues/791) +- remove scrolling for HTML reporter +- fix retina support +- fix tmbundle, restrict to js scope + +# 1.8.2 / 2013-03-11 + +- add `setImmediate` support for 0.10.x +- fix mocha -w spinner on windows + +# 1.8.1 / 2013-01-09 + +- fix .bail() arity check causing it to default to true + +# 1.8.0 / 2013-01-08 + +- add Mocha() options bail support +- add `Mocha#bail()` method +- add instanceof check back for inheriting from Error +- add component.json +- add diff.js to browser build +- update growl +- fix TAP reporter failures comment :D + +# 1.7.4 / 2012-12-06 + +- add total number of passes and failures to TAP +- remove .bind() calls. re [#680](https://github.com/mochajs/mocha/issues/680) +- fix indexOf. Closes [#680](https://github.com/mochajs/mocha/issues/680) + +# 1.7.3 / 2012-11-30 + +- fix uncaught error support for the browser +- revert uncaught "fix" which breaks node + +# 1.7.2 / 2012-11-28 + +- fix uncaught errors to expose the original error message + +# 1.7.0 / 2012-11-07 + +- add `--async-only` support to prevent false positives for missing `done()` +- add sorting by filename in code coverage +- add HTML 5 doctype to browser template. +- add play button to html reporter to rerun a single test +- add `this.timeout(ms)` as Suite#timeout(ms). Closes [#599](https://github.com/mochajs/mocha/issues/599) +- update growl dependency to 1.6.x +- fix encoding of test-case ?grep. Closes [#637](https://github.com/mochajs/mocha/issues/637) +- fix unicode chars on windows +- fix dom globals in Opera/IE. Closes [#243](https://github.com/mochajs/mocha/issues/243) +- fix markdown reporter a tags +- fix `this.timeout("5s")` support + +# 1.6.0 / 2012-10-02 + +- add object diffs when `err.showDiff` is present +- add hiding of empty suites when pass/failures are toggled +- add faster `.length` checks to `checkGlobals()` before performing the filter + +# 1.5.0 / 2012-09-21 + +- add `ms()` to `.slow()` and `.timeout()` +- add `Mocha#checkLeaks()` to re-enable global leak checks +- add `this.slow()` option [aheckmann] +- add tab, CR, LF to error diffs for now +- add faster `.checkGlobals()` solution [guille] +- remove `fn.call()` from reduce util +- remove `fn.call()` from filter util +- fix forEach. Closes [#582](https://github.com/mochajs/mocha/issues/582) +- fix relaying of signals [TooTallNate] +- fix TAP reporter grep number + +# 1.4.2 / 2012-09-01 + +- add support to multiple `Mocha#globals()` calls, and strings +- add `mocha.reporter()` constructor support [jfirebaugh] +- add `mocha.timeout()` +- move query-string parser to utils.js +- move highlight code to utils.js +- fix third-party reporter support [exogen] +- fix client-side API to match node-side [jfirebaugh] +- fix mocha in iframe [joliss] + +# 1.4.1 / 2012-08-28 + +- add missing `Markdown` export +- fix `Mocha#grep()`, escape regexp strings +- fix reference error when `devicePixelRatio` is not defined. Closes [#549](https://github.com/mochajs/mocha/issues/549) + +# 1.4.0 / 2012-08-22 + +- add mkdir -p to `mocha init`. Closes [#539](https://github.com/mochajs/mocha/issues/539) +- add `.only()`. Closes [#524](https://github.com/mochajs/mocha/issues/524) +- add `.skip()`. Closes [#524](https://github.com/mochajs/mocha/issues/524) +- change str.trim() to use utils.trim(). Closes [#533](https://github.com/mochajs/mocha/issues/533) +- fix HTML progress indicator retina display +- fix url-encoding of click-to-grep HTML functionality + +# 1.3.2 / 2012-08-01 + +- fix exports double-execution regression. Closes [#531](https://github.com/mochajs/mocha/issues/531) + +# 1.3.1 / 2012-08-01 + +- add passes/failures toggling to HTML reporter +- add pending state to `xit()` and `xdescribe()` [Brian Moore] +- add the [**@charset**](https://github.com/charset) "UTF-8"; to fix [#522](https://github.com/mochajs/mocha/issues/522) with FireFox. [Jonathan Creamer] +- add border-bottom to #stats links +- add check for runnable in `Runner#uncaught()`. Closes [#494](https://github.com/mochajs/mocha/issues/494) +- add 0.4 and 0.6 back to travis.yml +- add `-E, --growl-errors` to growl on failures only +- add prefixes to debug() names. Closes [#497](https://github.com/mochajs/mocha/issues/497) +- add `Mocha#invert()` to js api +- change dot reporter to use sexy unicode dots +- fix error when clicking pending test in HTML reporter +- fix `make tm` + +# 1.3.0 / 2012-07-05 + +- add window scrolling to `HTML` reporter +- add v8 `--trace-*` option support +- add support for custom reports via `--reporter MODULE` +- add `--invert` switch to invert `--grep` matches +- fix export of `Nyan` reporter. Closes [#495](https://github.com/mochajs/mocha/issues/495) +- fix escaping of `HTML` suite titles. Closes [#486](https://github.com/mochajs/mocha/issues/486) +- fix `done()` called multiple times with an error test +- change `--grep` - regexp escape the input + +# 1.2.2 / 2012-06-28 + +- Added 0.8.0 support + +# 1.2.1 / 2012-06-25 + +- Added `this.test.error(err)` support to after each hooks. Closes [#287](https://github.com/mochajs/mocha/issues/287) +- Added: export top-level suite on global mocha object (mocha.suite). Closes [#448](https://github.com/mochajs/mocha/issues/448) +- Fixed `js` code block format error in markdown reporter +- Fixed deprecation warning when using `path.existsSync` +- Fixed --globals with wildcard +- Fixed chars in nyan when his head moves back +- Remove `--growl` from test/mocha.opts. Closes [#289](https://github.com/mochajs/mocha/issues/289) + +# 1.2.0 / 2012-06-17 + +- Added `nyan` reporter [Atsuya Takagi] +- Added `mocha init ` to copy client files +- Added "specify" synonym for "it" [domenic] +- Added global leak wildcard support [nathanbowser] +- Fixed runner emitter leak. closes [#432](https://github.com/mochajs/mocha/issues/432) +- Fixed omission of .js extension. Closes [#454](https://github.com/mochajs/mocha/issues/454) + +# 1.1.0 / 2012-05-30 + +- Added: check each `mocha(1)` arg for directories to walk +- Added `--recursive` [tricknotes] +- Added `context` for BDD [hokaccha] +- Added styling for new clickable titles +- Added clickable suite titles to HTML reporter +- Added warning when strings are thrown as errors +- Changed: green arrows again in HTML reporter styling +- Changed ul/li elements instead of divs for better copy-and-pasting [joliss] +- Fixed issue [#325](https://github.com/mochajs/mocha/issues/325) - add better grep support to js api +- Fixed: save timer references to avoid Sinon interfering. + +# 1.0.3 / 2012-04-30 + +- Fixed string diff newlines +- Fixed: removed mocha.css target. Closes [#401](https://github.com/mochajs/mocha/issues/401) + +# 1.0.2 / 2012-04-25 + +- Added HTML reporter duration. Closes [#47](https://github.com/mochajs/mocha/issues/47) +- Fixed: one postMessage event listener [exogen] +- Fixed: allow --globals to be used multiple times. Closes [#100](https://github.com/mochajs/mocha/issues/100) [brendannee] +- Fixed [#158](https://github.com/mochajs/mocha/issues/158): removes jquery include from browser tests +- Fixed grep. Closes [#372](https://github.com/mochajs/mocha/issues/372) [brendannee] +- Fixed [#166](https://github.com/mochajs/mocha/issues/166) - When grepping don't display the empty suites +- Removed test/browser/style.css. Closes [#385](https://github.com/mochajs/mocha/issues/385) + +# 1.0.1 / 2012-04-04 + +- Fixed `.timeout()` in hooks +- Fixed: allow callback for `mocha.run()` in client version +- Fixed browser hook error display. Closes [#361](https://github.com/mochajs/mocha/issues/361) + +# 1.0.0 / 2012-03-24 + +- Added js API. Closes [#265](https://github.com/mochajs/mocha/issues/265) +- Added: initial run of tests with `--watch`. Closes [#345](https://github.com/mochajs/mocha/issues/345) +- Added: mark `location` as a global on the CS. Closes [#311](https://github.com/mochajs/mocha/issues/311) +- Added `markdown` reporter (github flavour) +- Added: scrolling menu to coverage.html. Closes [#335](https://github.com/mochajs/mocha/issues/335) +- Added source line to html report for Safari [Tyson Tate] +- Added "min" reporter, useful for `--watch` [Jakub Nešetřil] +- Added support for arbitrary compilers via . Closes [#338](https://github.com/mochajs/mocha/issues/338) [Ian Young] +- Added Teamcity export to lib/reporters/index [Michael Riley] +- Fixed chopping of first char in error reporting. Closes [#334](https://github.com/mochajs/mocha/issues/334) [reported by topfunky] +- Fixed terrible FF / Opera stack traces + +# 0.14.1 / 2012-03-06 + +- Added lib-cov to _.npmignore_ +- Added reporter to `mocha.run([reporter])` as argument +- Added some margin-top to the HTML reporter +- Removed jQuery dependency +- Fixed `--watch`: purge require cache. Closes [#266](https://github.com/mochajs/mocha/issues/266) + +# 0.14.0 / 2012-03-01 + +- Added string diff support for terminal reporters + +# 0.13.0 / 2012-02-23 + +- Added preliminary test coverage support. Closes [#5](https://github.com/mochajs/mocha/issues/5) +- Added `HTMLCov` reporter +- Added `JSONCov` reporter [kunklejr] +- Added `xdescribe()` and `xit()` to the BDD interface. Closes [#263](https://github.com/mochajs/mocha/issues/263) (docs \* Changed: make json reporter output pretty json +- Fixed node-inspector support, swapped `--debug` for `debug` to match node. Closes [#247](https://github.com/mochajs/mocha/issues/247) + +# 0.12.1 / 2012-02-14 + +- Added `npm docs mocha` support [TooTallNate] +- Added a `Context` object used for hook and test-case this. Closes [#253](https://github.com/mochajs/mocha/issues/253) +- Fixed `Suite#clone()` `.ctx` reference. Closes [#262](https://github.com/mochajs/mocha/issues/262) + +# 0.12.0 / 2012-02-02 + +- Added .coffee `--watch` support. Closes [#242](https://github.com/mochajs/mocha/issues/242) +- Added support to `--require` files relative to the CWD. Closes [#241](https://github.com/mochajs/mocha/issues/241) +- Added quick n dirty syntax highlighting. Closes [#248](https://github.com/mochajs/mocha/issues/248) +- Changed: made HTML progress indicator smaller +- Fixed xunit errors attribute [dhendo] + +# 0.10.2 / 2012-01-21 + +- Fixed suite count in reporter stats. Closes [#222](https://github.com/mochajs/mocha/issues/222) +- Fixed `done()` after timeout error reporting [Phil Sung] +- Changed the 0-based errors to 1 + +# 0.10.1 / 2012-01-17 + +- Added support for node 0.7.x +- Fixed absolute path support. Closes [#215](https://github.com/mochajs/mocha/issues/215) [kompiro] +- Fixed `--no-colors` option [Jussi Virtanen] +- Fixed Arial CSS typo in the correct file + +# 0.10.0 / 2012-01-13 + +- Added `-b, --bail` to exit on first exception [guillermo] +- Added support for `-gc` / `--expose-gc` [TooTallNate] +- Added `qunit`-inspired interface +- Added MIT LICENSE. Closes [#194](https://github.com/mochajs/mocha/issues/194) +- Added: `--watch` all .js in the CWD. Closes [#139](https://github.com/mochajs/mocha/issues/139) +- Fixed `self.test` reference in runner. Closes [#189](https://github.com/mochajs/mocha/issues/189) +- Fixed double reporting of uncaught exceptions after timeout. Closes [#195](https://github.com/mochajs/mocha/issues/195) + +# 0.8.2 / 2012-01-05 + +- Added test-case context support. Closes [#113](https://github.com/mochajs/mocha/issues/113) +- Fixed exit status. Closes [#187](https://github.com/mochajs/mocha/issues/187) +- Update commander. Closes [#190](https://github.com/mochajs/mocha/issues/190) + +# 0.8.1 / 2011-12-30 + +- Fixed reporting of uncaught exceptions. Closes [#183](https://github.com/mochajs/mocha/issues/183) +- Fixed error message defaulting [indutny] +- Changed mocha(1) from bash to node for windows [Nathan Rajlich] + +# 0.8.0 / 2011-12-28 + +- Added `XUnit` reporter [FeeFighters/visionmedia] +- Added `say(1)` notification support [Maciej Małecki] +- Changed: fail when done() is invoked with a non-Error. Closes [#171](https://github.com/mochajs/mocha/issues/171) +- Fixed `err.stack`, defaulting to message. Closes [#180](https://github.com/mochajs/mocha/issues/180) +- Fixed: `make tm` mkdir -p the dest. Closes [#137](https://github.com/mochajs/mocha/issues/137) +- Fixed mocha(1) --help bin name +- Fixed `-d` for `--debug` support + +# 0.7.1 / 2011-12-22 + +- Removed `mocha-debug(1)`, use `mocha --debug` +- Fixed CWD relative requires +- Fixed growl issue on windows [Raynos] +- Fixed: platform specific line endings [TooTallNate] +- Fixed: escape strings in HTML reporter. Closes [#164](https://github.com/mochajs/mocha/issues/164) + +# 0.7.0 / 2011-12-18 + +- Added support for IE{7,8} [guille] +- Changed: better browser nextTick implementation [guille] + +# 0.6.0 / 2011-12-18 + +- Added setZeroTimeout timeout for browser (nicer stack traces). Closes [#153](https://github.com/mochajs/mocha/issues/153) +- Added "view source" on hover for HTML reporter to make it obvious +- Changed: replace custom growl with growl lib +- Fixed duplicate reporting for HTML reporter. Closes [#154](https://github.com/mochajs/mocha/issues/154) +- Fixed silent hook errors in the HTML reporter. Closes [#150](https://github.com/mochajs/mocha/issues/150) + +# 0.5.0 / 2011-12-14 + +- Added: push node_modules directory onto module.paths for relative require Closes [#93](https://github.com/mochajs/mocha/issues/93) +- Added teamcity reporter [blindsey] +- Fixed: recover from uncaught exceptions for tests. Closes [#94](https://github.com/mochajs/mocha/issues/94) +- Fixed: only emit "test end" for uncaught within test, not hook + +# 0.4.0 / 2011-12-14 + +- Added support for test-specific timeouts via `this.timeout(0)`. Closes [#134](https://github.com/mochajs/mocha/issues/134) +- Added guillermo's client-side EventEmitter. Closes [#132](https://github.com/mochajs/mocha/issues/132) +- Added progress indicator to the HTML reporter +- Fixed slow browser tests. Closes [#135](https://github.com/mochajs/mocha/issues/135) +- Fixed "suite" color for light terminals +- Fixed `require()` leak spotted by [guillermo] + +# 0.3.6 / 2011-12-09 + +- Removed suite merging (for now) + +# 0.3.5 / 2011-12-08 + +- Added support for `window.onerror` [guillermo] +- Fixed: clear timeout on uncaught exceptions. Closes [#131](https://github.com/mochajs/mocha/issues/131) [guillermo] +- Added `mocha.css` to PHONY list. +- Added `mocha.js` to PHONY list. + +# 0.3.4 / 2011-12-08 + +- Added: allow `done()` to be called with non-Error +- Added: return Runner from `mocha.run()`. Closes [#126](https://github.com/mochajs/mocha/issues/126) +- Fixed: run afterEach even on failures. Closes [#125](https://github.com/mochajs/mocha/issues/125) +- Fixed clobbering of current runnable. Closes [#121](https://github.com/mochajs/mocha/issues/121) + +# 0.3.3 / 2011-12-08 + +- Fixed hook timeouts. Closes [#120](https://github.com/mochajs/mocha/issues/120) +- Fixed uncaught exceptions in hooks + +# 0.3.2 / 2011-12-05 + +- Fixed weird reporting when `err.message` is not present + +# 0.3.1 / 2011-12-04 + +- Fixed hook event emitter leak. Closes [#117](https://github.com/mochajs/mocha/issues/117) +- Fixed: export `Spec` constructor. Closes [#116](https://github.com/mochajs/mocha/issues/116) + +# 0.3.0 / 2011-12-04 + +- Added `-w, --watch`. Closes [#72](https://github.com/mochajs/mocha/issues/72) +- Added `--ignore-leaks` to ignore global leak checking +- Added browser `?grep=pattern` support +- Added `--globals ` to specify accepted globals. Closes [#99](https://github.com/mochajs/mocha/issues/99) +- Fixed `mocha-debug(1)` on some systems. Closes [#232](https://github.com/mochajs/mocha/issues/232) +- Fixed growl total, use `runner.total` + +# 0.2.0 / 2011-11-30 + +- Added `--globals ` to specify accepted globals. Closes [#99](https://github.com/mochajs/mocha/issues/99) +- Fixed funky highlighting of messages. Closes [#97](https://github.com/mochajs/mocha/issues/97) +- Fixed `mocha-debug(1)`. Closes [#232](https://github.com/mochajs/mocha/issues/232) +- Fixed growl total, use runner.total + +# 0.1.0 / 2011-11-29 + +- Added `suiteSetup` and `suiteTeardown` to TDD interface [David Henderson] +- Added growl icons. Closes [#84](https://github.com/mochajs/mocha/issues/84) +- Fixed coffee-script support + +# 0.0.8 / 2011-11-25 + +- Fixed: use `Runner#total` for accurate reporting + +# 0.0.7 / 2011-11-25 + +- Added `Hook` +- Added `Runnable` +- Changed: `Test` is `Runnable` +- Fixed global leak reporting in hooks +- Fixed: > 2 calls to done() only report the error once +- Fixed: clear timer on failure. Closes [#80](https://github.com/mochajs/mocha/issues/80) + +# 0.0.6 / 2011-11-25 + +- Fixed return on immediate async error. Closes [#80](https://github.com/mochajs/mocha/issues/80) + +# 0.0.5 / 2011-11-24 + +- Fixed: make mocha.opts whitespace less picky [kkaefer] + +# 0.0.4 / 2011-11-24 + +- Added `--interfaces` +- Added `--reporters` +- Added `-c, --colors`. Closes [#69](https://github.com/mochajs/mocha/issues/69) +- Fixed hook timeouts + +# 0.0.3 / 2011-11-23 + +- Added `-C, --no-colors` to explicitly disable +- Added coffee-script support + +# 0.0.2 / 2011-11-22 + +- Fixed global leak detection due to Safari bind() change +- Fixed: escape html entities in Doc reporter +- Fixed: escape html entities in HTML reporter +- Fixed pending test support for HTML reporter. Closes [#66](https://github.com/mochajs/mocha/issues/66) + +# 0.0.1 / 2011-11-22 + +- Added `--timeout` second shorthand support, ex `--timeout 3s`. +- Fixed "test end" event for uncaughtExceptions. Closes [#61](https://github.com/mochajs/mocha/issues/61) + +# 0.0.1-alpha6 / 2011-11-19 + +- Added travis CI support (needs enabling when public) +- Added preliminary browser support +- Added `make mocha.css` target. Closes [#45](https://github.com/mochajs/mocha/issues/45) +- Added stack trace to TAP errors. Closes [#52](https://github.com/mochajs/mocha/issues/52) +- Renamed tearDown to teardown. Closes [#49](https://github.com/mochajs/mocha/issues/49) +- Fixed: cascading hooksc. Closes [#30](https://github.com/mochajs/mocha/issues/30) +- Fixed some colors for non-tty +- Fixed errors thrown in sync test-cases due to nextTick +- Fixed Base.window.width... again give precedence to 0.6.x + +# 0.0.1-alpha5 / 2011-11-17 + +- Added `doc` reporter. Closes [#33](https://github.com/mochajs/mocha/issues/33) +- Added suite merging. Closes [#28](https://github.com/mochajs/mocha/issues/28) +- Added TextMate bundle and `make tm`. Closes [#20](https://github.com/mochajs/mocha/issues/20) + +# 0.0.1-alpha4 / 2011-11-15 + +- Fixed getWindowSize() for 0.4.x + +# 0.0.1-alpha3 / 2011-11-15 + +- Added `-s, --slow ` to specify "slow" test threshold +- Added `mocha-debug(1)` +- Added `mocha.opts` support. Closes [#31](https://github.com/mochajs/mocha/issues/31) +- Added: default [files] to _test/\*.js_ +- Added protection against multiple calls to `done()`. Closes [#35](https://github.com/mochajs/mocha/issues/35) +- Changed: bright yellow for slow Dot reporter tests + +# 0.0.1-alpha2 / 2011-11-08 + +- Missed this one :) + +# 0.0.1-alpha1 / 2011-11-08 + +- Initial release diff --git a/docs/changelogs/CHANGELOG_V4.md b/docs/changelogs/CHANGELOG_V4.md new file mode 100644 index 0000000000..d09c6928b5 --- /dev/null +++ b/docs/changelogs/CHANGELOG_V4.md @@ -0,0 +1,84 @@ +# 4.1.0 / 2017-12-28 + +This is mainly a "housekeeping" release. + +Welcome [@Bamieh](https://github.com/Bamieh) and [@xxczaki](https://github.com/xxczaki) to the team! + +## :bug: Fixes + +- [#2661](https://github.com/mochajs/mocha/issues/2661): `progress` reporter now accepts reporter options ([@canoztokmak](https://github.com/canoztokmak)) +- [#3142](https://github.com/mochajs/mocha/issues/3142): `xit` in `bdd` interface now properly returns its `Test` object ([@Bamieh](https://github.com/Bamieh)) +- [#3075](https://github.com/mochajs/mocha/pull/3075): Diffs now computed eagerly to avoid misinformation when reported ([@abrady0](https://github.com/abrady0)) +- [#2745](https://github.com/mochajs/mocha/issues/2745): `--help` will now help you even if you have a `mocha.opts` ([@Zarel](https://github.com/Zarel)) + +## :tada: Enhancements + +- [#2514](https://github.com/mochajs/mocha/issues/2514): The `--no-diff` flag will completely disable diff output ([@CapacitorSet](https://github.com/CapacitorSet)) +- [#3058](https://github.com/mochajs/mocha/issues/3058): All "setters" in Mocha's API are now also "getters" if called without arguments ([@makepanic](https://github.com/makepanic)) + +## :book: Documentation + +- [#3170](https://github.com/mochajs/mocha/pull/3170): Optimization and site speed improvements ([@Munter](https://github.com/munter)) +- [#2987](https://github.com/mochajs/mocha/issues/2987): Moved the old [site repo](https://github.com/mochajs/mochajs.github.io) into the main repo under `docs/` ([@boneskull](https://github.com/boneskull)) +- [#2896](https://github.com/mochajs/mocha/issues/2896): Add [maintainer guide](https://github.com/mochajs/mocha/blob/master/MAINTAINERS.md) ([@boneskull](https://github.com/boneskull)) +- Various fixes and updates ([@xxczaki](https://github.com/xxczaki), [@maty21](https://github.com/maty21), [@leedm777](https://github.com/leedm777)) + +## :nut_and_bolt: Other + +- Test improvements and fixes ([@eugenet8k](https://github.com/eugenet8k), [@ngeor](https://github.com/ngeor), [@38elements](https://github.com/38elements), [@Gerhut](https://github.com/Gerhut), [@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) +- Refactoring and cruft excision ([@38elements](https://github.com/38elements), [@Bamieh](https://github.com/Bamieh), [@finnigantime](https://github.com/finnigantime), [@boneskull](https://github.com/boneskull)) + +# 4.0.1 / 2017-10-05 + +## :bug: Fixes + +- [#3051](https://github.com/mochajs/mocha/pull/3051): Upgrade Growl to v1.10.3 to fix its [peer dep problems](https://github.com/tj/node-growl/pull/68) ([@dpogue](https://github.com/dpogue)) + +# 4.0.0 / 2017-10-02 + +You might want to read this before filing a new bug! :stuck_out_tongue_closed_eyes: + +## :boom: Breaking Changes + +For more info, please [read this article](https://boneskull.com/mocha-v4-nears-release/). + +### Compatibility + +- [#3016](https://github.com/mochajs/mocha/issues/3016): Drop support for unmaintained versions of Node.js ([@boneskull](https://github.com/boneskull)): + - 0.10.x + - 0.11.x + - 0.12.x + - iojs (any) + - 5.x.x +- [#2979](https://github.com/mochajs/mocha/issues/2979): Drop support for non-ES5-compliant browsers ([@boneskull](https://github.com/boneskull)): + - IE7 + - IE8 + - PhantomJS 1.x +- [#2615](https://github.com/mochajs/mocha/issues/2615): Drop Bower support; old versions (3.x, etc.) will remain available ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) + +### Default Behavior + +- [#2879](https://github.com/mochajs/mocha/issues/2879): By default, Mocha will no longer force the process to exit once all tests complete. This means any test code (or code under test) which would normally prevent `node` from exiting will do so when run in Mocha. Supply the `--exit` flag to revert to pre-v4.0.0 behavior ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) + +### Reporter Output + +- [#2095](https://github.com/mochajs/mocha/issues/2095): Remove `stdout:` prefix from browser reporter logs ([@skeggse](https://github.com/skeggse)) +- [#2295](https://github.com/mochajs/mocha/issues/2295): Add separator in "unified diff" output ([@olsonpm](https://github.com/olsonpm)) +- [#2686](https://github.com/mochajs/mocha/issues/2686): Print failure message when `--forbid-pending` or `--forbid-only` is specified ([@ScottFreeCode](https://github.com/ScottFreeCode)) +- [#2814](https://github.com/mochajs/mocha/pull/2814): Indent contexts for better readability when reporting failures ([@charlierudolph](https://github.com/charlierudolph)) + +## :-1: Deprecations + +- [#2493](https://github.com/mochajs/mocha/issues/2493): The `--compilers` command-line option is now soft-deprecated and will emit a warning on `STDERR`. Read [this](https://github.com/mochajs/mocha/wiki/compilers-deprecation) for more info and workarounds ([@ScottFreeCode](https://github.com/ScottFreeCode), [@boneskull](https://github.com/boneskull)) + +## :tada: Enhancements + +- [#2628](https://github.com/mochajs/mocha/issues/2628): Allow override of default test suite name in XUnit reporter ([@ngeor](https://github.com/ngeor)) + +## :book: Documentation + +- [#3020](https://github.com/mochajs/mocha/pull/3020): Link to CLA in `README.md` and `CONTRIBUTING.md` ([@skeggse](https://github.com/skeggse)) + +## :nut_and_bolt: Other + +- [#2890](https://github.com/mochajs/mocha/issues/2890): Speed up build by (re-)consolidating SauceLabs tests ([@boneskull](https://github.com/boneskull)) From d0f04e994f3e78939f0a947ef064881c7fec5188 Mon Sep 17 00:00:00 2001 From: juergba Date: Sun, 26 Jan 2020 07:54:24 +0100 Subject: [PATCH 1436/1771] Release v7.0.1 --- CHANGELOG.md | 14 +++++++------- package-lock.json | 2 +- package.json | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 007a71d5f6..3d439b03e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,19 +2,19 @@ ## :bug: Fixes -- #4165: Fix exception when skipping tests programmatically (@juergba) -- #4153: Restore backwards compatibility for `reporterOptions` (@holm) -- #4150: Fix recovery of an open test upon uncaught exception (@juergba) -- #4147: Fix regression of leaking uncaught exception handler (@juergba) +- [#4165](https://github.com/mochajs/mocha/issues/4165): Fix exception when skipping tests programmatically ([**@juergba**](https://github.com/juergba)) +- [#4153](https://github.com/mochajs/mocha/issues/4153): Restore backwards compatibility for `reporterOptions` ([**@holm**](https://github.com/holm)) +- [#4150](https://github.com/mochajs/mocha/issues/4150): Fix recovery of an open test upon uncaught exception ([**@juergba**](https://github.com/juergba)) +- [#4147](https://github.com/mochajs/mocha/issues/4147): Fix regression of leaking uncaught exception handler ([**@juergba**](https://github.com/juergba)) ## :book: Documentation -- #4146: Update copyright & trademark notices per OJSF (@boneskull) -- #4140: Fix broken links (@KyoungWan) +- [#4146](https://github.com/mochajs/mocha/issues/4146): Update copyright & trademark notices per OJSF ([**@boneskull**](https://github.com/boneskull)) +- [#4140](https://github.com/mochajs/mocha/issues/4140): Fix broken links ([**@KyoungWan**](https://github.com/KyoungWan)) ## :nut_and_bolt: Other -- #4133: Print more descriptive error message (@Zirak) +- [#4133](https://github.com/mochajs/mocha/issues/4133): Print more descriptive error message ([**@Zirak**](https://github.com/Zirak)) # 7.0.0 / 2020-01-05 diff --git a/package-lock.json b/package-lock.json index e66be18a00..0c7d9888c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.0.0", + "version": "7.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index aa77237f94..7dbe7a453d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.0.0", + "version": "7.0.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", @@ -105,6 +105,7 @@ "Chris Buckley ", "Chris Lamb ", "Christian ", + "Christian Holm ", "Christoffer Hallas ", "Christoph Neuroth ", "Christopher Hiller ", @@ -291,6 +292,7 @@ "Kunal Nagpal ", "Kyle Fuller ", "Kyle Mitchell ", + "KyoungWan ", "lakmeer ", "Lane Kelly ", "László Bácsi ", @@ -503,6 +505,7 @@ "Yuest Wang ", "yuitest ", "zhiyelee ", + "Zirak ", "Zsolt Takács ", "现充 " ], From dbba276826f149e15dd8c78dbb478a8e798fe205 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Fri, 31 Jan 2020 01:40:52 +0900 Subject: [PATCH 1437/1771] Manage author list in AUTHORS instead of package.json (#4058) Signed-off-by: Outsider --- AUTHORS | 490 +++++++++++++++++++++++++++++++++++++ MAINTAINERS.md | 150 ++++++------ package-lock.json | 232 ------------------ package-scripts.js | 8 +- package.json | 503 -------------------------------------- scripts/update-authors.js | 62 +++++ 6 files changed, 631 insertions(+), 814 deletions(-) create mode 100644 AUTHORS create mode 100755 scripts/update-authors.js diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000000..e343853b2a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,490 @@ +# Authors ordered by first contribution. + +TJ Holowaychuk +James Carr +Fredrik Lindin +Konstantin Käfer +David Henderson +Harry Brundage +Quang Van +hokaccha +Guillermo Rauch +FARKAS Máté +Ben Lindsey +Steve Mason +Ryunosuke SATO +Nathan Rajlich +Raynos +Yuest Wang +Maciej Małecki +Joshua Krall +Fedor Indutny +Will Langstroth +Attila Domokos +Jussi Virtanen +Phil Sung +vlad +Paul Miller +Bjørge Næss +Jeff Kunkle +Fabio M. Costa +Michael Riley +Ian Young +Jakub Nešetřil +Tyson Tate +Jo Liss +Arian Stolwijk +Brendan Nee +Xavier Antoviaque +Domenic Denicola +Brian Beck +Dave McKenna +Richard Dingwall +Cory Thomas +R56 +Ian Storm Taylor +Andreas Brekken +abrkn +Nathan Bowser +László Bácsi +Atsuya Takagi +Gavin Mogan +fengmk2 +Seiya Konno +Jan Lehnardt +Matt Robenolt +Jonas Westerlund +Koen Punt +Jason Barry +Austin Birch +Adam Crabtree +Casey Foster +Jonathan Creamer +Brian Moore +traleig1 +John Firebaugh +airportyh +Aaron Heckmann +Russ Bradberry +Ivan +Corey Butler +Paul Armstrong +Herman Junge +Michael Schoonmaker +Wil Moore III +Pete Hawkins +tgautier@yahoo.com +yuitest +Matt Smith +Katie Gengler +Bryan Donovan +Nathan Alderson +Shawn Krisman +Merrick Christensen +Timo Tijhof +Simon Gaeremynck +Jaakko Salonen +Jonathan Rajavuori +Forbes Lindesay +Standa Opichal +Matthew Shanley +James Lal +Greg Perkins +Gareth Murphy +Juzer Ali +Sasha Koss +Justin DuJardin +Frederico Silva +Jesse Dailey +Yanis Wang +fcrisci +Javier Aranda +Florian Margaine +fool2fish +James Bowes +Valentin Agachi +Mathieu Desvé +Glen Huang +Simon Goumaz +Alexander Early +Jimmy Cuadra +Russell Munson +lodr +Liam Newman +Dmitry Shirokov +Fredrik Enestad +Kirill Korolyov +grasGendarme +Mike Pennisi +Victor Costan +Tim Ehat +Jeremy Martin +Mal Graty +Di Wu +badunk +Marc Kuo +Sindre Sorhus +Salehen Shovon Rahman +eiji.ienaga +Oscar Godson +Daniel Stockman +Stephen Mathieson +Travis Jeffery +Andreas Lind Petersen +Romain Prieto +JP Bochi +Teddy Zeenny +Roman Neuhauser +XhmikosR +Brian Lalor +Refael Ackermann +ChrisWren +Andrew Nesbitt +berni +Andrey Popp <8mayday@gmail.com> +Brian M. Carlson +Michael Olson +Arnaud Brousseau +Peter Rust +Vadim Nikitin +Roman Shtylman +Tapiwa Kelvin +Rustem Mustafin +Glen Mailer +Nathan Black +sebv +andy matthews +Benjie Gillam +Noshir Patel +Ben Noordhuis +Jacob Wejendorp +claudyus +Denis Bardadym +Connor Dunn +Jonathan Ong +Harish +Michal Charemza +startswithaj +Gareth Aye +Nick Fitzgerald +Jan Kopriva +kavun +Christoffer Hallas +Jonathan Park +Devin Weaver +John Doty +Shaine Hatch +Ben Bradley +qiuzuhui +Jean Ponchon +Linus Unnebäck +Mattias Tidlund +Matija Marohnić +Michael Jackson +Joel Kemp +Zsolt Takács +jsdevel +lakmeer +Joshua Appelman +Christopher Hiller +Michael Demmer +Giovanni Bassi +Panu Horsmalahti +nishigori +Nicolo Taddei +Diogo Monteiro +mrShturman +PoppinL +samuel goldszmidt +Rob Wu +Kent C. Dodds +Kevin Conway +Dominique Quatravaux +zhiyelee +Quanlong He +omardelarosa +Ariel Mashraki +Sean Lang +David da Silva Contín +C. Scott Ananian +Douglas Christopher Wilson +Richard Knop +Buck Doyle +Jonas Dohse +oveddan +monowerker +Marcello Bastea-Forte +Benoît Zugmeyer +Vlad Magdalin +Moshe Kolodny +Tom Coquereau +Timothy Gu +Ian Zamojc +Martin Marko +Chris Buckley +Jake Craige +Fede Ramirez +Parker Moore +Todd Agulnick +Daniel St. Jules +Rico Sta. Cruz +Anis Safine +Adam Gruber +Sam Mussell +klaemo +Stewart Taylor +Jordan Sexton +Keith Cirkel +Andrii Shumada +Dominic Barnes +Maximilian Antoni +Sune Simonsen +Kyle Mitchell +James Nylen +Jonathan Delgado +Jake Marsh +slyg +Tomer Eskenazi +Jeff Schilling +Ryan Hubbard +amsul +Kevin Kirsche +Gabriel Silk +Johnathon Sanders +Max Goodman +Nathan Houle +Ben Vinegar +Duncan Beevers +Tingan Ho +Guy Arye +Nik Nyby +Artem Govorov +Ajay Kodali +Ryan Tablada +Pavel Zubkou +gigadude +Outsider +Jason Lai +Aaron Krause +wsw +Kevin Burke +Berker Peksag +nexdrew +Hugo Giraudel +Rich Trott +Matt Giles +Joey Cozza +Kris Rasmussen +James G. Kim +Sorin Iclanzan +Rob Raux +Sergey Simonchik +Ian W. Remmel +tmont +John Reeves +Fagner Brack +Mark Banner +Michiel de Jong +Benoit Larroque +Charles Lowell +Joao Moreno +Long Ho +Robert Rossmann +Aaron Hamid +Stone +Tom Hughes +Soel +Mislav Marohnić +Prayag Verma +Frank Leon Rose +Ryan Shaw +Thedark1337 +Gyandeep Singh +ryym +Josh Lory +Jonathan Kim +Al Scott +Tobias Bieniek +Benjamin Eidelman +Julien Wajsberg +sarehag +Alexander Shepelin +OlegTsyba +Xavier Damman +Mick Brooks +Erik Eng +Kelong Wang +Jérémie Astori +ScottFreeCode +Sergio Santoro +Adrian Ludwig +Anders Olsen Sandvik +Thomas Grainger +jimenglish81 +Avi Vahl +Jason Leyba +silentcloud +Dmitriy Simushev +simov +Ross Warren +Benson Trent +rmacklin +Rob Loach +Shinnosuke Watanabe +Callum Macrae +ELLIOTTCABLE +Anton +Peter Müller +APerson +not-an-aardvark +Alhadis +Slobodan Mišković +Philip M. White +Christian +anton +Dmitry Sorin +Vivek Ganesan +Josh Eversmann +inxorable +Ben Harris +Aaron Petcoff +Matt Bierner +Ville Saukkonen +Ben Hutchison +Volker Buzek +Scott Kao +Sulabh Bista +rotemdan +Fumiaki MATSUSHIMA +Markus Tacker +Christoph Neuroth +Enric Pallerols +Craig Taub +Yoshiya Hinosawa +Sebastian Van Sande +Chris Lamb +Igwe Kalu +Kevin Wang +Laurence Rowe +Jakob Krigovsky +Chris +Kunal Nagpal +elergy +Jupp Müller +Poprádi Árpád +Charlie Rudolph +Angelica Valenta +Jan Krems +Josh Soref +solodynamo +Eli Skeggs +Nikolaos Georgiou +olsonpm +David Neubauer +Darryl Pogue +38elements +Guangcong Luo +David M. Lee +tripu +Pat Finnigan +Eugene Tiutiunnyk +Aaron Brady +Charles Merriam +Kevin Partington +Lane Kelly +Cube +yehiyam +Jon Surrell +现充 +Ahmad Bamieh +Capacitor Set +Anthony +Can Oztokmak +ImgBot <31427850+ImgBotApp@users.noreply.github.com> +Thomas Broadley +FND +Dina Berry +Marais Rossouw +Andrew Krawchyk <903716+akrawchyk@users.noreply.github.com> +Ted Yavuzkurt +Daniel Ruf +Harry Wolff +Valeri Karpov +Silvio Massari +Joseph Lin +Honza Javorek +Harry Sarson +Anish Karandikar +Victor +Emanuele +Thomas Vantuycom +Alex Bainter +Jerry Muzsik +Nicolas Girault +dfberry +DavNej +Paul Roebuck +Tim Harshman +Charles Samborski +Tobias Mollstam +Ben Glassman +Mark Owsiak +fargies +Marc Udoff +gizemkeser <44727928+gizemkeser@users.noreply.github.com> +Fin Chen +Brittany Moore +Fábio Santos +Jayasankar +Juerg B <44573692+juergba@users.noreply.github.com> +Svetlana <39729453+Lana-Light@users.noreply.github.com> +Martijn Cuppens +Anna Henningsen +Andreas Lind +Chen Yangjian <252317+cyjake@users.noreply.github.com> +Corey Farrell +Wanseob Lim +Szauka <33459309+Szauka@users.noreply.github.com> +Brian Tomlin +Sylvain +Adam Ginzberg +XhmikosR +Gastón I. Silva +Andrew Bradley +Andrew Bradley +DavidLi119 +James D. Rogers +Carl-Erik Kopseng +juergba +Sylvester Keil +Bjorn Stromberg +Stephen Hess +toyjhlee +Piotr Kuczynski +Thomas Scholtes +Brian Lagerman <49239617+brian-lagerman@users.noreply.github.com> +Pascal +Gabe Gorelick +Daniel Ruf <827205+DanielRuf@users.noreply.github.com> +Mario Díaz Ceñera <46492068+MarioDiaz98@users.noreply.github.com> +Oliver Salzburg +Sona Lee +Park Seong-beom +EunChan Park +Mia +Lindsay-Needs-Sleep <51773923+Lindsay-Needs-Sleep@users.noreply.github.com> +Soobin Bak +Peter Schmidt +SheetJSDev +HyunSangHan +Jan-Philip Gehrcke +Robert Kieffer +Saerom Bang +Kyle Fuller +Rens Groothuijsen +Hugo Kim +KyoungWan +Zirak +Christian Holm + +# Generated by scripts/update-authors.js diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 31d5e40ce9..f155418edd 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -39,13 +39,13 @@ ## Introduction -Hi stranger! We've written this document for: +Hi stranger! We've written this document for: 1. Active maintainers of Mocha 1. Prospective maintainers of Mocha 1. Anyone curious about how Mocha's maintainers maintain Mocha -The purpose of this document is to *describe our processes*. We want to avoid conflicts and confusion around "unwritten rules". In our opinion, the most straightforward way to address this is to *write them down*. This *also* happens to be the most straightforward way to change them! +The purpose of this document is to _describe our processes_. We want to avoid conflicts and confusion around "unwritten rules". In our opinion, the most straightforward way to address this is to _write them down_. This _also_ happens to be the most straightforward way to change them! To assist in eliminating ambiguity, we will define some terms. @@ -55,7 +55,7 @@ Anyone involved with Mocha will fall into one of these buckets: **user**, **cont ### User -A "user" for the purpose of this document is any *individual developer* who consumes Mocha to write and/or execute tests. A user interacts with contributors. A user interacts with the software, web site, documentation, etc., which these contributors provide. +A "user" for the purpose of this document is any _individual developer_ who consumes Mocha to write and/or execute tests. A user interacts with contributors. A user interacts with the software, web site, documentation, etc., which these contributors provide. As a user, you're expected to follow the [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) when interacting in Mocha's "official" social spaces. This includes: @@ -70,7 +70,7 @@ This is the most important thing: **You don't have to write code to be a contributor!** -A "contributor" is any individual who has *given back* in some way to the project and its community. Contributions include (but are not limited to): +A "contributor" is any individual who has _given back_ in some way to the project and its community. Contributions include (but are not limited to): 1. Reporting bugs which follow the reporting guidelines 1. Suggesting and debating enhancements that have wide applicability @@ -84,11 +84,11 @@ A "contributor" is any individual who has *given back* in some way to the projec 1. Recruiting more contributors! Don't spam. 1. Researching the user base, getting feedback, etc. Don't spam. -A contributor is *usually* a user as well, but this isn't a hard-and-fast rule. A contributor is also expected to adhere to the [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) as a user would. +A contributor is _usually_ a user as well, but this isn't a hard-and-fast rule. A contributor is also expected to adhere to the [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) as a user would. -As you can see, it's wide open! Think of it another way: if you are *adding value to Mocha*, then you are a contributor. +As you can see, it's wide open! Think of it another way: if you are _adding value to Mocha_, then you are a contributor. -> Due to the nature of GitHub, it's a challenge to recognize those who've made contributions *elsewhere* on the web, or even contributions of the "non-code" variety. If you know of any great contributions which have gone unnoticed, please bring them to the maintainers' attention! +> Due to the nature of GitHub, it's a challenge to recognize those who've made contributions _elsewhere_ on the web, or even contributions of the "non-code" variety. If you know of any great contributions which have gone unnoticed, please bring them to the maintainers' attention! #### A Note About Donations @@ -98,11 +98,11 @@ We love our backers and sponsors! 💕 ### Maintainer -A maintainer has certain "rights" (or "permissions") to the Mocha project and other projects under the `mochajs` organization. There's no way to dance around this: with these rights come increased responsibilities. +A maintainer has certain "rights" (or "permissions") to the Mocha project and other projects under the `mochajs` organization. There's no way to dance around this: with these rights come increased responsibilities. -However, **there is no expectation of a standard of technical ability** to be a maintainer of Mocha. This doesn't imply a lack of technical oversight--every pull request will eventually be reviewed. +However, **there is no expectation of a standard of technical ability** to be a maintainer of Mocha. This doesn't imply a lack of technical oversight--every pull request will eventually be reviewed. -**If you think you aren't experienced enough to maintain a project like Mocha, you are incorrect.** The only requirements are the above responsibilities and a desire to help the project. It bears repeating: +**If you think you aren't experienced enough to maintain a project like Mocha, you are incorrect.** The only requirements are the above responsibilities and a desire to help the project. It bears repeating: **You don't have to write code to be a maintainer!** @@ -110,30 +110,30 @@ However, **there is no expectation of a standard of technical ability** to be a #### The Responsibilities of a Maintainer -As a maintainer, you are expected to *not just* "follow" the code of conduct, but embody its values. Your public behavior, whether in the physical or virtual world, reflects upon the project and other maintainers. +As a maintainer, you are expected to _not just_ "follow" the code of conduct, but embody its values. Your public behavior, whether in the physical or virtual world, reflects upon the project and other maintainers. -> If you don't understand the code of conduct, or why it exists, it is *your responsibility* to educate yourself. +> If you don't understand the code of conduct, or why it exists, it is _your responsibility_ to educate yourself. > This does not imply the CoC is immutable. -Furthermore, a maintainer is a contributor who **contributes regularly**, or expresses a *desire to do so.* That could be every day--but it might be once a week, or even once a month. Your boss doesn't work here; contribute as often as you wish. We are all people with Real Lives, and for many of us, contributing to OSS is just a hobby! +Furthermore, a maintainer is a contributor who **contributes regularly**, or expresses a _desire to do so._ That could be every day--but it might be once a week, or even once a month. Your boss doesn't work here; contribute as often as you wish. We are all people with Real Lives, and for many of us, contributing to OSS is just a hobby! -Finally, a maintainer must help define what makes Mocha "Mocha". At minimum, a maintainer must *understand* the current definition (if a maintainer is not interested in decision-making). Some of these questions include: +Finally, a maintainer must help define what makes Mocha "Mocha". At minimum, a maintainer must _understand_ the current definition (if a maintainer is not interested in decision-making). Some of these questions include: - What's the scope of Mocha? - Where should we focus efforts? - What's urgent, what can wait? - What can we break? What's off-limits? -- What user feedback is valuable? What isn't? +- What user feedback is valuable? What isn't? -As maintainers, *we work together* to learn about the nature of these questions. If we try hard enough, we even come to some answers! +As maintainers, _we work together_ to learn about the nature of these questions. If we try hard enough, we even come to some answers! -A maintainer *must* also have 2FA enabled on their GitHub account. +A maintainer _must_ also have 2FA enabled on their GitHub account. > If you think that you aren't familiar with mocha's internals enough to contribute, please watch [This walkthrough video!](https://youtu.be/zLayCLcIno0) #### The Rights of a Maintainer -You may choose to do zero or more of these *at their discretion*: +You may choose to do zero or more of these _at their discretion_: - Merge pull requests - Modify issues (closing, adding labels, assigning them other maintainers, etc.) @@ -144,7 +144,7 @@ You may choose to do zero or more of these *at their discretion*: - Add new maintainers to the team - Tag releases and publish Mocha to npm -> While maintainers have the ability to commit directly to the `master` branch, *this is to be avoided* if any other maintainer could reasonably take issue with the change, or the change affects Mocha's API or output. For example, a spelling correction in `CHANGELOG.md` may not require a pull request. A change to a reporter's output most certainly would! Maintainers are trusted to use their best judgement; if unsure, err on the side of caution. +> While maintainers have the ability to commit directly to the `master` branch, _this is to be avoided_ if any other maintainer could reasonably take issue with the change, or the change affects Mocha's API or output. For example, a spelling correction in `CHANGELOG.md` may not require a pull request. A change to a reporter's output most certainly would! Maintainers are trusted to use their best judgement; if unsure, err on the side of caution. #### About "Owners" @@ -155,20 +155,20 @@ Some maintainers will have full admin rights to the [mochajs org](https://github ## Mocha's Decision-Making Process -Mocha follows a [consensus-seeking decision-making](https://en.wikipedia.org/wiki/Consensus-seeking_decision-making) process. In other words, all maintainers attempt to come to agreement. If that fails, we decide by a simple vote. +Mocha follows a [consensus-seeking decision-making](https://en.wikipedia.org/wiki/Consensus-seeking_decision-making) process. In other words, all maintainers attempt to come to agreement. If that fails, we decide by a simple vote. -Active maintainers will make an effort to solicit feedback from others before making important or potentially controversial decisions. Given the varying geographical distribution and availability of the maintenance team, we resolve to do the best we can to solicit feedback. +Active maintainers will make an effort to solicit feedback from others before making important or potentially controversial decisions. Given the varying geographical distribution and availability of the maintenance team, we resolve to do the best we can to solicit feedback. -In other words, to have your opinion heard, participate regularly. The rest of the team won't wait on feedback that isn't necessarily forthcoming! +In other words, to have your opinion heard, participate regularly. The rest of the team won't wait on feedback that isn't necessarily forthcoming! ## Communication -Maintainers will mainly gather in [the mochajs/contributors channel](https://gitter.im/mochajs/contributors). This is a *public* channel, and *anyone* can join. +Maintainers will mainly gather in [the mochajs/contributors channel](https://gitter.im/mochajs/contributors). This is a _public_ channel, and _anyone_ can join. Videoconference (or audio) calls may happen on a regular or irregular basis, as schedules allow. This is mainly because we have Real Lives and time zones suck. ## Working with Issues & Pull Requests -All new issues will need to be triaged, and pull requests must be examined. Maintainers must understand [Semantic Versioning](http://semver.org) ("SemVer"), as Mocha follows it strictly. +All new issues will need to be triaged, and pull requests must be examined. Maintainers must understand [Semantic Versioning](http://semver.org) ("SemVer"), as Mocha follows it strictly. > If you see an issue or PR that could use some labels, please add them! @@ -180,24 +180,24 @@ The TL;DR of Semantic Versioning is: - MINOR version when you add functionality in a backwards-compatible manner, and - PATCH version when you make backwards-compatible bug fixes. -Pull requests *must* have one of these three (3) labels: +Pull requests _must_ have one of these three (3) labels: - `semver-patch` for backwards-compatible bug fixes, documentation, or anything which does not affect a "production" (`npm install mocha`) installation of Mocha - `semver-minor` for backwards-compatible new features or usability/interface enhancements - `semver-major` for backwards-incompatible ("breaking") changes to the API -A PR which introduces a breaking change is considered to be `semver-major`, *regardless* of whether it's a bug fix, feature, or whatever. +A PR which introduces a breaking change is considered to be `semver-major`, _regardless_ of whether it's a bug fix, feature, or whatever. For the purposes of the above definitions, Mocha has some unique considerations, and includes the following in its definition of "API": -1. Mocha's *documented*, programmatic interface which *is not explicitly tagged with `@private`* +1. Mocha's _documented_, programmatic interface which _is not explicitly tagged with `@private`_ 1. Mocha's machine-readable reporter output 1. Mocha's default settings 1. Mocha's command-line options 1. The environments which Mocha supports; this includes: - 1. Browser versions - 1. Node.js versions - 1. Compatibility with popular module loaders (e.g., AMD) + 1. Browser versions + 1. Node.js versions + 1. Compatibility with popular module loaders (e.g., AMD) **Err on the side of the user; breaking changes to private APIs will be `semver-major`, if and only if they are known to be consumed by actively developed project(s).** @@ -213,18 +213,18 @@ Examples of a breaking changes might be: ### Questions -Support questions should be answered if possible, but the user should be directed to the chat room, StackOverflow, or Google Groups for further help, *if* it is indeed a Mocha-related issue. +Support questions should be answered if possible, but the user should be directed to the chat room, StackOverflow, or Google Groups for further help, _if_ it is indeed a Mocha-related issue. -If it's *not* a Mocha problem (people tend not to believe this), you may want to show a counter-example. It's often helpful to direct the issue author to the responsible project, if you can determine what that is. +If it's _not_ a Mocha problem (people tend not to believe this), you may want to show a counter-example. It's often helpful to direct the issue author to the responsible project, if you can determine what that is. -- `faq`: Issues which are *repeatedly* asked support questions or misunderstandings. This may also apply to questions which receive a lot of 👍's +- `faq`: Issues which are _repeatedly_ asked support questions or misunderstandings. This may also apply to questions which receive a lot of 👍's - `question`: Add this label if it's just a support question ### Bugs - `confirmed-bug`: A confirmed bug - `unconfirmed-bug`: A maintainer has not yet or cannot reproduce; typically `needs-feedback` follows (see "Feedback & Follow-ups" below) -- `invalid`: Not a bug. Close the issue. +- `invalid`: Not a bug. Close the issue. - `wontfix`: A bug, but for Reasons, it won't get fixed. ### Features @@ -243,22 +243,22 @@ If it's *not* a Mocha problem (people tend not to believe this), you may want to ### Feedback & Follow-ups -Issues or PRs which require action or feedback from a *specific* maintainer, should have that item *assigned* to them. +Issues or PRs which require action or feedback from a _specific_ maintainer, should have that item _assigned_ to them. -- `needs-feedback`: Issues which *need feedback from the original author*. Will automatically become `stale` (see "Meta" section below) -- `needs-review`: For *pull requests only*; PRs which need a maintainer to inspect and/or merge them +- `needs-feedback`: Issues which _need feedback from the original author_. Will automatically become `stale` (see "Meta" section below) +- `needs-review`: For _pull requests only_; PRs which need a maintainer to inspect and/or merge them ### Meta -- `stale`: The "stalebot" marks things as stale and will close issues if they need feedback but haven't received any. Comment on an issue to prevent this from happening. -- `help wanted`: If it's an issue that is not a high priority for the maintenance team, use this label to solicit contributions. Note lack of `-` in this label's name. +- `stale`: The "stalebot" marks things as stale and will close issues if they need feedback but haven't received any. Comment on an issue to prevent this from happening. +- `help wanted`: If it's an issue that is not a high priority for the maintenance team, use this label to solicit contributions. Note lack of `-` in this label's name. - `good-first-issue`: Typically combined with `help wanted`; an issue that new contributors to Mocha may find straightforward. ### Closing Issues Write "closes #" or "resolves #" in a commit or PR to have the original issue closed automatically once the PR is merged. -For any issue which is a duplicate, write "duplicate of #" in a new comment, and close the issue. [Read more about marking issues as duplicates](https://help.github.com/articles/about-duplicate-issues-and-pull-requests/). +For any issue which is a duplicate, write "duplicate of #" in a new comment, and close the issue. [Read more about marking issues as duplicates](https://help.github.com/articles/about-duplicate-issues-and-pull-requests/). If the issue is a support question, and you believe it has been answered, close the issue. @@ -266,13 +266,13 @@ If the issue is not Mocha-related, and/or a bug cannot be confirmed, label it `i ## Commenting on Issues and Reviewing Pull Requests -**All maintainers should be courteous and kind.** Thank the external contributor for the pull request, even if it is not merged. If the pull request has been opened (and subsequently closed) without discussion in a corresponding issue, let them know that by creating an issue first, they could have saved wasted effort. *Clearly and objectively* explain the reasoning for rejecting any PR. +**All maintainers should be courteous and kind.** Thank the external contributor for the pull request, even if it is not merged. If the pull request has been opened (and subsequently closed) without discussion in a corresponding issue, let them know that by creating an issue first, they could have saved wasted effort. _Clearly and objectively_ explain the reasoning for rejecting any PR. -If you need more information in an issue, nicely ask the user to provide it. Remind them to use the issue/PR templates if they have not. If the user never gets around to it, the "stalebot" will close it eventually anyhow. +If you need more information in an issue, nicely ask the user to provide it. Remind them to use the issue/PR templates if they have not. If the user never gets around to it, the "stalebot" will close it eventually anyhow. ### Reviewing Code -Use GitHub's code review features. Requesting a review from another maintainer *may or may not* actually result in a review; don't wait on it. If the PR cannot move forward without input from a certain maintainer, *assign them to the PR*. +Use GitHub's code review features. Requesting a review from another maintainer _may or may not_ actually result in a review; don't wait on it. If the PR cannot move forward without input from a certain maintainer, _assign them to the PR_. ### The Part About Jerks @@ -280,18 +280,18 @@ There will be jerks. #### Rude or Entitled People -These are users who feel the Mocha project and its maintainers *owe them* time or support. This is incorrect. +These are users who feel the Mocha project and its maintainers _owe them_ time or support. This is incorrect. -However, this behavior is often indicative of someone who is "new" to open source. Many just don't know better. It is not your *responsibility* to educate them (again, you owe them nothing). +However, this behavior is often indicative of someone who is "new" to open source. Many just don't know better. It is not your _responsibility_ to educate them (again, you owe them nothing). Here are some suggestions: 1. If u mad, wait 20 minutes before writing a comment. -1. "Kill them with kindness". Explain how they are presenting themselves; maybe link to a good article or two about it. -1. Don't make it about "users vs. maintainers". Treat them like a potential future maintainer. -1. Avoid adding to the drama. You could try to reach out privately; email may be in their GitHub profile. You will likely never hear from that individual again (problem solved) +1. "Kill them with kindness". Explain how they are presenting themselves; maybe link to a good article or two about it. +1. Don't make it about "users vs. maintainers". Treat them like a potential future maintainer. +1. Avoid adding to the drama. You could try to reach out privately; email may be in their GitHub profile. You will likely never hear from that individual again (problem solved) 1. If an issue is getting out of control, lock it. -1. If someone is *repeatedly* rude and does not correct their mistakes, you may ban them from participating in the `mochajs` org. If you do not have permission to do so, contact one which does (an "owner"). +1. If someone is _repeatedly_ rude and does not correct their mistakes, you may ban them from participating in the `mochajs` org. If you do not have permission to do so, contact one which does (an "owner"). #### Code of Conduct Violations @@ -304,29 +304,29 @@ Here are some suggestions: ## Branches -`master` is the only maintained branch in `mochajs/mocha` or any of the other repos. **`master` is the only branch to which force-pushing is disallowed.** +`master` is the only maintained branch in `mochajs/mocha` or any of the other repos. **`master` is the only branch to which force-pushing is disallowed.** Maintainers may push new branches to a repo, as long as they remove them when finished (merging a PR will prompt to do so). -Please *please* ***please*** delete old or unused branches. +Please _please_ **_please_** delete old or unused branches. ## Merging PRs -GitHub has several options for how to merge a PR. Here's what we do: +GitHub has several options for how to merge a PR. Here's what we do: -1. *If a PR has multiple commits*, "Squash". -1. *If a PR has a single commit*, "Rebase". +1. _If a PR has multiple commits_, "Squash". +1. _If a PR has a single commit_, "Rebase". 1. Don't "Merge". **Upon acceptance of a PR, you must assign it a milestone.** ### Using Milestones -If you know that the PR is breaking, assign it to a new or existing milestone correlating with the next major release. For example, if Mocha's current version is v6.5.2, then this milestone would be named `v7.0.0`. +If you know that the PR is breaking, assign it to a new or existing milestone correlating with the next major release. For example, if Mocha's current version is v6.5.2, then this milestone would be named `v7.0.0`. -Likewise, if the PR is `semver-minor`, create or use a new milestone correlating to the next *minor* release, e.g., `v6.6.0`. +Likewise, if the PR is `semver-minor`, create or use a new milestone correlating to the next _minor_ release, e.g., `v6.6.0`. -If it's unclear what the next milestone will be, use or create a milestone named `next`. This milestone will be renamed to the new version at release time. +If it's unclear what the next milestone will be, use or create a milestone named `next`. This milestone will be renamed to the new version at release time. By using milestones, we can cherry-pick non-breaking changes into minor or patch releases, and keep `master` as the latest version. @@ -334,43 +334,43 @@ By using milestones, we can cherry-pick non-breaking changes into minor or patch ## Mocha's Release Process -*It's easier to release often.* +_It's easier to release often._ 1. Decide whether this is a `patch`, `minor`, or `major` release. 1. Checkout `master` in your working copy & pull. -1. Modify `CHANGELOG.md`; follow the existing conventions in that file. Use the "pull request" number, unless there isn't one. *You do not need to add Markdown links; this is done automatically.* - 1. You can omit stuff from `CHANGELOG.md` that was done by a maintainer, but would have no interest to consumers of Mocha. - 1. If the changes aren't of interest to consumers but *were not* made by a maintainer, reference them anyway. It's cool to give attribution! -1. Use `npm version` (use `npm@6+`) to bump the version; see `npm version --help` for more info. (Hint--use `-m`: e.g., `npm version patch -m 'Release v%s'`) - 1. This command will update the list of contributors (from the Git history) in `package.json`, and add GitHub links to `CHANGELOG.md`. - 1. These changes are then added to the Git "stage" and will be added to the commit. +1. Modify `CHANGELOG.md`; follow the existing conventions in that file. Use the "pull request" number, unless there isn't one. _You do not need to add Markdown links; this is done automatically._ + 1. You can omit stuff from `CHANGELOG.md` that was done by a maintainer, but would have no interest to consumers of Mocha. + 1. If the changes aren't of interest to consumers but _were not_ made by a maintainer, reference them anyway. It's cool to give attribution! +1. Use `npm version` (use `npm@6+`) to bump the version; see `npm version --help` for more info. (Hint--use `-m`: e.g., `npm version patch -m 'Release v%s'`) + 1. This command will update the list of authors (from the Git history) in `AUTHORS`, and add GitHub links to `CHANGELOG.md`. + 1. These changes are then added to the Git "stage" and will be added to the commit. 1. Push `master` to `origin` with your new tag; e.g. `git push origin master --tags` -1. Copy & paste the `CHANGELOG.md` lines to a new GitHub "release". Save release as draft. +1. Copy & paste the `CHANGELOG.md` lines to a new GitHub "release". Save release as draft. 1. Meanwhile, you can check [the build](https://travis-ci.org/mochajs/mocha) on Travis-CI and [AppVeyor](https://ci.appveyor.com/project/boneskull/mocha). 1. Once the build is green, and you're satisfied with the release notes, open your draft release on GitHub, then click "publish." -1. Back in your working copy, run `npm publish`. *If you're doing a prerelease, ensure that you use `--tag=next`.* -1. Announce the update on Twitter or just tell your dog or something. New releases will be automatically tweeted by [@b0neskull](https://twitter.com/b0neskull) via a feed subscription to Mocha's "releases" page on GitHub. +1. Back in your working copy, run `npm publish`. _If you're doing a prerelease, ensure that you use `--tag=next`._ +1. Announce the update on Twitter or just tell your dog or something. New releases will be automatically tweeted by [@b0neskull](https://twitter.com/b0neskull) via a feed subscription to Mocha's "releases" page on GitHub. In addition to above, you'll need to ensure the docs at [https://mochajs.org](https://mochajs.org) are updated: -1. *If you're doing a prerelease*, fast-forward the `next` branch to `master`, and push it. This updates [https://next.mochajs.org](https://next.mochajs.org). That's all. -1. *If this is NOT a prerelease*, fast-forward the `mochajs.org` branch to `master` and push it. This updates [https://mochajs.org](https://mochajs.org). -1. *If this is a "final" release* (the first release of a major *after* one or more prereleases) then remove the `next` tag from npm via `npm dist-tag rm next`. +1. _If you're doing a prerelease_, fast-forward the `next` branch to `master`, and push it. This updates [https://next.mochajs.org](https://next.mochajs.org). That's all. +1. _If this is NOT a prerelease_, fast-forward the `mochajs.org` branch to `master` and push it. This updates [https://mochajs.org](https://mochajs.org). +1. _If this is a "final" release_ (the first release of a major _after_ one or more prereleases) then remove the `next` tag from npm via `npm dist-tag rm next`. -*Note: there are too many steps above.* +_Note: there are too many steps above._ ## About The JS Foundation -The [JS Foundation](https://js.foundation) retains copyright of all projects underneath the [mochajs org](https://github.com/mochajs). The Foundation does not influence technical decisions nor the project roadmap. It is, however, charged with ensuring the continued vitality and sustainability of projects under its banner. +The [JS Foundation](https://js.foundation) retains copyright of all projects underneath the [mochajs org](https://github.com/mochajs). The Foundation does not influence technical decisions nor the project roadmap. It is, however, charged with ensuring the continued vitality and sustainability of projects under its banner. As a maintainer, you have access to the resources the JS Foundation provides. ## About OpenCollective -Mocha collects donations [via OpenCollective](https://opencollective.com/mochajs). As a maintainer, you may help decide how the funds are used. These decisions are made via a consensus-seeking process, much like any other decision. +Mocha collects donations [via OpenCollective](https://opencollective.com/mochajs). As a maintainer, you may help decide how the funds are used. These decisions are made via a consensus-seeking process, much like any other decision. Expense transparency is built in to OpenCollective. -* * * +--- -Questions? Ask in the [contributors' chat room](https://gitter.im/mochajs/contributors)! +Questions? Ask in the [contributors' chat room](https://gitter.im/mochajs/contributors)! diff --git a/package-lock.json b/package-lock.json index 0c7d9888c5..01eed437ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,51 +279,6 @@ } } }, - "@mocha/contributors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@mocha/contributors/-/contributors-1.0.4.tgz", - "integrity": "sha512-bdOaBixwP7948K7xlqSXnelbsLDAnCX1h4qSRYfbRADMg+UtNJE+ggpzTdBVpdLNxJLkgnRM5KJ9MXiLoMib3Q==", - "dev": true, - "requires": { - "log-symbols": "^2.2.0", - "parse-author": "^2.0.0", - "pkg-up": "^2.0.0", - "write-pkg": "^3.2.0", - "yargs": "^12.0.5" - }, - "dependencies": { - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "@mocha/docdash": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.2.tgz", @@ -1292,12 +1247,6 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "dev": true - }, "autolinker": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", @@ -3149,28 +3098,6 @@ "tiny-emitter": "^2.0.0" } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -4355,12 +4282,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -8485,12 +8406,6 @@ } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -9680,15 +9595,6 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", @@ -10514,15 +10420,6 @@ "integrity": "sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -10917,17 +10814,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, "memoizeasync": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/memoizeasync/-/memoizeasync-1.1.0.tgz", @@ -12402,17 +12288,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", @@ -12450,12 +12325,6 @@ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", @@ -12471,12 +12340,6 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", - "dev": true - }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -12607,15 +12470,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dev": true, - "requires": { - "author-regex": "^1.0.0" - } - }, "parse-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.1.tgz", @@ -13002,60 +12856,6 @@ } } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, "please-upgrade-node": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", @@ -18172,38 +17972,6 @@ "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", "dev": true }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "dev": true, - "requires": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" - } - }, "ws": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", diff --git a/package-scripts.js b/package-scripts.js index 0e414e1542..3f9b2d0bd4 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -307,9 +307,9 @@ module.exports = { description: 'Build API docs' } }, - updateContributors: { - script: 'contributors', - description: 'Update list of contributors in package.json' + updateAuthors: { + script: 'node scripts/update-authors.js', + description: 'Update list of AUTHORS' }, linkifyChangelog: { script: 'node scripts/linkify-changelog.js', @@ -317,7 +317,7 @@ module.exports = { }, version: { script: - 'nps updateContributors && nps linkifyChangelog && git add -A ./package.json ./CHANGELOG.md', + 'nps updateAuthors && nps linkifyChangelog && git add -A ./AUTHORS ./CHANGELOG.md', description: 'Tasks to perform when `npm version` is run' } } diff --git a/package.json b/package.json index 7dbe7a453d..045314b857 100644 --- a/package.json +++ b/package.json @@ -14,501 +14,6 @@ "url": "https://opencollective.com/mochajs" }, "author": "TJ Holowaychuk ", - "contributors": [ - "38elements ", - "Aaron Brady ", - "Aaron Hamid ", - "Aaron Heckmann ", - "Aaron Krause ", - "Aaron Petcoff ", - "abrkn ", - "Adam Crabtree ", - "Adam Ginzberg ", - "Adam Gruber ", - "Adrian Ludwig ", - "Ahmad Bamieh ", - "airportyh ", - "Ajay Kodali ", - "Al Scott ", - "Alex Bainter ", - "Alexander Early ", - "Alexander Shepelin ", - "Alhadis ", - "amsul ", - "Anders Olsen Sandvik ", - "Andreas Brekken ", - "Andreas Lind ", - "Andreas Lind Petersen ", - "Andrew Bradley ", - "Andrew Bradley ", - "Andrew Krawchyk <903716+akrawchyk@users.noreply.github.com>", - "Andrew Nesbitt ", - "Andrey Popp <8mayday@gmail.com>", - "Andrii Shumada ", - "andy matthews ", - "Angelica Valenta ", - "Anis Safine ", - "Anish Karandikar ", - "Anna Henningsen ", - "Anthony ", - "Anton ", - "anton ", - "APerson ", - "Arian Stolwijk ", - "Ariel Mashraki ", - "Arnaud Brousseau ", - "Artem Govorov ", - "Atsuya Takagi ", - "Attila Domokos ", - "Austin Birch ", - "Avi Vahl ", - "badunk ", - "Bamieh ", - "Ben Bradley ", - "Ben Glassman ", - "Ben Harris ", - "Ben Hutchison ", - "Ben Lindsey ", - "Ben Noordhuis ", - "Ben Vinegar ", - "Benjamin Eidelman ", - "Benjie Gillam ", - "Benoit Larroque ", - "Benoît Zugmeyer ", - "Benson Trent ", - "Berker Peksag ", - "berni ", - "Bjørge Næss ", - "Bjorn Stromberg ", - "Brendan Nee ", - "Brian Beck ", - "Brian Lagerman <49239617+brian-lagerman@users.noreply.github.com>", - "Brian Lalor ", - "Brian M. Carlson ", - "Brian Moore ", - "Brian Tomlin ", - "Brittany Moore ", - "Bryan Donovan ", - "Buck Doyle ", - "C. Scott Ananian ", - "Callum Macrae ", - "Can Oztokmak ", - "Capacitor Set ", - "Carl-Erik Kopseng ", - "Casey Foster ", - "Charles Lowell ", - "Charles Merriam ", - "Charles Samborski ", - "Charlie Rudolph ", - "Chen Yangjian <252317+cyjake@users.noreply.github.com>", - "Chris ", - "Chris Buckley ", - "Chris Lamb ", - "Christian ", - "Christian Holm ", - "Christoffer Hallas ", - "Christoph Neuroth ", - "Christopher Hiller ", - "ChrisWren ", - "claudyus ", - "Connor Dunn ", - "Corey Butler ", - "Corey Farrell ", - "Cory Thomas ", - "Craig Taub ", - "Cube ", - "Daniel Ruf <827205+DanielRuf@users.noreply.github.com>", - "Daniel Ruf ", - "Daniel St. Jules ", - "Daniel Stockman ", - "Darryl Pogue ", - "Dave McKenna ", - "David da Silva Contín ", - "David Henderson ", - "David M. Lee ", - "David Neubauer ", - "DavidLi119 ", - "DavNej ", - "Denis Bardadym ", - "Devin Weaver ", - "dfberry ", - "Di Wu ", - "Dina Berry ", - "Diogo Monteiro ", - "Dmitrii Sorin ", - "Dmitriy Simushev ", - "Dmitry Shirokov ", - "Dmitry Sorin ", - "Domenic Denicola ", - "Dominic Barnes ", - "Dominique Quatravaux ", - "Douglas Christopher Wilson ", - "Duncan Beevers ", - "eiji.ienaga ", - "elergy ", - "Eli Skeggs ", - "ELLIOTTCABLE ", - "Emanuele ", - "Enric Pallerols ", - "Erik Eng ", - "Eugene Tiutiunnyk ", - "EunChan Park ", - "Fabio M. Costa ", - "Fábio Santos ", - "Fagner Brack ", - "fargies ", - "FARKAS Máté ", - "fcrisci ", - "Fede Ramirez ", - "Fedor Indutny ", - "fengmk2 ", - "Fin Chen ", - "Florian Margaine ", - "FND ", - "fool2fish ", - "Forbes Lindesay ", - "Frank Leon Rose ", - "Frederico Silva ", - "Fredrik Enestad ", - "Fredrik Lindin ", - "Fumiaki MATSUSHIMA ", - "Gabe Gorelick ", - "Gabriel Silk ", - "Gareth Aye ", - "Gareth Murphy ", - "Gastón I. Silva ", - "Gavin Mogan ", - "gaye ", - "gigadude ", - "Giovanni Bassi ", - "gizemkeser <44727928+gizemkeser@users.noreply.github.com>", - "Glen Huang ", - "Glen Mailer ", - "grasGendarme ", - "Greg Perkins ", - "Guangcong Luo ", - "Guillermo Rauch ", - "Guy Arye ", - "Gyandeep Singh ", - "Harish ", - "Harry Brundage ", - "Harry Sarson ", - "Harry Wolff ", - "Herman Junge ", - "hokaccha ", - "Honza Javorek ", - "Hugo Giraudel ", - "Hugo Kim ", - "HYUNSANG HAN ", - "HyunSangHan ", - "Ian Storm Taylor ", - "Ian W. Remmel ", - "Ian Young ", - "Ian Zamojc ", - "Igwe Kalu ", - "ImgBot <31427850+ImgBotApp@users.noreply.github.com>", - "inxorable ", - "Ivan ", - "Jaakko Salonen ", - "Jacob Wejendorp ", - "Jake Craige ", - "Jake Marsh ", - "Jakob Krigovsky ", - "Jakub Nešetřil ", - "James Bowes ", - "James Carr ", - "James D. Rogers ", - "James G. Kim ", - "James Lal ", - "James Nylen ", - "Jan Kopriva ", - "Jan Krems ", - "Jan Lehnardt ", - "Jan-Philip Gehrcke ", - "Jason Barry ", - "Jason Lai ", - "Jason Leyba ", - "Javier Aranda ", - "Jayasankar ", - "Jean Ponchon ", - "Jeff Kunkle ", - "Jeff Schilling ", - "JeongHoon Byun (aka Outsider) ", - "Jérémie Astori ", - "Jeremy Martin ", - "Jerry Muzsik ", - "Jesse Dailey ", - "jimenglish81 ", - "Jimmy Cuadra ", - "Jo Liss ", - "Joao Moreno ", - "Joel Kemp ", - "Joey Cozza ", - "John Doty ", - "John Firebaugh ", - "John Reeves ", - "Johnathon Sanders ", - "Jon Surrell ", - "Jonas Dohse ", - "Jonas Westerlund ", - "Jonathan Creamer ", - "Jonathan Delgado ", - "Jonathan Kim ", - "Jonathan Ong ", - "Jonathan Park ", - "Jonathan Rajavuori ", - "Jordan Sexton ", - "Joseph Lin ", - "Josh Eversmann ", - "Josh Lory ", - "Josh Soref ", - "Joshua Appelman ", - "Joshua Krall ", - "JP Bochi ", - "jsdevel ", - "Juerg B <44573692+juergba@users.noreply.github.com>", - "juergba ", - "Julien Wajsberg ", - "Jupp Müller ", - "Jussi Virtanen ", - "Justin DuJardin ", - "Juzer Ali ", - "Katie Gengler ", - "kavun ", - "Kazuhito Hokamura ", - "Keith Cirkel ", - "Kelong Wang ", - "Kent C. Dodds ", - "Kevin Burke ", - "Kevin Conway ", - "Kevin Kirsche ", - "Kevin Partington ", - "Kevin Wang ", - "Kirill Korolyov ", - "klaemo ", - "Koen Punt ", - "Konstantin Käfer ", - "Kris Rasmussen ", - "Kunal Nagpal ", - "Kyle Fuller ", - "Kyle Mitchell ", - "KyoungWan ", - "lakmeer ", - "Lane Kelly ", - "László Bácsi ", - "Laurence Rowe ", - "Liam Newman ", - "Lindsay-Needs-Sleep <51773923+Lindsay-Needs-Sleep@users.noreply.github.com>", - "Linus Unnebäck ", - "lodr ", - "Long Ho ", - "Maciej Małecki ", - "Mal Graty ", - "Marais Rossouw ", - "Marc Kuo ", - "Marc Udoff ", - "Marcello Bastea-Forte ", - "Mario Díaz Ceñera <46492068+MarioDiaz98@users.noreply.github.com>", - "Mark Banner ", - "Mark Owsiak ", - "Markus Tacker ", - "Martijn Cuppens ", - "Martin Marko ", - "Mathieu Desvé ", - "Matija Marohnić ", - "Matt Bierner ", - "Matt Giles ", - "Matt Robenolt ", - "Matt Smith ", - "Matthew Shanley ", - "Mattias Tidlund ", - "Max Goodman ", - "Maximilian Antoni ", - "Merrick Christensen ", - "Mia ", - "Michael Demmer ", - "Michael Jackson ", - "Michael Olson ", - "Michael Riley ", - "Michael Schoonmaker ", - "Michal Charemza ", - "Michiel de Jong ", - "Mick Brooks ", - "Mike Pennisi ", - "Mislav Marohnić ", - "monowerker ", - "Moshe Kolodny ", - "mrShturman ", - "Nathan Alderson ", - "Nathan Black ", - "Nathan Bowser ", - "Nathan Houle ", - "Nathan Rajlich ", - "nexdrew ", - "Nick Fitzgerald ", - "Nicolas Girault ", - "Nicolo Taddei ", - "Nik Nyby ", - "Nikolaos Georgiou ", - "nishigori ", - "Noshir Patel ", - "not-an-aardvark ", - "OlegTsyba ", - "Oliver Salzburg ", - "olsonpm ", - "omardelarosa ", - "Oscar Godson ", - "Outsider ", - "oveddan ", - "P. Roebuck ", - "Panu Horsmalahti ", - "Park Seong-beom ", - "Parker Moore ", - "Pascal ", - "Pat Finnigan ", - "Paul Armstrong ", - "Paul Miller ", - "Paul Roebuck ", - "Pavel Zubkou ", - "Pete Hawkins ", - "Peter Müller ", - "Peter Rust ", - "Peter Schmidt ", - "Phil Sung ", - "Philip M. White ", - "Piotr Kuczynski ", - "PoppinL ", - "Poprádi Árpád ", - "Prayag Verma ", - "qiuzuhui ", - "Quang Van ", - "Quanlong He ", - "R56 ", - "Raynos ", - "Refael Ackermann ", - "Rens Groothuijsen ", - "Rich Trott ", - "Richard Dingwall ", - "Richard Knop ", - "Rico Sta. Cruz ", - "rmacklin ", - "Rob Loach ", - "Rob Raux ", - "Rob Wu ", - "Robert Kieffer ", - "Robert Rossmann ", - "Romain Prieto ", - "Roman Neuhauser ", - "Roman Shtylman ", - "Ross Warren ", - "rotemdan ", - "Russ Bradberry ", - "Russell Munson ", - "Rustem Mustafin ", - "Ryan Hubbard ", - "Ryan Shaw ", - "Ryan Tablada ", - "Ryunosuke SATO ", - "ryym ", - "Saerom Bang ", - "Salehen Shovon Rahman ", - "Sam Mussell ", - "samuel goldszmidt ", - "sarehag ", - "Sasha Koss ", - "Scott Kao ", - "Scott Santucci ", - "ScottFreeCode ", - "Sean Lang ", - "Sebastian Van Sande ", - "sebv ", - "Seiya Konno ", - "Sergey Simonchik ", - "Sergio Santoro ", - "Shaine Hatch ", - "Shawn Krisman ", - "SheetJSDev ", - "Shinnosuke Watanabe ", - "silentcloud ", - "Silvio Massari ", - "Simon Gaeremynck ", - "Simon Goumaz ", - "simov ", - "Sindre Sorhus ", - "Slobodan Mišković ", - "slyg ", - "Soel ", - "solodynamo ", - "Sona Lee ", - "Soobin Bak ", - "Sorin Iclanzan ", - "Standa Opichal ", - "startswithaj ", - "Stephen Hess ", - "Stephen Mathieson ", - "Steve Mason ", - "Stewart Taylor ", - "Stone ", - "Sulabh Bista ", - "Sune Simonsen ", - "Svetlana <39729453+Lana-Light@users.noreply.github.com>", - "Sylvain ", - "Sylvester Keil ", - "Szauka <33459309+Szauka@users.noreply.github.com>", - "Tapiwa Kelvin ", - "Ted Yavuzkurt ", - "Teddy Zeenny ", - "tgautier@yahoo.com ", - "Thedark1337 ", - "Thomas Broadley ", - "Thomas Grainger ", - "Thomas Scholtes ", - "Thomas Vantuycom ", - "Tim Ehat ", - "Tim Harshman ", - "Timo Tijhof ", - "Timothy Gu ", - "Tingan Ho ", - "tmont ", - "Tobias Bieniek ", - "Tobias Mollstam ", - "Todd Agulnick ", - "Tom Coquereau ", - "Tom Hughes ", - "Tomer Eskenazi ", - "toyjhlee ", - "traleig1 ", - "Travis Jeffery ", - "tripu ", - "Tyson Tate ", - "Vadim Nikitin ", - "Valentin Agachi ", - "Valeri Karpov ", - "Victor ", - "Victor Costan ", - "Ville Saukkonen ", - "Vivek Ganesan ", - "vlad ", - "Vlad Magdalin ", - "Volker Buzek ", - "Wanseob Lim ", - "Wil Moore III ", - "Will Langstroth ", - "wsw ", - "Xavier Antoviaque ", - "Xavier Damman ", - "XhmikosR ", - "XhmikosR ", - "Yanis Wang ", - "yehiyam ", - "Yoshiya Hinosawa ", - "Yuest Wang ", - "yuitest ", - "zhiyelee ", - "Zirak ", - "Zsolt Takács ", - "现充 " - ], "license": "MIT", "repository": { "type": "git", @@ -565,7 +70,6 @@ }, "devDependencies": { "@11ty/eleventy": "^0.8.3", - "@mocha/contributors": "^1.0.4", "@mocha/docdash": "^2.1.2", "acorn": "^7.0.0", "assetgraph-builder": "^6.10.1", @@ -655,13 +159,6 @@ "endOfLine": "auto" }, "gitter": "https://gitter.im/mochajs/mocha", - "@mocha/contributors": { - "exclude": [ - "greenkeeperio-bot ", - "greenkeeper[bot] ", - "TJ Holowaychuk " - ] - }, "husky": { "hooks": { "pre-commit": "lint-staged" diff --git a/scripts/update-authors.js b/scripts/update-authors.js new file mode 100755 index 0000000000..4ec0e03137 --- /dev/null +++ b/scripts/update-authors.js @@ -0,0 +1,62 @@ +#!/usr/bin/env node +// original comes from https://github.com/nodejs/node/blob/master/tools/update-authors.js + +// Usage: tools/update-author.js [--dry] +// Passing --dry will redirect output to stdout rather than write to 'AUTHORS'. +'use strict'; +const {spawn} = require('child_process'); +const fs = require('fs'); +const readline = require('readline'); + +const log = spawn( + 'git', + // Inspect author name/email and body. + ['log', '--reverse', '--format=Author: %aN <%aE>\n%b'], + { + stdio: ['inherit', 'pipe', 'inherit'] + } +); +const rl = readline.createInterface({input: log.stdout}); + +let output; +if (process.argv.includes('--dry')) { + output = process.stdout; +} else { + output = fs.createWriteStream('AUTHORS'); +} + +output.write('# Authors ordered by first contribution.\n\n'); + +const seen = new Set(); + +const excludeEmails = [ + '', + '' +]; + +// Support regular git author metadata, as well as `Author:` and +// `Co-authored-by:` in the message body. Both have been used in the past +// to indicate multiple authors per commit, with the latter standardized +// by GitHub now. +const authorRe = new RegExp( + '(^Author:|^Co-authored-by:)\\s+(?[^<]+)\\s+(?<[^>]+>)', + 'i' +); + +rl.on('line', line => { + const match = line.match(authorRe); + if (!match) return; + + let {author, email} = match.groups; + + if (seen.has(email) || excludeEmails.includes(email)) { + return; + } + + seen.add(email); + output.write(`${author} ${email}\n`); +}); + +rl.on('close', () => { + output.end('\n# Generated by scripts/update-authors.js\n'); +}); From 2a1b6372ed176832ae0818e8758c172b7131e081 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Sat, 1 Feb 2020 02:58:52 -0500 Subject: [PATCH 1438/1771] Upgrade: ESLint v6.8 (#4138) --- .eslintrc.yml | 13 +- browser-entry.js | 2 +- package-lock.json | 644 ++++++++++++++++++++++++++++-------- package.json | 18 +- scripts/netlify-headers.js | 2 +- test/reporters/base.spec.js | 20 +- test/reporters/helpers.js | 16 +- test/reporters/nyan.spec.js | 80 ++--- test/unit/runner.spec.js | 12 +- 9 files changed, 576 insertions(+), 231 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index b47ddca1a3..300a48ef67 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -3,13 +3,12 @@ extends: - semistandard - plugin:prettier/recommended env: - node: yes - browser: yes + node: true + browser: true parserOptions: ecmaVersion: 5 ecmaFeatures: - globalReturn: no - jsx: no + jsx: false sourceType: script rules: strict: @@ -31,14 +30,14 @@ overrides: parserOptions: ecmaVersion: 2017 env: - browser: no + browser: false - files: - test/**/*.{js,mjs} env: - mocha: yes + mocha: true globals: - expect: no + expect: readonly - files: - bin/* - lib/**/*.js diff --git a/browser-entry.js b/browser-entry.js index fd89117755..3f770fac49 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -129,7 +129,7 @@ mocha.setup = function(opts) { opts = {ui: opts}; } for (var opt in opts) { - if (opts.hasOwnProperty(opt)) { + if (Object.prototype.hasOwnProperty.call(opts, opt)) { this[opt](opts[opt]); } } diff --git a/package-lock.json b/package-lock.json index 01eed437ec..05f0471347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -801,13 +801,79 @@ "dev": true }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "array-map": { @@ -855,6 +921,81 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -5013,47 +5154,48 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "debug": { @@ -5065,37 +5207,102 @@ "ms": "^2.1.1" } }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, "eslint-config-prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", - "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", + "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -5110,15 +5317,15 @@ } }, "eslint-config-semistandard": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-13.0.0.tgz", - "integrity": "sha512-ZuImKnf/9LeZjr6dtRJ0zEdQbjBwXu0PJR3wXJXoQeMooICMrYPyD70O1tIA9Ng+wutgLjB7UXvZOKYPvzHg+w==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", + "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", "dev": true }, "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", "dev": true }, "eslint-import-resolver-node": { @@ -5134,7 +5341,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5149,19 +5356,19 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", + "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", "dev": true, "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5176,38 +5383,47 @@ } }, "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", "dev": true, "requires": { - "eslint-utils": "^1.3.0", - "regexpp": "^2.0.1" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true + } } }, "eslint-plugin-import": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz", - "integrity": "sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==", + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", + "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", "dev": true, "requires": { "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "resolve": "^1.12.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5315,9 +5531,9 @@ } }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", + "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -5332,52 +5548,67 @@ } }, "eslint-plugin-node": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", - "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", + "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", "dev": true, "requires": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^5.0.2", + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "dependencies": { "ignore": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", - "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "resolve": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", + "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", - "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", "dev": true }, "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "dev": true }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -5385,35 +5616,47 @@ } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true } } @@ -5727,9 +5970,9 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -8318,43 +8561,132 @@ } }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", + "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -8817,6 +9149,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -11151,9 +11489,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "nan": { @@ -16046,6 +16384,26 @@ "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=", "dev": true }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -16311,17 +16669,29 @@ } }, "table": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", - "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -17602,6 +17972,12 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -17888,6 +18264,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 045314b857..fcebd7f32e 100644 --- a/package.json +++ b/package.json @@ -81,15 +81,15 @@ "coveralls": "^3.0.3", "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", - "eslint": "^5.16.0", - "eslint-config-prettier": "^3.6.0", - "eslint-config-semistandard": "^13.0.0", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.17.3", - "eslint-plugin-node": "^8.0.1", - "eslint-plugin-prettier": "^3.1.0", - "eslint-plugin-promise": "^4.1.1", - "eslint-plugin-standard": "^4.0.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.9.0", + "eslint-config-semistandard": "^15.0.0", + "eslint-config-standard": "^14.1.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-node": "^11.0.0", + "eslint-plugin-prettier": "^3.1.2", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", "fs-extra": "^8.0.1", "husky": "^1.3.1", "hyperlink": "^4.3.1", diff --git a/scripts/netlify-headers.js b/scripts/netlify-headers.js index d74842bfce..4faae6f13d 100644 --- a/scripts/netlify-headers.js +++ b/scripts/netlify-headers.js @@ -92,7 +92,7 @@ new AssetGraph({root: 'docs/_dist'}) ); preconnectRelations.forEach(rel => { - let header = `Link: <${rel.href}>; rel=preconnect`; + const header = `Link: <${rel.href}>; rel=preconnect`; headerMap[url].push(header); diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 18867ae6fa..744b92e69b 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -17,13 +17,9 @@ describe('Base reporter', function() { function list(tests) { try { - try { - Base.list(tests); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + Base.list(tests); + } finally { + sandbox.restore(); } } @@ -31,13 +27,9 @@ describe('Base reporter', function() { var diffStr; try { - try { - diffStr = Base.generateDiff(actual, expected); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + diffStr = Base.generateDiff(actual, expected); + } finally { + sandbox.restore(); } return diffStr; diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 76b3d79307..45c4d916de 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -215,16 +215,12 @@ function createRunReporterFunction(ctor) { Object.setPrototypeOf(stubSelf, ctor.prototype); try { - try { - // Invoke reporter - ctor.call(stubSelf, runner, options); - } finally { - // Revert stream reassignment here so reporter output - // can't be corrupted if any test assertions throw - stdoutWriteStub.restore(); - } - } catch (err) { - throw err; // Rethrow + // Invoke reporter + ctor.call(stubSelf, runner, options); + } finally { + // Revert stream reassignment here so reporter output + // can't be corrupted if any test assertions throw + stdoutWriteStub.restore(); } return stdout; diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index 05d2e1bf77..ce65e97d85 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -192,13 +192,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.draw.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); } var expectedArray = [ @@ -239,13 +235,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.draw.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.draw.call(fakeThis); + } finally { + sandbox.restore(); } var expectedArray = [ @@ -286,13 +278,9 @@ describe('Nyan reporter', function() { var expectedNumber = 25; try { - try { - nyanCat.cursorDown(expectedNumber); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.cursorDown(expectedNumber); + } finally { + sandbox.restore(); } var expectedArray = ['\u001b[' + expectedNumber + 'B']; @@ -319,13 +307,9 @@ describe('Nyan reporter', function() { var expectedNumber = 25; try { - try { - nyanCat.cursorUp(expectedNumber); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.cursorUp(expectedNumber); + } finally { + sandbox.restore(); } var expectedArray = ['\u001b[' + expectedNumber + 'A']; @@ -495,13 +479,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.drawScoreboard.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); } var expectedArray = [ @@ -532,13 +512,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.drawScoreboard.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.drawScoreboard.call(fakeThis); + } finally { + sandbox.restore(); } expect(fakeThis.cursorUp.calledWith(expectedNumberOfLines), 'to be true'); @@ -573,13 +549,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.drawRainbow.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); } var expectedArray = [ @@ -607,13 +579,9 @@ describe('Nyan reporter', function() { }; try { - try { - nyanCat.drawRainbow.call(fakeThis); - } finally { - sandbox.restore(); - } - } catch (err) { - throw err; // Rethrow + nyanCat.drawRainbow.call(fakeThis); + } finally { + sandbox.restore(); } expect(expectedCursorArgument, 'to be', expectedNumberOfLines); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index b36cbb04bf..92b41c5fc4 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -149,7 +149,11 @@ describe('Runner', function() { return; } // verify that the prop isn't enumerable - expect(global.propertyIsEnumerable('XMLHttpRequest'), 'to be', false); + expect( + Object.prototype.propertyIsEnumerable.call(global, 'XMLHttpRequest'), + 'to be', + false + ); // create a new runner and keep a reference to the test. var test = new Test('im a test about bears', noop); @@ -158,7 +162,11 @@ describe('Runner', function() { // make the prop enumerable again. global.XMLHttpRequest = noop; - expect(global.propertyIsEnumerable('XMLHttpRequest'), 'to be', true); + expect( + Object.prototype.propertyIsEnumerable.call(global, 'XMLHttpRequest'), + 'to be', + true + ); // verify the test hasn't failed. newRunner.checkGlobals(test); From 883ae4b5e1aacd8cf30694da33b391ce58f4cca8 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 1 Feb 2020 09:19:43 +0100 Subject: [PATCH 1439/1771] ESLint: use 'const' instead of 'let' --- scripts/update-authors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update-authors.js b/scripts/update-authors.js index 4ec0e03137..6e5d214f30 100755 --- a/scripts/update-authors.js +++ b/scripts/update-authors.js @@ -47,7 +47,7 @@ rl.on('line', line => { const match = line.match(authorRe); if (!match) return; - let {author, email} = match.groups; + const {author, email} = match.groups; if (seen.has(email) || excludeEmails.includes(email)) { return; From b431609f01c8d6e7399ab592d6df1a319f81eea7 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 10 Feb 2020 10:59:25 +0100 Subject: [PATCH 1440/1771] docs: update browser options --- docs/index.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/index.md b/docs/index.md index 756faf0ecf..ef3f462f1f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -674,7 +674,7 @@ Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and h You can choose to retry failed tests up to a certain number of times. This feature is designed to handle end-to-end tests (functional tests/Selenium...) where resources cannot be easily mocked/stubbed. **It's not recommended to use this feature for unit tests**. -This feature does re-run `beforeEach/afterEach` hooks but not `before/after` hooks. +This feature does re-run a failed test and its corresponding `beforeEach/afterEach` hooks, but not `before/after` hooks. `this.retries()` has no effect on failing hooks. **NOTE**: Example below was written using Selenium webdriver (which [overwrites global Mocha hooks][selenium-webdriver-testing] for `Promise` chain). @@ -739,7 +739,7 @@ $ mocha

              Test duration

              -Many reporters will display test duration and flag tests that are slow (default: 75ms), as shown here with the "spec" reporter: +Many reporters will display test duration and flag tests that are slow (default: 75ms), as shown here with the SPEC reporter: ![test duration](images/reporter-spec-duration.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} @@ -813,7 +813,7 @@ Again, use `this.timeout(0)` to disable the timeout for a hook. ## Diffs -Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff: +Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff using `--inline-diffs`: ![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} @@ -1068,7 +1068,7 @@ By default, Mocha will search for a config file if `--config` is not specified; ### `--opts ` -> _Deprecated._ +> _Deprecated in v7.0.0._ Specify a path to [`mocha.opts`](#mochaopts). @@ -1598,11 +1598,18 @@ mocha.setup({ ui: 'tdd' }); -// Use "tdd" interface, check global leaks, and force all tests to be asynchronous +// Examples of options: mocha.setup({ - ui: 'tdd', + asyncOnly: true, + bail: true, checkLeaks: true, - asyncOnly: true + forbidOnly: true, + forbidPending: true, + global: ['MyLib'], + retries: 3, + slow: '100', + timeout: '2000', + ui: 'bdd' }); ``` @@ -1623,7 +1630,7 @@ If set to `true`, do not attempt to use syntax highlighting on output test code. ### Reporting -The "html" reporter is the default reporter when running Mocha in the browser. It looks like this: +The HTML reporter is the default reporter when running Mocha in the browser. It looks like this: ![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} From 2ff1cb23689d193c7ed1498b0d44588558b5585d Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 11 Feb 2020 15:37:46 +0100 Subject: [PATCH 1441/1771] uncaughtException: refactor, move and add tests --- .../fixtures/uncaught/after-runner.fixture.js | 9 ++ .../double.fixture.js} | 0 .../fatal.fixture.js} | 0 .../hook.fixture.js} | 0 .../issue-1327.fixture.js | 0 .../issue-1417.fixture.js | 0 .../pending.fixture.js} | 0 test/integration/regression.spec.js | 33 ----- test/integration/uncaught.spec.js | 121 ++++++++++++------ 9 files changed, 94 insertions(+), 69 deletions(-) create mode 100644 test/integration/fixtures/uncaught/after-runner.fixture.js rename test/integration/fixtures/{uncaught.fixture.js => uncaught/double.fixture.js} (100%) rename test/integration/fixtures/{uncaught-fatal.fixture.js => uncaught/fatal.fixture.js} (100%) rename test/integration/fixtures/{uncaught-hook.fixture.js => uncaught/hook.fixture.js} (100%) rename test/integration/fixtures/{regression => uncaught}/issue-1327.fixture.js (100%) rename test/integration/fixtures/{regression => uncaught}/issue-1417.fixture.js (100%) rename test/integration/fixtures/{uncaught-pending.fixture.js => uncaught/pending.fixture.js} (100%) diff --git a/test/integration/fixtures/uncaught/after-runner.fixture.js b/test/integration/fixtures/uncaught/after-runner.fixture.js new file mode 100644 index 0000000000..dbb6403b82 --- /dev/null +++ b/test/integration/fixtures/uncaught/after-runner.fixture.js @@ -0,0 +1,9 @@ +'use strict'; + +describe("Uncaught exception after runner's end", () => { + it('test', () => { + setTimeout(() => { + throw new Error('Unexpected crash'); + }, 100); + }); +}); diff --git a/test/integration/fixtures/uncaught.fixture.js b/test/integration/fixtures/uncaught/double.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught.fixture.js rename to test/integration/fixtures/uncaught/double.fixture.js diff --git a/test/integration/fixtures/uncaught-fatal.fixture.js b/test/integration/fixtures/uncaught/fatal.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught-fatal.fixture.js rename to test/integration/fixtures/uncaught/fatal.fixture.js diff --git a/test/integration/fixtures/uncaught-hook.fixture.js b/test/integration/fixtures/uncaught/hook.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught-hook.fixture.js rename to test/integration/fixtures/uncaught/hook.fixture.js diff --git a/test/integration/fixtures/regression/issue-1327.fixture.js b/test/integration/fixtures/uncaught/issue-1327.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-1327.fixture.js rename to test/integration/fixtures/uncaught/issue-1327.fixture.js diff --git a/test/integration/fixtures/regression/issue-1417.fixture.js b/test/integration/fixtures/uncaught/issue-1417.fixture.js similarity index 100% rename from test/integration/fixtures/regression/issue-1417.fixture.js rename to test/integration/fixtures/uncaught/issue-1417.fixture.js diff --git a/test/integration/fixtures/uncaught-pending.fixture.js b/test/integration/fixtures/uncaught/pending.fixture.js similarity index 100% rename from test/integration/fixtures/uncaught-pending.fixture.js rename to test/integration/fixtures/uncaught/pending.fixture.js diff --git a/test/integration/regression.spec.js b/test/integration/regression.spec.js index 0682cdc353..0cf644e6b3 100644 --- a/test/integration/regression.spec.js +++ b/test/integration/regression.spec.js @@ -4,21 +4,6 @@ var run = require('./helpers').runMocha; var runJSON = require('./helpers').runMochaJSON; describe('regressions', function() { - it('issue-1327: should run the first test and then bail', function(done) { - var args = []; - runJSON('regression/issue-1327.fixture.js', args, function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to have failed') - .and('to have passed test count', 1) - .and('to have failed test count', 1) - .and('to have passed test', 'test 1') - .and('to have failed test', 'test 1'); - done(); - }); - }); - it('issue-1991: Declarations do not get cleaned up unless you set them to `null` - Memory Leak', function(done) { // on a modern MBP takes ±5 seconds on node 4.0, but on older laptops with node 0.12 ±40 seconds. // Could easily take longer on even weaker machines (Travis-CI containers for example). @@ -90,22 +75,4 @@ describe('regressions', function() { done(); }); }); - - it('issue-1417 uncaught exceptions from async specs', function(done) { - runJSON('regression/issue-1417.fixture.js', [], function(err, res) { - if (err) { - done(err); - return; - } - expect(res, 'to have failed with errors', 'sync error a', 'sync error b') - .and('to have exit code', 2) - .and('not to have passed tests') - .and('not to have pending tests') - .and('to have failed test order', [ - 'fails exactly once when a global error is thrown synchronously and done errors', - 'fails exactly once when a global error is thrown synchronously and done completes' - ]); - done(); - }); - }); }); diff --git a/test/integration/uncaught.spec.js b/test/integration/uncaught.spec.js index 5b193280bc..c517bb0577 100644 --- a/test/integration/uncaught.spec.js +++ b/test/integration/uncaught.spec.js @@ -1,60 +1,56 @@ 'use strict'; -var assert = require('assert'); -var run = require('./helpers').runMochaJSON; +var helpers = require('./helpers'); +var run = helpers.runMochaJSON; +var runMocha = helpers.runMocha; +var invokeNode = helpers.invokeNode; var args = []; describe('uncaught exceptions', function() { it('handles uncaught exceptions from hooks', function(done) { - run('uncaught-hook.fixture.js', args, function(err, res) { + run('uncaught/hook.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 0); - assert.strictEqual(res.stats.failures, 1); - - assert.strictEqual( - res.failures[0].fullTitle, - 'uncaught "before each" hook for "test"' - ); - assert.strictEqual(res.code, 1); + + expect(res, 'to have failed with error', 'oh noes') + .and('to have passed test count', 0) + .and('to have pending test count', 0) + .and('to have failed test count', 1) + .and('to have failed test', '"before each" hook for "test"'); + done(); }); }); it('handles uncaught exceptions from async specs', function(done) { - run('uncaught.fixture.js', args, function(err, res) { + run('uncaught/double.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 0); - assert.strictEqual(res.stats.failures, 2); - - assert.strictEqual( - res.failures[0].title, - 'fails exactly once when a global error is thrown first' - ); - assert.strictEqual( - res.failures[1].title, - 'fails exactly once when a global error is thrown second' - ); - assert.strictEqual(res.code, 2); + + expect(res, 'to have failed with error', 'global error', 'test error') + .and('to have passed test count', 0) + .and('to have pending test count', 0) + .and('to have failed test count', 2) + .and( + 'to have failed test', + 'fails exactly once when a global error is thrown first', + 'fails exactly once when a global error is thrown second' + ); + done(); }); }); it('handles uncaught exceptions from which Mocha cannot recover', function(done) { - run('uncaught-fatal.fixture.js', args, function(err, res) { + run('uncaught/fatal.fixture.js', args, function(err, res) { if (err) { return done(err); } var testName = 'should bail if a successful test asynchronously fails'; - expect(res, 'to have failed') + expect(res, 'to have failed with error', 'global error') .and('to have passed test count', 1) .and('to have failed test count', 1) .and('to have passed test', testName) @@ -65,12 +61,12 @@ describe('uncaught exceptions', function() { }); it('handles uncaught exceptions within pending tests', function(done) { - run('uncaught-pending.fixture.js', args, function(err, res) { + run('uncaught/pending.fixture.js', args, function(err, res) { if (err) { return done(err); } - expect(res, 'to have failed') + expect(res, 'to have failed with error', 'I am uncaught!') .and('to have passed test count', 3) .and('to have pending test count', 1) .and('to have failed test count', 1) @@ -115,13 +111,66 @@ describe('uncaught exceptions', function() { }); it('removes uncaught exceptions handlers correctly', function(done) { - run('uncaught/listeners.fixture.js', args, function(err, res) { + var path = require.resolve('./fixtures/uncaught/listeners.fixture.js'); + invokeNode([path], function(err, res) { if (err) { return done(err); } - expect(res, 'to have passed').and('to have passed test count', 0); + expect(res, 'to have passed'); + done(); + }); + }); + it("handles uncaught exceptions after runner's end", function(done) { + runMocha( + 'uncaught/after-runner.fixture.js', + args, + function(err, res) { + if (err) { + return done(err); + } + + expect(res, 'to have failed').and('to satisfy', { + failing: 0, + passing: 1, + pending: 0, + output: expect.it('to contain', 'Error: Unexpected crash') + }); + + done(); + }, + 'pipe' + ); + }); + + it('issue-1327: should run the first test and then bail', function(done) { + run('uncaught/issue-1327.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with error', 'Too bad') + .and('to have passed test count', 1) + .and('to have failed test count', 1) + .and('to have passed test', 'test 1') + .and('to have failed test', 'test 1'); + done(); + }); + }); + + it('issue-1417: uncaught exceptions from async specs', function(done) { + run('uncaught/issue-1417.fixture.js', args, function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with errors', 'sync error a', 'sync error b') + .and('to have exit code', 2) + .and('not to have passed tests') + .and('not to have pending tests') + .and('to have failed test order', [ + 'fails exactly once when a global error is thrown synchronously and done errors', + 'fails exactly once when a global error is thrown synchronously and done completes' + ]); done(); }); }); From ac12f2c9a41f6952f085453a9c25c439813e58d4 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 13 Feb 2020 11:21:01 +0100 Subject: [PATCH 1442/1771] Browser: fix 'allowUncaught' handling (#4174) --- browser-entry.js | 2 +- docs/index.md | 10 ++-------- lib/runner.js | 3 ++- test/unit/runner.spec.js | 2 ++ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/browser-entry.js b/browser-entry.js index 3f770fac49..3e9cbbaf90 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -60,7 +60,7 @@ process.on = function(e, fn) { if (e === 'uncaughtException') { global.onerror = function(err, url, line) { fn(new Error(err + ' (' + url + ':' + line + ')')); - return !mocha.allowUncaught; + return !mocha.options.allowUncaught; }; uncaughtExceptionHandlers.push(fn); } diff --git a/docs/index.md b/docs/index.md index ef3f462f1f..cf0f226259 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,7 +24,6 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [javascript API for running tests](#more-information) - proper exit status for CI support etc - [auto-detects and disables coloring for non-ttys](#reporters) -- [maps uncaught exceptions to the correct test case](#browser-specific-methods) - [async test timeout support](#delayed-root-suite) - [test retry support](#retry-tests) - [test-specific timeouts](#test-level) @@ -666,7 +665,7 @@ describe('outer', function() { }); ``` -> _Updated in v7.0.0. Skipping a test within an "after all" hook is disallowed and will throw an exception. Use a return statement or other means to abort hook execution._ +> _Updated in v7.0.0:_ skipping a test within an "after all" hook is disallowed and will throw an exception. Use a return statement or other means to abort hook execution. Before Mocha v3.0.0, `this.skip()` was not supported in asynchronous tests and hooks. @@ -1543,12 +1542,6 @@ Alias: `HTML`, `html` Mocha runs in the browser. Every release of Mocha will have new builds of `./mocha.js` and `./mocha.css` for use in the browser. -### Browser-specific methods - -The following method(s) _only_ function in a browser context: - -`mocha.allowUncaught()` : If called, uncaught errors will not be absorbed by the error handler. - A typical setup might look something like the following, where we call `mocha.setup('bdd')` to use the **BDD** interface before loading the test scripts, running them `onload` with `mocha.run()`. ```html @@ -1600,6 +1593,7 @@ mocha.setup({ // Examples of options: mocha.setup({ + allowUncaught: true, asyncOnly: true, bail: true, checkLeaks: true, diff --git a/lib/runner.js b/lib/runner.js index ceb1a24a4f..f96b020320 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -800,7 +800,8 @@ Runner.prototype.uncaught = function(err) { if (err instanceof Pending) { return; } - if (this.allowUncaught) { + // browser does not exit script when throwing in global.onerror() + if (this.allowUncaught && !process.browser) { throw err; } diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 92b41c5fc4..cc65453b31 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -709,6 +709,8 @@ describe('Runner', function() { describe('when allow-uncaught is set to true', function() { it('should propagate error and throw', function() { + if (process.browser) this.skip(); + var err = new Error('should rethrow err'); runner.allowUncaught = true; expect( From a995e3324b9da02c9cda8ad26e2695a853c28f30 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 24 Feb 2020 18:18:32 +0100 Subject: [PATCH 1443/1771] Fix: programmatic API cannot access retried test objects (#4181) --- lib/runner.js | 5 +++++ lib/test.js | 13 +++++++++++ .../fixtures/retries/early-pass.fixture.js | 8 +++++++ test/integration/retries.spec.js | 22 +++++++++---------- test/unit/test.spec.js | 6 +++++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index f96b020320..17fa290432 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -135,6 +135,11 @@ function Runner(suite, delay) { this.total = suite.total(); this.failures = 0; this.on(constants.EVENT_TEST_END, function(test) { + if (test.retriedTest() && test.parent) { + var idx = + test.parent.tests && test.parent.tests.indexOf(test.retriedTest()); + if (idx > -1) test.parent.tests[idx] = test; + } self.checkGlobals(test); }); this.on(constants.EVENT_HOOK_END, function(hook) { diff --git a/lib/test.js b/lib/test.js index f32008a85b..65122b260c 100644 --- a/lib/test.js +++ b/lib/test.js @@ -36,6 +36,18 @@ function Test(title, fn) { */ utils.inherits(Test, Runnable); +/** + * Set or get retried test + * + * @private + */ +Test.prototype.retriedTest = function(n) { + if (!arguments.length) { + return this._retriedTest; + } + this._retriedTest = n; +}; + Test.prototype.clone = function() { var test = new Test(this.title, this.fn); test.timeout(this.timeout()); @@ -43,6 +55,7 @@ Test.prototype.clone = function() { test.enableTimeouts(this.enableTimeouts()); test.retries(this.retries()); test.currentRetry(this.currentRetry()); + test.retriedTest(this.retriedTest() || this); test.globals(this.globals()); test.parent = this.parent; test.file = this.file; diff --git a/test/integration/fixtures/retries/early-pass.fixture.js b/test/integration/fixtures/retries/early-pass.fixture.js index ddad40399e..87ef703a7a 100644 --- a/test/integration/fixtures/retries/early-pass.fixture.js +++ b/test/integration/fixtures/retries/early-pass.fixture.js @@ -1,8 +1,10 @@ 'use strict'; +const assert = require('assert'); describe('retries', function () { this.retries(1); var times = 0; + var self = this; it('should pass after 1 retry', function () { times++; @@ -10,4 +12,10 @@ describe('retries', function () { throw new Error('retry error ' + times); } }); + + it('check for updated `suite.tests`', function() { + assert.equal(self.tests[0]._currentRetry, 1); + assert.ok(self.tests[0]._retriedTest); + assert.equal(self.tests[0].state, 'passed'); + }) }); diff --git a/test/integration/retries.spec.js b/test/integration/retries.spec.js index 3225dafbc4..e076595d7d 100644 --- a/test/integration/retries.spec.js +++ b/test/integration/retries.spec.js @@ -2,6 +2,7 @@ var assert = require('assert'); var helpers = require('./helpers'); +var runJSON = helpers.runMochaJSON; var args = []; var bang = require('../../lib/reporters/base').symbols.bang; @@ -59,25 +60,22 @@ describe('retries', function() { }); it('should exit early if test passes', function(done) { - helpers.runMochaJSON('retries/early-pass.fixture.js', args, function( - err, - res - ) { + runJSON('retries/early-pass.fixture.js', args, function(err, res) { if (err) { - done(err); - return; + return done(err); } - assert.strictEqual(res.stats.passes, 1); - assert.strictEqual(res.stats.failures, 0); - assert.strictEqual(res.tests[0].currentRetry, 1); - assert.strictEqual(res.stats.tests, 1); - assert.strictEqual(res.code, 0); + + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and('to have failed test count', 0) + .and('to have retried test', 'should pass after 1 retry', 1); + done(); }); }); it('should let test override', function(done) { - helpers.runMochaJSON('retries/nested.fixture.js', args, function(err, res) { + runJSON('retries/nested.fixture.js', args, function(err, res) { if (err) { done(err); return; diff --git a/test/unit/test.spec.js b/test/unit/test.spec.js index 6192bf9f7f..4cff662c89 100644 --- a/test/unit/test.spec.js +++ b/test/unit/test.spec.js @@ -41,6 +41,12 @@ describe('Test', function() { expect(this._test.clone().currentRetry(), 'to be', 1); }); + it('should add/keep the retriedTest value', function() { + var clone1 = this._test.clone(); + expect(clone1.retriedTest(), 'to be', this._test); + expect(clone1.clone().retriedTest(), 'to be', this._test); + }); + it('should copy the globals value', function() { expect(this._test.clone().globals(), 'not to be empty'); }); From 57be4558eac737efae9ea67bee5de6e9f4fd6b0c Mon Sep 17 00:00:00 2001 From: Gil Tayar Date: Tue, 25 Feb 2020 00:02:07 +0200 Subject: [PATCH 1444/1771] Add support for Node.JS native ES modules (#4038) --- .eslintrc.yml | 9 +- docs/index.md | 54 ++++++- karma.conf.js | 1 + lib/cli/config.js | 3 +- lib/cli/options.js | 2 +- lib/cli/run-helpers.js | 15 +- lib/cli/run.js | 11 +- lib/esm-utils.js | 31 ++++ lib/mocha.js | 59 +++++++- lib/mocharc.json | 2 +- lib/utils.js | 22 +++ package-lock.json | 139 ++++++++++++------ package-scripts.js | 2 +- package.json | 3 +- test/integration/config.spec.js | 2 + test/integration/esm.spec.js | 53 +++++++ test/integration/fixtures/config/mocharc.cjs | 9 ++ test/integration/fixtures/esm/add.mjs | 3 + .../fixtures/esm/esm-failure.fixture.mjs | 5 + .../fixtures/esm/esm-success.fixture.mjs | 5 + .../integration/fixtures/esm/js-folder/add.js | 3 + .../esm/js-folder/esm-in-js.fixture.js | 5 + .../fixtures/esm/js-folder/package.json | 3 + test/integration/helpers.js | 2 +- test/integration/suite.spec.js | 8 +- 25 files changed, 372 insertions(+), 79 deletions(-) create mode 100644 lib/esm-utils.js create mode 100644 test/integration/esm.spec.js create mode 100644 test/integration/fixtures/config/mocharc.cjs create mode 100644 test/integration/fixtures/esm/add.mjs create mode 100644 test/integration/fixtures/esm/esm-failure.fixture.mjs create mode 100644 test/integration/fixtures/esm/esm-success.fixture.mjs create mode 100644 test/integration/fixtures/esm/js-folder/add.js create mode 100644 test/integration/fixtures/esm/js-folder/esm-in-js.fixture.js create mode 100644 test/integration/fixtures/esm/js-folder/package.json diff --git a/.eslintrc.yml b/.eslintrc.yml index 300a48ef67..96f28ebb9f 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -31,7 +31,14 @@ overrides: ecmaVersion: 2017 env: browser: false - + - files: + - esm-utils.js + parserOptions: + ecmaVersion: 2018 + sourceType: module + parser: babel-eslint + env: + browser: false - files: - test/**/*.{js,mjs} env: diff --git a/docs/index.md b/docs/index.md index cf0f226259..1a67af108a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -39,6 +39,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [mocha.opts file support](#-opts-path) - clickable suite titles to filter test execution - [node debugger support](#-inspect-inspect-brk-inspect) +- [node native ES modules support](#nodejs-native-esm-support) - [detects multiple calls to `done()`](#detects-multiple-calls-to-done) - [use any assertion library you want](#assertions) - [extensible reporting, bundled with 9+ reporters](#reporters) @@ -70,6 +71,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [Command-Line Usage](#command-line-usage) - [Interfaces](#interfaces) - [Reporters](#reporters) +- [Node.JS native ESM support](#nodejs-native-esm-support) - [Running Mocha in the Browser](#running-mocha-in-the-browser) - [Desktop Notification Support](#desktop-notification-support) - [Configuring Mocha (Node.js)](#configuring-mocha-nodejs) @@ -354,11 +356,11 @@ With its default "BDD"-style interface, Mocha provides the hooks `before()`, `af ```js describe('hooks', function() { before(function() { - // runs before all tests in this block + // runs once before the first test in this block }); after(function() { - // runs after all tests in this block + // runs once after the last test in this block }); beforeEach(function() { @@ -868,7 +870,8 @@ Configuration --package Path to package.json for config [string] File Handling - --extension File extension(s) to load [array] [default: js] + --extension File extension(s) to load + [array] [default: ["js","cjs","mjs"]] --file Specify file(s) to be loaded prior to root suite execution [array] [default: (none)] --ignore, --exclude Ignore file(s) or glob pattern(s) @@ -1538,6 +1541,42 @@ Alias: `HTML`, `html` **The HTML reporter is not intended for use on the command-line.** +## Node.JS native ESM support + +> _New in v7.1.0_ + +Mocha supports writing your tests as ES modules, and not just using CommonJS. For example: + +```js +// test.mjs +import {add} from './add.mjs'; +import assert from 'assert'; + +it('should add to numbers from an es module', () => { + assert.equal(add(3, 5), 8); +}); +``` + +To enable this you don't need to do anything special. Write your test file as an ES module. In Node.js +this means either ending the file with a `.mjs` extension, or, if you want to use the regular `.js` extension, by +adding `"type": "module"` to your `package.json`. +More information can be found in the [Node.js documentation](https://nodejs.org/api/esm.html). + +> Mocha supports ES modules only from Node.js v12.11.0 and above. To enable this in versions smaller than 13.2.0, you need to add `--experimental-modules` when running +> Mocha. From version 13.2.0 of Node.js, you can use ES modules without any flags. + +### Current Limitations + +Node.JS native ESM support still has status: **Stability: 1 - Experimental** + +- [Watch mode](#-watch-w) does not support ES Module test files +- [Custom reporters](#third-party-reporters) and [custom interfaces](#interfaces) + can only be CommonJS files +- [Required modules](#-require-module-r-module) can only be CommonJS files +- [Configuration file](#configuring-mocha-nodejs) can only be a CommonJS file (`mocharc.js` or `mocharc.cjs`) +- When using module-level mocks via libs like `proxyquire`, `rewiremock` or `rewire`, hold off on using ES modules for your test files +- Node.JS native ESM support does not work with [esm][npm-esm] module + ## Running Mocha in the Browser Mocha runs in the browser. Every release of Mocha will have new builds of `./mocha.js` and `./mocha.css` for use in the browser. @@ -1609,17 +1648,17 @@ mocha.setup({ ### Browser-specific Option(s) -Browser Mocha supports many, but not all [cli options](#command-line-usage). +Browser Mocha supports many, but not all [cli options](#command-line-usage). To use a [cli option](#command-line-usage) that contains a "-", please convert the option to camel-case, (eg. `check-leaks` to `checkLeaks`). #### Options that differ slightly from [cli options](#command-line-usage): -`reporter` _{string|constructor}_ +`reporter` _{string|constructor}_ You can pass a reporter's name or a custom reporter's constructor. You can find **recommended** reporters for the browser [here](#reporting). It is possible to use [built-in reporters](#reporters) as well. Their employment in browsers is neither recommended nor supported, open the console to see the test results. #### Options that _only_ function in browser context: -`noHighlighting` _{boolean}_ +`noHighlighting` _{boolean}_ If set to `true`, do not attempt to use syntax highlighting on output test code. ### Reporting @@ -1701,7 +1740,8 @@ tests as shown below: In addition to supporting the deprecated [`mocha.opts`](#mochaopts) run-control format, Mocha now supports configuration files, typical of modern command-line tools, in several formats: -- **JavaScript**: Create a `.mocharc.js` in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. +- **JavaScript**: Create a `.mocharc.js` (or `mocharc.cjs` when using [`"type"="module"`](#nodejs-native-esm-support) in your `package.json`) + in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. - **YAML**: Create a `.mocharc.yaml` (or `.mocharc.yml`) in your project's root directory. - **JSON**: Create a `.mocharc.json` (or `.mocharc.jsonc`) in your project's root directory. Comments — while not valid JSON — are allowed in this file, and will be ignored by Mocha. - **package.json**: Create a `mocha` property in your project's `package.json`. diff --git a/karma.conf.js b/karma.conf.js index b0c713856c..ae84d7d830 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -35,6 +35,7 @@ module.exports = config => { .ignore('chokidar') .ignore('fs') .ignore('glob') + .ignore('./lib/esm-utils.js') .ignore('path') .ignore('supports-color') .on('bundled', (err, content) => { diff --git a/lib/cli/config.js b/lib/cli/config.js index 6fa4e2dbca..24de6cd474 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -21,6 +21,7 @@ const findUp = require('find-up'); * @private */ exports.CONFIG_FILES = [ + '.mocharc.cjs', '.mocharc.js', '.mocharc.yaml', '.mocharc.yml', @@ -75,7 +76,7 @@ exports.loadConfig = filepath => { try { if (ext === '.yml' || ext === '.yaml') { config = parsers.yaml(filepath); - } else if (ext === '.js') { + } else if (ext === '.js' || ext === '.cjs') { config = parsers.js(filepath); } else { config = parsers.json(filepath); diff --git a/lib/cli/options.js b/lib/cli/options.js index c87552c542..9fbc22ca0b 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -265,7 +265,7 @@ module.exports.loadPkgRc = loadPkgRc; * Priority list: * * 1. Command-line args - * 2. RC file (`.mocharc.js`, `.mocharc.ya?ml`, `mocharc.json`) + * 2. RC file (`.mocharc.c?js`, `.mocharc.ya?ml`, `mocharc.json`) * 3. `mocha` prop of `package.json` * 4. `mocha.opts` * 5. default configuration (`lib/mocharc.json`) diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 6c662a665f..72823c48f6 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -15,8 +15,6 @@ const collectFiles = require('./collect-files'); const cwd = (exports.cwd = process.cwd()); -exports.watchRun = watchRun; - /** * Exits Mocha when tests + code under test has finished execution (default) * @param {number} code - Exit code; typically # of failures @@ -92,19 +90,21 @@ exports.handleRequires = (requires = []) => { }; /** - * Collect test files and run mocha instance. + * Collect and load test files, then run mocha instance. * @param {Mocha} mocha - Mocha instance * @param {Options} [opts] - Command line options * @param {boolean} [opts.exit] - Whether or not to force-exit after tests are complete * @param {Object} fileCollectParams - Parameters that control test * file collection. See `lib/cli/collect-files.js`. - * @returns {Runner} + * @returns {Promise} * @private */ -exports.singleRun = (mocha, {exit}, fileCollectParams) => { +const singleRun = async (mocha, {exit}, fileCollectParams) => { const files = collectFiles(fileCollectParams); debug('running tests with files', files); mocha.files = files; + + await mocha.loadFilesAsync(); return mocha.run(exit ? exitMocha : exitMochaLater); }; @@ -113,8 +113,9 @@ exports.singleRun = (mocha, {exit}, fileCollectParams) => { * @param {Mocha} mocha - Mocha instance * @param {Object} opts - Command line options * @private + * @returns {Promise} */ -exports.runMocha = (mocha, options) => { +exports.runMocha = async (mocha, options) => { const { watch = false, extension = [], @@ -140,7 +141,7 @@ exports.runMocha = (mocha, options) => { if (watch) { watchRun(mocha, {watchFiles, watchIgnore}, fileCollectParams); } else { - exports.singleRun(mocha, {exit}, fileCollectParams); + await singleRun(mocha, {exit}, fileCollectParams); } }; diff --git a/lib/cli/run.js b/lib/cli/run.js index e4e6ba2791..014227d569 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -87,7 +87,6 @@ exports.builder = yargs => }, extension: { default: defaults.extension, - defaultDescription: 'js', description: 'File extension(s) to load', group: GROUPS.FILES, requiresArg: true, @@ -299,8 +298,14 @@ exports.builder = yargs => .number(types.number) .alias(aliases); -exports.handler = argv => { +exports.handler = async function(argv) { debug('post-yargs config', argv); const mocha = new Mocha(argv); - runMocha(mocha, argv); + + try { + await runMocha(mocha, argv); + } catch (err) { + console.error('\n' + (err.stack || `Error: ${err.message || err}`)); + process.exit(1); + } }; diff --git a/lib/esm-utils.js b/lib/esm-utils.js new file mode 100644 index 0000000000..df2b5fed0e --- /dev/null +++ b/lib/esm-utils.js @@ -0,0 +1,31 @@ +const url = require('url'); +const path = require('path'); + +const requireOrImport = async file => { + file = path.resolve(file); + + if (path.extname(file) === '.mjs') { + return import(url.pathToFileURL(file)); + } + // This is currently the only known way of figuring out whether a file is CJS or ESM. + // If Node.js or the community establish a better procedure for that, we can fix this code. + // Another option here would be to always use `import()`, as this also supports CJS, but I would be + // wary of using it for _all_ existing test files, till ESM is fully stable. + try { + return require(file); + } catch (err) { + if (err.code === 'ERR_REQUIRE_ESM') { + return import(url.pathToFileURL(file)); + } else { + throw err; + } + } +}; + +exports.loadFilesAsync = async (files, preLoadFunc, postLoadFunc) => { + for (const file of files) { + preLoadFunc(file); + const result = await requireOrImport(file); + postLoadFunc(file, result); + } +}; diff --git a/lib/mocha.js b/lib/mocha.js index 0b43004abc..740e1fd841 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -14,6 +14,7 @@ var utils = require('./utils'); var mocharc = require('./mocharc.json'); var errors = require('./errors'); var Suite = require('./suite'); +var esmUtils = utils.supportsEsModules() ? require('./esm-utils') : undefined; var createStatsCollector = require('./stats-collector'); var createInvalidReporterError = errors.createInvalidReporterError; var createInvalidInterfaceError = errors.createInvalidInterfaceError; @@ -290,16 +291,18 @@ Mocha.prototype.ui = function(ui) { }; /** - * Loads `files` prior to execution. + * Loads `files` prior to execution. Does not support ES Modules. * * @description * The implementation relies on Node's `require` to execute * the test interface functions and will be subject to its cache. + * Supports only CommonJS modules. To load ES modules, use Mocha#loadFilesAsync. * * @private * @see {@link Mocha#addFile} * @see {@link Mocha#run} * @see {@link Mocha#unloadFiles} + * @see {@link Mocha#loadFilesAsync} * @param {Function} [fn] - Callback invoked upon completion. */ Mocha.prototype.loadFiles = function(fn) { @@ -314,6 +317,49 @@ Mocha.prototype.loadFiles = function(fn) { fn && fn(); }; +/** + * Loads `files` prior to execution. Supports Node ES Modules. + * + * @description + * The implementation relies on Node's `require` and `import` to execute + * the test interface functions and will be subject to its cache. + * Supports both CJS and ESM modules. + * + * @public + * @see {@link Mocha#addFile} + * @see {@link Mocha#run} + * @see {@link Mocha#unloadFiles} + * @returns {Promise} + * @example + * + * // loads ESM (and CJS) test files asynchronously, then runs root suite + * mocha.loadFilesAsync() + * .then(() => mocha.run(failures => process.exitCode = failures ? 1 : 0)) + * .catch(() => process.exitCode = 1); + */ +Mocha.prototype.loadFilesAsync = function() { + var self = this; + var suite = this.suite; + this.loadAsync = true; + + if (!esmUtils) { + return new Promise(function(resolve) { + self.loadFiles(resolve); + }); + } + + return esmUtils.loadFilesAsync( + this.files, + function(file) { + suite.emit(EVENT_FILE_PRE_REQUIRE, global, file, self); + }, + function(file, resultModule) { + suite.emit(EVENT_FILE_REQUIRE, resultModule, file, self); + suite.emit(EVENT_FILE_POST_REQUIRE, global, file, self); + } + ); +}; + /** * Removes a previously loaded file from Node's `require` cache. * @@ -330,8 +376,9 @@ Mocha.unloadFile = function(file) { * Unloads `files` from Node's `require` cache. * * @description - * This allows files to be "freshly" reloaded, providing the ability + * This allows required files to be "freshly" reloaded, providing the ability * to reuse a Mocha instance programmatically. + * Note: does not clear ESM module files from the cache * * Intended for consumers — not used internally * @@ -842,10 +889,14 @@ Object.defineProperty(Mocha.prototype, 'version', { * @see {@link Mocha#unloadFiles} * @see {@link Runner#run} * @param {DoneCB} [fn] - Callback invoked when test execution completed. - * @return {Runner} runner instance + * @returns {Runner} runner instance + * @example + * + * // exit with non-zero status if there were test failures + * mocha.run(failures => process.exitCode = failures ? 1 : 0); */ Mocha.prototype.run = function(fn) { - if (this.files.length) { + if (this.files.length && !this.loadAsync) { this.loadFiles(); } var suite = this.suite; diff --git a/lib/mocharc.json b/lib/mocharc.json index e6f5d99c5b..1ed9157675 100644 --- a/lib/mocharc.json +++ b/lib/mocharc.json @@ -1,6 +1,6 @@ { "diff": true, - "extension": ["js"], + "extension": ["js", "cjs", "mjs"], "opts": "./test/mocha.opts", "package": "./package.json", "reporter": "spec", diff --git a/lib/utils.js b/lib/utils.js index 805d98d463..59b250c20e 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -831,3 +831,25 @@ exports.defineConstants = function(obj) { } return Object.freeze(exports.createMap(obj)); }; + +/** + * Whether current version of Node support ES modules + * + * @description + * Versions prior to 10 did not support ES Modules, and version 10 has an old incompatibile version of ESM. + * This function returns whether Node.JS has ES Module supports that is compatible with Mocha's needs, + * which is version >=12.11. + * + * @returns {Boolean} whether the current version of Node.JS supports ES Modules in a way that is compatible with Mocha + */ +exports.supportsEsModules = function() { + if (!process.browser && process.versions && process.versions.node) { + var versionFields = process.versions.node.split('.'); + var major = +versionFields[0]; + var minor = +versionFields[1]; + + if (major >= 13 || (major === 12 && minor >= 11)) { + return true; + } + } +}; diff --git a/package-lock.json b/package-lock.json index 05f0471347..86234a92da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -684,7 +684,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "arch": { @@ -1330,7 +1330,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1342,7 +1342,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1470,6 +1470,31 @@ } } }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -1904,7 +1929,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -2069,7 +2094,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -2158,7 +2183,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { "version": "2.26.7", @@ -2328,7 +2353,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2350,7 +2375,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -3106,7 +3131,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3771,7 +3796,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, "cross-env": { @@ -4615,7 +4640,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", @@ -5744,7 +5769,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6386,13 +6411,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -7218,7 +7243,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7287,7 +7312,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7507,7 +7532,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7848,7 +7873,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -9084,7 +9109,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9853,6 +9878,15 @@ "strip-ansi": "^4.0.0" }, "dependencies": { + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -10074,6 +10108,15 @@ "is-extglob": "^2.1.1" } }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", @@ -10237,7 +10280,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -10399,7 +10442,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10420,7 +10463,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10560,11 +10603,11 @@ "dev": true }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "requires": { - "chalk": "^2.0.1" + "chalk": "^2.4.2" } }, "log-update": { @@ -10703,7 +10746,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -10869,7 +10912,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -10952,7 +10995,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -11262,7 +11305,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11582,7 +11625,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11684,7 +11727,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -11861,7 +11904,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -12300,7 +12343,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -12381,7 +12424,7 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -12543,7 +12586,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -13079,7 +13122,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13681,7 +13724,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13907,13 +13950,13 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-ms": { "version": "0.2.2", - "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -14115,7 +14158,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14259,7 +14302,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14914,7 +14957,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -15042,7 +15085,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -17130,7 +17173,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -17173,7 +17216,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18149,7 +18192,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-encoding": { diff --git a/package-scripts.js b/package-scripts.js index 3f9b2d0bd4..a94de98e40 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -23,7 +23,7 @@ function test(testName, mochaParams) { module.exports = { scripts: { build: { - script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore './lib/cli/*.js' --ignore 'chokidar' --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' -o mocha.js`, + script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore './lib/cli/*.js' --ignore "./lib/esm-utils.js" --ignore 'chokidar' --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' -o mocha.js`, description: 'Build browser bundle' }, lint: { diff --git a/package.json b/package.json index fcebd7f32e..8cad374e94 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", @@ -74,6 +74,7 @@ "acorn": "^7.0.0", "assetgraph-builder": "^6.10.1", "autoprefixer": "^9.6.0", + "babel-eslint": "^10.0.3", "browserify": "^16.2.3", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", diff --git a/test/integration/config.spec.js b/test/integration/config.spec.js index 8d81bec9ab..52fa886220 100644 --- a/test/integration/config.spec.js +++ b/test/integration/config.spec.js @@ -11,9 +11,11 @@ describe('config', function() { it('should return the same values for all supported config types', function() { var configDir = path.join(__dirname, 'fixtures', 'config'); var js = loadConfig(path.join(configDir, 'mocharc.js')); + var cjs = loadConfig(path.join(configDir, 'mocharc.cjs')); var json = loadConfig(path.join(configDir, 'mocharc.json')); var yaml = loadConfig(path.join(configDir, 'mocharc.yaml')); expect(js, 'to equal', json); + expect(js, 'to equal', cjs); expect(json, 'to equal', yaml); }); diff --git a/test/integration/esm.spec.js b/test/integration/esm.spec.js new file mode 100644 index 0000000000..b4cf761f2a --- /dev/null +++ b/test/integration/esm.spec.js @@ -0,0 +1,53 @@ +'use strict'; +var run = require('./helpers').runMochaJSON; +var utils = require('../../lib/utils'); +var args = + +process.versions.node.split('.')[0] >= 13 ? [] : ['--experimental-modules']; + +describe('esm', function() { + before(function() { + if (!utils.supportsEsModules()) this.skip(); + }); + + it('should pass a passing esm test that uses esm', function(done) { + var fixture = 'esm/esm-success.fixture.mjs'; + run(fixture, args, function(err, result) { + if (err) { + done(err); + return; + } + + expect(result, 'to have passed test count', 1); + done(); + }); + }); + + it('should fail a failing esm test that uses esm', function(done) { + var fixture = 'esm/esm-failure.fixture.mjs'; + run(fixture, args, function(err, result) { + if (err) { + done(err); + return; + } + + expect(result, 'to have failed test count', 1).and( + 'to have failed test', + 'should use a function from an esm, and fail' + ); + done(); + }); + }); + + it('should recognize esm files ending with .js due to package.json type flag', function(done) { + var fixture = 'esm/js-folder/esm-in-js.fixture.js'; + run(fixture, args, function(err, result) { + if (err) { + done(err); + return; + } + + expect(result, 'to have passed test count', 1); + done(); + }); + }); +}); diff --git a/test/integration/fixtures/config/mocharc.cjs b/test/integration/fixtures/config/mocharc.cjs new file mode 100644 index 0000000000..adec9d68ed --- /dev/null +++ b/test/integration/fixtures/config/mocharc.cjs @@ -0,0 +1,9 @@ +'use strict'; + +// a comment +module.exports = { + require: ['foo', 'bar'], + bail: true, + reporter: 'dot', + slow: 60 +}; diff --git a/test/integration/fixtures/esm/add.mjs b/test/integration/fixtures/esm/add.mjs new file mode 100644 index 0000000000..7d658310b0 --- /dev/null +++ b/test/integration/fixtures/esm/add.mjs @@ -0,0 +1,3 @@ +export function add(a, b) { + return a + b; +} diff --git a/test/integration/fixtures/esm/esm-failure.fixture.mjs b/test/integration/fixtures/esm/esm-failure.fixture.mjs new file mode 100644 index 0000000000..588d8fce7f --- /dev/null +++ b/test/integration/fixtures/esm/esm-failure.fixture.mjs @@ -0,0 +1,5 @@ +import {add} from './add.mjs'; + +it('should use a function from an esm, and fail', () => { + expect(add(3, 5), 'to be', 9); +}); diff --git a/test/integration/fixtures/esm/esm-success.fixture.mjs b/test/integration/fixtures/esm/esm-success.fixture.mjs new file mode 100644 index 0000000000..0df926cae7 --- /dev/null +++ b/test/integration/fixtures/esm/esm-success.fixture.mjs @@ -0,0 +1,5 @@ +import {add} from './add.mjs'; + +it('should use a function from an esm', () => { + expect(add(3, 5), 'to be', 8); +}); diff --git a/test/integration/fixtures/esm/js-folder/add.js b/test/integration/fixtures/esm/js-folder/add.js new file mode 100644 index 0000000000..7d658310b0 --- /dev/null +++ b/test/integration/fixtures/esm/js-folder/add.js @@ -0,0 +1,3 @@ +export function add(a, b) { + return a + b; +} diff --git a/test/integration/fixtures/esm/js-folder/esm-in-js.fixture.js b/test/integration/fixtures/esm/js-folder/esm-in-js.fixture.js new file mode 100644 index 0000000000..92abf1241e --- /dev/null +++ b/test/integration/fixtures/esm/js-folder/esm-in-js.fixture.js @@ -0,0 +1,5 @@ +import {add} from './add.js'; + +it('should use a function from an esm module with a js extension', () => { + expect(add(3, 5), 'to be', 8); +}); diff --git a/test/integration/fixtures/esm/js-folder/package.json b/test/integration/fixtures/esm/js-folder/package.json new file mode 100644 index 0000000000..3dbc1ca591 --- /dev/null +++ b/test/integration/fixtures/esm/js-folder/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 0d65e91e6b..6cdf7e93cf 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -299,7 +299,7 @@ function _spawnMochaWithListeners(args, fn, opts) { } function resolveFixturePath(fixture) { - if (path.extname(fixture) !== '.js') { + if (path.extname(fixture) !== '.js' && path.extname(fixture) !== '.mjs') { fixture += '.fixture.js'; } return path.join('test', 'integration', 'fixtures', fixture); diff --git a/test/integration/suite.spec.js b/test/integration/suite.spec.js index d3aac74034..ce1171b0a2 100644 --- a/test/integration/suite.spec.js +++ b/test/integration/suite.spec.js @@ -12,9 +12,11 @@ describe('suite w/no callback', function() { if (err) { return done(err); } - var pattern = new RegExp('TypeError', 'g'); - var result = res.output.match(pattern) || []; - expect(result, 'to have length', 2); + expect( + res.output, + 'to match', + /no callback was supplied. Supply a callback/ + ); done(); }, {stdio: 'pipe'} From d43092e0b9768e392492a47a4069b3e0ff9ed9a6 Mon Sep 17 00:00:00 2001 From: juergba Date: Tue, 25 Feb 2020 09:02:10 +0100 Subject: [PATCH 1445/1771] update CHANGELOG for v7.1.0 [ci skip] --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d439b03e0..d786e82830 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# 7.1.0 / 2020-02-26 + +## :tada: Enhancements + +#4038: Add Node.js native ESM support (@giltayar) + +Mocha supports writing your test files as ES modules: + +- Node.js only v12.11.0 and above +- Node.js below v13.2.0, you must set `--experimental-modules` option +- current limitations: please check our [documentation](https://mochajs.org/#nodejs-native-esm-support) +- for programmatic usage: see [API: loadFilesAsync()](https://mochajs.org/api/mocha#loadFilesAsync) + +**Note:** Node.JS native [ECMAScript Modules](https://nodejs.org/api/esm.html) implementation has status: **Stability: 1 - Experimental** + +## :bug: Fixes + +- #4181: Programmatic API cannot access retried test objects (@juergba) +- #4174: Browser: fix `allowUncaught` option (@juergba) + +## :book: Documentation + +- #4058: Manage author list in AUTHORS instead of `package.json` (@outsideris) + +## :nut_and_bolt: Other + +- #4138: Upgrade ESLint v6.8 (@kaicataldo) + # 7.0.1 / 2020-01-25 ## :bug: Fixes From 09b948bd899e39a684dd6e2d871ea3fc77f9aee0 Mon Sep 17 00:00:00 2001 From: juergba Date: Wed, 26 Feb 2020 07:37:39 +0100 Subject: [PATCH 1446/1771] Release v7.1.0 --- AUTHORS | 2 ++ CHANGELOG.md | 10 +++++----- package-lock.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index e343853b2a..326283089b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -486,5 +486,7 @@ Hugo Kim KyoungWan Zirak Christian Holm +Kai Cataldo +Gil Tayar # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d786e82830..4cf0b4e8cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## :tada: Enhancements -#4038: Add Node.js native ESM support (@giltayar) +[#4038](https://github.com/mochajs/mocha/issues/4038): Add Node.js native ESM support ([**@giltayar**](https://github.com/giltayar)) Mocha supports writing your test files as ES modules: @@ -15,16 +15,16 @@ Mocha supports writing your test files as ES modules: ## :bug: Fixes -- #4181: Programmatic API cannot access retried test objects (@juergba) -- #4174: Browser: fix `allowUncaught` option (@juergba) +- [#4181](https://github.com/mochajs/mocha/issues/4181): Programmatic API cannot access retried test objects ([**@juergba**](https://github.com/juergba)) +- [#4174](https://github.com/mochajs/mocha/issues/4174): Browser: fix `allowUncaught` option ([**@juergba**](https://github.com/juergba)) ## :book: Documentation -- #4058: Manage author list in AUTHORS instead of `package.json` (@outsideris) +- [#4058](https://github.com/mochajs/mocha/issues/4058): Manage author list in AUTHORS instead of `package.json` ([**@outsideris**](https://github.com/outsideris)) ## :nut_and_bolt: Other -- #4138: Upgrade ESLint v6.8 (@kaicataldo) +- [#4138](https://github.com/mochajs/mocha/issues/4138): Upgrade ESLint v6.8 ([**@kaicataldo**](https://github.com/kaicataldo)) # 7.0.1 / 2020-01-25 diff --git a/package-lock.json b/package-lock.json index 86234a92da..3cadb5289f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.0.1", + "version": "7.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8cad374e94..915b15d3d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.0.1", + "version": "7.1.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 4dc3cd1cd3dbae13f81d4d0e1386dcee67e25194 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Thu, 27 Feb 2020 06:20:27 +0900 Subject: [PATCH 1447/1771] docs: show netlify badge on footer (#4190) Signed-off-by: Outsider --- docs/_includes/default.html | 95 +++++++++++++++++++++---------------- docs/css/style.css | 12 ++++- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/docs/_includes/default.html b/docs/_includes/default.html index 476b96a64d..7e3a29f000 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.html @@ -90,47 +90,60 @@

              - +
              Last updated
              diff --git a/docs/css/style.css b/docs/css/style.css index f9bfc27a75..60bca37af4 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -251,6 +251,10 @@ footer { max-width: 66%; } +#external-links { + position: relative; +} + #openjsf-links { margin: 0; padding: 0; @@ -271,6 +275,12 @@ footer { content: ' | '; } +#external-links .netlify-badge { + position: absolute; + right: 0; + bottom: 0; +} + .dl-inline dt, .dl-inline dd { display: inline; @@ -291,7 +301,7 @@ blockquote { padding: 10px; } -@media all and (max-width: 900px) { +@media all and (max-width: 960px) { #copyright-notice { max-width: initial; } From 9cbb6f63f9103af40d08a9bc14eefdee7b907a3f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 27 Feb 2020 16:39:57 -0800 Subject: [PATCH 1448/1771] upgrade assetgraph-builder this addresses many `npm audit` issues. will it work on netlify? --- package-lock.json | 1051 ++++++++++++++++++++++++--------------------- package.json | 4 +- 2 files changed, 562 insertions(+), 493 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cadb5289f..cb8de65cb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -535,6 +535,24 @@ "es6-promisify": "^5.0.0" } }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -1085,46 +1103,38 @@ "dev": true }, "assetgraph": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.8.4.tgz", - "integrity": "sha512-vDGeWPSaRihVny07KsyFHYXFh7w2ScbzKruxNi0pZ7OT3zKzU9ppxVFK1kNnFUEjicLKaFB5Ffh2xk2n6dGjNA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.0.tgz", + "integrity": "sha512-dkankzD4TU1MRk+q76s9HyDftzGO8bKk0DSlCICZLnsbkITQYhaqnSnnrMN69NgBGNB9MM4anDrESWe+IVEOcQ==", "dev": true, "requires": { - "acorn": "^6.1.0", + "acorn": "^7.0.0", "acorn-jsx": "^5.0.1", "bluebird": "^3.5.1", "chalk": "^2.0.1", "common-path-prefix": "^1.0.0", "createerror": "^1.3.0", - "css-font-parser-papandreou": "^0.2.3-patch1", - "css-font-weight-names": "0.2.1", - "css-list-helpers": "2.0.0", "cssnano": "^4.1.10", "data-urls": "^1.0.0", "domspace": "^1.2.1", "esanimate": "^1.1.0", - "escodegen": "^1.11.1", + "escodegen": "^1.12.0", "espurify": "^2.0.1", - "estraverse": "^4.2.0", + "estraverse": "^4.3.0", "estraverse-fb": "^1.3.2", - "font-family-papandreou": "^0.2.0-patch1", - "font-snapper": "^1.0.0", - "font-tracer": "^1.1.0", - "fontkit": "^1.7.7", "gettemporaryfilepath": "^1.0.0", "glob": "^7.0.5", "html-minifier": "^4.0.0", "imageinfo": "^1.0.4", - "jsdom": "14.0.0", + "jsdom": "^15.0.0", "lines-and-columns": "^1.1.6", - "lodash": "4.17.11", + "lodash": "4.17.15", "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", "perfectionist": "^2.4.0", "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.0", - "read-pkg-up": "^4.0.0", + "read-pkg-up": "^6.0.0", "repeat-string": "^1.5.4", "schemes": "^1.0.1", "semver": "^6.0.0", @@ -1133,96 +1143,110 @@ "specificity": "^0.4.0", "sw-precache": "^5.2.0", "teepee": "^2.31.1", - "terser": "^3.14.1", - "urltools": "^0.4.1", - "xmldom": "^0.1.27" + "terser": "^4.0.0", + "urltools": "^0.4.1" }, "dependencies": { - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "pify": "^3.0.0" + "p-locate": "^4.1.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" } }, "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "source-map": { @@ -1230,22 +1254,16 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, "assetgraph-builder": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-6.10.1.tgz", - "integrity": "sha512-jRqme+K8BWVAlY3+qqkWH19/FD92aay0TqZzCfaH3HkTTqFPacIHiGA/DRvPPOxjl+wvIvjVNLWSG2QrPxtHrA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-7.0.0.tgz", + "integrity": "sha512-XhMhugz5H4WT7Tw0DAKoIgjmEfzcHJvgfXOlugaiLj9W/7zKhn2PqdrCmAyEm8WBKmPxRTfzb0ONTOH02KKwSQ==", "dev": true, "requires": { - "assetgraph": "5.8.4", + "assetgraph": "6.0.0", "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", "chalk": "^2.3.2", @@ -1259,11 +1277,22 @@ "memoizesync": "^1.1.1", "optimist": "^0.6.1", "optipng": "^2.0.0", - "p-map": "^2.0.0", + "p-map": "^3.0.0", "passerror": "^1.1.1", "pngcrush": "^2.0.1", - "pngquant": "^2.0.1", + "pngquant": "^3.0.0", "urltools": "^0.4.1" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } } }, "assetgraph-sprite": { @@ -1330,7 +1359,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1342,7 +1371,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1763,6 +1792,15 @@ "pify": "^4.0.1" }, "dependencies": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", @@ -1842,6 +1880,12 @@ "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", @@ -1929,7 +1973,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2094,7 +2138,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -2353,7 +2397,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2375,7 +2419,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -2731,6 +2775,15 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } } } }, @@ -2858,12 +2911,12 @@ "dev": true }, "canvas": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.5.0.tgz", - "integrity": "sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", + "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", "dev": true, "requires": { - "nan": "^2.13.2", + "nan": "^2.14.0", "node-pre-gyp": "^0.11.0", "simple-get": "^3.0.3" }, @@ -3117,9 +3170,9 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "ci-info": { @@ -3131,7 +3184,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3178,6 +3231,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", @@ -3264,6 +3323,41 @@ "tiny-emitter": "^2.0.0" } }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -3277,6 +3371,14 @@ "dev": true, "requires": { "mimic-response": "^1.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + } } }, "coa": { @@ -3796,7 +3898,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", "dev": true }, "cross-env": { @@ -4147,12 +4249,12 @@ } }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^2.0.0" } }, "decompress-tar": { @@ -4776,6 +4878,15 @@ "pify": "^3.0.0" }, "dependencies": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -4804,6 +4915,12 @@ "url-to-options": "^1.0.1" } }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -5366,7 +5483,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -5769,7 +5886,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -5941,10 +6058,21 @@ }, "dependencies": { "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true + }, + "pngquant": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-2.0.1.tgz", + "integrity": "sha512-van2S2ZJwr8lCH+LJtRWsi3Mz1b8xJd2ZvLtUMzpsD8EqW12fIZN7ZczQpDcArKlXJE97TunL+PeIxXP6uBt5w==", + "dev": true, + "requires": { + "memoizeasync": "1.1.0", + "pngquant-bin": "^5.0.2", + "which": "1.3.1" + } } } }, @@ -6382,21 +6510,12 @@ } }, "find-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.1.0.tgz", - "integrity": "sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", "dev": true, "requires": { - "array-uniq": "^2.1.0", "semver-regex": "^2.0.0" - }, - "dependencies": { - "array-uniq": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", - "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", - "dev": true - } } }, "findup": { @@ -6411,13 +6530,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -6679,12 +6798,12 @@ } }, "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -7312,7 +7431,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7532,7 +7651,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7873,7 +7992,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -8445,9 +8564,9 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -8466,9 +8585,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -8566,12 +8685,12 @@ }, "dependencies": { "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" } } } @@ -8753,14 +8872,6 @@ "requires": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" - }, - "dependencies": { - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - } } }, "ip-regex": { @@ -9109,7 +9220,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9571,54 +9682,108 @@ } }, "jsdom": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz", - "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", "dev": true, "requires": { "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", "data-urls": "^1.1.0", "domexception": "^1.0.1", - "escodegen": "^1.11.0", + "escodegen": "^1.11.1", "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", + "nwsapi": "^2.2.0", "parse5": "5.1.0", "pn": "^1.1.0", "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.5", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", + "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^7.0.0", - "ws": "^6.1.2", + "ws": "^7.0.0", "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" } + }, + "ws": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", + "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "dev": true } } }, @@ -10280,7 +10445,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -10442,7 +10607,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10463,7 +10628,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10746,7 +10911,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -10912,7 +11077,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -10995,7 +11160,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -11305,7 +11470,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11340,9 +11505,9 @@ "dev": true }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true }, "minimalistic-assert": { @@ -11367,13 +11532,13 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -11381,20 +11546,20 @@ }, "dependencies": { "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mitt": { @@ -11426,7 +11591,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -11575,9 +11740,9 @@ "dev": true }, "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz", + "integrity": "sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==", "dev": true, "requires": { "debug": "^3.2.6", @@ -11625,16 +11790,16 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" } }, "node-abi": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", - "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", + "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", "dev": true, "requires": { "semver": "^5.4.1" @@ -11727,7 +11892,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -11839,10 +12004,13 @@ "dev": true }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } }, "npm-conf": { "version": "1.1.3", @@ -11862,14 +12030,21 @@ } } }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-path": { @@ -11914,9 +12089,9 @@ } }, "nps": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.5.tgz", - "integrity": "sha512-UsjrtowHeXGnKELZUlqiyPSXc3vYs3YwLZEFfZJ1Z9kZCFgtzK4YRVKnxEa+teRMMdw6Q4keAX/M/aLCkPTqIw==", + "version": "5.9.12", + "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.12.tgz", + "integrity": "sha512-zuUAz/2VVp6kd1hJ4Fuq3p4ETTaj3zQ5/P4ck7c2O1NsG79BjQvRJprQvHbz2av7qFXmbR33UCp9y2PkcbW4TQ==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -11930,71 +12105,9 @@ "readline-sync": "^1.4.7", "spawn-command-with-kill": "^1.0.0", "type-detect": "^4.0.3", - "yargs": "^8.0.2" + "yargs": "14.2.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -12004,48 +12117,12 @@ "locate-path": "^2.0.0" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -12056,26 +12133,6 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -12100,85 +12157,95 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", + "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "y18n": "^4.0.0", + "yargs-parser": "^15.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -12343,7 +12410,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -12424,7 +12491,7 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": false, "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -12586,7 +12653,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -12721,6 +12788,12 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -12952,7 +13025,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -13122,7 +13195,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13276,9 +13349,9 @@ } }, "pngquant": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-2.0.1.tgz", - "integrity": "sha512-van2S2ZJwr8lCH+LJtRWsi3Mz1b8xJd2ZvLtUMzpsD8EqW12fIZN7ZczQpDcArKlXJE97TunL+PeIxXP6uBt5w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-3.0.0.tgz", + "integrity": "sha512-zGcAUXEnDDJ9iAu3an1Dr77HlS8UJbrnsaTcPMyyZPibhyB6XGTG6REDOyAiVOa6MgQwxL8nCqAFVlFixK+HPg==", "dev": true, "requires": { "memoizeasync": "1.1.0", @@ -13724,7 +13797,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13805,9 +13878,9 @@ } }, "prebuild-install": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", - "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", + "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", "dev": true, "requires": { "detect-libc": "^1.0.3", @@ -13819,11 +13892,10 @@ "node-abi": "^2.7.0", "noop-logger": "^0.1.1", "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", + "pump": "^3.0.0", "rc": "^1.2.7", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0", "which-pm-runs": "^1.0.0" }, @@ -13833,27 +13905,6 @@ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } } } }, @@ -13950,13 +14001,13 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-ms": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -14158,7 +14209,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14302,7 +14353,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -14492,9 +14543,9 @@ } }, "readline-sync": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.9.tgz", - "integrity": "sha1-PtqOZfI80qF+YTAbHwADOWr17No=", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", "dev": true }, "recursive-copy": { @@ -14957,7 +15008,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -15085,7 +15136,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -15507,12 +15558,12 @@ "dev": true }, "simple-get": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz", - "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", "dev": true, "requires": { - "decompress-response": "^3.3.0", + "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -15926,9 +15977,9 @@ } }, "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -15941,17 +15992,6 @@ "dev": true, "requires": { "sort-keys": "^1.0.0" - }, - "dependencies": { - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } } }, "source-map": { @@ -16526,7 +16566,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -16778,14 +16818,14 @@ "dev": true }, "tar": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", - "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.5", + "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", @@ -16793,33 +16833,56 @@ }, "dependencies": { "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", "dev": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" + "pump": "^3.0.0", + "tar-stream": "^2.0.0" }, "dependencies": { - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "bl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", + "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "readable-stream": "^3.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", + "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "dev": true, + "requires": { + "bl": "^3.0.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" } } } @@ -16945,16 +17008,22 @@ } }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", + "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17173,7 +17242,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -17216,7 +17285,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18192,7 +18261,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "whatwg-encoding": { @@ -18321,7 +18390,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index 915b15d3d6..4c48449d4c 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@11ty/eleventy": "^0.8.3", "@mocha/docdash": "^2.1.2", "acorn": "^7.0.0", - "assetgraph-builder": "^6.10.1", + "assetgraph-builder": "^7.0.0", "autoprefixer": "^9.6.0", "babel-eslint": "^10.0.3", "browserify": "^16.2.3", @@ -110,7 +110,7 @@ "markdown-magic-package-json": "^2.0.0", "markdown-toc": "^1.2.0", "markdownlint-cli": "^0.14.1", - "nps": "^5.9.5", + "nps": "^5.9.12", "nyc": "^14.1.1", "prettier": "^1.17.1", "remark": "^10.0.1", From e1389efd949f57e0ee32c7b52df09d5040464084 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 9 Mar 2020 09:02:54 +0100 Subject: [PATCH 1449/1771] Fix: runner listening to 'start' and 'end' events (#3660) --- lib/runner.js | 4 +++- test/unit/mocha.spec.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index 17fa290432..8e7c8736c0 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -939,7 +939,9 @@ Runner.prototype.run = function(fn) { this.emit(constants.EVENT_DELAY_BEGIN, rootSuite); rootSuite.once(EVENT_ROOT_SUITE_RUN, start); } else { - start(); + Runner.immediately(function() { + start(); + }); } return this; diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 33cd0fdb8e..bc460aa845 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -487,6 +487,16 @@ describe('Mocha', function() { }, 'not to throw'); }); + it('should catch the `start` event if no tests are provided', function(done) { + var mocha = new Mocha(opts); + mocha.run().on('start', done); + }); + + it('should catch the `end` event if no tests are provided', function(done) { + var mocha = new Mocha(opts); + mocha.run().on('end', done); + }); + describe('#reporter("xunit")#run(fn)', function() { // :TBD: Why does specifying reporter differentiate this test from preceding one it('should not raise errors if callback was not provided', function() { From c7f5e882b6ff14f0959340396072379b0319f00c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulises=20Gasc=C3=B3n?= Date: Thu, 12 Mar 2020 15:08:29 +0100 Subject: [PATCH 1450/1771] Drop node.js v8 support (#4164) --- .eslintrc.yml | 4 ++-- .github/CONTRIBUTING.md | 2 +- .travis.yml | 6 ------ appveyor.yml | 1 - docs/README.md | 2 +- docs/index.md | 2 +- package.json | 2 +- 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 96f28ebb9f..34c77cabe4 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -28,7 +28,7 @@ overrides: - test/integration/helpers.js - lib/growl.js parserOptions: - ecmaVersion: 2017 + ecmaVersion: 2018 env: browser: false - files: @@ -83,7 +83,7 @@ overrides: - files: - test/**/*.mjs parserOptions: - ecmaVersion: 2017 + ecmaVersion: 2018 sourceType: module - files: diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 027a7f9647..4614aa046e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -42,7 +42,7 @@ Follow these steps to get going. If you are having trouble, don't be afraid to [ > PRO TIP: After `npm install`, run `npm start` to see a list of commands which can be run with `npm start ` (powered by [nps](https://npm.im/nps)). -1. [Install Node.js 8.x or newer](https://nodejs.org/en/download/). +1. [Install Node.js 10.x or newer](https://nodejs.org/en/download/). - If you're new to installing Node, a tool like [nvm](https://github.com/creationix/nvm#install-script) can help you manage multiple version installations. - You will need [Google Chrome](https://www.google.com/chrome/) to run browser-based tests locally. 1. Follow [Github's documentation](https://help.github.com/articles/fork-a-repo/) on setting up Git, forking and cloning. diff --git a/.travis.yml b/.travis.yml index adc8c5e874..26976b9cd7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,9 +46,6 @@ jobs: - <<: *node node_js: '10' - - <<: *node - node_js: '8' - - script: npm start test.bundle test.browser # XXX: update when canvas supplies a prebuilt binary for Node.js v12.x node_js: 10 @@ -83,9 +80,6 @@ jobs: - <<: *smoke node_js: '10' - - <<: *smoke - node_js: '8' - - stage: precache script: true diff --git a/appveyor.yml b/appveyor.yml index 821ef90349..af8559d76f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,6 @@ environment: - nodejs_version: '13' - nodejs_version: '12' - nodejs_version: '10' - - nodejs_version: '8' matrix: fast_finish: true install: diff --git a/docs/README.md b/docs/README.md index b9f8da6d45..0aeef4d5ca 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ _So you wanna build the site?_ ## Prerequisites -- Node.js v8.x or greater +- Node.js v10.x or greater ## Development diff --git a/docs/index.md b/docs/index.md index 1a67af108a..1ef8793f96 100644 --- a/docs/index.md +++ b/docs/index.md @@ -99,7 +99,7 @@ or as a development dependency for your project: $ npm install --save-dev mocha ``` -> As of v7.0.0, Mocha requires Node.js v8.0.0 or newer. +> As of v8.0.0, Mocha requires Node.js v10.0.0 or newer. ## Getting Started diff --git a/package.json b/package.json index 4c48449d4c..a3de8e44af 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "test": "./test" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 10.0.0" }, "scripts": { "prepublishOnly": "nps test clean build", From 6aeeb33908a5fa8f02e90676273ea40e65d8ddc6 Mon Sep 17 00:00:00 2001 From: kundol Date: Thu, 12 Mar 2020 23:45:27 +0900 Subject: [PATCH 1451/1771] Remove deprecated methods in mocha.js (#4178) Remove following methods and cleanup. - Mocha.prototype.ignoreLeaks - Mocha.prototype.useColors - Mocha.prototype.useInlineDiffs - Mocha.prototype.hideDiff --- lib/mocha.js | 71 ------------------------------- test/jsapi/index.js | 1 - test/unit/mocha.spec.js | 94 ----------------------------------------- 3 files changed, 166 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 740e1fd841..017daa1e2c 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -474,24 +474,6 @@ Mocha.prototype.invert = function() { return this; }; -/** - * Enables or disables ignoring global leaks. - * - * @deprecated since v7.0.0 - * @public - * @see {@link Mocha#checkLeaks} - * @param {boolean} [ignoreLeaks=false] - Whether to ignore global leaks. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.ignoreLeaks = function(ignoreLeaks) { - utils.deprecate( - '"ignoreLeaks()" is DEPRECATED, please use "checkLeaks()" instead.' - ); - this.options.checkLeaks = !ignoreLeaks; - return this; -}; - /** * Enables or disables checking for global variables leaked while running tests. * @@ -589,24 +571,6 @@ Mocha.prototype.global = function(global) { // for backwards compability, 'globals' is an alias of 'global' Mocha.prototype.globals = Mocha.prototype.global; -/** - * Enables or disables TTY color output by screen-oriented reporters. - * - * @deprecated since v7.0.0 - * @public - * @see {@link Mocha#color} - * @param {boolean} colors - Whether to enable color output. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.useColors = function(colors) { - utils.deprecate('"useColors()" is DEPRECATED, please use "color()" instead.'); - if (colors !== undefined) { - this.options.color = colors; - } - return this; -}; - /** * Enables or disables TTY color output by screen-oriented reporters. * @@ -621,25 +585,6 @@ Mocha.prototype.color = function(color) { return this; }; -/** - * Determines if reporter should use inline diffs (rather than +/-) - * in test failure output. - * - * @deprecated since v7.0.0 - * @public - * @see {@link Mocha#inlineDiffs} - * @param {boolean} [inlineDiffs=false] - Whether to use inline diffs. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.useInlineDiffs = function(inlineDiffs) { - utils.deprecate( - '"useInlineDiffs()" is DEPRECATED, please use "inlineDiffs()" instead.' - ); - this.options.inlineDiffs = inlineDiffs !== undefined && inlineDiffs; - return this; -}; - /** * Enables or disables reporter to use inline diffs (rather than +/-) * in test failure output. @@ -655,22 +600,6 @@ Mocha.prototype.inlineDiffs = function(inlineDiffs) { return this; }; -/** - * Determines if reporter should include diffs in test failure output. - * - * @deprecated since v7.0.0 - * @public - * @see {@link Mocha#diff} - * @param {boolean} [hideDiff=false] - Whether to hide diffs. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.hideDiff = function(hideDiff) { - utils.deprecate('"hideDiff()" is DEPRECATED, please use "diff()" instead.'); - this.options.diff = !(hideDiff === true); - return this; -}; - /** * Enables or disables reporter to include diff in test failure output. * diff --git a/test/jsapi/index.js b/test/jsapi/index.js index 231c52fedf..1aa842eb08 100644 --- a/test/jsapi/index.js +++ b/test/jsapi/index.js @@ -5,7 +5,6 @@ var Mocha = require('../../'); var mocha = new Mocha({ ui: 'bdd', globals: ['okGlobalA', 'okGlobalB', 'okGlobalC', 'callback*'], - // ignoreLeaks: true, growl: true }); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index bc460aa845..a317ca7c39 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -332,56 +332,6 @@ describe('Mocha', function() { }); }); - describe('#hideDiff()', function() { - it('should set the diff option to false when param equals true', function() { - var mocha = new Mocha(opts); - mocha.hideDiff(true); - expect(mocha.options, 'to have property', 'diff', false); - }); - - it('should set the diff option to true when param equals false', function() { - var mocha = new Mocha(opts); - mocha.hideDiff(false); - expect(mocha.options, 'to have property', 'diff', true); - }); - - it('should set the diff option to true when the param is undefined', function() { - var mocha = new Mocha(opts); - mocha.hideDiff(); - expect(mocha.options, 'to have property', 'diff', true); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.hideDiff(), 'to be', mocha); - }); - }); - - describe('#ignoreLeaks()', function() { - it('should set the checkLeaks option to false when param equals true', function() { - var mocha = new Mocha(opts); - mocha.ignoreLeaks(true); - expect(mocha.options, 'to have property', 'checkLeaks', false); - }); - - it('should set the checkLeaks option to true when param equals false', function() { - var mocha = new Mocha(opts); - mocha.ignoreLeaks(false); - expect(mocha.options, 'to have property', 'checkLeaks', true); - }); - - it('should set the checkLeaks option to true when the param is undefined', function() { - var mocha = new Mocha(opts); - mocha.ignoreLeaks(); - expect(mocha.options, 'to have property', 'checkLeaks', true); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.ignoreLeaks(), 'to be', mocha); - }); - }); - describe('#inlineDiffs()', function() { it('should set the inlineDiffs option to true', function() { var mocha = new Mocha(opts); @@ -512,48 +462,4 @@ describe('Mocha', function() { }); }); }); - - describe('#useColors()', function() { - it('should set the color option to true', function() { - var mocha = new Mocha(opts); - mocha.useColors(true); - expect(mocha.options, 'to have property', 'color', true); - }); - - it('should not create the color property', function() { - var mocha = new Mocha(opts); - mocha.useColors(); - expect(mocha.options, 'not to have property', 'color'); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.useColors(), 'to be', mocha); - }); - }); - - describe('#useInlineDiffs()', function() { - it('should set the inlineDiffs option to true when param equals true', function() { - var mocha = new Mocha(opts); - mocha.useInlineDiffs(true); - expect(mocha.options, 'to have property', 'inlineDiffs', true); - }); - - it('should set the inlineDiffs option to false when param equals false', function() { - var mocha = new Mocha(opts); - mocha.useInlineDiffs(false); - expect(mocha.options, 'to have property', 'inlineDiffs', false); - }); - - it('should set the inlineDiffs option to false when the param is undefined', function() { - var mocha = new Mocha(opts); - mocha.useInlineDiffs(); - expect(mocha.options, 'to have property', 'inlineDiffs', false); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.useInlineDiffs(), 'to be', mocha); - }); - }); }); From 2f264784d22277efa99244a8615ce2a1830b2d3c Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Thu, 12 Mar 2020 17:20:37 +0100 Subject: [PATCH 1452/1771] Remove configuration via 'mocha.opts' (#4175) --- docs/index.md | 54 +--- example/config/.mocharc.js | 1 - example/config/.mocharc.json | 1 - example/config/.mocharc.jsonc | 1 - example/config/.mocharc.yml | 1 - lib/cli/config.js | 1 - lib/cli/options.js | 89 +------ lib/cli/run-option-metadata.js | 1 - lib/cli/run.js | 14 +- lib/mocharc.json | 1 - package-scripts.js | 11 +- .../fixtures/options/help/test/mocha.opts | 1 - .../fixtures/options/opts.fixture.js | 5 - test/integration/options/help.spec.js | 26 -- test/integration/options/opts.spec.js | 57 +--- test/node-unit/cli/options.spec.js | 245 ++---------------- test/opts/mocha.opts | 10 - test/opts/opts.spec.js | 11 - 18 files changed, 42 insertions(+), 488 deletions(-) delete mode 100644 test/integration/fixtures/options/help/test/mocha.opts delete mode 100644 test/integration/fixtures/options/opts.fixture.js delete mode 100644 test/integration/options/help.spec.js delete mode 100644 test/opts/mocha.opts delete mode 100644 test/opts/opts.spec.js diff --git a/docs/index.md b/docs/index.md index 1ef8793f96..898d8f1de5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -36,7 +36,6 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [auto-exit to prevent "hanging" with an active loop](#-exit) - [easily meta-generate suites](#markdown) & [test-cases](#list) - [config file support](#-config-path) -- [mocha.opts file support](#-opts-path) - clickable suite titles to filter test execution - [node debugger support](#-inspect-inspect-brk-inspect) - [node native ES modules support](#nodejs-native-esm-support) @@ -75,7 +74,6 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [Running Mocha in the Browser](#running-mocha-in-the-browser) - [Desktop Notification Support](#desktop-notification-support) - [Configuring Mocha (Node.js)](#configuring-mocha-nodejs) -- [`mocha.opts`](#mochaopts) - [The `test/` Directory](#the-test-directory) - [Error Codes](#error-codes) - [Editor Plugins](#editor-plugins) @@ -865,8 +863,6 @@ Reporting & Output Configuration --config Path to config file [string] [default: (nearest rc file)] - --opts Path to `mocha.opts` (DEPRECATED) - [string] [default: "./test/mocha.opts"] --package Path to package.json for config [string] File Handling @@ -1070,11 +1066,7 @@ By default, Mocha will search for a config file if `--config` is not specified; ### `--opts ` -> _Deprecated in v7.0.0._ - -Specify a path to [`mocha.opts`](#mochaopts). - -By default, Mocha looks for a `mocha.opts` in `test/mocha.opts`; use `--no-opts` to suppress this behavior. +> _Removed in v8.0.0. Please use [configuration file](#configuring-mocha-nodejs) instead._ ### `--package ` @@ -1738,7 +1730,7 @@ tests as shown below: > _New in v6.0.0_ -In addition to supporting the deprecated [`mocha.opts`](#mochaopts) run-control format, Mocha now supports configuration files, typical of modern command-line tools, in several formats: +Mocha supports configuration files, typical of modern command-line tools, in several formats: - **JavaScript**: Create a `.mocharc.js` (or `mocharc.cjs` when using [`"type"="module"`](#nodejs-native-esm-support) in your `package.json`) in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. @@ -1746,8 +1738,6 @@ In addition to supporting the deprecated [`mocha.opts`](#mochaopts) run-control - **JSON**: Create a `.mocharc.json` (or `.mocharc.jsonc`) in your project's root directory. Comments — while not valid JSON — are allowed in this file, and will be ignored by Mocha. - **package.json**: Create a `mocha` property in your project's `package.json`. -Mocha suggests using one of the above strategies for configuration instead of the deprecated `mocha.opts` format. - ### Custom Locations You can specify a custom location for your configuration file with the `--config ` option. Mocha will use the file's extension to determine how to parse the file, and will assume JSON if unknown. @@ -1770,12 +1760,11 @@ If no custom path was given, and if there are multiple configuration files in th ### Merging -Mocha will also _merge_ any options found in `package.json` _and_ `mocha.opts` into its run-time configuration. In case of conflict, the priority is: +Mocha will also _merge_ any options found in `package.json` into its run-time configuration. In case of conflict, the priority is: 1. Arguments specified on command-line 1. Configuration file (`.mocharc.js`, `.mocharc.yml`, etc.) 1. `mocha` property of `package.json` -1. `mocha.opts` Options which can safely be repeated (e.g., `--require`) will be _concatenated_, with higher-priorty configuration sources appearing earlier in the list. For example, a `.mocharc.json` containing `"require": "bar"`, coupled with execution of `mocha --require foo`, would cause Mocha to require `foo`, then `bar`, in that order. @@ -1790,45 +1779,10 @@ Configurations can inherit from other modules using the `extends` keyword. See [ - For options containing a dash (`-`), the option name can be specified using camelCase. - Aliases are valid names, e.g., `R` instead of `reporter`. - Test files can be specified using `spec`, e.g., `"spec": "test/**/*.spec.js"`. -- Flags to `node` are _also_ supported in configuration files, like in `mocha.opts`. Use caution, as these can vary between versions of Node.js! +- Flags to `node` are _also_ supported in configuration files. Use caution, as these can vary between versions of Node.js! **For more configuration examples, see the [`example/config`][example-mocha-config] directory on GitHub.** -## `mocha.opts` - -> _`mocha.opts` file support is DEPRECATED and will be removed from a future version of Mocha. We recommend using a configuration file instead._ - -Mocha will attempt to load `"./test/mocha.opts"` as a run-control file of sorts. - -Beginning-of-line comment support is available; any line _starting_ with a -hash (`#`) symbol will be considered a comment. Blank lines may also be used. -Any other line will be treated as a command-line argument (along with any -associated option value) to be used as a default setting. Settings should be -specified one per line. - -The lines in this file are prepended to any actual command-line arguments. -As such, actual command-line arguments will take precedence over the defaults. - -For example, suppose you have the following `mocha.opts` file: - -```bash -# mocha.opts - --require should - --reporter dot - --ui bdd -``` - -The settings above will default the reporter to `dot`, require the `should` -library, and use `bdd` as the interface. With this, you may then invoke `mocha` -with additional arguments, here changing the reporter to `list` and setting the -slow threshold to half a second: - -```bash -$ mocha --reporter list --slow 500 -``` - -To ignore your `mocha.opts`, use the `--no-opts` option. - ## The `test/` Directory By default, `mocha` looks for the glob `"./test/*.js"`, so you may want to put diff --git a/example/config/.mocharc.js b/example/config/.mocharc.js index 671520cd53..46d4e9de1b 100644 --- a/example/config/.mocharc.js +++ b/example/config/.mocharc.js @@ -7,7 +7,6 @@ module.exports = { diff: true, extension: ['js'], - opts: false, package: './package.json', reporter: 'spec', slow: 75, diff --git a/example/config/.mocharc.json b/example/config/.mocharc.json index 43a83e6b0f..fd71460f9a 100644 --- a/example/config/.mocharc.json +++ b/example/config/.mocharc.json @@ -5,7 +5,6 @@ { "diff": true, "extension": ["js"], - "opts": false, "package": "./package.json", "reporter": "spec", "slow": 75, diff --git a/example/config/.mocharc.jsonc b/example/config/.mocharc.jsonc index 25a40b6821..590bf09607 100644 --- a/example/config/.mocharc.jsonc +++ b/example/config/.mocharc.jsonc @@ -5,7 +5,6 @@ { "diff": true, "extension": ["js"], - "opts": false, "package": /* 📦 */ "./package.json", "reporter": /* 📋 */ "spec", "slow": 75, diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index 226f8184ca..da5a0a0c4f 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -28,7 +28,6 @@ ignore: inline-diffs: false # needs to be used with grep or fgrep # invert: false -opts: false recursive: false reporter: spec reporter-option: diff --git a/lib/cli/config.js b/lib/cli/config.js index 24de6cd474..1be9f9c4c0 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -2,7 +2,6 @@ /** * Responsible for loading / finding Mocha's "rc" files. - * This doesn't have anything to do with `mocha.opts`. * * @private * @module diff --git a/lib/cli/options.js b/lib/cli/options.js index 9fbc22ca0b..9f9f988e70 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -2,7 +2,7 @@ /** * Main entry point for handling filesystem-based configuration, - * whether that's `mocha.opts` or a config file or `package.json` or whatever. + * whether that's a config file or `package.json` or whatever. * @module */ @@ -15,7 +15,6 @@ const mocharc = require('../mocharc.json'); const {list} = require('./run-helpers'); const {loadConfig, findConfig} = require('./config'); const findUp = require('find-up'); -const {deprecate} = require('../utils'); const debug = require('debug')('mocha:cli:options'); const {isNodeFlag} = require('./node-flags'); @@ -143,71 +142,6 @@ const parse = (args = [], defaultValues = {}, ...configObjects) => { return result.argv; }; -/** - * - Replaces comments with empty strings - * - Replaces escaped spaces (e.g., 'xxx\ yyy') with HTML space - * - Splits on whitespace, creating array of substrings - * - Filters empty string elements from array - * - Replaces any HTML space with space - * @summary Parses options read from run-control file. - * @private - * @param {string} content - Content read from run-control file. - * @returns {string[]} cmdline options (and associated arguments) - * @ignore - */ -const parseMochaOpts = content => - content - .replace(/^#.*$/gm, '') - .replace(/\\\s/g, '%20') - .split(/\s/) - .filter(Boolean) - .map(value => value.replace(/%20/g, ' ')); - -/** - * Given filepath in `args.opts`, attempt to load and parse a `mocha.opts` file. - * @param {Object} [args] - Arguments object - * @param {string|boolean} [args.opts] - Filepath to mocha.opts; defaults to whatever's in `mocharc.opts`, or `false` to skip - * @returns {external:yargsParser.Arguments|void} If read, object containing parsed arguments - * @memberof module:lib/cli/options - * @see {@link /#mochaopts|mocha.opts} - * @public - */ -const loadMochaOpts = (args = {}) => { - let result; - let filepath = args.opts; - // /dev/null is backwards compat - if (filepath === false || filepath === '/dev/null') { - return result; - } - filepath = filepath || mocharc.opts; - result = {}; - let mochaOpts; - try { - mochaOpts = fs.readFileSync(filepath, 'utf8'); - debug(`read ${filepath}`); - } catch (err) { - if (args.opts) { - throw new Error(`Unable to read ${filepath}: ${err}`); - } - // ignore otherwise. we tried - debug(`No mocha.opts found at ${filepath}`); - } - - // real args should override `mocha.opts` which should override defaults. - // if there's an exception to catch here, I'm not sure what it is. - // by attaching the `no-opts` arg, we avoid re-parsing of `mocha.opts`. - if (mochaOpts) { - deprecate( - 'Configuration via mocha.opts is DEPRECATED and will be removed from a future version of Mocha. Use RC files or package.json instead.' - ); - result = parse(parseMochaOpts(mochaOpts)); - debug(`${filepath} parsed succesfully`); - } - return result; -}; - -module.exports.loadMochaOpts = loadMochaOpts; - /** * Given path to config file in `args.config`, attempt to load & parse config file. * @param {Object} [args] - Arguments object @@ -267,11 +201,10 @@ module.exports.loadPkgRc = loadPkgRc; * 1. Command-line args * 2. RC file (`.mocharc.c?js`, `.mocharc.ya?ml`, `mocharc.json`) * 3. `mocha` prop of `package.json` - * 4. `mocha.opts` - * 5. default configuration (`lib/mocharc.json`) + * 4. default configuration (`lib/mocharc.json`) * * If a {@link module:lib/cli/one-and-dones.ONE_AND_DONE_ARGS "one-and-done" option} is present in the `argv` array, no external config files will be read. - * @summary Parses options read from `mocha.opts`, `.mocharc.*` and `package.json`. + * @summary Parses options read from `.mocharc.*` and `package.json`. * @param {string|string[]} [argv] - Arguments to parse * @public * @memberof module:lib/cli/options @@ -279,7 +212,7 @@ module.exports.loadPkgRc = loadPkgRc; */ const loadOptions = (argv = []) => { let args = parse(argv); - // short-circuit: look for a flag that would abort loading of mocha.opts + // short-circuit: look for a flag that would abort loading of options if ( Array.from(ONE_AND_DONE_ARGS).reduce( (acc, arg) => acc || arg in args, @@ -291,7 +224,6 @@ const loadOptions = (argv = []) => { const rcConfig = loadRc(args); const pkgConfig = loadPkgRc(args); - const optsConfig = loadMochaOpts(args); if (rcConfig) { args.config = false; @@ -301,19 +233,8 @@ const loadOptions = (argv = []) => { args.package = false; args._ = args._.concat(pkgConfig._ || []); } - if (optsConfig) { - args.opts = false; - args._ = args._.concat(optsConfig._ || []); - } - args = parse( - args._, - mocharc, - args, - rcConfig || {}, - pkgConfig || {}, - optsConfig || {} - ); + args = parse(args._, mocharc, args, rcConfig || {}, pkgConfig || {}); // recombine positional arguments and "spec" if (args.spec) { diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index d0bc92ffbe..4648d9fbfe 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -51,7 +51,6 @@ exports.types = { 'config', 'fgrep', 'grep', - 'opts', 'package', 'reporter', 'ui', diff --git a/lib/cli/run.js b/lib/cli/run.js index 014227d569..d024cbb0f2 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -163,13 +163,6 @@ exports.builder = yargs => group: GROUPS.OUTPUT, hidden: true }, - opts: { - default: defaults.opts, - description: 'Path to `mocha.opts` (DEPRECATED)', - group: GROUPS.CONFIG, - normalize: true, - requiresArg: true - }, package: { description: 'Path to package.json for config', group: GROUPS.CONFIG, @@ -285,6 +278,13 @@ exports.builder = yargs => ); } + if (argv.opts) { + throw createUnsupportedError( + `--opts: configuring Mocha via 'mocha.opts' is DEPRECATED and no longer supported. + Please use a configuration file instead.` + ); + } + // load requires first, because it can impact "plugin" validation handleRequires(argv.require); validatePlugin(argv, 'reporter', Mocha.reporters); diff --git a/lib/mocharc.json b/lib/mocharc.json index 1ed9157675..51c3fce6a0 100644 --- a/lib/mocharc.json +++ b/lib/mocharc.json @@ -1,7 +1,6 @@ { "diff": true, "extension": ["js", "cjs", "mjs"], - "opts": "./test/mocha.opts", "package": "./package.json", "reporter": "spec", "slow": 75, diff --git a/package-scripts.js b/package-scripts.js index a94de98e40..5e0b1736ef 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -80,8 +80,7 @@ module.exports = { 'test.node.jsapi', 'test.node.requires', 'test.node.reporters', - 'test.node.only', - 'test.node.opts' + 'test.node.only' ].join(' ')}`, description: 'Run Node.js tests' }, @@ -120,14 +119,6 @@ module.exports = { description: 'Run Node.js integration tests', hiddenFromHelp: true }, - opts: { - script: test( - 'opts', - '--opts test/opts/mocha.opts test/opts/opts.spec.js --no-config' - ), - description: 'Run tests concerning mocha.opts', - hiddenFromHelp: true - }, jsapi: { script: 'node test/jsapi', description: 'Run Node.js Mocha JavaScript API tests', diff --git a/test/integration/fixtures/options/help/test/mocha.opts b/test/integration/fixtures/options/help/test/mocha.opts deleted file mode 100644 index 257cc5642c..0000000000 --- a/test/integration/fixtures/options/help/test/mocha.opts +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/test/integration/fixtures/options/opts.fixture.js b/test/integration/fixtures/options/opts.fixture.js deleted file mode 100644 index 359dc1302b..0000000000 --- a/test/integration/fixtures/options/opts.fixture.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -describe('opts', function () { - it('should display this spec', function () {}); -}); diff --git a/test/integration/options/help.spec.js b/test/integration/options/help.spec.js deleted file mode 100644 index fe182bce95..0000000000 --- a/test/integration/options/help.spec.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -var path = require('path'); -var helpers = require('../helpers'); -var invokeMocha = helpers.invokeMocha; - -describe('--help', function() { - it('should work despite the presence of "mocha.opts"', function(done) { - var args = ['-h']; - // :NOTE: Must use platform-specific `path.join` for `spawnOpts.cwd` - var fixtureDir = path.join(__dirname, '..', 'fixtures', 'options', 'help'); - var spawnOpts = {cwd: fixtureDir}; - - invokeMocha( - args, - function(err, res) { - if (err) { - return done(err); - } - expect(res.output, 'to contain', 'Run tests with Mocha'); - done(); - }, - spawnOpts - ); - }); -}); diff --git a/test/integration/options/opts.spec.js b/test/integration/options/opts.spec.js index e3d98581ed..30b129f316 100644 --- a/test/integration/options/opts.spec.js +++ b/test/integration/options/opts.spec.js @@ -1,64 +1,23 @@ 'use strict'; -var path = require('path').posix; -var helpers = require('../helpers'); -var runMochaJSON = helpers.runMochaJSON; -var invokeMocha = helpers.invokeMocha; -var resolvePath = helpers.resolveFixturePath; +var invokeMocha = require('../helpers').invokeMocha; describe('--opts', function() { - var args = []; - var fixture = path.join('options', 'opts'); - - it('should print a deprecation warning', function(done) { - var mochaOpts = path.join('test', 'opts', 'mocha.opts'); - args = [resolvePath(fixture), '--opts', mochaOpts]; + it('should report deprecation', function(done) { invokeMocha( - args, + ['--opts', './test/mocha.opts'], function(err, res) { if (err) { return done(err); } - - expect(res, 'to have passed'); - expect(res.output, 'to contain', 'mocha.opts is DEPRECATED'); + expect( + res, + 'to have failed with output', + /'mocha.opts' is DEPRECATED/i + ); done(); }, 'pipe' ); }); - - it('should work despite nonexistent default options file', function(done) { - args = []; - runMochaJSON(fixture, args, function(err, res) { - if (err) { - return done(err); - } - - expect(res, 'to have passed').and('to have passed test count', 1); - done(); - }); - }); - - it('should throw an error due to nonexistent options file', function(done) { - var spawnOpts = {stdio: 'pipe'}; - var nonexistentFile = 'nosuchoptionsfile'; - args = ['--opts', nonexistentFile, resolvePath(fixture)]; - invokeMocha( - args, - function(err, res) { - if (err) { - return done(err); - } - - var pattern = 'unable to read ' + nonexistentFile; - expect(res, 'to satisfy', { - code: 1, - output: new RegExp(pattern, 'i') - }); - done(); - }, - spawnOpts - ); - }); }); diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 84723bafda..d60de8e268 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -27,7 +27,6 @@ const defaults = { timeout: 1000, timeouts: 1000, t: 1000, - opts: '/default/path/to/mocha.opts', extension: ['js'] }; @@ -54,8 +53,7 @@ describe('options', function() { * 1. Command-line args * 2. RC file (`.mocharc.js`, `.mocharc.ya?ml`, `mocharc.json`) * 3. `mocha` prop of `package.json` - * 4. `mocha.opts` - * 5. default rc + * 4. default rc */ describe('loadOptions()', function() { describe('when no parameter provided', function() { @@ -63,7 +61,6 @@ describe('options', function() { this.timeout(500); readFileSync = sandbox.stub(); readFileSync.onFirstCall().returns('{}'); - readFileSync.onSecondCall().returns('--retries 3'); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub().returns('/some/package.json'); @@ -83,192 +80,13 @@ describe('options', function() { Object.assign({}, defaults, { _: [], config: false, - opts: false, - package: false, - retries: '3' + package: false }) ); }); }); describe('when parameter provided', function() { - describe('mocha.opts', function() { - describe('when path to mocha.opts (`--opts `) is invalid', function() { - describe('when path is not default', function() { - let opts; - - beforeEach(function() { - opts = '/some/other/path/to/mocha.opts'; - readFileSync = sandbox.stub(); - readFileSync.onFirstCall().returns('{}'); - readFileSync.onSecondCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); - - loadOptions = proxyLoadOptions({ - readFileSync, - findConfig, - loadConfig, - findupSync - }); - }); - - it('should attempt to load file at path', function() { - try { - loadOptions(`--opts ${opts}`); - } catch (ignored) {} - expect(readFileSync, 'to have a call satisfying', [opts, 'utf8']); - }); - - it('should throw', function() { - expect( - () => { - loadOptions(`--opts ${opts}`); - }, - 'to throw', - /unable to read/i - ); - }); - }); - - describe('when path to mocha.opts is unspecified', function() { - let result; - - beforeEach(function() { - readFileSync = sandbox.stub(); - readFileSync.onFirstCall().returns('{}'); - readFileSync.onSecondCall().returns('{}'); - readFileSync.onThirdCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); - - loadOptions = proxyLoadOptions({ - readFileSync, - findConfig, - loadConfig, - findupSync - }); - - result = loadOptions(); - }); - - it('should attempt to load default mocha.opts', function() { - expect(readFileSync, 'to have a call satisfying', [ - defaults.opts, - 'utf8' - ]); - }); - - it('should set opts = false', function() { - expect(result, 'to have property', 'opts', false); - }); - }); - }); - - describe('when path to mocha.opts (`--opts `) is valid', function() { - let result; - beforeEach(function() { - const filepath = '/path/to/mocha.opts'; - readFileSync = sandbox.stub(); - // package.json - readFileSync.onFirstCall().throws(); - // mocha.opts - readFileSync.onSecondCall().returns('--retries 3 foobar.spec.js'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); - loadOptions = proxyLoadOptions({ - readFileSync, - findConfig, - loadConfig, - findupSync - }); - result = loadOptions(['--opts', filepath]); - }); - - it('should return merged options incl. mocha.opts', function() { - expect( - result, - 'to equal', - Object.assign( - { - _: ['foobar.spec.js'] - }, - defaults, - { - config: false, - opts: false, - package: false, - retries: '3' - } - ) - ); - }); - - it('should have attempted to load two files', function() { - expect(readFileSync, 'was called times', 2).and( - 'to have calls satisfying', - [ - {args: ['/some/package.json', 'utf8']}, - {args: ['/path/to/mocha.opts', 'utf8']} - ] - ); - }); - - it('should set opts = false', function() { - expect(result, 'to have property', 'opts', false); - }); - }); - - describe('when called with opts = false (`--no-opts`)', function() { - let result; - beforeEach(function() { - readFileSync = sandbox - .stub() - .returns('{"mocha": {"check-leaks": false}}'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({retries: 3}); - findupSync = sandbox.stub().returns('/some/package.json'); - - loadOptions = proxyLoadOptions({ - readFileSync, - findConfig, - loadConfig, - findupSync - }); - - result = loadOptions('--no-opts'); - }); - - it('should return parsed args, default config, config file, and package.json', function() { - expect( - result, - 'to equal', - Object.assign({_: []}, defaults, { - 'check-leaks': false, - config: false, - opts: false, - package: false, - retries: 3 - }) - ); - }); - - it('should not attempt to read any mocha.opts', function() { - expect(readFileSync, 'was called times', 1).and( - 'to have all calls satisfying', - ['/some/package.json', 'utf8'] - ); - }); - - it('should set opts = false', function() { - expect(result, 'to have property', 'opts', false); - }); - }); - }); - describe('package.json', function() { describe('when path to package.json (`--package `) is valid', function() { let result; @@ -278,8 +96,6 @@ describe('options', function() { readFileSync = sandbox.stub(); // package.json readFileSync.onFirstCall().returns('{"mocha": {"retries": 3}}'); - // mocha.opts - readFileSync.onSecondCall().throws(); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub(); @@ -303,7 +119,6 @@ describe('options', function() { defaults, { config: false, - opts: false, package: false, retries: 3 } @@ -325,8 +140,6 @@ describe('options', function() { readFileSync = sandbox.stub(); // package.json readFileSync.onFirstCall().throws('yikes'); - // mocha.opts - readFileSync.onSecondCall().throws(); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub(); @@ -359,8 +172,6 @@ describe('options', function() { readFileSync .onFirstCall() .returns('{"mocha": {"retries": 3, "_": ["foobar.spec.js"]}}'); - // mocha.opts - readFileSync.onSecondCall().throws(); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub().returns(filepath); @@ -384,7 +195,6 @@ describe('options', function() { defaults, { config: false, - opts: false, package: false, retries: 3 } @@ -401,8 +211,7 @@ describe('options', function() { let result; beforeEach(function() { readFileSync = sandbox.stub(); - - readFileSync.onFirstCall().returns('--retries 3'); + readFileSync.onFirstCall().returns('{}'); findConfig = sandbox.stub().returns('/some/path/to/.mocharc.json'); loadConfig = sandbox.stub().returns({'check-leaks': true}); findupSync = sandbox.stub().returns('/some/package.json'); @@ -414,19 +223,18 @@ describe('options', function() { findupSync }); - result = loadOptions('--no-package'); + result = loadOptions('--no-diff --no-package'); }); - it('should return parsed args, default config, package.json and mocha.opts', function() { + it('should return parsed args and default config', function() { expect( result, 'to equal', Object.assign({_: []}, defaults, { + diff: false, 'check-leaks': true, config: false, - opts: false, - package: false, - retries: '3' + package: false }) ); }); @@ -451,7 +259,6 @@ describe('options', function() { .returns( '{"mocha": {"check-leaks": true, "_": ["foobar.spec.js"]}}' ); - readFileSync.onSecondCall().returns('--retries 3 foobar.spec.js'); findConfig = sandbox.stub(); loadConfig = sandbox.stub(); findupSync = sandbox.stub().returns('/some/package.json'); @@ -463,19 +270,18 @@ describe('options', function() { findupSync }); - result = loadOptions('--no-config'); + result = loadOptions('--no-diff --no-config'); }); - it('should return parsed args, default config, package.json and mocha.opts', function() { + it('should return parsed args, default config and package.json', function() { expect( result, 'to equal', Object.assign({_: ['foobar.spec.js']}, defaults, { + diff: false, 'check-leaks': true, config: false, - opts: false, - package: false, - retries: '3' + package: false }) ); }); @@ -500,7 +306,6 @@ describe('options', function() { readFileSync = sandbox.stub(); config = '/some/.mocharc.json'; readFileSync.onFirstCall().returns('{}'); - readFileSync.onSecondCall().returns('--retries 3'); findConfig = sandbox.stub(); loadConfig = sandbox.stub().throws('Error', 'failed to parse'); findupSync = sandbox.stub().returns('/some/package.json'); @@ -613,30 +418,13 @@ describe('options', function() { }); describe('config priority', function() { - it('should prioritize mocha.opts over defaults', function() { - readFileSync = sandbox.stub(); - readFileSync.onFirstCall().returns('{}'); - readFileSync.onSecondCall().returns('--timeout 800 --require foo'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); - - loadOptions = proxyLoadOptions({ - readFileSync, - findConfig, - loadConfig, - findupSync - }); - - expect(loadOptions(), 'to satisfy', {timeout: '800', require: ['foo']}); - }); - - it('should prioritize package.json over mocha.opts', function() { + it('should prioritize package.json over defaults', function() { readFileSync = sandbox.stub(); readFileSync .onFirstCall() - .returns('{"mocha": {"timeout": 700, "require": "bar"}}'); - readFileSync.onSecondCall().returns('--timeout 800 --require foo'); + .returns( + '{"mocha": {"timeout": 700, "require": "bar", "extension": "ts"}}' + ); findConfig = sandbox.stub().returns('/some/.mocharc.json'); loadConfig = sandbox.stub().returns({}); findupSync = sandbox.stub().returns('/some/package.json'); @@ -650,7 +438,8 @@ describe('options', function() { expect(loadOptions(), 'to satisfy', { timeout: 700, - require: ['bar', 'foo'] + require: ['bar'], + extension: ['ts'] }); }); diff --git a/test/opts/mocha.opts b/test/opts/mocha.opts deleted file mode 100644 index c212a5b0d3..0000000000 --- a/test/opts/mocha.opts +++ /dev/null @@ -1,10 +0,0 @@ -### -### mocha.opts -### - ---require test/setup ---ui bdd ---globals okGlobalA,okGlobalB ---globals okGlobalC ---globals callback* ---timeout 300 diff --git a/test/opts/opts.spec.js b/test/opts/opts.spec.js deleted file mode 100644 index 74860421a8..0000000000 --- a/test/opts/opts.spec.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -// as of this writing we're using a config file instead of mocha.opts, -// so to run this test, we must use `--opts test/opts/mocha.opts` -// and `--no-config`. -describe('--opts', function() { - it('should use options present in test `mocha.opts`', function() { - // this will fail if config file was used and/or mocha.opts didn't load. - expect(this.timeout(), 'to be', 300); - }); -}); From dfaa65440789ec16fcbcdf6437ca0f5d20873686 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 18 Mar 2020 08:42:17 +0100 Subject: [PATCH 1453/1771] security: update mkdirp, yargs, yargs-parser (#4204) --- package-lock.json | 137 +++++++++++++++++++++------------------------- package.json | 6 +- 2 files changed, 64 insertions(+), 79 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb8de65cb1..28f68e8da8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1359,7 +1359,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1371,7 +1371,7 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, @@ -1973,7 +1973,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -2138,7 +2138,7 @@ }, "brfs": { "version": "1.6.1", - "resolved": "http://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, "requires": { @@ -2397,7 +2397,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2419,7 +2419,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -3184,7 +3184,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3327,7 +3327,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -3338,7 +3337,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -3349,7 +3347,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -3898,7 +3895,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, "cross-env": { @@ -5483,7 +5480,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5886,7 +5883,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6530,13 +6527,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -7431,7 +7428,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7651,7 +7648,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7992,7 +7989,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -9220,7 +9217,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -10445,7 +10442,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -10607,7 +10604,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10628,7 +10625,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10911,7 +10908,7 @@ }, "magic-string": { "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { @@ -11077,7 +11074,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -11160,7 +11157,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -11470,7 +11467,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11532,8 +11529,9 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minipass": { "version": "2.9.0", @@ -11590,11 +11588,18 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } } }, "module-definition": { @@ -11790,7 +11795,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11892,7 +11897,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -12491,7 +12496,7 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -12653,7 +12658,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -13025,7 +13030,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -13195,7 +13200,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13797,7 +13802,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -14001,13 +14006,13 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-ms": { "version": "0.2.2", - "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -14209,7 +14214,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -15008,7 +15013,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -15136,7 +15141,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -16566,7 +16571,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -17242,7 +17247,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -17285,7 +17290,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18261,7 +18266,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-encoding": { @@ -18390,7 +18395,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -18551,9 +18556,9 @@ "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -18564,19 +18569,9 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" }, "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -18596,23 +18591,13 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } } } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index a3de8e44af..00f72a330f 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "js-yaml": "3.13.1", "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.3", "ms": "2.1.1", "node-environment-flags": "1.0.6", "object.assign": "4.1.0", @@ -64,8 +64,8 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "devDependencies": { From c1a8adb1caa5093b05020762a7ab8e1a119a6990 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 18 Mar 2020 11:11:04 +0100 Subject: [PATCH 1454/1771] update CHANGELOG for v7.1.1 [ci skip] --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf0b4e8cc..8c2f86a222 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# 7.1.1 / 2020-03-18 + +## :lock: Security Fixes + +- [#4204](https://github.com/mochajs/mocha/issues/4204): Update dependencies mkdirp, yargs-parser and yargs ([**@juergba**](https://github.com/juergba)) + +## :bug: Fixes + +- [#3660](https://github.com/mochajs/mocha/issues/3660): Fix `runner` listening to `start` and `end` events ([**@juergba**](https://github.com/juergba)) + +## :book: Documentation + +- [#4190](https://github.com/mochajs/mocha/issues/4190): Show Netlify badge on footer ([**@outsideris**](https://github.com/outsideris)) + # 7.1.0 / 2020-02-26 ## :tada: Enhancements From f87825a2e7ed2af79c0393cfd76bd73edebcc1d9 Mon Sep 17 00:00:00 2001 From: HYUNSANG HAN Date: Thu, 19 Mar 2020 18:38:47 +0900 Subject: [PATCH 1455/1771] Drop mkdirp and replace it with fs.mkdirSync (#4200) - Replace mkdirp with fs.mkdirSync using {recursive: true} - Drop the dependency mkdirp from Mocha - Fix version number of docs and package.json --- .github/CONTRIBUTING.md | 2 +- docs/README.md | 2 +- docs/index.md | 2 +- karma.conf.js | 3 +-- lib/cli/init.js | 3 +-- lib/reporters/xunit.js | 5 +++-- package-lock.json | 10 +++++----- package.json | 3 +-- test/integration/file-utils.spec.js | 3 +-- test/reporters/xunit.spec.js | 13 +++++++++---- 10 files changed, 24 insertions(+), 22 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4614aa046e..2d7b5e5f85 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -42,7 +42,7 @@ Follow these steps to get going. If you are having trouble, don't be afraid to [ > PRO TIP: After `npm install`, run `npm start` to see a list of commands which can be run with `npm start ` (powered by [nps](https://npm.im/nps)). -1. [Install Node.js 10.x or newer](https://nodejs.org/en/download/). +1. [Install Node.js 10.12.0 or newer](https://nodejs.org/en/download/). - If you're new to installing Node, a tool like [nvm](https://github.com/creationix/nvm#install-script) can help you manage multiple version installations. - You will need [Google Chrome](https://www.google.com/chrome/) to run browser-based tests locally. 1. Follow [Github's documentation](https://help.github.com/articles/fork-a-repo/) on setting up Git, forking and cloning. diff --git a/docs/README.md b/docs/README.md index 0aeef4d5ca..ab083fe29d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ _So you wanna build the site?_ ## Prerequisites -- Node.js v10.x or greater +- Node.js v10.12.0 or greater ## Development diff --git a/docs/index.md b/docs/index.md index 898d8f1de5..aeaa1c318c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -97,7 +97,7 @@ or as a development dependency for your project: $ npm install --save-dev mocha ``` -> As of v8.0.0, Mocha requires Node.js v10.0.0 or newer. +> As of v8.0.0, Mocha requires Node.js v10.12.0 or newer. ## Getting Started diff --git a/karma.conf.js b/karma.conf.js index ae84d7d830..9337e3d3b8 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,7 +2,6 @@ const fs = require('fs'); const path = require('path'); -const mkdirp = require('mkdirp'); const os = require('os'); const baseBundleDirpath = path.join(__dirname, '.karma'); @@ -111,7 +110,7 @@ module.exports = config => { console.error('No SauceLabs credentials present'); } } - mkdirp.sync(bundleDirpath); + fs.mkdirSync(bundleDirpath, {recursive: true}); } else { console.error('CI mode disabled'); } diff --git a/lib/cli/init.js b/lib/cli/init.js index ca847c6f1e..3847aff86c 100644 --- a/lib/cli/init.js +++ b/lib/cli/init.js @@ -9,7 +9,6 @@ const fs = require('fs'); const path = require('path'); -const mkdirp = require('mkdirp'); exports.command = 'init '; @@ -24,7 +23,7 @@ exports.builder = yargs => exports.handler = argv => { const destdir = argv.path; const srcdir = path.join(__dirname, '..', '..'); - mkdirp.sync(destdir); + fs.mkdirSync(destdir, {recursive: true}); const css = fs.readFileSync(path.join(srcdir, 'mocha.css')); const js = fs.readFileSync(path.join(srcdir, 'mocha.js')); const tmpl = fs.readFileSync( diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index da366cdaa1..a690ac5343 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -9,7 +9,6 @@ var Base = require('./base'); var utils = require('../utils'); var fs = require('fs'); -var mkdirp = require('mkdirp'); var path = require('path'); var errors = require('../errors'); var createUnsupportedError = errors.createUnsupportedError; @@ -62,7 +61,9 @@ function XUnit(runner, options) { throw createUnsupportedError('file output not supported in browser'); } - mkdirp.sync(path.dirname(options.reporterOptions.output)); + fs.mkdirSync(path.dirname(options.reporterOptions.output), { + recursive: true + }); self.fileStream = fs.createWriteStream(options.reporterOptions.output); } diff --git a/package-lock.json b/package-lock.json index 28f68e8da8..b2533ca949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -702,7 +702,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "arch": { @@ -2227,7 +2227,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" }, "browser-sync": { "version": "2.26.7", @@ -4739,7 +4739,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" }, "diffie-hellman": { "version": "5.0.3", @@ -7359,7 +7359,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -12084,7 +12084,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", diff --git a/package.json b/package.json index 00f72a330f..1863e87622 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "test": "./test" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 10.12.0" }, "scripts": { "prepublishOnly": "nps test clean build", @@ -56,7 +56,6 @@ "js-yaml": "3.13.1", "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.3", "ms": "2.1.1", "node-environment-flags": "1.0.6", "object.assign": "4.1.0", diff --git a/test/integration/file-utils.spec.js b/test/integration/file-utils.spec.js index 0b5b2e92fe..8c48e4a826 100644 --- a/test/integration/file-utils.spec.js +++ b/test/integration/file-utils.spec.js @@ -4,7 +4,6 @@ var utils = require('../../lib/utils'); var fs = require('fs'); var path = require('path'); var os = require('os'); -var mkdirp = require('mkdirp'); var rimraf = require('rimraf'); describe('file utils', function() { @@ -119,7 +118,7 @@ describe('file utils', function() { afterEach(removeTempDir); function makeTempDir() { - mkdirp.sync(tmpDir); + fs.mkdirSync(tmpDir, {recursive: true}); } function removeTempDir() { diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 736f9d1112..323db703a9 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -4,7 +4,6 @@ var EventEmitter = require('events').EventEmitter; var fs = require('fs'); var os = require('os'); var path = require('path'); -var mkdirp = require('mkdirp'); var rimraf = require('rimraf'); var sinon = require('sinon'); var createStatsCollector = require('../../lib/stats-collector'); @@ -51,12 +50,12 @@ describe('XUnit reporter', function() { }; describe('when fileStream can be created', function() { - var mkdirpSync; + var fsMkdirSync; var fsCreateWriteStream; beforeEach(function() { sandbox = sinon.createSandbox(); - mkdirpSync = sandbox.stub(mkdirp, 'sync'); + fsMkdirSync = sandbox.stub(fs, 'mkdirSync'); fsCreateWriteStream = sandbox.stub(fs, 'createWriteStream'); }); @@ -67,7 +66,13 @@ describe('XUnit reporter', function() { XUnit.call(fakeThis, runner, options); var expectedDirectory = path.dirname(expectedOutput); - expect(mkdirpSync.calledWith(expectedDirectory), 'to be true'); + expect( + fsMkdirSync.calledWith(expectedDirectory, { + recursive: true + }), + 'to be true' + ); + expect(fsCreateWriteStream.calledWith(expectedOutput), 'to be true'); }); From 6320d3df4df7368d784f4b6b511e06d036370dfe Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 18 Mar 2020 12:42:01 -0700 Subject: [PATCH 1456/1771] add wallaby logo to bottom of site --- docs/_includes/default.html | 16 +++++++++++++++- docs/css/style.css | 18 ++++++++++++++++++ docs/images/wallaby-logo.png | Bin 0 -> 578 bytes 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 docs/images/wallaby-logo.png diff --git a/docs/_includes/default.html b/docs/_includes/default.html index 7e3a29f000..cdef5c2276 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.html @@ -31,7 +31,11 @@

              {{ content }}
              diff --git a/docs/css/style.css b/docs/css/style.css index 60bca37af4..d4b0ab8600 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -231,6 +231,7 @@ img.screenshot { .sponsorship a { padding: 0 40px; + text-decoration: none; } footer { @@ -301,6 +302,23 @@ blockquote { padding: 10px; } +figure#wallaby-logo { + vertical-align: top; + display: inline-block; + text-align: center; +} +figure#wallaby-logo figcaption { + margin-top: 10px; + display: block; + font-family: 'Open Sans', -apple-system, system-ui, 'Segoe UI', Oxygen, Ubuntu, + Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-weight: 400; + letter-spacing: 2px; + text-transform: uppercase; + color: #2c2c2c; + -webkit-font-smoothing: antialiased; +} + @media all and (max-width: 960px) { #copyright-notice { max-width: initial; diff --git a/docs/images/wallaby-logo.png b/docs/images/wallaby-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c29bb19aaad307c8ed76d4cffddbdad5e2cbe790 GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fEX7WqAsj$Z!;#Vf4nJ zD9r+4#(j5xYXJo%OI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kz!zA-0$h) z7*a9k?G;Df1_uEaN50kt3@S~B4l~>Qa-7<9a@pqOb2~rWt9;M*<6sp3gZnHVUJXlz pHgT*lceC8V`kzDHAK+M!Gce@%z3yw literal 0 HcmV?d00001 From 0e77e4178f7dd39ec75eda6b0c2b77a138f9fa45 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 23 Mar 2020 07:39:26 +0100 Subject: [PATCH 1457/1771] Update devDependencies and Travis (#4211) * update devDependencies * fix linting error * .lintstagedrc.json: advanced to simple format * travis: run browser tests with Node v12 --- .lintstagedrc.json | 12 +- .travis.yml | 3 +- package-lock.json | 15974 +++++++++++++++++++------------------- package.json | 75 +- test/unit/utils.spec.js | 6 +- 5 files changed, 7999 insertions(+), 8071 deletions(-) diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 14dcdd9302..8535d17cd1 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,10 +1,6 @@ { - "linters": { - "(bin/*|*.js|**/*.js)": ["eslint --fix", "git add"], - "(*.{json,yml,md,html}|**/*.{json,yml,md,html})": [ - "prettier --write", - "git add" - ] - }, - "ignore": ["docs/**/*.js", "test/**/*.fixture.js", "package*.json"] + "*.js": ["eslint --fix", "git add"], + "bin/*": ["eslint --fix", "git add"], + "!(package*).json": ["prettier --write", "git add"], + "*.{yml,md,html}": ["prettier --write", "git add"] } diff --git a/.travis.yml b/.travis.yml index 26976b9cd7..a3874504dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,8 +47,7 @@ jobs: node_js: '10' - script: npm start test.bundle test.browser - # XXX: update when canvas supplies a prebuilt binary for Node.js v12.x - node_js: 10 + node_js: 12 install: npm ci # we need the native modules here addons: artifacts: diff --git a/package-lock.json b/package-lock.json index b2533ca949..1adbb9218a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,66 +4,103 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@11ty/dependency-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-1.0.0.tgz", + "integrity": "sha512-2FWYlkphQ/83MG7b9qqBJfJJ0K9zupNz/6n4EdDuNLw6hQHGp4Sp4UMDRyBvA/xCTYDBaPSuSjHuu45tSujegg==", + "dev": true + }, "@11ty/eleventy": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.8.3.tgz", - "integrity": "sha512-TehjvEuVQaocz3R/rYMJdujg8a2SL4Wt+ZUPKfXZS926Wd14JqLpWtR/dTNPOh3JzAovZDNrOpFmwN3/urX6gQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.10.0.tgz", + "integrity": "sha512-GOgG5ZvFfdJ4fMDlF+OHLQyvwu4cDkCdE8U0x/cfKze2Bu+27htaJ7qW8XbaGArySlBvYGhJD/z8vjdn/+hpLw==", "dev": true, "requires": { - "browser-sync": "^2.26.3", - "chalk": "^2.4.2", - "chokidar": "^2.1.5", + "@11ty/dependency-tree": "^1.0.0", + "browser-sync": "^2.26.7", + "chalk": "^3.0.0", + "chokidar": "^3.3.1", "debug": "^4.1.1", - "dependency-graph": "^0.8.0", - "dependency-tree": "^6.3.0", - "ejs": "^2.6.1", - "fast-glob": "^2.2.6", - "fs-extra": "^7.0.1", + "dependency-graph": "^0.8.1", + "ejs": "^2.6.2", + "fast-glob": "^3.1.1", + "fs-extra": "^8.1.0", "gray-matter": "^4.0.2", "hamljs": "^0.6.2", - "handlebars": "^4.1.1", - "javascript-stringify": "^2.0.0", + "handlebars": "^4.5.3", + "javascript-stringify": "^2.0.1", "liquidjs": "^6.4.3", - "lodash": "^4.17.11", - "luxon": "^1.12.0", + "lodash": "^4.17.15", + "luxon": "^1.21.3", "markdown-it": "^8.4.2", "minimist": "^1.2.0", - "moo": "^0.5.0", - "multimatch": "^3.0.0", + "moo": "^0.5.1", + "multimatch": "^4.0.0", "mustache": "^2.3.0", "normalize-path": "^3.0.0", "nunjucks": "^3.2.0", "parse-filepath": "^1.0.2", - "please-upgrade-node": "^3.1.1", + "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", - "pug": "^2.0.3", + "pug": "^2.0.4", "recursive-copy": "^2.0.10", - "semver": "^6.0.0", - "slugify": "^1.3.4", + "semver": "^7.1.0", + "slugify": "^1.3.6", "time-require": "^0.1.2", "valid-url": "^1.0.9" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -74,24 +111,21 @@ } }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -102,153 +136,282 @@ "graceful-fs": "^4.1.6" } }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } }, "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.0.tgz", + "integrity": "sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.2.tgz", + "integrity": "sha512-2jyvKdoOS1aWAFL2rjJZmamyDDkPCx/AAz4/Wh1Dfxvw8qqnOvek/ZlHQ2noO/o8JpnXa/WiUUFOv48meBKkpA==", "dev": true }, "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true } } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - } + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -261,13 +424,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" }, "dependencies": { @@ -279,6 +442,66 @@ } } }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@mocha/docdash": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.2.tgz", @@ -288,22 +511,41 @@ "taffydb": "^2.7.3" } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@munter/tap-render": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@munter/tap-render/-/tap-render-0.2.0.tgz", + "integrity": "sha512-m6xHJ6MhWBj2+BmxmRmdLas6P6yvrsThoRsOsrnZkTbJq9yPgxilqCGxKrPO9sFrsj9of5keUlLw5PkEjEj5kQ==", + "dev": true, + "requires": { + "pause-stream": "0.0.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -320,33 +562,42 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz", + "integrity": "sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", "dev": true, "requires": { "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "@sinonjs/samsam": "^5.0.2" } }, "@sinonjs/samsam": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", - "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { @@ -370,10 +621,39 @@ "@types/babel-types": "*" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/node": { - "version": "10.12.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.29.tgz", - "integrity": "sha512-J/tnbnj8HcsBgCe2apZbdUpQ7hs4d7oZNTYA5bekWdP0sr2NGsOpI/HRdDroEi209tEvTcTtxhD0FfED3DhEcw==", + "version": "13.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.2.tgz", + "integrity": "sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg==", "dev": true }, "@types/normalize-package-data": { @@ -382,6 +662,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", @@ -394,27 +680,6 @@ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", "dev": true }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*" - } - }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -432,9 +697,9 @@ "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, "abbrev": { @@ -444,25 +709,19 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true }, "acorn-globals": { @@ -483,41 +742,46 @@ } }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "acorn-node": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", - "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, "requires": { - "acorn": "^6.0.2", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.0", - "xtend": "^4.0.1" + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true } } }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "adm-zip": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", - "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", "dev": true }, "after": { @@ -554,12 +818,12 @@ } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -576,6 +840,12 @@ "repeat-string": "^1.5.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -593,13 +863,6 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - }, "animated-gif-detector": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/animated-gif-detector/-/animated-gif-detector-1.2.0.tgz", @@ -624,10 +887,21 @@ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-red": { "version": "0.1.1", @@ -664,45 +938,27 @@ "dev": true }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", - "dev": true - }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^3.0.0" } }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "arch": { @@ -789,9 +1045,9 @@ } }, "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true }, "array-equal": { @@ -800,24 +1056,12 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, "array-includes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", @@ -827,91 +1071,14 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.0", "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, "array-parallel": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", "integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=", "dev": true }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, "array-series": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", @@ -919,13 +1086,10 @@ "dev": true }, "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, "array-uniq": { "version": "1.0.3", @@ -947,71 +1111,6 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } } }, "arraybuffer.slice": { @@ -1033,9 +1132,9 @@ "dev": true }, "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, "asap": { @@ -1065,11 +1164,12 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -1103,9 +1203,9 @@ "dev": true }, "assetgraph": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.0.tgz", - "integrity": "sha512-dkankzD4TU1MRk+q76s9HyDftzGO8bKk0DSlCICZLnsbkITQYhaqnSnnrMN69NgBGNB9MM4anDrESWe+IVEOcQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.5.tgz", + "integrity": "sha512-t+S7aDhjxY7c/s/PX2Tz17R8rDorsMVZTSlPnUXClpnbet8R+xTNrZ47hoES7yAZ9MsgXkBKmV6TT4giYyXhOw==", "dev": true, "requires": { "acorn": "^7.0.0", @@ -1147,23 +1247,10 @@ "urltools": "^0.4.1" }, "dependencies": { - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "find-up": { @@ -1258,20 +1345,21 @@ } }, "assetgraph-builder": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-7.0.0.tgz", - "integrity": "sha512-XhMhugz5H4WT7Tw0DAKoIgjmEfzcHJvgfXOlugaiLj9W/7zKhn2PqdrCmAyEm8WBKmPxRTfzb0ONTOH02KKwSQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-8.0.0.tgz", + "integrity": "sha512-hOSgIhWtWLOVeKTWkvjpF1IUBKBnAz6bECX/8K1yEA+NvTkZFdlgf07z5SHpdCzCy4f7U7coDJiXu8TrFBdevA==", "dev": true, "requires": { - "assetgraph": "6.0.0", + "assetgraph": "6.0.5", "assetgraph-sprite": "^3.0.1", "browserslist": "^4.4.2", - "chalk": "^2.3.2", + "chalk": "^3.0.0", "esanimate": "^1.1.0", "estraverse": "^4.2.0", - "express-processimage": "^8.1.0", + "express-processimage": "^9.0.2", "extend": "^3.0.0", "histogram": "^3.0.1", + "impro": "~0.6.1", "jpegtran": "^1.0.6", "lodash": "^4.14.1", "memoizesync": "^1.1.1", @@ -1284,13 +1372,54 @@ "urltools": "^0.4.1" }, "dependencies": { - "p-map": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -1310,71 +1439,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-module-types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.5.0.tgz", - "integrity": "sha512-dP6vhvatex3Q+OThhvcyGRvHn4noQBg1b8lCNKUAFL05up80hr2pAExveU3YQNDGMhfNPhQit/vzIkkvBPbSXw==", - "dev": true - }, - "ast-transform": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", - "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", - "dev": true, - "requires": { - "escodegen": "~1.2.0", - "esprima": "~1.0.4", - "through": "~2.3.4" - }, - "dependencies": { - "escodegen": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", - "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", - "dev": true, - "requires": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.30" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", - "dev": true - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "ast-types": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", - "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", - "dev": true - }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -1388,9 +1452,9 @@ "dev": true }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-each-series": { @@ -1400,9 +1464,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -1411,6 +1475,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -1427,46 +1497,18 @@ } }, "autoprefixer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", - "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", "dev": true, "requires": { - "browserslist": "^4.6.1", - "caniuse-lite": "^1.0.30000971", + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.16", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" } }, "aws-sign2": { @@ -1476,9 +1518,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "axios": { @@ -1489,39 +1531,20 @@ "requires": { "follow-redirects": "1.5.10", "is-buffer": "^2.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } } }, "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } } }, "babel-runtime": { @@ -1559,9 +1582,9 @@ "dev": true }, "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "dev": true }, "balanced-match": { @@ -1631,9 +1654,9 @@ "dev": true }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "base64id": { @@ -1677,27 +1700,49 @@ "execa": "^0.7.0", "p-map-series": "^1.0.0", "tempfile": "^2.0.0" + } + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + } + }, + "bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" }, "dependencies": { "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -1706,67 +1751,16 @@ } }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } } } }, - "bin-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "executable": "^4.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "bin-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", - "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "find-versions": "^3.0.0" - } - }, "bin-version-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", @@ -1835,12 +1829,6 @@ "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -1934,19 +1922,9 @@ } }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, "bl": { "version": "1.2.2", @@ -1965,9 +1943,9 @@ "dev": true }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "bn.js": { @@ -1994,12 +1972,6 @@ "type-is": "~1.6.17" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2022,14 +1994,11 @@ "toidentifier": "1.0.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ms": { "version": "2.0.0", @@ -2055,12 +2024,6 @@ "unpipe": "1.0.0" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -2108,56 +2071,11 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "fill-range": "^7.0.1" } }, "brorand": { @@ -2166,15 +2084,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", - "dev": true, - "requires": { - "base64-js": "^1.1.2" - } - }, "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", @@ -2202,9 +2111,9 @@ } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-resolve": { @@ -2227,7 +2136,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browser-sync": { "version": "2.26.7", @@ -2273,6 +2182,51 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -2310,962 +2264,628 @@ "wrap-ansi": "^2.0.0" } }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "lcid": "^1.0.0" + "is-extendable": "^0.1.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, - "strip-ansi": { + "fs-extra": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", - "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.1.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "dev": true, + "optional": true, "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "browser-sync-client": { - "version": "2.26.6", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", - "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6" - } - }, - "browser-sync-ui": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", - "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^2.0.4", - "stream-throttle": "^0.1.3" - } - }, - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", - "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", - "dev": true, - "requires": { - "ast-transform": "0.0.0", - "ast-types": "^0.7.0", - "browser-resolve": "^1.8.1" - } - }, - "browserify-package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", - "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=", - "dev": true - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - }, - "dependencies": { - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - } - } - }, - "browserslist": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", - "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000971", - "electron-to-chromium": "^1.3.137", - "node-releases": "^1.1.21" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "dev": true, - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.1.0.tgz", - "integrity": "sha512-WP9f9OBL/TAbwOFBJL79FoS9UKUmnp82RWnhlwTgrAJeMq7lytHhe0Jzc6/P7Zq0+2oviXJuPlvkZalWUug9gg==" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "canvas": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", - "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", - "dev": true, - "requires": { - "nan": "^2.14.0", - "node-pre-gyp": "^0.11.0", - "simple-get": "^3.0.3" - }, - "dependencies": { - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - } - } - }, - "capitalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-2.0.0.tgz", - "integrity": "sha512-HwGrAbSn44Tm5Nz+m02oQHf+9y771rmb/cTbXFcoADy29LFRCj4PhWBT54qxfY2HJBWBplwx17Pd4ek6OFbr/Q==", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "catharsis": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } - } - }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "dev": true, - "requires": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" - } - }, - "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", - "dev": true - }, - "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", - "dev": true - }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "requires": { - "is-regex": "^1.0.3" - } - }, - "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "requires": { - "picomatch": "^2.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } - } - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-fullwidth-code-point": { @@ -3277,10 +2897,39 @@ "number-is-nan": "^1.0.0" } }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "string-width": { @@ -3302,2664 +2951,2480 @@ "requires": { "ansi-regex": "^2.0.0" } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true - } - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "dev": true - }, - "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "browser-sync-client": { + "version": "2.26.6", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", + "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", + "dev": true, "requires": { - "color-name": "1.1.3" + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" } }, - "color-diff": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", - "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", - "dev": true - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "browser-sync-ui": { + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", + "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", "dev": true, "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" } }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "browserify": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", "dev": true, "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } } } }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "comment-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/comment-regex/-/comment-regex-1.0.1.tgz", - "integrity": "sha512-IWlN//Yfby92tOIje7J18HkNmWRR7JESA/BK8W7wqY/akITpU5B0JQWnbTjCfdChSrDNb0DrdA9jfAxiiBXyiQ==", - "dev": true - }, - "common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=", - "dev": true - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "commondir": { + "browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-module-exports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", - "integrity": "sha512-3Lc0sTIuX1jmY2K2RrXRJOND6KsRTX2D4v3+eu1PDptsuJZVK4LZc852eZa9I+avj0NrUKlTNgqvccNOH6mbGg==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "browserify-package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", + "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=", + "dev": true + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "pako": "~1.0.5" } }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "browserslist": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", "dev": true, "requires": { - "date-now": "^0.1.4" + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", "dev": true }, - "console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", "dev": true }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "dev": true, "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "coveralls": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", - "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", "dev": true, "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.86.0" + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } } } }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "dependencies": { "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } } } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "createerror": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", - "dev": true - }, - "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "callsites": "^2.0.0" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "caller-callsite": "^2.0.0" } }, - "crypto-random-string": { + "callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, - "css-font-parser-papandreou": { - "version": "0.2.3-patch1", - "resolved": "https://registry.npmjs.org/css-font-parser-papandreou/-/css-font-parser-papandreou-0.2.3-patch1.tgz", - "integrity": "sha512-yVhlQDjEppcS9a91xPs1x7u3IYNb2HPfTXxsFoNW2Kr2ilqWOqhxpfBxS42yzo1FCu0IGg1vbt8aag9fChCwmA==", - "dev": true - }, - "css-font-weight-names": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/css-font-weight-names/-/css-font-weight-names-0.2.1.tgz", - "integrity": "sha1-VxDUha0pX2s/HO7EH4guMkpGtRY=", - "dev": true - }, - "css-list-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-list-helpers/-/css-list-helpers-2.0.0.tgz", - "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==", - "dev": true + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } } }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", - "dev": true - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "caniuse-lite": { + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", "dev": true }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "canvas": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", + "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" + "requires": { + "nan": "^2.14.0", + "node-pre-gyp": "^0.11.0", + "simple-get": "^3.0.3" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dev": true, "requires": { - "postcss": "^7.0.0" + "lodash": "^4.17.14" } }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" } }, - "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "ccount": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", "dev": true }, - "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "cssom": "0.3.x" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "is-regex": "^1.0.3" } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "date-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", - "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "requires": { - "ms": "^2.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "mimic-response": "^2.0.0" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" + "restore-cursor": "^3.1.0" } }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", "dev": true, "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" }, "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } } } }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", "dev": true, + "optional": true, "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" } }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" } } } }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "type-detect": "^4.0.0" + "mimic-response": "^1.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + } } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", "dev": true }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "color-name": "1.1.3" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "color-diff": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", + "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", "dev": true }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "dependency-graph": { + "combine-source-map": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", - "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", - "dev": true - }, - "dependency-tree": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-6.5.0.tgz", - "integrity": "sha512-r0KO5BkQy8sMbyTD8NxSDOexsySbGpSH5fIsxCLZjarFTXMryiZoR7+Ao6OWkwLz6OeQPYCOIjUDh+knWitMEw==", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { - "commander": "^2.19.0", - "debug": "^4.1.1", - "filing-cabinet": "^2.3.0", - "precinct": "^5.3.1" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true } } }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "combine-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/combine-stream/-/combine-stream-0.0.4.tgz", + "integrity": "sha1-NNGbwooVABr3h1Qkrydos2oF3R0=", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" + "readable-stream": "~1.1.9" }, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "delayed-stream": "~1.0.0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "comment-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/comment-regex/-/comment-regex-1.0.1.tgz", + "integrity": "sha512-IWlN//Yfby92tOIje7J18HkNmWRR7JESA/BK8W7wqY/akITpU5B0JQWnbTjCfdChSrDNb0DrdA9jfAxiiBXyiQ==", "dev": true }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } + "common-path-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", + "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=", + "dev": true }, - "detective-amd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.0.0.tgz", - "integrity": "sha512-kOpKHyabdSKF9kj7PqYHLeHPw+TJT8q2u48tZYMkIcas28el1CYeLEJ42Nm+563/Fq060T5WknfwDhdX9+kkBQ==", - "dev": true, - "requires": { - "ast-module-types": "^2.3.1", - "escodegen": "^1.8.0", - "get-amd-module-type": "^3.0.0", - "node-source-walk": "^4.0.0" - } + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true }, - "detective-cjs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.1.tgz", - "integrity": "sha512-JQtNTBgFY6h8uT6pgph5QpV3IyxDv+z3qPk/FZRDT9TlFfm5dnRtpH39WtQEr1khqsUxVqXzKjZHpdoQvQbllg==", - "dev": true, - "requires": { - "ast-module-types": "^2.4.0", - "node-source-walk": "^4.0.0" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, - "detective-es6": { + "compare-module-exports": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.1.0.tgz", - "integrity": "sha512-QSHqKGOp/YBIfmIqKXaXeq2rlL+bp3bcIQMfZ+0PvKzRlELSOSZxKRvpxVcxlLuocQv4QnOfuWGniGrmPbz8MQ==", + "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", + "integrity": "sha512-3Lc0sTIuX1jmY2K2RrXRJOND6KsRTX2D4v3+eu1PDptsuJZVK4LZc852eZa9I+avj0NrUKlTNgqvccNOH6mbGg==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "node-source-walk": "^4.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "detective-less": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", - "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", "dev": true, "requires": { - "debug": "^4.0.0", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" + "source-map": "^0.6.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "detective-postcss": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-3.0.1.tgz", - "integrity": "sha512-tfTS2GdpUal5NY0aCqI4dpEy8Xfr88AehYKB0iBIZvo8y2g3UsrcDnrp9PR2FbzoW7xD5Rip3NJW7eCSvtqdUw==", + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", "dev": true, "requires": { - "debug": "^4.1.1", - "is-url": "^1.2.4", - "postcss": "^7.0.2", - "postcss-values-parser": "^1.5.0" + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "ms": "^2.1.1" + "is-buffer": "^1.1.5" } } } }, - "detective-sass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.1.tgz", - "integrity": "sha512-oSbrBozRjJ+QFF4WJFbjPQKeakoaY1GiR380NPqwdbWYd5wfl5cLWv0l6LsJVqrgWfFN1bjFqSeo32Nxza8Lbw==", + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "requires": { - "debug": "^4.1.1", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "is-obj": "^1.0.0" } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true } } }, - "detective-scss": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.1.tgz", - "integrity": "sha512-VveyXW4WQE04s05KlJ8K0bG34jtHQVgTc9InspqoQxvnelj/rdgSAy7i2DXAazyQNFKlWSWbS+Ro2DWKFOKTPQ==", + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { - "debug": "^4.1.1", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "detective-stylus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.0.tgz", - "integrity": "sha1-UK7n24uruZA4HwEMY/q7pbWOVM0=", + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, - "detective-typescript": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-4.1.2.tgz", - "integrity": "sha512-jeQMIN/0hjMdMpFGoo9y+ibo+dTb1Vbg6z/peHoRMR69jqH691kgz1gT5XM5UfkDD/Ru0save1bSJBmUr2yjvQ==", - "dev": true, - "requires": { - "node-source-walk": "^4.0.0", - "typescript": "^3.0.3", - "typescript-eslint-parser": "^18.0.0" - } - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "dfa": { + "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.1.0.tgz", - "integrity": "sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E=", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true + }, + "constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", "dev": true, "requires": { - "babel-runtime": "^6.11.6" + "@types/babel-types": "^7.0.0", + "@types/babylon": "^6.16.2", + "babel-types": "^6.26.0", + "babylon": "^6.18.0" } }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "diacritics-map": { + "contains-path": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", - "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "safe-buffer": "5.1.2" } }, - "dnserrors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/dnserrors/-/dnserrors-2.1.2.tgz", - "integrity": "sha1-/r/K6yJWCO0Zbs9Be67vBU+3lNA=", - "dev": true, - "requires": { - "createerror": "^1.2.0", - "httperrors": "^2.2.0", - "lodash.defaults": "^4.2.0", - "lodash.omit": "^4.5.0" - } + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "esutils": "^2.0.2" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } } }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "coveralls": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.11.tgz", + "integrity": "sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ==", "dev": true, "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.0" } }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, - "dom-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", - "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "urijs": "^1.16.1" + "capture-stack-trace": "^1.0.0" } }, - "domain-browser": { + "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "domspace": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/domspace/-/domspace-1.2.1.tgz", - "integrity": "sha512-cJlfxdCJydO6Fpx0H4wy1z0NGoFMDPcy8u/wS+rMeIQSGQhnK9xpjl9mFRfB7bkRF2hiFbgzoS+VvU9vdWAN0w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "createerror": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "dev": true + }, + "cross-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "cross-spawn": "^7.0.0" } }, - "download": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "caw": "^2.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.0.0", - "ext-name": "^5.0.0", - "file-type": "5.2.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^7.0.0", - "make-dir": "^1.0.0", - "p-event": "^1.0.0", - "pify": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "dependencies": { - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "shebang-regex": "^3.0.0" } }, - "get-stream": { + "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "isexe": "^2.0.0" } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true } } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true }, - "eazy-logger": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", - "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "tfunk": "^3.0.1" + "postcss": "^7.0.1", + "timsort": "^0.3.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" } }, - "emitter-mixin": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz", - "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw=", + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", "dev": true }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", "dev": true, "requires": { - "once": "^1.4.0" + "css-tree": "1.0.0-alpha.37" } }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "cssom": "~0.3.6" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } } } }, - "engine.io-client": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - } + "array-find-index": "^1.0.1" } }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "assert-plus": "^1.0.0" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, + "date-time": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", + "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "prr": "~1.0.1" + "ms": "^2.1.1" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" } }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "mimic-response": "^2.0.0" } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" } }, - "es6-error": { + "decompress-tarbz2": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" } }, - "esanimate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esanimate/-/esanimate-1.1.0.tgz", - "integrity": "sha1-5xcSttiyuy5tXUCmOSp7+cfCCFc=", + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", "dev": true, "requires": { - "escodegen": "^1.7.0", - "esprima": "^2.6.0" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } } } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "strip-bom": "^4.0.0" }, "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "kind-of": "^6.0.0" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "kind-of": "^6.0.0" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", - "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - }, - "dependencies": { - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true } } }, - "eslint-config-semistandard": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", - "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", - "dev": true - }, - "eslint-config-standard": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", - "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "ms": "2.0.0" + "glob": "^7.1.3" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, - "eslint-module-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", - "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.1.tgz", + "integrity": "sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw==", + "dev": true + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", "dev": true, "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "ms": "2.0.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, - "eslint-plugin-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - } + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "eslint-plugin-import": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", - "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", - "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-finite": "^1.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + } + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } }, - "eslint-plugin-node": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", - "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", + "dnserrors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/dnserrors/-/dnserrors-2.1.2.tgz", + "integrity": "sha1-/r/K6yJWCO0Zbs9Be67vBU+3lNA=", "dev": true, "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" + "createerror": "^1.2.0", + "httperrors": "^2.2.0", + "lodash.defaults": "^4.2.0", + "lodash.omit": "^4.5.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", + "dev": true + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true }, - "resolve": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", - "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } }, - "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "dom-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "urijs": "^1.16.1" } }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "eslint-plugin-standard": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", - "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "webidl-conversions": "^4.0.2" } }, - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "domspace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/domspace/-/domspace-1.2.2.tgz", + "integrity": "sha512-wonvpGbed9PlcvQ0xfb0ov8QoKR9Tk7GiIGrOto6ykPdAtmtQXFBUS10Ifm/1srPkrvcOB4Hsexb/Okt7CeOwg==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "dom-serializer": "0", + "domelementtype": "1" } }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" }, "dependencies": { - "acorn": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "got": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true }, - "espurify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.0.1.tgz", - "integrity": "sha512-7w/dUrReI/QbJFHRwfomTlkQOXaB1NuCrBRn5Y26HXn5gvh18/19AgLbayVrNxXQfkckvgrJloWyvZDuJ7dhEA==", + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "^3.0.1" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "estraverse": "^4.0.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "estraverse-fb": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.2.tgz", - "integrity": "sha1-0yOky15awzHOoDNBOpJT4WQ+B8Q=", + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "electron-to-chromium": { + "version": "1.3.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", + "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", "dev": true }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "emitter-mixin": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz", + "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw=", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "pify": "^2.2.0" + "once": "^1.4.0" } }, - "exif-reader-paras20xx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exif-reader-paras20xx/-/exif-reader-paras20xx-1.1.1.tgz", - "integrity": "sha1-+oFNSNoyDmAq+rge8ZsRp9aMctM=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, "ms": { @@ -5967,465 +5432,448 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "express-processimage": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-8.1.0.tgz", - "integrity": "sha512-jOg7kaokQyppQTBYhyzofyqbDqO3VI/HFew0CeIpWBVyH0by0zi0xWj8PLty+riWmgCIKr40K3uh73Ytv+PROw==", + "engine.io-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", "dev": true, "requires": { - "accepts": "^1.3.3", - "animated-gif-detector": "^1.2.0", - "bluebird": "^3.3.4", - "createerror": "^1.1.0", - "exif-reader-paras20xx": "^1.1.1", - "gm-papandreou": "^1.23.0-patch1", - "hijackresponse": "^4.0.0", - "httperrors": "^2.0.1", - "icc": "^1.0.0", - "inkscape": "^2.0.0", - "jpegtran": "^1.0.6", - "mime": "^2.3.1", - "optimist": "^0.6.1", - "optipng": "^2.0.0", - "passerror": "^1.1.1", - "pngcrush": "^2.0.1", - "pngquant": "^2.0.1", - "sharp": "^0.21.0", - "underscore": "^1.8.3" + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" }, "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "pngquant": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-2.0.1.tgz", - "integrity": "sha512-van2S2ZJwr8lCH+LJtRWsi3Mz1b8xJd2ZvLtUMzpsD8EqW12fIZN7ZczQpDcArKlXJE97TunL+PeIxXP6uBt5w==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "memoizeasync": "1.1.0", - "pngquant-bin": "^5.0.2", - "which": "1.3.1" + "ms": "^2.1.1" } } } }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", "dev": true, "requires": { - "mime-db": "^1.28.0" + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" + "prr": "~1.0.1" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "es6-promise": "^4.0.3" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "esanimate": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esanimate/-/esanimate-1.1.1.tgz", + "integrity": "sha512-fIrM3uC3tgv3Vz6HuSOUmB/YtEcQ7PVMCHyl+r13KirqTQhigraedKzrBzNMcz1QieZ476K0AnMHEN/Ei1LDVQ==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "escodegen": "^1.11.1", + "esprima": "^4.0.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "optional": true } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "ms": "^2.1.1" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ansi-regex": "^4.1.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "eslint-config-prettier": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", + "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", "dev": true, "requires": { - "acorn": "^5.0.0", - "foreach": "^2.0.5", - "isarray": "0.0.1", - "object-keys": "^1.0.6" + "get-stdin": "^6.0.0" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true } } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "eslint-config-semistandard": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", + "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", "dev": true }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "eslint-config-standard": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", "dev": true }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" + "debug": "^2.6.9", + "resolve": "^1.13.1" }, "dependencies": { - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-exists-dazinatorfork": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/file-exists-dazinatorfork/-/file-exists-dazinatorfork-1.0.2.tgz", - "integrity": "sha512-r70c72ln2YHzQINNfxDp02hAhbGkt1HffZ+Du8oetWDLjDtFja/Lm10lUaSh9e+wD+7VDvPee0b0C9SAy8pWZg==", - "dev": true - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true - }, - "filenamify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "filing-cabinet": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-2.3.3.tgz", - "integrity": "sha512-Lp9FNBm74UnZI/0tVcH8WlJZmnYf9/qImt1/VUaEj3rlBl+V7M5yVAzYPJ7X1T2WxQeCrSQN4jN64SlQa6Rbew==", + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", "dev": true, "requires": { - "app-module-path": "^2.2.0", - "commander": "^2.13.0", - "debug": "^4.1.1", - "enhanced-resolve": "^4.1.0", - "is-relative-path": "^1.0.2", - "module-definition": "^3.0.0", - "module-lookup-amd": "^6.1.0", - "resolve": "^1.11.1", - "resolve-dependency-path": "^2.0.0", - "sass-lookup": "^3.0.0", - "stylus-lookup": "^3.0.1", - "typescript": "^3.0.3" + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "eslint-visitor-keys": "^1.1.0" } + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true } } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "eslint-plugin-import": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -6434,7 +5882,54 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "ms": { @@ -6442,924 +5937,1046 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - } - } - }, - "find": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", - "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", - "dev": true, - "requires": { - "traverse-chain": "~0.1.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "p-try": "^1.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true } } }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "dev": true, - "requires": { - "semver-regex": "^2.0.0" - } - }, - "findup": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", - "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "eslint-plugin-node": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", + "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", "dev": true, "requires": { - "colors": "~0.6.0-1", - "commander": "~2.1.0" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "commander": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", - "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "eslint-plugin-prettier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "prettier-linter-helpers": "^1.0.0" } }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", "dev": true }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "dev": true }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "font-family-papandreou": { - "version": "0.2.0-patch1", - "resolved": "https://registry.npmjs.org/font-family-papandreou/-/font-family-papandreou-0.2.0-patch1.tgz", - "integrity": "sha512-l6WMbeh7+Zd4TTu3yUUPR5KOepiuGLd/QAPfTIoX8ipTko0IF7PU6dsM4YM2zCDToEPIPSyCBKEJnKlSdYMgaA==", - "dev": true - }, - "font-snapper": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/font-snapper/-/font-snapper-1.0.0.tgz", - "integrity": "sha512-8E91ADLNoLIXZGGRDuuK13SWPVbbxIwVkcIcvEoQdEpP13U20bOVXXrur4VxUff3pMImrot7cM/9vN0LwiJ32w==", + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { - "css-font-weight-names": "^0.2.1", - "font-family-papandreou": "^0.2.0-patch1" + "eslint-visitor-keys": "^1.1.0" } }, - "font-tracer": { + "eslint-visitor-keys": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/font-tracer/-/font-tracer-1.1.0.tgz", - "integrity": "sha512-IfLwFnWbOE0sAmPXzpq8aFyaJzbZniMkM7d5X6GvJG+p8InEmeJFAoZzCDrx67iPWtcifUwxAE/xVu4og8+w/w==", - "dev": true, - "requires": { - "capitalize": "^2.0.0", - "css-font-weight-names": "^0.2.1", - "postcss-values-parser": "^2.0.1", - "specificity": "^0.4.1" - }, - "dependencies": { - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "fontkit": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz", - "integrity": "sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ==", - "dev": true, - "requires": { - "babel-runtime": "^6.11.6", - "brfs": "^1.4.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.0", - "clone": "^1.0.1", - "deep-equal": "^1.0.0", - "dfa": "^1.0.0", - "restructure": "^0.5.3", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.0.0", - "unicode-trie": "^0.3.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "espurify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.0.1.tgz", + "integrity": "sha512-7w/dUrReI/QbJFHRwfomTlkQOXaB1NuCrBRn5Y26HXn5gvh18/19AgLbayVrNxXQfkckvgrJloWyvZDuJ7dhEA==", "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "esquery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "estraverse": "^4.0.0" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "estraverse": "^4.1.0" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "estraverse-fb": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.2.tgz", + "integrity": "sha1-0yOky15awzHOoDNBOpJT4WQ+B8Q=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "null-check": "^1.0.0" + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", "dev": true }, - "fs-copy-file-sync": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", - "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==", + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", "dev": true }, - "fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, "requires": { - "minipass": "^2.6.0" + "pify": "^2.2.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "exif-reader": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz", + "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==", + "dev": true }, - "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "ms": "2.0.0" } }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "optional": true, "requires": { - "minimatch": "^3.0.4" + "is-descriptor": "^0.1.0" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "is-extendable": "^0.1.0" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, - "optional": true + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "kind-of": "^3.0.2" } }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, - "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "isarray": "1.0.0" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express-processimage": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-9.0.2.tgz", + "integrity": "sha512-PODsr6rL5JCB5uppytmwHDerK3QW41qMPk1DmlZOkKRYB7wgrXX3FwA2UqG13ENzGHGY1fApXtw5VZA7HA2Few==", + "dev": true, + "requires": { + "accepts": "^1.3.3", + "animated-gif-detector": "^1.2.0", + "bluebird": "^3.3.4", + "createerror": "^1.1.0", + "exif-reader": "^1.0.2", + "gm-papandreou": "^1.23.0-patch1", + "hijackresponse": "^4.0.0", + "httperrors": "^2.0.1", + "icc": "^1.0.0", + "impro": "~0.6.0", + "inkscape": "^2.0.0", + "jpegtran": "^1.0.6", + "mime": "^2.3.1", + "optimist": "^0.6.1", + "optipng": "^2.0.0", + "passerror": "^1.1.1", + "pngcrush": "^2.0.1", + "pngquant": "^3.0.0", + "sharp": "^0.23.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "is-plain-object": "^2.0.4" } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "is-descriptor": "^1.0.0" } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "minimist": "0.0.8" + "is-extendable": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "bundled": true, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, - "optional": true + "requires": { + "kind-of": "^6.0.0" + } }, - "needle": { - "version": "2.2.4", - "bundled": true, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, - "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "kind-of": "^6.0.0" } }, - "node-pre-gyp": { - "version": "0.10.3", - "bundled": true, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "ms": "2.0.0" } }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "p-locate": "^4.1.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "semver": "^6.0.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "p-limit": "^2.2.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, - "rc": { - "version": "1.2.8", - "bundled": true, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "find-up": "^4.0.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + } + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, - "optional": true, "requires": { "glob": "^7.1.3" } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, - "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "ms": "2.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true } } }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7367,17 +6984,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - } - }, "gather-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", @@ -7437,15 +7043,11 @@ } } }, - "get-amd-module-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz", - "integrity": "sha512-99Q7COuACPfVt18zH9N4VAMyb81S6TUgJm2NgV6ERtkh9VIkAaByZkW530wl3lLN5KTtSrK9jVLxYsoP5hQKsw==", - "dev": true, - "requires": { - "ast-module-types": "^2.3.2", - "node-source-walk": "^4.0.0" - } + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true }, "get-assigned-identifiers": { "version": "1.2.0", @@ -7454,10 +7056,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -7466,9 +7067,9 @@ "dev": true }, "get-own-enumerable-property-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", - "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, "get-proxy": { @@ -7487,13 +7088,10 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "get-value": { "version": "2.0.6", @@ -7536,21 +7134,13 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -7561,9 +7151,9 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globby": { @@ -7578,6 +7168,23 @@ "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } } }, "gm-papandreou": { @@ -7609,29 +7216,12 @@ "dev": true, "requires": { "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "gonzales-pe": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.4.tgz", - "integrity": "sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==", - "dev": true, - "requires": { - "minimist": "1.1.x" - }, - "dependencies": { - "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", - "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } @@ -7663,20 +7253,12 @@ "timed-out": "^4.0.0", "unzip-response": "^2.0.1", "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "graceful-readlink": { @@ -7738,9 +7320,9 @@ "dev": true }, "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7805,14 +7387,6 @@ "dev": true, "requires": { "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } } }, "has-color": { @@ -7839,9 +7413,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "has-to-string-tag-x": { "version": "1.4.1", @@ -7879,6 +7453,32 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -7911,12 +7511,27 @@ } }, "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", "dev": true, "requires": { - "is-stream": "^1.0.1" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "hat": { @@ -7963,9 +7578,15 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hreftypes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hreftypes/-/hreftypes-1.0.1.tgz", + "integrity": "sha512-zBoWrxmo6oyIvWtaHyLkIaZdFg27Zz8NETanUWfgIWWEkaXAutATUx4jP+dkqtV+G0Y7sMiAE7LZ3BVMLzLjNA==", "dev": true }, "hsl-regex": { @@ -7995,6 +7616,12 @@ "whatwg-encoding": "^1.0.1" } }, + "html-escaper": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", + "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", + "dev": true + }, "html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -8008,32 +7635,6 @@ "param-case": "^2.1.1", "relateurl": "^0.2.7", "uglify-js": "^3.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - } - } - } } }, "htmlescape": { @@ -8080,12 +7681,6 @@ "toidentifier": "1.0.0" }, "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -8145,9 +7740,9 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", "dev": true, "requires": { "agent-base": "^4.3.0", @@ -8155,218 +7750,77 @@ } }, "husky": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", - "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.7", - "execa": "^1.0.0", - "find-up": "^3.0.0", - "get-stdin": "^6.0.0", - "is-ci": "^2.0.0", - "pkg-dir": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "read-pkg": "^4.0.1", - "run-node": "^1.0.0", - "slash": "^2.0.0" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" }, "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "slash": { + "ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "hyperlink": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.3.1.tgz", - "integrity": "sha512-IVo2B4k0ITQTgOf095qF2+ye5ZMC4F6N06yipBYClQ+wSI6vMT+GisoASP620zdYdxqge12cA0tSbs/GXFUtkw==", - "dev": true, - "requires": { - "assetgraph": "^5.12.0", - "async": "^3.1.0", - "optimist": "^0.6.1", - "pretty-bytes": "^5.2.0", - "request": "^2.88.0", - "tap-render": "github:Munter/tap-render#0.1.7-patch4", - "urltools": "^0.4.1" - }, - "dependencies": { - "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "acorn-globals": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", - "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - } - } - }, - "assetgraph": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-5.12.0.tgz", - "integrity": "sha512-w1ZQlYGFcjpE8jbSuE/+rWTq5xKvMWnR/WcYmtwFIYqyq9Ts7x6n3Hn8D7nDK5PT7rvO6DGnzI5Jguad97CD/w==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.1", - "bluebird": "^3.5.1", - "chalk": "^2.0.1", - "common-path-prefix": "^1.0.0", - "createerror": "^1.3.0", - "css-font-parser-papandreou": "^0.2.3-patch1", - "css-font-weight-names": "0.2.1", - "css-list-helpers": "2.0.0", - "cssnano": "^4.1.10", - "data-urls": "^1.0.0", - "domspace": "^1.2.1", - "esanimate": "^1.1.0", - "escodegen": "^1.12.0", - "espurify": "^2.0.1", - "estraverse": "^4.3.0", - "estraverse-fb": "^1.3.2", - "font-family-papandreou": "^0.2.0-patch1", - "font-snapper": "^1.0.0", - "font-tracer": "^1.1.0", - "fontkit": "^1.7.7", - "gettemporaryfilepath": "^1.0.0", - "glob": "^7.0.5", - "html-minifier": "^4.0.0", - "imageinfo": "^1.0.4", - "jsdom": "^15.0.0", - "lines-and-columns": "^1.1.6", - "lodash": "4.17.15", - "memoizesync": "1.1.1", - "mkdirp": "^0.5.1", - "normalizeurl": "^1.0.0", - "perfectionist": "^2.4.0", - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.0", - "read-pkg-up": "^6.0.0", - "repeat-string": "^1.5.4", - "schemes": "^1.0.1", - "semver": "^6.0.0", - "sift": "^7.0.1", - "source-map": "~0.6.1", - "specificity": "^0.4.0", - "sw-precache": "^5.2.0", - "teepee": "^2.31.1", - "terser": "^4.0.0", - "urltools": "^0.4.1", - "xmldom": "^0.1.27" + "color-name": "~1.1.4" } }, - "async": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", - "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==", - "dev": true - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -8377,46 +7831,20 @@ "path-exists": "^4.0.0" } }, - "jsdom": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", - "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.1.1", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.3.6", - "cssstyle": "^1.2.2", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.4", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "locate-path": { @@ -8428,12 +7856,6 @@ "p-locate": "^4.1.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -8461,99 +7883,74 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", - "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^4.0.0", - "read-pkg": "^5.1.1", - "type-fest": "^0.5.0" + "find-up": "^4.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "terser": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", - "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", - "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "async-limiter": "^1.0.0" + "has-flag": "^4.0.0" } } } }, + "hyperlink": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.4.3.tgz", + "integrity": "sha512-g5kjgE/TvF3Oe8mi0Lh5y2ZP6XkfI+ngHuSyniMrCB89Joj2YBDjTbaEi3GfnYhZBuhr/AHe9V2udaAuV2H1Rw==", + "dev": true, + "requires": { + "@munter/tap-render": "^0.2.0", + "assetgraph": "^6.0.2", + "async": "^3.1.0", + "hreftypes": "^1.0.1", + "optimist": "^0.6.1", + "pretty-bytes": "^5.2.0", + "request": "^2.88.0", + "urltools": "^0.4.1" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + } + } + }, "icc": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/icc/-/icc-1.0.0.tgz", @@ -8570,9 +7967,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -8624,6 +8021,35 @@ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, + "impro": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/impro/-/impro-0.6.1.tgz", + "integrity": "sha512-465dG4MvakvKzPoGyPZvThTOXsHZwETURJM4RrZu4p/trcKETFn+7Smna8MoJ6E1eRdBjmmIFVcJXs0maC+d8A==", + "dev": true, + "requires": { + "combine-stream": "0.0.4", + "createerror": "1.1.0", + "exif-reader": "^1.0.3", + "icc": "^1.0.0", + "lodash": "^4.17.15", + "mime": "^1.6.0", + "require-or": "0.0.2" + }, + "dependencies": { + "createerror": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.1.0.tgz", + "integrity": "sha1-KnEfWJzHyjhYZBQ5iFa4ow6koGs=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8661,9 +8087,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -8702,50 +8128,61 @@ } }, "inquirer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", - "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8753,45 +8190,26 @@ "dev": true }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "rxjs": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", @@ -8810,24 +8228,16 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -8849,6 +8259,12 @@ "xtend": "^4.0.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -8871,6 +8287,12 @@ "p-is-promise": "^1.1.0" } }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -8902,6 +8324,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8914,9 +8342,9 @@ } }, "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, "is-alphanumeric": { @@ -8926,9 +8354,9 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -8942,24 +8370,22 @@ "dev": true }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "1.2.1", @@ -8993,6 +8419,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -9005,14 +8437,14 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "dev": true }, "is-descriptor": { @@ -9070,13 +8502,10 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -9084,18 +8513,17 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } }, "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, "is-installed-globally": { @@ -9127,24 +8555,9 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-like": { "version": "1.0.8", @@ -9156,9 +8569,9 @@ } }, "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-object": { @@ -9236,11 +8649,11 @@ "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-regexp": { @@ -9258,12 +8671,6 @@ "is-unc-path": "^1.0.0" } }, - "is-relative-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", - "integrity": "sha1-CRtGoNZ8HtD+hfH4z93gBrslHUY=", - "dev": true - }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -9271,9 +8678,9 @@ "dev": true }, "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, "is-stream": { @@ -9298,11 +8705,11 @@ } }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -9320,12 +8727,6 @@ "unc-path-regex": "^0.1.2" } }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -9339,9 +8740,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", "dev": true }, "is-windows": { @@ -9351,9 +8752,9 @@ "dev": true }, "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", "dev": true }, "is-wsl": { @@ -9363,9 +8764,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, "isbinaryfile": { @@ -9395,97 +8796,126 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "append-transform": "^2.0.0" } }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } }, "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { @@ -9498,22 +8928,6 @@ "ms": "^2.1.1" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9523,12 +8937,13 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, "isurl": { @@ -9542,9 +8957,9 @@ } }, "javascript-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", - "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", "dev": true }, "jpegtran": { @@ -9570,15 +8985,15 @@ } }, "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", "dev": true }, "js-beautify": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", - "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", + "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -9616,12 +9031,12 @@ } }, "js2xmlparser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", - "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", + "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", "dev": true, "requires": { - "xmlcreate": "^2.0.0" + "xmlcreate": "^2.0.3" } }, "jsbn": { @@ -9652,18 +9067,25 @@ "underscore": "~1.9.1" }, "dependencies": { - "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true - }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", @@ -9713,9 +9135,9 @@ }, "dependencies": { "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-globals": { @@ -9729,57 +9151,17 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", - "dev": true - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", "dev": true } } @@ -9835,6 +9217,21 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "dev": true + }, "jsonfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", @@ -9879,23 +9276,15 @@ } }, "jszip": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", - "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", "dev": true, "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - } } }, "junk": { @@ -9905,24 +9294,23 @@ "dev": true }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "karma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", - "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", + "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", "dev": true, "requires": { "bluebird": "^3.3.0", "body-parser": "^1.16.1", - "braces": "^2.3.2", - "chokidar": "^2.0.3", + "braces": "^3.0.2", + "chokidar": "^3.0.0", "colors": "^1.1.0", "connect": "^3.6.0", - "core-js": "^2.2.0", "di": "^0.0.1", "dom-serialize": "^2.2.0", "flatted": "^2.0.0", @@ -9930,7 +9318,7 @@ "graceful-fs": "^4.1.2", "http-proxy": "^1.13.0", "isbinaryfile": "^3.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "log4js": "^4.0.0", "mime": "^2.3.1", "minimatch": "^3.0.2", @@ -9945,41 +9333,21 @@ "useragent": "2.3.0" }, "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "glob": "^7.1.3" } }, - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9989,26 +9357,25 @@ } }, "karma-browserify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-6.0.0.tgz", - "integrity": "sha512-G3dGjoy1/6P8I6qTp799fbcAxs4P+1JcyEKUzy9g1/xMakqf9FFPwW2T9iEtCbWoH5WIKD3z+YwGL5ysBhzrsg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-7.0.0.tgz", + "integrity": "sha512-SLgh1dmF2eZEj3glrmTD2CMJRGZwEiKA6k2hBr2+2JDC4JMU1dlsvBKpV66Lvi/tbj3H9qA+Vl/FdIcfPRrJpA==", "dev": true, "requires": { "convert-source-map": "^1.1.3", "hat": "^0.0.3", "js-string-escape": "^1.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.14", "minimatch": "^3.0.0", "os-shim": "^0.1.3" } }, "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { - "fs-access": "^1.0.0", "which": "^1.2.1" } }, @@ -10081,9 +9448,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "klaw": { @@ -10096,22 +9463,13 @@ } }, "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", "dev": true, "requires": { "inherits": "^2.0.1", - "isarray": "^2.0.4", "stream-splicer": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - } } }, "latest-version": { @@ -10129,16 +9487,19 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "levn": { @@ -10161,9 +9522,9 @@ } }, "limiter": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", - "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", "dev": true }, "lines-and-columns": { @@ -10173,132 +9534,162 @@ "dev": true }, "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "lint-staged": { - "version": "8.1.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.7.tgz", - "integrity": "sha512-egT0goFhIFoOGk6rasPngTFh2qDqxZddM0PwI58oi66RxCDcn5uDwxmiasWIF0qGnchHSYVJ8HPRD5LrFo7TKA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", + "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", "dev": true, "requires": { - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.2.0", - "debug": "^3.1.0", + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "find-parent-dir": "^0.3.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "listr-update-renderer": "^0.5.0", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.0" }, "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "ms": "^2.1.1" } }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", "dev": true, "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "pump": "^3.0.0" } }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, "requires": { - "chalk": "^2.0.1" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "pify": { + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } @@ -10330,6 +9721,12 @@ "is-extendable": "^0.1.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -10367,10 +9764,16 @@ "rxjs": "^6.3.3" }, "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -10469,6 +9872,15 @@ "figures": "^2.0.0" }, "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -10477,6 +9889,31 @@ "requires": { "escape-string-regexp": "^1.0.5" } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } } } }, @@ -10537,10 +9974,10 @@ "ms": "^2.1.1" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "is-fullwidth-code-point": { @@ -10552,23 +9989,11 @@ "number-is-nan": "^1.0.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "string-width": { "version": "1.0.2", @@ -10596,6 +10021,16 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -10646,8 +10081,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -10728,30 +10162,24 @@ "dev": true }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -10783,6 +10211,46 @@ "wrap-ansi": "^3.0.1" }, "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -10805,16 +10273,16 @@ } }, "log4js": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", - "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", "dev": true, "requires": { "date-format": "^2.0.0", "debug": "^4.1.1", "flatted": "^2.0.0", - "rfdc": "^1.1.2", - "streamroller": "^1.0.5" + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" }, "dependencies": { "debug": { @@ -10838,12 +10306,6 @@ "squeak": "^1.0.0" } }, - "lolex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.1.0.tgz", - "integrity": "sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==", - "dev": true - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -10851,9 +10313,9 @@ "dev": true }, "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "dev": true }, "loud-rejection": { @@ -10901,29 +10363,19 @@ } }, "luxon": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.16.0.tgz", - "integrity": "sha512-qaqB+JwpGwtl7UbIXng3A/l4W/ySBr8drQvwtMLZBMiLD2V+0fEnPWMrs+UjnIy9PsktazQaKvwDUCLzoWz0Hw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.22.0.tgz", + "integrity": "sha512-3sLvlfbFo+AxVEY3IqxymbumtnlgBwjDExxK60W3d+trrUzErNAz/PfvPT+mva+vEUrdIodeCOs7fB6zHtRSrw==", "dev": true }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "^0.2.2" - } - }, "magicpen": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-5.12.0.tgz", - "integrity": "sha1-u+nunUI2R2rs+EE27KGDPrRwqWs=", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-6.2.1.tgz", + "integrity": "sha512-JEkzC2hJmoCRTC8v1lgLIi75aF8pAz72kYZ9l/EorRnBXavPErnBywm/ec3xTDjCPBonsdhNZoRzj+TUfbCYJg==", "dev": true, "requires": { "ansi-styles": "2.0.0", - "color-diff": "0.1.7", - "supports-color": "1.2.0" + "color-diff": "0.1.7" }, "dependencies": { "ansi-styles": { @@ -10931,12 +10383,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.0.tgz", "integrity": "sha1-QysmFi/qG2PIeIlqvIzFVI8lBj4=", "dev": true - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true } } }, @@ -10991,43 +10437,51 @@ } }, "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", "dev": true }, "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, "requires": { "argparse": "^1.0.7", - "entities": "~1.1.1", + "entities": "~2.0.0", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + } } }, "markdown-it-anchor": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", - "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.5.tgz", + "integrity": "sha512-xLIjLQmtym3QpoY9llBgApknl7pxAcN3WDRc2d3rwpl+/YvDZHPmKscGs+L6E05xf2KrCXPBvosWt7MZukwSpQ==", "dev": true }, "markdown-it-attrs": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-2.4.1.tgz", - "integrity": "sha512-BASnIYS+JLpjlhDf7jLV8VOuccxjfDDnQcz5dLfgPsYw8OsgbASexADdIkF7tIdGn+jaQSA4qOZXM3v3W3JBCg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-3.0.2.tgz", + "integrity": "sha512-q45vdXU9TSWaHgFkWEFM97YHEoCmOyG9csLLdv3oVC6ARjT77u4wfng9rRtSOMb5UpxzT7zTX5GBbwm15H40dw==", "dev": true }, "markdown-it-prism": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.2.tgz", - "integrity": "sha512-tBRK+L36D2m4NauUr9teyFYJXBtw6XtuCdCJJWeNabSBwKlgI3oil4TfHHWd0bunwSf8zkmXEZkJzDVgVkfp+g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.5.tgz", + "integrity": "sha512-u2jErcoLCnENIOUnEbS9w9RWUGiId8fjQovD0Gbo4iT8tZU0/Un4v72E8g8sj/NAzieSCvFVG6KtMwlurSBMnw==", "dev": true, "requires": { - "prismjs": "^1.16.0" + "prismjs": "1.19.0" } }, "markdown-link": { @@ -11037,9 +10491,9 @@ "dev": true }, "markdown-magic": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-0.1.25.tgz", - "integrity": "sha512-NBVMv2IPdKaRIXcL8qmLkfq9O17tkByTr8sRkJ4l76tkp401hxCUA0r9mkhtnGJRevCqZ2KoHrIf9WYQUn8ztA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-1.0.0.tgz", + "integrity": "sha512-H2Y8eGA19kF5EPs1vdJp0+21mqEkJylFu134anEtolygwvaHZDyBKQVE5mUXxWkuvWizBp5QQU8O8BA8hradmA==", "dev": true, "requires": { "commander": "^2.9.0", @@ -11048,10 +10502,19 @@ "fs-extra": "^1.0.0", "globby": "^6.1.0", "is-local-path": "^0.1.6", - "markdown-toc": "^1.0.2", + "markdown-toc": "^1.2.0", "sync-request": "^3.0.1" }, "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -11140,18 +10603,18 @@ } }, "markdown-magic-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-magic-package-json/-/markdown-magic-package-json-2.0.0.tgz", - "integrity": "sha512-Sv+3h/4eOYqI3wdyj8AKxCdL/7Bow9KW0y/S3WSO8rbp4dnLFqKiKiIEfSdIuySJpJFDWQQtcVuh9SNgYXJNag==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-magic-package-json/-/markdown-magic-package-json-2.0.1.tgz", + "integrity": "sha512-ahEHLW4ovxjGEDkNdirKl01uU6dcZkjtqhc4iJIgwxXwDVq4ThN7cHf1rIA4uaDD4JHAK2hsTHAr7F1TggGt2Q==", "dev": true, "requires": { "findup": "^0.1.5" } }, "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, "markdown-toc": { @@ -11204,38 +10667,35 @@ "requires": { "set-getter": "^0.1.0" } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true } } }, "markdownlint": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.12.0.tgz", - "integrity": "sha512-bjur6ZP0yKHVYh1U5+xD+bVkouKiUyiVzg9c9qkytYRW2nDfSowifKSmpPeO0uZHxzZOYMcV2Oe7sycPOEqMOQ==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.19.0.tgz", + "integrity": "sha512-+MsWOnYVUH4klcKM7iRx5cno9FQMDAb6FC6mWlZkeXPwIaK6Z5Vd9VkXkykPidRqmLHU2wI+MNyfUMnUCBw3pQ==", "dev": true, "requires": { - "markdown-it": "8.4.2" + "markdown-it": "10.0.0" } }, "markdownlint-cli": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.14.1.tgz", - "integrity": "sha512-bHueUEp1NmSFPWvOk3SNWhRRAInrdvmuzlkMrZJptUF6jNXJ32OhPXicRw2xg43+NLiUI01V5sc1VIrRWLKgig==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.22.0.tgz", + "integrity": "sha512-qRg6tK5dXWqkaFvEstz9YSQal1ECMgofrSZgdBOaPWG8cD50pk8Hs0ZpBCJ6SCHPKF71pCdtuSL2u82sIx2XWA==", "dev": true, "requires": { "commander": "~2.9.0", "deep-extend": "~0.5.1", "get-stdin": "~5.0.1", "glob": "~7.1.2", - "js-yaml": "~3.13.0", + "ignore": "~5.1.4", + "js-yaml": "~3.13.1", + "jsonc-parser": "~2.2.0", "lodash.differencewith": "~4.5.0", "lodash.flatten": "~4.4.0", - "markdownlint": "~0.12.0", + "markdownlint": "~0.19.0", + "markdownlint-rule-helpers": "~0.7.0", "minimatch": "~3.0.4", "rc": "~1.2.7" }, @@ -11260,24 +10720,27 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true } } }, + "markdownlint-rule-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.7.0.tgz", + "integrity": "sha512-xZByWJNBaCMHo7nYPv/5aO8Jt68YcMvyouFXhuXmJzbqCsQy8rfCj0kYcv22kdK5PwAgMdbHg0hyTdURbUZtJw==", + "dev": true + }, "marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.4" - } - }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -11301,6 +10764,21 @@ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true } } }, @@ -11316,33 +10794,33 @@ } }, "mdast-util-compact": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz", - "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", + "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", "dev": true, "requires": { "unist-util-visit": "^1.1.0" } }, "mdast-util-definitions": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.3.tgz", - "integrity": "sha512-P6wpRO8YVQ1iv30maMc93NLh7COvufglBE8/ldcOyYmk5EbfF0YeqlLgtqP/FOBU501Kqar1x5wYWwB3Nga74g==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", + "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", "dev": true, "requires": { "unist-util-visit": "^1.0.0" } }, "mdast-util-to-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.5.tgz", - "integrity": "sha512-2qLt/DEOo5F6nc2VFScQiHPzQ0XXcabquRJxKMhKte8nt42o08HUxNDPk7tt0YPxnWjAT11I1SYi0X0iPnfI5A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", "dev": true }, "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, "mdurl": { @@ -11392,16 +10870,6 @@ } } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -11418,29 +10886,18 @@ "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, "micromatch": { @@ -11462,6 +10919,96 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "miller-rabin": { @@ -11481,24 +11028,24 @@ "dev": true }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.43.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "mimic-response": { @@ -11528,9 +11075,9 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { @@ -11561,9 +11108,9 @@ } }, "mitt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", - "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "dev": true }, "mixin-deep": { @@ -11591,39 +11138,23 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } - } - }, - "module-definition": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.2.0.tgz", - "integrity": "sha512-PO6o0BajpdRR+fb3FUSeDISgJpnyxg8UDUEalR8LPQajl0M5+m4jHWhgrMGGSEl6D9+sVl/l1fjOCvpBXIQ+2Q==", "dev": true, "requires": { - "ast-module-types": "^2.4.0", - "node-source-walk": "^4.0.0" + "minimist": "^1.2.5" } }, "module-deps": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", - "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz", + "integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==", "dev": true, "requires": { "JSONStream": "^1.0.3", "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", + "cached-path-relative": "^1.0.2", "concat-stream": "~1.6.0", "defined": "^1.0.0", - "detective": "^5.0.2", + "detective": "^5.2.0", "duplexer2": "^0.1.2", "inherits": "^2.0.1", "parents": "^1.0.0", @@ -11647,35 +11178,10 @@ } } }, - "module-lookup-amd": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-6.2.0.tgz", - "integrity": "sha512-uxHCj5Pw9psZiC1znjU2qPsubt6haCSsN9m7xmIdoTciEgfxUkE1vhtDvjHPuOXEZrVJhjKgkmkP+w73rRuelQ==", - "dev": true, - "requires": { - "commander": "^2.8.1", - "debug": "^4.1.0", - "file-exists-dazinatorfork": "^1.0.2", - "find": "^0.3.0", - "requirejs": "^2.3.5", - "requirejs-config-file": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "moo": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.0.tgz", - "integrity": "sha512-AMv6iqhTEd5vT/cQlH6cammKS5ekyHhyqTRKi5zKMWl1RTyFnQ3ohPSBNSm8ySe2wlxSKwDonr9D5ZT44mdO3g==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", "dev": true }, "ms": { @@ -11684,14 +11190,15 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", "dev": true, "requires": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", "minimatch": "^3.0.4" } }, @@ -11708,9 +11215,9 @@ "dev": true }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true }, "nanomatch": { @@ -11733,9 +11240,9 @@ } }, "napi-build-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, "natural-compare": { @@ -11745,9 +11252,9 @@ "dev": true }, "needle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz", - "integrity": "sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "requires": { "debug": "^3.2.6", @@ -11756,9 +11263,9 @@ } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { @@ -11767,12 +11274,6 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -11780,15 +11281,15 @@ "dev": true }, "nise": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.0.tgz", - "integrity": "sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", + "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", "dev": true, "requires": { - "@sinonjs/formatio": "^3.1.0", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^4.1.0", "path-to-regexp": "^1.7.0" } }, @@ -11817,19 +11318,12 @@ "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { "assert": "^1.1.1", @@ -11842,7 +11336,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -11854,13 +11348,13 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -11869,15 +11363,15 @@ } }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "punycode": { @@ -11886,10 +11380,23 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -11908,15 +11415,14 @@ "dev": true, "requires": { "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } } } @@ -11937,24 +11443,43 @@ "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "node-releases": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", - "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "semver": "^5.3.0" + "process-on-spawn": "^1.0.0" } }, - "node-source-walk": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.2.0.tgz", - "integrity": "sha512-hPs/QMe6zS94f5+jG3kk9E7TNm4P2SulrKiLWMzKszBfNZvL/V6wseHlTd7IvfW0NZWqPtK3+9yYNr+3USGteA==", + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", "dev": true, "requires": { - "@babel/parser": "^7.0.0" + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "noop-logger": { @@ -11964,9 +11489,9 @@ "dev": true }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "requires": { "abbrev": "1", @@ -12052,15 +11577,6 @@ "npm-normalize-package-bin": "^1.0.1" } }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -12070,21 +11586,10 @@ "path-key": "^2.0.0" } }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -12113,6 +11618,18 @@ "yargs": "14.2.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -12122,12 +11639,6 @@ "locate-path": "^2.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -12162,12 +11673,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -12179,6 +11684,15 @@ "strip-ansi": "^5.1.0" } }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, "yargs": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", @@ -12244,9 +11758,9 @@ } }, "yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -12264,12 +11778,6 @@ "boolbase": "~1.0.0" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -12283,228 +11791,243 @@ "dev": true }, "nunjucks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.0.tgz", - "integrity": "sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.1.tgz", + "integrity": "sha512-LYlVuC1ZNSalQQkLNNPvcgPt2M9FTY9bs39mTCuFXtqh7jWbYzhDlmz2M6onPiXEhdZo+b9anRhc+uBGuJZ2bQ==", "dev": true, "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", - "chokidar": "^2.0.0", - "yargs": "^3.32.0" + "chokidar": "^3.3.0", + "commander": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + } + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "nyc": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", + "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "js-yaml": "^3.13.1", + "make-dir": "^3.0.0", + "node-preload": "^0.2.0", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "uuid": "^3.3.3", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "safe-buffer": "~5.1.1" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true, "requires": { - "is-extglob": "^2.1.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "lcid": "^1.0.0" + "p-locate": "^4.1.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "semver": "^6.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "p-limit": "^2.2.0" } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "yargs": { - "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } - } - } - }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", - "dev": true - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "source-map": "^0.6.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "yargs-parser": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -12546,6 +12069,12 @@ "is-descriptor": "^0.1.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -12557,16 +12086,15 @@ } } }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", - "dev": true + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-path": { "version": "0.9.2", @@ -12595,12 +12123,12 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -12613,13 +12141,13 @@ } }, "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } @@ -12642,14 +12170,20 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", @@ -12675,26 +12209,26 @@ "wordwrap": "~0.0.2" }, "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true } } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "optipng": { @@ -12741,6 +12275,15 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, "os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", @@ -12800,9 +12343,9 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "requires": { "p-try": "^2.0.0" } @@ -12816,10 +12359,13 @@ } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } }, "p-map-series": { "version": "1.0.0", @@ -12846,18 +12392,18 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", + "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } @@ -12875,9 +12421,9 @@ } }, "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "param-case": { @@ -12916,9 +12462,9 @@ } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -12930,9 +12476,9 @@ } }, "parse-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.1.tgz", - "integrity": "sha512-NBWYLQm1KSoDKk7GAHyioLTvCZ5QjdH/ASBBQTD3iLiAWJXS5bg1jEWI8nIJ+vgVvsceBVBcDGRWSo0KVQBvvg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", "dev": true, "requires": { "character-entities": "^1.0.0", @@ -12994,9 +12540,9 @@ } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -13073,9 +12619,9 @@ "dev": true }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" @@ -13191,12 +12737,6 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", @@ -13209,6 +12749,12 @@ "supports-color": "^3.2.3" } }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -13236,9 +12782,9 @@ "dev": true }, "picomatch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", - "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { "version": "2.3.0", @@ -13315,10 +12861,19 @@ } } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "please-upgrade-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", - "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { "semver-compare": "^1.0.0" @@ -13377,6 +12932,20 @@ "logalot": "^2.0.0" }, "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "execa": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", @@ -13392,13 +12961,6 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "optional": true } } }, @@ -13419,9 +12981,9 @@ "dev": true }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -13432,7 +12994,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { @@ -13447,15 +13009,14 @@ } }, "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "dev": true, "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, "postcss-colormin": { @@ -13469,6 +13030,14 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-convert-values": { @@ -13479,6 +13048,14 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-discard-comments": { @@ -13527,6 +13104,14 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-merge-rules": { @@ -13544,12 +13129,12 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -13564,6 +13149,14 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-minify-gradients": { @@ -13576,6 +13169,14 @@ "is-color-stop": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-minify-params": { @@ -13590,6 +13191,14 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-minify-selectors": { @@ -13605,12 +13214,12 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -13635,6 +13244,14 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-positions": { @@ -13647,6 +13264,14 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-repeat-style": { @@ -13659,6 +13284,14 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-string": { @@ -13670,6 +13303,14 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-timing-functions": { @@ -13681,6 +13322,14 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-unicode": { @@ -13692,6 +13341,14 @@ "browserslist": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-url": { @@ -13704,6 +13361,14 @@ "normalize-url": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-normalize-whitespace": { @@ -13714,6 +13379,14 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-ordered-values": { @@ -13725,6 +13398,14 @@ "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-reduce-initial": { @@ -13749,6 +13430,14 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-scss": { @@ -13832,12 +13521,12 @@ } }, "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "cssesc": "^2.0.0", + "cssesc": "^3.0.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -13852,6 +13541,14 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "postcss-unique-selectors": { @@ -13866,22 +13563,11 @@ } }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, - "postcss-values-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz", - "integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "prebuild-install": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", @@ -13903,46 +13589,6 @@ "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0", "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "precinct": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-5.3.1.tgz", - "integrity": "sha512-HOIXDarP6S5JXYC5GhnpoAj9RqJ6yAwZ8VI71vQFlq1rmkBRPs+Mt60TOr7DUc/fx309iIQaniB4x3zueOOSdw==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "debug": "^4.1.1", - "detective-amd": "^3.0.0", - "detective-cjs": "^3.1.1", - "detective-es6": "^2.0.0", - "detective-less": "^1.0.2", - "detective-postcss": "^3.0.0", - "detective-sass": "^3.0.0", - "detective-scss": "^2.0.0", - "detective-stylus": "^1.0.0", - "detective-typescript": "^4.1.2", - "module-definition": "^3.1.0", - "node-source-walk": "^4.2.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "prefix-matches": { @@ -13968,9 +13614,9 @@ "dev": true }, "prettier": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", - "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "prettier-linter-helpers": { @@ -14020,9 +13666,9 @@ } }, "prismjs": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", - "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", + "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -14035,11 +13681,20 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -14055,12 +13710,6 @@ "asap": "~2.0.3" } }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", - "dev": true - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -14089,9 +13738,9 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", "dev": true }, "public-encrypt": { @@ -14109,65 +13758,65 @@ } }, "pug": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz", - "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", "dev": true, "requires": { - "pug-code-gen": "^2.0.1", - "pug-filters": "^3.1.0", - "pug-lexer": "^4.0.0", - "pug-linker": "^3.0.5", - "pug-load": "^2.0.11", - "pug-parser": "^5.0.0", - "pug-runtime": "^2.0.4", - "pug-strip-comments": "^1.0.3" + "pug-code-gen": "^2.0.2", + "pug-filters": "^3.1.1", + "pug-lexer": "^4.1.0", + "pug-linker": "^3.0.6", + "pug-load": "^2.0.12", + "pug-parser": "^5.0.1", + "pug-runtime": "^2.0.5", + "pug-strip-comments": "^1.0.4" } }, "pug-attrs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz", - "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", "dev": true, "requires": { "constantinople": "^3.0.1", "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.4" + "pug-runtime": "^2.0.5" } }, "pug-code-gen": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz", - "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", + "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", "dev": true, "requires": { - "constantinople": "^3.0.1", + "constantinople": "^3.1.2", "doctypes": "^1.1.0", "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.3", - "pug-error": "^1.3.2", - "pug-runtime": "^2.0.4", + "pug-attrs": "^2.0.4", + "pug-error": "^1.3.3", + "pug-runtime": "^2.0.5", "void-elements": "^2.0.1", "with": "^5.0.0" } }, "pug-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", - "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", "dev": true }, "pug-filters": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz", - "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", "dev": true, "requires": { "clean-css": "^4.1.11", "constantinople": "^3.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.2", - "pug-walk": "^1.1.7", + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8", "resolve": "^1.1.6", "uglify-js": "^2.6.1" }, @@ -14227,65 +13876,65 @@ } }, "pug-lexer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz", - "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", "dev": true, "requires": { "character-parser": "^2.1.1", "is-expression": "^3.0.0", - "pug-error": "^1.3.2" + "pug-error": "^1.3.3" } }, "pug-linker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz", - "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", "dev": true, "requires": { - "pug-error": "^1.3.2", - "pug-walk": "^1.1.7" + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8" } }, "pug-load": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz", - "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", "dev": true, "requires": { "object-assign": "^4.1.0", - "pug-walk": "^1.1.7" + "pug-walk": "^1.1.8" } }, "pug-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz", - "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", "dev": true, "requires": { - "pug-error": "^1.3.2", + "pug-error": "^1.3.3", "token-stream": "0.0.1" } }, "pug-runtime": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz", - "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", "dev": true }, "pug-strip-comments": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz", - "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", "dev": true, "requires": { - "pug-error": "^1.3.2" + "pug-error": "^1.3.3" } }, "pug-walk": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz", - "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", "dev": true }, "pump": { @@ -14327,53 +13976,24 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -14413,9 +14033,9 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { @@ -14428,17 +14048,6 @@ "http-errors": "1.7.3", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "rc": { @@ -14451,14 +14060,6 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "read-file-stdin": { @@ -14522,9 +14123,9 @@ } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -14534,17 +14135,22 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.0.4" } }, "readline-sync": { @@ -14638,20 +14244,20 @@ } }, "remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/remark/-/remark-11.0.2.tgz", + "integrity": "sha512-bh+eJgn8wgmbHmIBOuwJFdTVRVpl3fcVP6HxmpPWO0ULGP9Qkh6INJh0N5Uy7GqlV7DQYGoqaKiEIpM5LLvJ8w==", "dev": true, "requires": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" + "remark-parse": "^7.0.0", + "remark-stringify": "^7.0.0", + "unified": "^8.2.0" } }, "remark-github": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/remark-github/-/remark-github-7.0.6.tgz", - "integrity": "sha512-AjBZ/MynNq149wmuvZIz3YcuM8JNFdkTQhpVEZymnkWrgV3jK+kPHNYw9uBQ0XYCPd+qVe21hI4YMwVSj5NjJA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-github/-/remark-github-8.0.0.tgz", + "integrity": "sha512-N1gWYcvYguZesBGMwfNXBCJEquuWSlb1sSINWiun8fg5k/ea6H9FL/t5I6M4eIgeXLrz3vN8RjJUxkyGdyJQZQ==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -14662,9 +14268,9 @@ } }, "remark-inline-links": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-inline-links/-/remark-inline-links-3.1.2.tgz", - "integrity": "sha512-XIMJmiN4QBgKZW/7PvnlAKcWqEbYlUhq6/vuJ27J0YRkU/SgNrUIPNZikZdA+QgV+xpFYt8HvwhbnpFReVcSyQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/remark-inline-links/-/remark-inline-links-3.1.3.tgz", + "integrity": "sha512-mgCdL6mDkhwT1i+XxPK/CcSJphwvvODmnsT0XFQdj5JazYl84BiGzYVbyI9ou7mDEu1y/dzTVKMM4luTDGJA/A==", "dev": true, "requires": { "mdast-util-definitions": "^1.1.1", @@ -14673,9 +14279,9 @@ } }, "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", + "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", "dev": true, "requires": { "collapse-white-space": "^1.0.2", @@ -14696,9 +14302,9 @@ } }, "remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-7.0.4.tgz", + "integrity": "sha512-qck+8NeA1D0utk1ttKcWAoHRrJxERYQzkHDyn+pF5Z4whX1ug98uCNPPSeFgLSaNERRxnD6oxIug6DzZQth6Pg==", "dev": true, "requires": { "ccount": "^1.0.0", @@ -14712,7 +14318,7 @@ "parse-entities": "^1.0.2", "repeat-string": "^1.5.4", "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", + "stringify-entities": "^2.0.0", "unherit": "^1.0.4", "xtend": "^4.0.1" } @@ -14754,10 +14360,16 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -14767,7 +14379,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -14777,17 +14389,11 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -14795,35 +14401,47 @@ "dev": true }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } } } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -14832,46 +14450,16 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "require-or": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/require-or/-/require-or-0.0.2.tgz", + "integrity": "sha1-/CwfhjbPuFWvmrlVrArQh4vK2wo=", "dev": true }, - "requirejs-config-file": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-3.1.2.tgz", - "integrity": "sha512-sdLWywcDuNz7EIOhenSbRfT4YF84nItDv90coN2htbokjmU2QeyQuSBZILQUKNksepl8UPVU+hgYySFaDxbJPQ==", - "dev": true, - "requires": { - "esprima": "^4.0.0", - "make-dir": "^2.1.0", - "stringify-object": "^3.2.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -14885,31 +14473,17 @@ "dev": true, "requires": { "lodash": "^4.17.14" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, - "resolve-dependency-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz", - "integrity": "sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==", - "dev": true - }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -14959,34 +14533,31 @@ } }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, - "restructure": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", - "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", - "dev": true, - "requires": { - "browserify-optional": "^1.0.0" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rewiremock": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.7.tgz", - "integrity": "sha512-U6iFfdXPiNtIBDcJWmspl/nhVk1EANkXLq2GM78T3ZfegvO5EW0TgNzExLh5iHXFJKQr//SmH9iloK/s4O7UqA==", + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.9.tgz", + "integrity": "sha512-FDk5uCyvfwgYZtZ9MKdpg6QiSSdjB/a/vU5luKjoJddaqcZz5+u4dXhc3Qf4vNMvDXvnOyodNd1riE5yeqoxaA==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -15027,9 +14598,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -15046,18 +14617,18 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, "requires": { "is-promise": "^2.1.0" } }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, "rx": { @@ -15096,35 +14667,35 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sass-lookup": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", - "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", - "dev": true, - "requires": { - "commander": "^2.16.0" - } - }, "sauce-connect-launcher": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz", - "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.1.tgz", + "integrity": "sha512-vIf9qDol3q2FlYzrKt0dr3kvec6LSjX2WS+/mVnAJIhqh1evSkPKCR2AzcJrnSmx9Xt9PtV0tLY7jYh0wsQi8A==", "dev": true, "requires": { "adm-zip": "~0.4.3", "async": "^2.1.2", - "https-proxy-agent": "^2.2.1", + "https-proxy-agent": "^3.0.0", "lodash": "^4.16.6", "rimraf": "^2.5.4" }, "dependencies": { "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" } } } @@ -15136,6 +14707,18 @@ "dev": true, "requires": { "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } } }, "sax": { @@ -15145,12 +14728,12 @@ "dev": true }, "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "dev": true, "requires": { - "xmlchars": "^1.3.1" + "xmlchars": "^2.1.1" } }, "schemes": { @@ -15211,17 +14794,25 @@ "optional": true }, "selenium-webdriver": { - "version": "4.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.1.tgz", - "integrity": "sha512-z88rdjHAv3jmTZ7KSGUkTvo4rGzcDGMq0oXWHNIDK96Gs31JKVdu9+FMtT4KBrVoibg8dUicJDok6GnqqttO5Q==", + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", + "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", "dev": true, "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" + "jszip": "^3.2.2", + "rimraf": "^2.7.1", + "tmp": "0.0.30" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -15234,10 +14825,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-compare": { "version": "1.0.0", @@ -15311,6 +14901,12 @@ "statuses": ">= 1.4.0 < 2" } }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15367,6 +14963,12 @@ "statuses": ">= 1.4.0 < 2" } }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15476,29 +15078,77 @@ "safe-buffer": "^5.0.1" } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", - "dev": true - }, "sharp": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.3.tgz", - "integrity": "sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw==", + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", + "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", "dev": true, "requires": { - "bindings": "^1.3.1", - "color": "^3.1.0", + "color": "^3.1.2", "detect-libc": "^1.0.3", - "fs-copy-file-sync": "^1.1.1", - "nan": "^2.12.1", + "nan": "^2.14.0", "npmlog": "^4.1.2", - "prebuild-install": "^5.2.2", - "semver": "^5.6.0", - "simple-get": "^3.0.3", - "tar": "^4.4.8", + "prebuild-install": "^5.3.3", + "semver": "^6.3.0", + "simple-get": "^3.1.0", + "tar": "^5.0.5", "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "dev": true, + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "shasum": { @@ -15511,6 +15161,15 @@ "sha.js": "~2.4.4" } }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -15527,16 +15186,10 @@ "dev": true }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true }, "sift": { "version": "7.0.1", @@ -15573,26 +15226,6 @@ "simple-concat": "^1.0.0" } }, - "simple-git": { - "version": "1.113.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.113.0.tgz", - "integrity": "sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==", - "dev": true, - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15611,27 +15244,39 @@ } }, "sinon": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", - "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.1", - "diff": "^3.5.0", - "lolex": "^4.0.1", - "nise": "^1.4.10", - "supports-color": "^5.5.0" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.1.tgz", + "integrity": "sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.0.3", + "diff": "^4.0.2", + "nise": "^4.0.1", + "supports-color": "^7.1.0" }, "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -15654,9 +15299,9 @@ } }, "slugify": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.4.tgz", - "integrity": "sha512-KP0ZYk5hJNBS8/eIjGkFDCzGQIoZ1mnfQRYS5WM3273z+fxGWXeN0fkwf2ebEweydv9tioZIHGZKoF21U07/nw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.0.tgz", + "integrity": "sha512-FtLNsMGBSRB/0JOE2A0fxlqjI6fJsgHGS13iTuVT28kViI4JjUiNqp/vyis0ZXYcMnpR3fzGNkv+6vRlI2GwdQ==", "dev": true }, "snapdragon": { @@ -15770,6 +15415,12 @@ "kind-of": "^3.2.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -15823,11 +15474,18 @@ "yeast": "0.1.2" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } }, "ms": { "version": "2.0.0", @@ -15882,9 +15540,9 @@ } }, "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { @@ -15940,12 +15598,6 @@ "ms": "2.0.0" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -16006,12 +15658,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -16019,9 +15671,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -16059,17 +15711,43 @@ } }, "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "which": "^1.3.0" + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "spdx-correct": { @@ -16099,9 +15777,9 @@ } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "specificity": { @@ -16209,12 +15887,6 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", - "dev": true - }, "starts-with": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", @@ -16222,20 +15894,11 @@ "dev": true }, "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", "dev": true }, - "static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dev": true, - "requires": { - "escodegen": "^1.8.1" - } - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -16257,66 +15920,6 @@ } } }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "dev": true, - "requires": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - }, - "dependencies": { - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -16359,22 +15962,34 @@ } }, "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", + "readable-stream": "^3.0.6", "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -16392,25 +16007,25 @@ } }, "streamroller": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", - "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", "dev": true, "requires": { "async": "^2.6.2", "date-format": "^2.0.0", "debug": "^3.2.6", "fs-extra": "^7.0.1", - "lodash": "^4.17.11" + "lodash": "^4.17.14" }, "dependencies": { "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" } }, "fs-extra": { @@ -16442,9 +16057,9 @@ "dev": true }, "string-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-width": { @@ -16476,7 +16091,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -16486,7 +16100,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -16502,14 +16115,15 @@ } }, "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", + "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", "dev": true, "requires": { "character-entities-html4": "^1.0.0", "character-entities-legacy": "^1.0.0", "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", "is-hexadecimal": "^1.0.0" } }, @@ -16522,20 +16136,30 @@ "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true } } }, @@ -16575,6 +16199,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -16610,39 +16240,18 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } } } }, - "stylus-lookup": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-3.0.2.tgz", - "integrity": "sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==", - "dev": true, - "requires": { - "commander": "^2.8.1", - "debug": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -16650,14 +16259,6 @@ "dev": true, "requires": { "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "supports-color": { @@ -16669,18 +16270,17 @@ } }, "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", - "csso": "^3.5.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", @@ -16725,9 +16325,9 @@ "dev": true }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "sync-request": { @@ -16741,12 +16341,6 @@ "then-request": "^2.0.1" } }, - "synchronous-promise": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.9.tgz", - "integrity": "sha512-LO95GIW16x69LuND1nuuwM4pjgFGupg7pZ/4lU86AmchPKrhk0o2tpMU2unXRrqo81iAFe1YJ0nAGEVwsrZAgg==", - "dev": true - }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -16768,17 +16362,11 @@ "string-width": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "string-width": { "version": "3.1.0", @@ -16790,6 +16378,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -16799,29 +16396,6 @@ "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=", "dev": true }, - "tap-render": { - "version": "github:Munter/tap-render#c3a72d6260ee19cfd340d1e41d73a0edfdb29d94", - "from": "github:Munter/tap-render#0.1.7-patch4", - "dev": true, - "requires": { - "jsonify": "0.0.0", - "pause-stream": "0.0.7" - }, - "dependencies": { - "pause-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.7.tgz", - "integrity": "sha1-/kDjE8ZcDyqh0WeTPEJeTLJMtTc=", - "dev": true - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", @@ -16858,12 +16432,14 @@ }, "dependencies": { "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", "dev": true, "requires": { - "readable-stream": "^3.0.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, "readable-stream": { @@ -16878,12 +16454,12 @@ } }, "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", "dev": true, "requires": { - "bl": "^3.0.0", + "bl": "^4.0.1", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", @@ -16976,46 +16552,12 @@ "dev": true, "requires": { "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } } }, "terser": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", - "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", "dev": true, "requires": { "commander": "^2.20.0", @@ -17023,12 +16565,6 @@ "source-map-support": "~0.5.12" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17038,86 +16574,29 @@ } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, @@ -17281,12 +16760,6 @@ "dev": true, "optional": true }, - "tiny-inflate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz", - "integrity": "sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -17329,6 +16802,12 @@ "kind-of": "^3.0.2" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -17353,31 +16832,21 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "to-vfile": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-5.0.3.tgz", - "integrity": "sha512-z1Lfx60yAMDMmr+f426Y4yECsHdl8GVEAE+LymjRF5oOIZ7T4N20IxWNAxXLMRzP9jSSll38Z0fKVAhVLsdLOw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz", + "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==", "dev": true, "requires": { "is-buffer": "^2.0.0", - "vfile": "^3.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } + "vfile": "^4.0.0" } }, "toidentifier": { @@ -17398,18 +16867,13 @@ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", "dev": true }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", - "dev": true - }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { + "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } @@ -17423,12 +16887,6 @@ "punycode": "^2.1.0" } }, - "traverse-chain": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=", - "dev": true - }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -17450,28 +16908,22 @@ "escape-string-regexp": "^1.0.2" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", + "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==", "dev": true }, "trough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", - "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tty-browserify": { @@ -17522,733 +16974,1335 @@ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - } + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "dev": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "ukkonen": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ukkonen/-/ukkonen-1.4.0.tgz", + "integrity": "sha512-g8SLGxflI0/VNH2C8j66KcfJXrU5StJglRQBYPNiChXFlOrqqYM1icOykOAAUgTeBpktaEuCm9hjpPinQ080PA==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", + "dev": true + }, + "unexpected": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-11.13.0.tgz", + "integrity": "sha512-nSVZN1KsyhmDNctgHwQLmp/d1h6eNqv1DQqqqonnGMWhyr0dVbVyYE6meTDPjmqPWQbiTEUNNiBG5WBLtrffYg==", + "dev": true, + "requires": { + "array-changes": "3.0.1", + "array-changes-async": "3.0.1", + "detect-indent": "3.0.1", + "diff": "4.0.2", + "greedy-interval-packer": "1.2.0", + "magicpen": "^6.2.1", + "ukkonen": "^1.4.0", + "unexpected-bluebird": "2.9.34-longstack2" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "unexpected-bluebird": { + "version": "2.9.34-longstack2", + "resolved": "https://registry.npmjs.org/unexpected-bluebird/-/unexpected-bluebird-2.9.34-longstack2.tgz", + "integrity": "sha1-SaysdTsFVt7WAlIQ7pYYIwfSssk=", + "dev": true + }, + "unexpected-eventemitter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unexpected-eventemitter/-/unexpected-eventemitter-1.1.3.tgz", + "integrity": "sha512-30MfVuCOCSEvUzNUErYZ3ZzLiPOgADcJsyxi+0Z5bhwgI/Yv4xHR/2v/YEe2alaEXDdkteCQ4gLBfa5/J2iTPA==", + "dev": true + }, + "unexpected-sinon": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.2.tgz", + "integrity": "sha512-N2KIKPweTVs6AK8cDKQTUwu0fGWyGt+cI/UJZ/eltAyOKgsHL9eILttdGfpZjI/iMYcHcbtUwIlXoHfmh6EcBw==", + "dev": true + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "unist-util-remove": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", + "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", - "dev": true + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, + "requires": { + "unist-util-visit-parents": "^2.0.0" + } }, - "typescript-eslint-parser": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz", - "integrity": "sha512-Pn/A/Cw9ysiXSX5U1xjBmPQlxtWGV2o7jDNiH/u7KgBO2yC/y37wNFl2ogSrGZBQFuglLzGq0Xl0Bt31Jv44oA==", + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "dev": true, "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } + "unist-util-is": "^3.0.0" } }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "dev": true }, - "uglify-js": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.0.tgz", - "integrity": "sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA==", + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "optional": true, "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, - "optional": true + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", "dev": true }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" + "punycode": "^2.1.0" } }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "urijs": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", + "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==", "dev": true }, - "unexpected": { - "version": "10.40.2", - "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.40.2.tgz", - "integrity": "sha512-xwLScBxEnHiK8H8yLblQ6u3Uoammhpk+oCB/HWiNY6exMEwxenUR+eWIKderEXQPOlZkUEakBAKborGJqK6hZQ==", + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { - "array-changes": "3.0.1", - "array-changes-async": "3.0.1", - "babel-runtime": "6.26.0", - "detect-indent": "3.0.1", - "diff": "1.1.0", - "greedy-interval-packer": "1.2.0", - "leven": "2.1.0", - "magicpen": "5.12.0", - "unexpected-bluebird": "2.9.34-longstack2" + "punycode": "1.3.2", + "querystring": "0.2.0" }, "dependencies": { - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.1.0.tgz", - "integrity": "sha1-eYpJOBqkZBUem08Ob/Kwmooa0j8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } } } }, - "unexpected-bluebird": { - "version": "2.9.34-longstack2", - "resolved": "https://registry.npmjs.org/unexpected-bluebird/-/unexpected-bluebird-2.9.34-longstack2.tgz", - "integrity": "sha1-SaysdTsFVt7WAlIQ7pYYIwfSssk=", - "dev": true + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } }, - "unexpected-eventemitter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unexpected-eventemitter/-/unexpected-eventemitter-1.1.3.tgz", - "integrity": "sha512-30MfVuCOCSEvUzNUErYZ3ZzLiPOgADcJsyxi+0Z5bhwgI/Yv4xHR/2v/YEe2alaEXDdkteCQ4gLBfa5/J2iTPA==", + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", "dev": true }, - "unexpected-sinon": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/unexpected-sinon/-/unexpected-sinon-10.11.2.tgz", - "integrity": "sha512-N2KIKPweTVs6AK8cDKQTUwu0fGWyGt+cI/UJZ/eltAyOKgsHL9eILttdGfpZjI/iMYcHcbtUwIlXoHfmh6EcBw==", + "urltools": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/urltools/-/urltools-0.4.1.tgz", + "integrity": "sha512-hGdweXMDjRXC0wC9RiJRRY05cAvlg6hnGBSg+6KWjJcqtvO0F6D4S2+ftp6t9x761jW8C0/lnKUOVUeA3rZlZQ==", + "dev": true, + "requires": { + "glob": "^7.0.3", + "underscore": "^1.8.3", + "urijs": "^1.18.2" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "xtend": "^4.0.1" + "lru-cache": "4.1.x", + "tmp": "0.0.x" } }, - "unicode-properties": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.1.0.tgz", - "integrity": "sha1-epbu9J91aC6mnSMV7smsQ//fAME=", + "uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", "dev": true, "requires": { - "brfs": "^1.4.0", - "unicode-trie": "^0.3.0" + "unorm": ">= 1.0.0" } }, - "unicode-trie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", - "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, - "union-value": { + "util.promisify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, - "uniq": { + "utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "crypto-random-string": "^1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "unist-util-is": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", - "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, - "unist-util-remove": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.1.tgz", - "integrity": "sha512-nL+3O0nBB2Oi8ixVzIfJQLtNOMPIFzwoAIKvhDzEL8B15Nq7EY0KBQPYULjNrEmrwYMCkWp5XGTQiAlYZAL/rw==", + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "unist-util-is": "^2.0.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "unist-util-remove-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", - "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "vfile": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.3.tgz", + "integrity": "sha512-lREgT5sF05TQk68LO6APy0In+TkFGnFEgKChK2+PHIaTrFQ9oHCKXznZ7VILwgYVBcl0gv4lGATFZBLhi2kVQg==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", "dev": true }, - "unist-util-visit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", - "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", - "dev": true, - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", - "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", + "vfile-message": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz", + "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==", "dev": true, "requires": { - "unist-util-is": "^2.1.2" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "unorm": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz", - "integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw==", + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "watchify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", + "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "anymatch": "^2.0.0", + "browserify": "^16.1.0", + "chokidar": "^2.1.1", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "isarray": "1.0.0" + "is-extglob": "^2.1.0" } } } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urijs": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", - "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "urltools": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/urltools/-/urltools-0.4.1.tgz", - "integrity": "sha512-hGdweXMDjRXC0wC9RiJRRY05cAvlg6hnGBSg+6KWjJcqtvO0F6D4S2+ftp6t9x761jW8C0/lnKUOVUeA3rZlZQ==", - "dev": true, - "requires": { - "glob": "^7.0.3", - "underscore": "^1.8.3", - "urijs": "^1.18.2" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, - "uslug": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", - "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", - "dev": true, - "requires": { - "unorm": ">= 1.0.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vendors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "dev": true, - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - }, - "dependencies": { + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - } - } - }, - "vfile-location": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz", - "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==", - "dev": true - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "dev": true, - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "watchify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", - "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "browserify": "^16.1.0", - "chokidar": "^2.1.1", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "kind-of": "^3.0.2" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "through2": { @@ -18260,6 +18314,16 @@ "readable-stream": "~2.3.6", "xtend": "~4.0.1" } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -18276,17 +18340,6 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "whatwg-mimetype": { @@ -18296,9 +18349,9 @@ "dev": true }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -18349,9 +18402,9 @@ "dev": true }, "wipe-node-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.0.tgz", - "integrity": "sha512-Vdash0WV9Di/GeYW9FJrAZcPjGK4dO7M/Be/sJybguEgcM7As0uwLyvewZYqdlepoh7Rj4ZJKEdo8uX83PeNIw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.1.tgz", + "integrity": "sha512-b2LdVay9YDim1Y5CTGYXZFxi8MuB5H1QHFApQu9+SERwqYuS8dwh8M4hhXEBut/z8pi1BCfAtEQM8280iT/oJg==", "dev": true }, "wipe-webpack-cache": { @@ -18371,14 +18424,6 @@ "requires": { "acorn": "^3.1.0", "acorn-globals": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } } }, "word-wrap": { @@ -18388,54 +18433,42 @@ "dev": true }, "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^4.1.0" } } } @@ -18455,9 +18488,9 @@ } }, "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -18480,12 +18513,6 @@ "async-limiter": "~1.0.0" } }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", - "dev": true - }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", @@ -18498,38 +18525,16 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "xmlcreate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", - "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", - "dev": true - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", + "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", "dev": true }, "xmlhttprequest-ssl": { @@ -18539,9 +18544,9 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { @@ -18555,6 +18560,15 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.7" + } + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -18572,15 +18586,10 @@ "yargs-parser": "^13.1.2" }, "dependencies": { - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "string-width": { "version": "3.1.0", @@ -18591,6 +18600,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -18611,79 +18628,6 @@ "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } } }, "yauzl": { @@ -18701,20 +18645,6 @@ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true - }, - "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } } } } diff --git a/package.json b/package.json index 1863e87622..f98bd6c519 100644 --- a/package.json +++ b/package.json @@ -68,61 +68,60 @@ "yargs-unparser": "1.6.0" }, "devDependencies": { - "@11ty/eleventy": "^0.8.3", + "@11ty/eleventy": "^0.10.0", "@mocha/docdash": "^2.1.2", - "acorn": "^7.0.0", - "assetgraph-builder": "^7.0.0", - "autoprefixer": "^9.6.0", - "babel-eslint": "^10.0.3", - "browserify": "^16.2.3", + "assetgraph-builder": "^8.0.0", + "autoprefixer": "^9.7.4", + "babel-eslint": "^10.1.0", + "browserify": "^16.5.0", "browserify-package-json": "^1.0.1", "chai": "^4.2.0", "coffee-script": "^1.12.7", - "coveralls": "^3.0.3", - "cross-env": "^5.2.0", - "cross-spawn": "^6.0.5", + "coveralls": "^3.0.11", + "cross-env": "^6.0.3", + "cross-spawn": "^7.0.1", "eslint": "^6.8.0", - "eslint-config-prettier": "^6.9.0", + "eslint-config-prettier": "^6.10.0", "eslint-config-semistandard": "^15.0.0", - "eslint-config-standard": "^14.1.0", - "eslint-plugin-import": "^2.19.1", + "eslint-config-standard": "^14.1.1", + "eslint-plugin-import": "^2.20.1", "eslint-plugin-node": "^11.0.0", "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", - "fs-extra": "^8.0.1", - "husky": "^1.3.1", - "hyperlink": "^4.3.1", + "fs-extra": "^9.0.0", + "husky": "^4.2.3", + "hyperlink": "^4.4.3", "jsdoc": "^3.6.3", - "karma": "^4.1.0", - "karma-browserify": "^6.0.0", - "karma-chrome-launcher": "^2.2.0", + "karma": "^4.4.1", + "karma-browserify": "^7.0.0", + "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", "karma-sauce-launcher": "^2.0.2", - "lint-staged": "^8.1.7", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.2.4", - "markdown-it-attrs": "^2.4.1", - "markdown-it-prism": "^2.0.2", - "markdown-magic": "^0.1.25", - "markdown-magic-package-json": "^2.0.0", + "lint-staged": "^9.5.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.5", + "markdown-it-attrs": "^3.0.2", + "markdown-it-prism": "^2.0.5", + "markdown-magic": "^1.0.0", + "markdown-magic-package-json": "^2.0.1", "markdown-toc": "^1.2.0", - "markdownlint-cli": "^0.14.1", + "markdownlint-cli": "^0.22.0", "nps": "^5.9.12", - "nyc": "^14.1.1", - "prettier": "^1.17.1", - "remark": "^10.0.1", - "remark-github": "^7.0.6", - "remark-inline-links": "^3.1.2", - "rewiremock": "^3.13.7", - "rimraf": "^2.6.3", - "sinon": "^7.3.2", - "strip-ansi": "^5.2.0", - "svgo": "^1.2.2", + "nyc": "^15.0.0", + "prettier": "^1.19.1", + "remark": "^11.0.2", + "remark-github": "^8.0.0", + "remark-inline-links": "^3.1.3", + "rewiremock": "^3.13.9", + "rimraf": "^3.0.2", + "sinon": "^9.0.1", + "strip-ansi": "^6.0.0", + "svgo": "^1.3.2", "through2": "^3.0.1", - "to-vfile": "^5.0.3", - "unexpected": "^10.40.2", + "to-vfile": "^6.1.0", + "unexpected": "^11.13.0", "unexpected-eventemitter": "^1.1.3", "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 970c77c125..bf20d2dae1 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -409,7 +409,11 @@ describe('lib/utils', function() { }); it('should handle empty functions (with no properties)', function() { - expect(stringify(function() {}), 'to be', '[Function]'); + expect( + stringify(function() {}), + 'to be', + '[Function]' + ); expect( stringify({foo: function() {}}), 'to be', From c5fc2bee0e15299825508743b25f596dff710120 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 25 Mar 2020 15:17:50 +0100 Subject: [PATCH 1458/1771] update CHANGELOG for v6.2.3 [ci skip] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c2f86a222..bc6352d79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -117,6 +117,12 @@ These are _soft_-deprecated, and will emit a warning upon use. Support will be r - [#4089](https://github.com/mochajs/mocha/issues/4089): Add funding information to `package.json` ([**@Munter**](https://github.com/Munter)) - [#4077](https://github.com/mochajs/mocha/issues/4077): Improve integration tests ([**@soobing**](https://github.com/soobing)) +# 6.2.3 / 2020-03-25 + +## :lock: Security Fixes + +- [848d6fb8](https://github.com/mochajs/mocha/commit/848d6fb8feef659564b296db457312d38176910d): Update dependencies mkdirp, yargs-parser and yargs ([**@juergba**](https://github.com/juergba)) + # 6.2.2 / 2019-10-18 ## :bug: Fixes From 54475eb4ca35a2c9044a1b8c59a60f09c73e6c01 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 4 Apr 2020 12:10:13 +0200 Subject: [PATCH 1459/1771] Update prod dependencies and remove 'node-environment-flags' (#4214) --- lib/cli/node-flags.js | 4 +- package-lock.json | 1210 +++++++++++++------------ package.json | 19 +- test/node-unit/cli/node-flags.spec.js | 2 +- 4 files changed, 621 insertions(+), 614 deletions(-) diff --git a/lib/cli/node-flags.js b/lib/cli/node-flags.js index ea6389d947..b7cc9a3864 100644 --- a/lib/cli/node-flags.js +++ b/lib/cli/node-flags.js @@ -6,7 +6,7 @@ * @module */ -const nodeFlags = require('node-environment-flags'); +const nodeFlags = process.allowedNodeEnvironmentFlags; const unparse = require('yargs-unparser'); /** @@ -48,7 +48,7 @@ exports.isNodeFlag = (flag, bareword = true) => { // check actual node flags from `process.allowedNodeEnvironmentFlags`, // then historical support for various V8 and non-`NODE_OPTIONS` flags // and also any V8 flags with `--v8-` prefix - (nodeFlags.has(flag) || + ((nodeFlags && nodeFlags.has(flag)) || debugFlags.has(flag) || /(?:preserve-symlinks(?:-main)?|harmony(?:[_-]|$)|(?:trace[_-].+$)|gc(?:[_-]global)?$|es[_-]staging$|use[_-]strict$|v8[_-](?!options).+?$)/.test( flag diff --git a/package-lock.json b/package-lock.json index 1adbb9218a..a208758447 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,22 +70,6 @@ "supports-color": "^7.1.0" } }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -121,12 +105,6 @@ "universalify": "^0.1.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -148,30 +126,6 @@ "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -225,13 +179,19 @@ "requires": { "ms": "^2.1.1" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "@babel/generator": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.0.tgz", - "integrity": "sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { "@babel/types": "^7.9.0", @@ -362,9 +322,9 @@ } }, "@babel/parser": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.2.tgz", - "integrity": "sha512-2jyvKdoOS1aWAFL2rjJZmamyDDkPCx/AAz4/Wh1Dfxvw8qqnOvek/ZlHQ2noO/o8JpnXa/WiUUFOv48meBKkpA==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/runtime": { @@ -454,40 +414,6 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -571,9 +497,9 @@ } }, "@sinonjs/fake-timers": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz", - "integrity": "sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" @@ -651,9 +577,9 @@ "dev": true }, "@types/node": { - "version": "13.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.2.tgz", - "integrity": "sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "dev": true }, "@types/normalize-package-data": { @@ -882,9 +808,9 @@ } }, "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { "version": "4.3.1", @@ -1253,34 +1179,6 @@ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "parse-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", @@ -1293,12 +1191,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -1406,21 +1298,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -1497,18 +1374,18 @@ } }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", "dev": true, "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" } }, "aws-sign2": { @@ -1758,6 +1635,21 @@ "requires": { "pump": "^3.0.0" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -1770,6 +1662,14 @@ "bin-version": "^3.0.0", "semver": "^5.6.0", "semver-truncate": "^1.1.2" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "bin-wrapper": { @@ -3044,9 +2944,9 @@ } }, "browserify": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", - "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", + "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -3054,7 +2954,7 @@ "browser-pack": "^6.0.1", "browser-resolve": "^1.11.0", "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", + "buffer": "~5.2.1", "cached-path-relative": "^1.0.0", "concat-stream": "^1.6.0", "console-browserify": "^1.1.0", @@ -3072,7 +2972,7 @@ "inherits": "~2.0.1", "insert-module-globals": "^7.0.0", "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", + "mkdirp-classic": "^0.5.2", "module-deps": "^6.0.0", "os-browserify": "~0.3.0", "parents": "^1.0.1", @@ -3099,6 +2999,16 @@ "xtend": "^4.0.0" }, "dependencies": { + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -3195,15 +3105,15 @@ } }, "browserslist": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", - "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.378", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "bs-recipes": { @@ -3469,9 +3379,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001035", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", - "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", + "version": "1.0.30001039", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", + "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==", "dev": true }, "canvas": { @@ -3614,18 +3524,18 @@ "dev": true }, "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.1", + "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "readdirp": "~3.3.0" } }, "chownr": { @@ -4405,15 +4315,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -4584,12 +4485,36 @@ "dev": true }, "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.37" + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "cssom": { @@ -4694,9 +4619,9 @@ "dev": true }, "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, "requires": { "decompress-tar": "^4.0.0", @@ -5051,9 +4976,9 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, "diffie-hellman": { "version": "5.0.3", @@ -5324,6 +5249,14 @@ "lru-cache": "^4.1.5", "semver": "^5.6.0", "sigmund": "^1.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "ee-first": { @@ -5339,9 +5272,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.380", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", - "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", + "version": "1.3.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.396.tgz", + "integrity": "sha512-ESY3UGekvNQwofHvgdsFW8GQEoudbqtJfoSDovnsCRRx8t0+0dPbE1XD/ZQdB+jbskSyPwUtIVYSyKwSXW/A6Q==", "dev": true }, "elegant-spinner": { @@ -5520,9 +5453,10 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -5541,6 +5475,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5732,24 +5667,27 @@ "ansi-regex": "^4.1.0" } }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "eslint-config-prettier": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", - "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", + "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -5803,9 +5741,9 @@ } }, "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -5857,9 +5795,9 @@ } }, "eslint-plugin-import": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", - "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", "dev": true, "requires": { "array-includes": "^3.0.3", @@ -5962,6 +5900,12 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -6001,9 +5945,9 @@ } }, "eslint-plugin-node": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", - "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, "requires": { "eslint-plugin-es": "^3.0.0", @@ -6114,12 +6058,20 @@ "dev": true }, "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } } }, "esrecurse": { @@ -6217,6 +6169,15 @@ "shebang-command": "^1.2.0", "which": "^1.2.9" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -6574,9 +6535,9 @@ "dev": true }, "fastq": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", - "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", + "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -6684,25 +6645,6 @@ "pkg-dir": "^4.1.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -6712,21 +6654,6 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -6745,11 +6672,12 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "find-versions": { @@ -6816,9 +6744,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "follow-redirects": { @@ -7121,9 +7049,9 @@ "dev": true }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7223,6 +7151,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -7320,15 +7257,16 @@ "dev": true }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { "source-map": { @@ -7359,6 +7297,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -7617,9 +7556,9 @@ } }, "html-escaper": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", - "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "html-minifier": { @@ -7821,22 +7760,6 @@ "yaml": "^1.7.2" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -7847,24 +7770,6 @@ "resolve-from": "^4.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "parse-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", @@ -7877,12 +7782,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7909,15 +7808,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -8198,12 +8088,6 @@ "escape-string-regexp": "^1.0.5" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -8211,9 +8095,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -8229,15 +8113,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -8385,7 +8260,8 @@ "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true }, "is-ci": { "version": "1.2.1", @@ -8439,7 +8315,8 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, "is-decimal": { "version": "1.0.4", @@ -8652,6 +8529,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -8708,6 +8586,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -8876,12 +8755,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -8896,15 +8769,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -8937,9 +8801,9 @@ } }, "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -8971,6 +8835,17 @@ "jpegtran-bin": "^4.0.0", "memoizeasync": "^1.0.0", "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "jpegtran-bin": { @@ -9086,17 +8961,17 @@ "uc.micro": "^1.0.5" } }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true + }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", + "dev": true } } }, @@ -9276,9 +9151,9 @@ } }, "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.3.0.tgz", + "integrity": "sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -9377,6 +9252,17 @@ "dev": true, "requires": { "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "karma-mocha": { @@ -9771,9 +9657,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -10070,12 +9956,11 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -10363,9 +10248,9 @@ } }, "luxon": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.22.0.tgz", - "integrity": "sha512-3sLvlfbFo+AxVEY3IqxymbumtnlgBwjDExxK60W3d+trrUzErNAz/PfvPT+mva+vEUrdIodeCOs7fB6zHtRSrw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.23.0.tgz", + "integrity": "sha512-+6a/bXsCWrrR8vfbL41iM92es12zwV2Rum/KPkT+ubOZnnU3Sqbqok/FmD1xsWlWN2Y9Hu0fU/vNgU24ns7bpA==", "dev": true }, "magicpen": { @@ -10464,9 +10349,9 @@ } }, "markdown-it-anchor": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.5.tgz", - "integrity": "sha512-xLIjLQmtym3QpoY9llBgApknl7pxAcN3WDRc2d3rwpl+/YvDZHPmKscGs+L6E05xf2KrCXPBvosWt7MZukwSpQ==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.7.tgz", + "integrity": "sha512-REFmIaSS6szaD1bye80DMbp7ePwsPNvLTR5HunsUcZ0SG0rWJQ+Pz24R4UlTKtjKBPhxo0v0tOBDYjZQQknW8Q==", "dev": true }, "markdown-it-attrs": { @@ -10599,6 +10484,12 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, @@ -11135,14 +11026,20 @@ } }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", + "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==", + "dev": true + }, "module-deps": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz", @@ -11185,9 +11082,9 @@ "dev": true }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multimatch": { "version": "4.0.0", @@ -11252,9 +11149,9 @@ "dev": true }, "needle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", - "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", + "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", "dev": true, "requires": { "debug": "^3.2.6", @@ -11309,15 +11206,14 @@ "dev": true, "requires": { "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "node-libs-browser": { @@ -11453,6 +11349,12 @@ "requires": { "glob": "^7.1.3" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -11466,21 +11368,10 @@ } }, "node-releases": { - "version": "1.1.52", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", - "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true }, "noop-logger": { "version": "0.1.1", @@ -11508,6 +11399,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-path": { @@ -11673,6 +11572,12 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -11817,9 +11722,9 @@ "dev": true }, "nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", + "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11837,10 +11742,9 @@ "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", + "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", - "node-preload": "^0.2.0", + "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", @@ -11848,7 +11752,6 @@ "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", - "uuid": "^3.3.3", "yargs": "^15.0.2" }, "dependencies": { @@ -11903,45 +11806,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -11951,21 +11821,6 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -12020,9 +11875,9 @@ } }, "yargs-parser": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", - "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -12089,7 +11944,8 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true }, "object-keys": { "version": "1.1.1", @@ -12126,6 +11982,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -12214,6 +12071,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true } } }, @@ -12241,6 +12104,17 @@ "memoizeasync": "^1.1.0", "optipng-bin": "^6.0.0", "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "optipng-bin": { @@ -12351,11 +12225,11 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -12418,6 +12292,14 @@ "registry-auth-token": "^3.0.1", "registry-url": "^3.0.3", "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "pako": { @@ -12570,9 +12452,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -12858,16 +12740,73 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, "please-upgrade-node": { @@ -12895,6 +12834,17 @@ "memoizeasync": "^1.0.0", "pngcrush-bin": "^4.0.0", "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "pngcrush-bin": { @@ -12917,6 +12867,17 @@ "memoizeasync": "1.1.0", "pngquant-bin": "^5.0.2", "which": "1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "pngquant-bin": { @@ -12961,6 +12922,23 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -13738,9 +13716,9 @@ "dev": true }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { @@ -14060,6 +14038,14 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } } }, "read-file-stdin": { @@ -14146,11 +14132,11 @@ } }, "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.0.7" } }, "readline-sync": { @@ -14825,9 +14811,10 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -14842,6 +14829,14 @@ "dev": true, "requires": { "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "semver-regex": { @@ -14857,6 +14852,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "send": { @@ -15204,9 +15207,9 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "simple-concat": { @@ -15256,29 +15259,6 @@ "diff": "^4.0.2", "nise": "^4.0.1", "supports-color": "^7.1.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "slash": { @@ -15738,15 +15718,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -16087,22 +16058,46 @@ "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=", "dev": true }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -16215,9 +16210,9 @@ } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, "strip-outer": { "version": "1.0.1", @@ -16262,11 +16257,18 @@ } }, "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + } } }, "svgo": { @@ -16420,13 +16422,13 @@ } }, "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", "dev": true, "requires": { "chownr": "^1.1.1", - "mkdirp": "^0.5.1", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.0.0" }, @@ -16555,9 +16557,9 @@ } }, "terser": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", - "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", + "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -16582,22 +16584,6 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "text-table": { @@ -17006,9 +16992,9 @@ "dev": true }, "uglify-js": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", - "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", "dev": true, "requires": { "commander": "~2.20.3", @@ -17049,9 +17035,9 @@ "dev": true }, "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.0.tgz", + "integrity": "sha512-kVx7CDAsdBSWVf404Mw7oI9i09w5/mTT/Ruk+RWa64PLYKvsAucLLFHvQtnvjeADM4ZizxrvG5SHnF4Te4T2Cg==", "dev": true, "requires": { "buffer": "^5.2.1", @@ -17078,15 +17064,15 @@ } }, "underscore": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", - "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", "dev": true }, "unexpected": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-11.13.0.tgz", - "integrity": "sha512-nSVZN1KsyhmDNctgHwQLmp/d1h6eNqv1DQqqqonnGMWhyr0dVbVyYE6meTDPjmqPWQbiTEUNNiBG5WBLtrffYg==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-11.14.0.tgz", + "integrity": "sha512-N4+XQRZjonRVue6ESYt3Hkt9e5p+mQJeoM8vNaQNae+RaWC0KjC81SAEXnDWdWXzH2N2To11eIDgE7ByVOjecQ==", "dev": true, "requires": { "array-changes": "3.0.1", @@ -17097,14 +17083,6 @@ "magicpen": "^6.2.1", "ukkonen": "^1.4.0", "unexpected-bluebird": "2.9.34-longstack2" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } } }, "unexpected-bluebird": { @@ -17523,9 +17501,9 @@ } }, "vfile": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.3.tgz", - "integrity": "sha512-lREgT5sF05TQk68LO6APy0In+TkFGnFEgKChK2+PHIaTrFQ9oHCKXznZ7VILwgYVBcl0gv4lGATFZBLhi2kVQg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz", + "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -17542,9 +17520,9 @@ "dev": true }, "vfile-message": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz", - "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -18360,9 +18338,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -18433,9 +18411,9 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { @@ -18591,6 +18569,36 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json index f98bd6c519..d2a133a380 100644 --- a/package.json +++ b/package.json @@ -43,25 +43,24 @@ "version": "nps version" }, "dependencies": { - "ansi-colors": "3.2.3", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.0", + "chokidar": "3.3.1", "debug": "3.2.6", - "diff": "3.5.0", + "diff": "4.0.2", "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", + "find-up": "4.1.0", + "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "3.0.0", "minimatch": "3.0.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", + "ms": "2.1.2", "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", "wide-align": "1.1.3", "yargs": "13.3.2", "yargs-parser": "13.1.2", diff --git a/test/node-unit/cli/node-flags.spec.js b/test/node-unit/cli/node-flags.spec.js index 4caabab570..f7167fa527 100644 --- a/test/node-unit/cli/node-flags.spec.js +++ b/test/node-unit/cli/node-flags.spec.js @@ -1,6 +1,6 @@ 'use strict'; -const nodeEnvFlags = require('node-environment-flags'); +const nodeEnvFlags = process.allowedNodeEnvironmentFlags; const { isNodeFlag, impliesNoTimeouts, From 8236ffd7494c368cbc1989fec73021f0e07008bc Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 18 Apr 2020 07:43:22 +0200 Subject: [PATCH 1460/1771] Improve hook pattern of 'this.skip()' in beforeAll (#4223) --- lib/runnable.js | 14 ++- lib/runner.js | 41 +++--- .../skip-async-before-hooks.fixture.js | 71 ++++++----- .../pending/skip-sync-before-hooks.fixture.js | 66 ++++++---- .../pending/skip-sync-before-inner.fixture.js | 38 ++++++ test/integration/pending.spec.js | 119 +++++++----------- 6 files changed, 188 insertions(+), 161 deletions(-) create mode 100644 test/integration/fixtures/pending/skip-sync-before-inner.fixture.js diff --git a/lib/runnable.js b/lib/runnable.js index 7d3011dc86..9e43da3100 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -295,6 +295,8 @@ Runnable.prototype.run = function(fn) { var finished; var emitted; + if (this.isPending()) return fn(); + // Sometimes the ctx exists, but it is not runnable if (ctx && ctx.runnable) { ctx.runnable(this); @@ -376,11 +378,7 @@ Runnable.prototype.run = function(fn) { // sync or promise-returning try { - if (this.isPending()) { - done(); - } else { - callFn(this.fn); - } + callFn(this.fn); } catch (err) { emitted = true; if (err instanceof Pending) { @@ -481,7 +479,11 @@ var constants = utils.defineConstants( /** * Value of `state` prop when a `Runnable` has passed */ - STATE_PASSED: 'passed' + STATE_PASSED: 'passed', + /** + * Value of `state` prop when a `Runnable` has been skipped by user + */ + STATE_PENDING: 'pending' } ); diff --git a/lib/runner.js b/lib/runner.js index 8e7c8736c0..0285315649 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -18,6 +18,7 @@ var HOOK_TYPE_BEFORE_ALL = Suite.constants.HOOK_TYPE_BEFORE_ALL; var EVENT_ROOT_SUITE_RUN = Suite.constants.EVENT_ROOT_SUITE_RUN; var STATE_FAILED = Runnable.constants.STATE_FAILED; var STATE_PASSED = Runnable.constants.STATE_PASSED; +var STATE_PENDING = Runnable.constants.STATE_PENDING; var dQuote = utils.dQuote; var ngettext = utils.ngettext; var sQuote = utils.sQuote; @@ -122,8 +123,7 @@ module.exports = Runner; * @public * @class * @param {Suite} suite Root suite - * @param {boolean} [delay] Whether or not to delay execution of root suite - * until ready. + * @param {boolean} [delay] Whether to delay execution of root suite until ready. */ function Runner(suite, delay) { var self = this; @@ -285,11 +285,13 @@ Runner.prototype.checkGlobals = function(test) { * Fail the given `test`. * * @private - * @param {Test} test + * @param {Runnable} test * @param {Error} err + * @param {boolean} [force=false] - Whether to fail a pending test. */ -Runner.prototype.fail = function(test, err) { - if (test.isPending()) { +Runner.prototype.fail = function(test, err, force) { + force = force === true; + if (test.isPending() && !force) { return; } @@ -386,7 +388,7 @@ Runner.prototype.hook = function(name, fn) { }); } - hook.run(function(err) { + hook.run(function cbHookRun(err) { var testError = hook.error(); if (testError) { self.fail(self.test, testError); @@ -412,6 +414,7 @@ Runner.prototype.hook = function(name, fn) { suite.suites.forEach(function(suite) { suite.pending = true; }); + hooks = []; } else { hook.pending = false; var errForbid = createUnsupportedError('`this.skip` forbidden'); @@ -533,9 +536,6 @@ Runner.prototype.runTest = function(fn) { test.asyncOnly = true; } test.on('error', function(err) { - if (err instanceof Pending) { - return; - } self.fail(test, err); }); if (this.allowUncaught) { @@ -634,10 +634,9 @@ Runner.prototype.runTests = function(suite, fn) { // static skip, no hooks are executed if (test.isPending()) { if (self.forbidPending) { - test.isPending = alwaysFalse; - self.fail(test, new Error('Pending test forbidden')); - delete test.isPending; + self.fail(test, new Error('Pending test forbidden'), true); } else { + test.state = STATE_PENDING; self.emit(constants.EVENT_TEST_PENDING, test); } self.emit(constants.EVENT_TEST_END, test); @@ -650,10 +649,9 @@ Runner.prototype.runTests = function(suite, fn) { // conditional skip within beforeEach if (test.isPending()) { if (self.forbidPending) { - test.isPending = alwaysFalse; - self.fail(test, new Error('Pending test forbidden')); - delete test.isPending; + self.fail(test, new Error('Pending test forbidden'), true); } else { + test.state = STATE_PENDING; self.emit(constants.EVENT_TEST_PENDING, test); } self.emit(constants.EVENT_TEST_END, test); @@ -674,10 +672,9 @@ Runner.prototype.runTests = function(suite, fn) { // conditional skip within it if (test.pending) { if (self.forbidPending) { - test.isPending = alwaysFalse; - self.fail(test, new Error('Pending test forbidden')); - delete test.isPending; + self.fail(test, new Error('Pending test forbidden'), true); } else { + test.state = STATE_PENDING; self.emit(constants.EVENT_TEST_PENDING, test); } self.emit(constants.EVENT_TEST_END, test); @@ -714,10 +711,6 @@ Runner.prototype.runTests = function(suite, fn) { next(); }; -function alwaysFalse() { - return false; -} - /** * Run the given `suite` and invoke the callback `fn()` when complete. * @@ -850,9 +843,7 @@ Runner.prototype.uncaught = function(err) { return; } else if (runnable.isPending()) { // report 'pending test' retrospectively as failed - runnable.isPending = alwaysFalse; - this.fail(runnable, err); - delete runnable.isPending; + this.fail(runnable, err, true); return; } diff --git a/test/integration/fixtures/pending/skip-async-before-hooks.fixture.js b/test/integration/fixtures/pending/skip-async-before-hooks.fixture.js index 7afd6bc670..0aa1409e6a 100644 --- a/test/integration/fixtures/pending/skip-async-before-hooks.fixture.js +++ b/test/integration/fixtures/pending/skip-async-before-hooks.fixture.js @@ -1,59 +1,72 @@ 'use strict'; +var assert = require('assert'); -describe('outer suite', function () { - - before(function () { - console.log('outer before'); +describe('outer suite', function() { + var runOrder = []; + before(function() { + runOrder.push('outer before'); }); - it('should run this test', function () { }); - - describe('inner suite', function () { + it('should run test-1', function() { + runOrder.push('should run test-1'); + }); - before(function (done) { - console.log('inner before'); + describe('inner suite', function() { + before(function(done) { + runOrder.push('inner before'); var self = this; - setTimeout(function () { + setTimeout(function() { self.skip(); // done() is not required }, 0); }); - beforeEach(function () { - throw new Error('beforeEach should not run'); + before(function() { + runOrder.push('inner before-2 should not run'); }); - afterEach(function () { - throw new Error('afterEach should not run'); + beforeEach(function() { + runOrder.push('beforeEach should not run'); }); - it('should not run this test', function () { - throw new Error('inner suite test should not run'); + afterEach(function() { + runOrder.push('afterEach should not run'); + }); + + after(function() { + runOrder.push('inner after'); }); - after(function () { - console.log('inner after'); + it('should not run this test', function() { + throw new Error('inner suite test should not run'); }); - describe('skipped suite', function () { - before(function () { - console.log('skipped before'); + describe('skipped suite', function() { + before(function() { + runOrder.push('skipped suite before should not run'); }); - it('should not run this test', function () { + it('should not run this test', function() { throw new Error('skipped suite test should not run'); }); - after(function () { - console.log('skipped after'); + after(function() { + runOrder.push('skipped suite after should not run'); }); }); - }); - it('should run this test', function () { }); - - after(function () { - console.log('outer after'); + it('should run test-2', function() { + runOrder.push('should run test-2'); }); + after(function() { + runOrder.push('outer after'); + assert.deepStrictEqual(runOrder, [ + 'outer before', + 'should run test-1', 'should run test-2', + 'inner before', 'inner after', + 'outer after' + ]); + throw new Error('should throw this error'); + }); }); diff --git a/test/integration/fixtures/pending/skip-sync-before-hooks.fixture.js b/test/integration/fixtures/pending/skip-sync-before-hooks.fixture.js index 1649656202..629ba29552 100644 --- a/test/integration/fixtures/pending/skip-sync-before-hooks.fixture.js +++ b/test/integration/fixtures/pending/skip-sync-before-hooks.fixture.js @@ -1,57 +1,69 @@ 'use strict'; +var assert = require('assert'); -describe('outer suite', function () { - - before(function () { - console.log('outer before'); +describe('outer suite', function() { + var runOrder = []; + before(function() { + runOrder.push('outer before'); }); - it('should run this test', function () { }); + it('should run test-1', function() { + runOrder.push('should run test-1'); + }); - describe('inner suite', function () { - before(function () { + describe('inner suite', function() { + before(function() { + runOrder.push('inner before'); this.skip(); }); - before(function () { - console.log('inner before'); + before(function() { + runOrder.push('inner before-2 should not run'); }); - beforeEach(function () { - throw new Error('beforeEach should not run'); + beforeEach(function() { + runOrder.push('beforeEach should not run'); }); - afterEach(function () { - throw new Error('afterEach should not run'); + afterEach(function() { + runOrder.push('afterEach should not run'); }); - after(function () { - console.log('inner after'); + after(function() { + runOrder.push('inner after'); }); - it('should never run this test', function () { + it('should never run this test', function() { throw new Error('inner suite test should not run'); }); - describe('skipped suite', function () { - before(function () { - console.log('skipped before'); + describe('skipped suite', function() { + before(function() { + runOrder.push('skipped suite before should not run'); }); - it('should never run this test', function () { + it('should never run this test', function() { throw new Error('skipped suite test should not run'); }); - after(function () { - console.log('skipped after'); + after(function() { + runOrder.push('skipped suite after should not run'); }); }); }); - it('should run this test', function () { }); - - after(function () { - console.log('outer after'); - }) + it('should run test-2', function() { + runOrder.push('should run test-2'); + }); + after(function() { + runOrder.push('outer after'); + assert.deepStrictEqual(runOrder, [ + 'outer before', + 'should run test-1', 'should run test-2', + 'inner before', 'inner after', + 'outer after' + ]); + throw new Error('should throw this error'); + }); }); diff --git a/test/integration/fixtures/pending/skip-sync-before-inner.fixture.js b/test/integration/fixtures/pending/skip-sync-before-inner.fixture.js new file mode 100644 index 0000000000..a5389a43e5 --- /dev/null +++ b/test/integration/fixtures/pending/skip-sync-before-inner.fixture.js @@ -0,0 +1,38 @@ +'use strict'; +var assert = require('assert'); + +describe('outer suite', function() { + var runOrder = []; + before(function() { + runOrder.push('outer before'); + this.skip(); + }); + + it('should never run this outer test', function() { + throw new Error('outer suite test should not run'); + }); + + describe('inner suite', function() { + before(function() { runOrder.push('no inner before'); }); + before(function(done) { runOrder.push('no inner before'); done(); }); + before(async function() { runOrder.push('no inner before'); }); + before(function() { return Promise.resolve(runOrder.push('no inner before')) }); + + after(function() { runOrder.push('no inner after'); }); + after(function(done) { runOrder.push('no inner after'); done(); }); + after(async function() { runOrder.push('no inner after'); }); + after(function() { return Promise.resolve(runOrder.push('no inner after')) }); + + it('should never run this inner test', function() { + throw new Error('inner suite test should not run'); + }); + }); + + after(function() { + runOrder.push('outer after'); + assert.deepStrictEqual(runOrder, [ + 'outer before', 'outer after' + ]); + throw new Error('should throw this error'); + }); +}); diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index ae6a57f0ca..51a7bc9b16 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -3,8 +3,6 @@ var assert = require('assert'); var helpers = require('./helpers'); var run = helpers.runMochaJSON; -var runMocha = helpers.runMocha; -var splitRegExp = helpers.splitRegExp; var invokeNode = helpers.invokeNode; var toJSONRunResult = helpers.toJSONRunResult; var args = []; @@ -111,43 +109,38 @@ describe('pending', function() { }); }); it('should run before and after hooks', function(done) { - runMocha( - 'pending/skip-sync-before-hooks.fixture.js', - args.concat(['--reporter', 'dot']), - function(err, res) { - if (err) { - done(err); - return; - } - - var lines = res.output - .split(splitRegExp) - .map(function(line) { - return line.trim(); - }) - .filter(function(line) { - return line.length; - }) - .slice(0, -1); - - var expected = [ - 'outer before', - 'inner before', - 'inner after', - 'outer after' - ]; - - assert.strictEqual(res.pending, 2); - assert.strictEqual(res.passing, 2); - assert.strictEqual(res.failing, 0); - assert.strictEqual(res.code, 0); - expected.forEach(function(line, i) { - assert.strictEqual(true, lines[i].includes(line)); - }); - - done(); + run('pending/skip-sync-before-hooks.fixture.js', function(err, res) { + if (err) { + return done(err); } - ); + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 2) + .and('to have passed test count', 2) + .and( + 'to have passed test order', + 'should run test-1', + 'should run test-2' + ); + done(); + }); + }); + it('should skip all sync/async inner before/after hooks', function(done) { + run('pending/skip-sync-before-inner.fixture.js', function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 2) + .and('to have passed test count', 0) + .and( + 'to have pending test order', + 'should never run this outer test', + 'should never run this inner test' + ); + done(); + }); }); }); @@ -245,43 +238,21 @@ describe('pending', function() { }); }); it('should run before and after hooks', function(done) { - runMocha( - 'pending/skip-async-before-hooks.fixture.js', - args.concat(['--reporter', 'dot']), - function(err, res) { - if (err) { - done(err); - return; - } - - var lines = res.output - .split(splitRegExp) - .map(function(line) { - return line.trim(); - }) - .filter(function(line) { - return line.length; - }) - .slice(0, -1); - - var expected = [ - 'outer before', - 'inner before', - 'inner after', - 'outer after' - ]; - - assert.strictEqual(res.pending, 2); - assert.strictEqual(res.passing, 2); - assert.strictEqual(res.failing, 0); - assert.strictEqual(res.code, 0); - expected.forEach(function(line, i) { - assert.strictEqual(true, lines[i].includes(line)); - }); - - done(); + run('pending/skip-async-before-hooks.fixture.js', function(err, res) { + if (err) { + return done(err); } - ); + expect(res, 'to have failed with error', 'should throw this error') + .and('to have failed test count', 1) + .and('to have pending test count', 2) + .and('to have passed test count', 2) + .and( + 'to have passed test order', + 'should run test-1', + 'should run test-2' + ); + done(); + }); }); }); From 38d579ac4156545c21a027bba640d49428d6bcfb Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 20 Apr 2020 06:55:57 +0200 Subject: [PATCH 1461/1771] Remove Runnable#inspect() and utils.ngettext() (#4230) --- lib/runnable.js | 25 ------------------------- lib/runner.js | 9 ++------- lib/utils.js | 32 -------------------------------- test/unit/runner.spec.js | 8 ++++---- test/unit/utils.spec.js | 25 ------------------------- 5 files changed, 6 insertions(+), 93 deletions(-) diff --git a/lib/runnable.js b/lib/runnable.js index 9e43da3100..bdd6fffe5c 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -222,31 +222,6 @@ Runnable.prototype.clearTimeout = function() { clearTimeout(this.timer); }; -/** - * Inspect the runnable void of private properties. - * - * @private - * @return {string} - */ -Runnable.prototype.inspect = function() { - return JSON.stringify( - this, - function(key, val) { - if (key[0] === '_') { - return; - } - if (key === 'parent') { - return '#'; - } - if (key === 'ctx') { - return '#'; - } - return val; - }, - 2 - ); -}; - /** * Reset the timeout. * diff --git a/lib/runner.js b/lib/runner.js index 0285315649..c60e562a81 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -20,7 +20,6 @@ var STATE_FAILED = Runnable.constants.STATE_FAILED; var STATE_PASSED = Runnable.constants.STATE_PASSED; var STATE_PENDING = Runnable.constants.STATE_PENDING; var dQuote = utils.dQuote; -var ngettext = utils.ngettext; var sQuote = utils.sQuote; var stackFilter = utils.stackTraceFilter(); var stringify = utils.stringify; @@ -271,12 +270,8 @@ Runner.prototype.checkGlobals = function(test) { this._globals = this._globals.concat(leaks); if (leaks.length) { - var format = ngettext( - leaks.length, - 'global leak detected: %s', - 'global leaks detected: %s' - ); - var error = new Error(util.format(format, leaks.map(sQuote).join(', '))); + var msg = 'global leak(s) detected: %s'; + var error = new Error(util.format(msg, leaks.map(sQuote).join(', '))); this.fail(test, error); } }; diff --git a/lib/utils.js b/lib/utils.js index 59b250c20e..6ab1277409 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -753,38 +753,6 @@ exports.dQuote = function(str) { return '"' + str + '"'; }; -/** - * Provides simplistic message translation for dealing with plurality. - * - * @description - * Use this to create messages which need to be singular or plural. - * Some languages have several plural forms, so _complete_ message clauses - * are preferable to generating the message on the fly. - * - * @private - * @param {number} n - Non-negative integer - * @param {string} msg1 - Message to be used in English for `n = 1` - * @param {string} msg2 - Message to be used in English for `n = 0, 2, 3, ...` - * @returns {string} message corresponding to value of `n` - * @example - * var sprintf = require('util').format; - * var pkgs = ['one', 'two']; - * var msg = sprintf( - * ngettext( - * pkgs.length, - * 'cannot load package: %s', - * 'cannot load packages: %s' - * ), - * pkgs.map(sQuote).join(', ') - * ); - * console.log(msg); // => cannot load packages: 'one', 'two' - */ -exports.ngettext = function(n, msg1, msg2) { - if (typeof n === 'number' && n >= 0) { - return n === 1 ? msg1 : msg2; - } -}; - /** * It's a noop. * @public diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index cc65453b31..79edfc47a1 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -121,7 +121,7 @@ describe('Runner', function() { global.foo = 'bar'; runner.on(EVENT_TEST_FAIL, function(_test, _err) { expect(_test, 'to be', test); - expect(_err, 'to have message', "global leak detected: 'foo'"); + expect(_err, 'to have message', "global leak(s) detected: 'foo'"); delete global.foo; done(); }); @@ -183,7 +183,7 @@ describe('Runner', function() { global.bar = 'baz'; runner.on(EVENT_TEST_FAIL, function(_test, _err) { expect(_test, 'to be', test); - expect(_err, 'to have message', "global leaks detected: 'foo', 'bar'"); + expect(_err.message, 'to be', "global leak(s) detected: 'foo', 'bar'"); delete global.foo; delete global.bar; done(); @@ -217,7 +217,7 @@ describe('Runner', function() { global.bar = 'detect-me'; runner.on(EVENT_TEST_FAIL, function(_test, _err) { expect(_test.title, 'to be', 'im a test about lions'); - expect(_err, 'to have message', "global leak detected: 'bar'"); + expect(_err, 'to have message', "global leak(s) detected: 'bar'"); delete global.foo; delete global.bar; done(); @@ -229,7 +229,7 @@ describe('Runner', function() { global.derp = 'bar'; runner.on(EVENT_TEST_FAIL, function(_test, _err) { expect(_test.title, 'to be', 'herp'); - expect(_err, 'to have message', "global leak detected: 'derp'"); + expect(_err, 'to have message', "global leak(s) detected: 'derp'"); delete global.derp; done(); }); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index bf20d2dae1..3c68ddd186 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -724,31 +724,6 @@ describe('lib/utils', function() { }); }); - describe('ngettext', function() { - var singular = 'singular'; - var plural = 'plural'; - - it("should return plural string if 'n' is 0", function() { - expect(utils.ngettext(0, singular, plural), 'to be', plural); - }); - - it("should return singular string if 'n' is 1", function() { - expect(utils.ngettext(1, singular, plural), 'to be', singular); - }); - - it("should return plural string if 'n' is greater than 1", function() { - var arr = ['aaa', 'bbb']; - expect(utils.ngettext(arr.length, singular, plural), 'to be', plural); - }); - - it("should return undefined if 'n' is not a non-negative integer", function() { - expect(utils.ngettext('', singular, plural), 'to be undefined'); - expect(utils.ngettext(-1, singular, plural), 'to be undefined'); - expect(utils.ngettext(true, singular, plural), 'to be undefined'); - expect(utils.ngettext({}, singular, plural), 'to be undefined'); - }); - }); - describe('createMap', function() { it('should return an object with a null prototype', function() { expect(Object.getPrototypeOf(utils.createMap()), 'to be', null); From 6838eaf66b94445e314f087ec407d7e2b5bf1fb5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 10:00:46 -0700 Subject: [PATCH 1462/1771] remove cruft from wallaby config also increase default timeout Ref: #4198 --- .wallaby.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.wallaby.js b/.wallaby.js index a54f3576fc..b23a244650 100644 --- a/.wallaby.js +++ b/.wallaby.js @@ -36,7 +36,7 @@ module.exports = () => { // running mocha instance is not the same as mocha under test, // running mocha is the project's source code mocha, mocha under test is instrumented version of the source code const runningMocha = wallaby.testFramework; - runningMocha.timeout(200); + runningMocha.timeout(1000); // to expose it/describe etc. on the mocha under test const MochaUnderTest = require('./'); const mochaUnderTest = new MochaUnderTest(); @@ -46,18 +46,6 @@ module.exports = () => { '', mochaUnderTest ); - // to make test/node-unit/color.spec.js pass, we need to run mocha in the project's folder context - const childProcess = require('child_process'); - const execFile = childProcess.execFile; - childProcess.execFile = function() { - let opts = arguments[2]; - if (typeof opts === 'function') { - opts = {}; - Array.prototype.splice.call(arguments, 2, 0, opts); - } - opts.cwd = wallaby.localProjectDir; - return execFile.apply(this, arguments); - }; require('./test/setup'); }, debug: true From 5f9400df1d0c650e585486e7640f72a7c585e8c2 Mon Sep 17 00:00:00 2001 From: Arvid Ottenberg Date: Fri, 24 Apr 2020 20:36:32 +0200 Subject: [PATCH 1463/1771] refactor Test: add markOnly() for encapsulation (PR #4249) * add markOnly instance method to test class * add test cases for markOnly method * use markOnly method of test class instead of accessing parent properties method * refactor cases for test markOnly * refactor test class unit test markOnly to exhaustively satisfy Ref: #3689 --- lib/interfaces/common.js | 2 +- lib/test.js | 9 +++++++++ test/unit/test.spec.js | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 1802fcc9dc..7991e113f7 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -165,7 +165,7 @@ module.exports = function(suites, context, mocha) { * @returns {*} */ only: function(mocha, test) { - test.parent.appendOnlyTest(test); + test.markOnly(); return test; }, diff --git a/lib/test.js b/lib/test.js index 65122b260c..87f1ccce7d 100644 --- a/lib/test.js +++ b/lib/test.js @@ -48,6 +48,15 @@ Test.prototype.retriedTest = function(n) { this._retriedTest = n; }; +/** + * Add test to the list of tests marked `only`. + * + * @private + */ +Test.prototype.markOnly = function() { + this.parent.appendOnlyTest(this); +}; + Test.prototype.clone = function() { var test = new Test(this.title, this.fn); test.timeout(this.timeout()); diff --git a/test/unit/test.spec.js b/test/unit/test.spec.js index 4cff662c89..7bf739d47e 100644 --- a/test/unit/test.spec.js +++ b/test/unit/test.spec.js @@ -2,6 +2,7 @@ var mocha = require('../../lib/mocha'); var Test = mocha.Test; +var sinon = require('sinon'); describe('Test', function() { describe('.clone()', function() { @@ -83,4 +84,29 @@ describe('Test', function() { expect(this._test.isPending(), 'to be', true); }); }); + + describe('.markOnly()', function() { + var sandbox; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + }); + + afterEach(function() { + sandbox.restore(); + }); + + it('should call appendOnlyTest on parent', function() { + var test = new Test('foo'); + var spy = sandbox.spy(); + test.parent = { + appendOnlyTest: spy + }; + test.markOnly(); + + expect(spy, 'to have a call exhaustively satisfying', [test]).and( + 'was called once' + ); + }); + }); }); From de759d1d87033232f40d64772ed076445006c58a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 09:58:04 -0700 Subject: [PATCH 1464/1771] enable emoji on website; enable normal ul elements grouped these together: - Site can now use emoji :party: - Using the `.single-column` class will render a `ul` element as a "normal" list - Suppress the warning about `text` being an unknown language coming out of 11ty/Prism/markdown-it Ref: #4198 --- .eleventy.js | 2 + .markdownlint.json | 3 +- docs/css/style.css | 18 ++ package-lock.json | 487 ++++++++++++++++++++----------- package.json | 1 + scripts/markdown-magic.config.js | 2 +- 6 files changed, 346 insertions(+), 167 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 934e19bb89..3836c6999e 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -31,6 +31,8 @@ module.exports = function(eleventyConfig) { markdown.use(require('markdown-it-prism')); + markdown.use(require('markdown-it-emoji')); + eleventyConfig.setLibrary('md', markdown); return { diff --git a/.markdownlint.json b/.markdownlint.json index 14a5c306e6..5eab24dc58 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -6,5 +6,6 @@ "first-header-h1": false, "first-line-h1": false, "commands-show-output": false, - "single-h1": false + "single-h1": false, + "fenced-code-language": false } diff --git a/docs/css/style.css b/docs/css/style.css index d4b0ab8600..39fefea91e 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -171,6 +171,13 @@ ul { padding: 0 15px; } +ul.single-column, +ul.single-column > li > ul { + column-count: 1; + margin-top: 0; + padding-right: 0; +} + ul li { border-bottom: 1px solid #eee; break-inside: avoid; @@ -179,6 +186,17 @@ ul li { padding: 5px 0; } +ul.single-column li, +ul.single-column li > ul > li { + list-style: disc; + padding: 0; + border-bottom: 0; +} + +ul.single-column li > ul > li { + list-style: circle; +} + code { font: 14px monaco, monospace; line-height: 1.8; diff --git a/package-lock.json b/package-lock.json index a208758447..b299eb745e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1826,6 +1826,16 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", @@ -1851,7 +1861,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2203,31 +2213,36 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -2237,13 +2252,15 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { @@ -2253,37 +2270,43 @@ }, "chownr": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { @@ -2292,25 +2315,29 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, "requires": { @@ -2319,13 +2346,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -2341,7 +2370,8 @@ }, "glob": { "version": "7.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, "requires": { @@ -2355,13 +2385,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { @@ -2370,7 +2402,8 @@ }, "ignore-walk": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, "requires": { @@ -2379,7 +2412,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -2389,19 +2423,22 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { @@ -2410,13 +2447,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { @@ -2425,13 +2464,15 @@ }, "minimist": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -2441,7 +2482,8 @@ }, "minizlib": { "version": "1.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, "requires": { @@ -2450,7 +2492,8 @@ }, "mkdirp": { "version": "0.5.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, "requires": { @@ -2459,13 +2502,15 @@ }, "ms": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, "requires": { @@ -2476,7 +2521,8 @@ }, "node-pre-gyp": { "version": "0.14.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, "requires": { @@ -2494,7 +2540,8 @@ }, "nopt": { "version": "4.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, "requires": { @@ -2504,7 +2551,8 @@ }, "npm-bundled": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, "requires": { @@ -2513,13 +2561,15 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, "requires": { @@ -2530,7 +2580,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -2542,19 +2593,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { @@ -2563,19 +2617,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -2585,19 +2642,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { @@ -2609,7 +2669,8 @@ }, "readable-stream": { "version": "2.3.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, "requires": { @@ -2624,7 +2685,8 @@ }, "rimraf": { "version": "2.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, "requires": { @@ -2633,43 +2695,50 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { @@ -2680,7 +2749,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -2689,7 +2759,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { @@ -2698,13 +2769,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { @@ -2719,13 +2792,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { @@ -2734,13 +2809,15 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true } @@ -2886,7 +2963,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -2908,7 +2985,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -3553,7 +3630,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4272,7 +4349,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", "dev": true }, "cross-env": { @@ -6137,7 +6214,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6577,6 +6654,13 @@ "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -6701,13 +6785,13 @@ "dependencies": { "colors": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, "commander": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", "dev": true } @@ -6962,7 +7046,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7175,7 +7259,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7549,7 +7633,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -8507,7 +8591,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9731,7 +9815,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -9925,7 +10009,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -9946,7 +10030,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10360,6 +10444,12 @@ "integrity": "sha512-q45vdXU9TSWaHgFkWEFM97YHEoCmOyG9csLLdv3oVC6ARjT77u4wfng9rRtSOMb5UpxzT7zTX5GBbwm15H40dw==", "dev": true }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=", + "dev": true + }, "markdown-it-prism": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.5.tgz", @@ -10422,7 +10512,7 @@ }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -10511,7 +10601,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10905,7 +10995,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11193,7 +11283,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11300,7 +11390,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -12049,7 +12139,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -12458,7 +12548,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12622,7 +12712,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13469,7 +13559,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13630,13 +13720,13 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-ms": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -13841,7 +13931,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14570,7 +14660,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -14710,7 +14800,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -16190,7 +16280,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -16712,7 +16802,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -16749,7 +16839,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -17666,31 +17756,36 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -17700,13 +17795,15 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { @@ -17716,37 +17813,43 @@ }, "chownr": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { @@ -17755,25 +17858,29 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, "requires": { @@ -17782,13 +17889,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -17804,7 +17913,8 @@ }, "glob": { "version": "7.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, "requires": { @@ -17818,13 +17928,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { @@ -17833,7 +17945,8 @@ }, "ignore-walk": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, "requires": { @@ -17842,7 +17955,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -17852,19 +17966,22 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { @@ -17873,13 +17990,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { @@ -17888,13 +18007,15 @@ }, "minimist": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -17904,7 +18025,8 @@ }, "minizlib": { "version": "1.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, "requires": { @@ -17913,7 +18035,8 @@ }, "mkdirp": { "version": "0.5.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, "requires": { @@ -17922,13 +18045,15 @@ }, "ms": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, "requires": { @@ -17939,7 +18064,8 @@ }, "node-pre-gyp": { "version": "0.14.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, "requires": { @@ -17957,7 +18083,8 @@ }, "nopt": { "version": "4.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, "requires": { @@ -17967,7 +18094,8 @@ }, "npm-bundled": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, "requires": { @@ -17976,13 +18104,15 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, "requires": { @@ -17993,7 +18123,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -18005,19 +18136,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { @@ -18026,19 +18160,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -18048,19 +18185,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { @@ -18072,7 +18212,8 @@ }, "readable-stream": { "version": "2.3.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, "requires": { @@ -18087,7 +18228,8 @@ }, "rimraf": { "version": "2.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, "requires": { @@ -18096,43 +18238,50 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { @@ -18143,7 +18292,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -18152,7 +18302,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { @@ -18161,13 +18312,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { @@ -18182,13 +18335,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { @@ -18197,13 +18352,15 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true } @@ -18308,7 +18465,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "whatwg-encoding": { diff --git a/package.json b/package.json index d2a133a380..14dc08d092 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,7 @@ "markdown-it": "^10.0.0", "markdown-it-anchor": "^5.2.5", "markdown-it-attrs": "^3.0.2", + "markdown-it-emoji": "^1.4.0", "markdown-it-prism": "^2.0.5", "markdown-magic": "^1.0.0", "markdown-magic-package-json": "^2.0.1", diff --git a/scripts/markdown-magic.config.js b/scripts/markdown-magic.config.js index f75740a264..f800a5c9f0 100644 --- a/scripts/markdown-magic.config.js +++ b/scripts/markdown-magic.config.js @@ -20,7 +20,7 @@ exports.transforms = { usage: (content, options) => { const {executable} = options; const flag = options.flag || '--help'; - const header = options.header || '\n```text'; + const header = options.header || '\n```'; const footer = options.footer || '```\n'; const output = stripAnsi( String( From 284b411634f8ae463603f64eecd487898ad63e67 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 10:17:55 -0700 Subject: [PATCH 1465/1771] fixes some signal handling - `landing` reporter befouls the terminal up if `SIGINT` is issued - `--exit` test used an incorrect description, and also did not reliably handle `SIGINT` when running - `runMocha` helper returns the child process Ref: #4198 --- lib/reporters/landing.js | 8 +++++++ test/integration/helpers.js | 3 ++- test/integration/options/exit.spec.js | 30 +++++++++++++++++++-------- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index a6af946c42..0be3837d7b 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -98,6 +98,14 @@ function Landing(runner, options) { process.stdout.write('\n'); self.epilogue(); }); + + // if cursor is hidden when we ctrl-C, then it will remain hidden unless... + process.once('SIGINT', function() { + cursor.show(); + process.nextTick(function() { + process.kill(process.pid, 'SIGINT'); + }); + }); } /** diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 6cdf7e93cf..799f477539 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -33,6 +33,7 @@ module.exports = { * @param {string[]} args - Extra args to mocha executable * @param {Function} fn - Callback * @param {Object} [opts] - Options for `spawn()` + * @returns {ChildProcess} Mocha process */ runMocha: function(fixturePath, args, fn, opts) { if (typeof args === 'function') { @@ -46,7 +47,7 @@ module.exports = { path = resolveFixturePath(fixturePath); args = args || []; - invokeSubMocha( + return invokeSubMocha( args.concat(['-C', path]), function(err, res) { if (err) { diff --git a/test/integration/options/exit.spec.js b/test/integration/options/exit.spec.js index 376496f4fc..cde3c35b96 100644 --- a/test/integration/options/exit.spec.js +++ b/test/integration/options/exit.spec.js @@ -1,7 +1,6 @@ 'use strict'; -var helpers = require('../helpers'); -var runMochaJSON = helpers.runMochaJSON; +var runMocha = require('../helpers').runMocha; describe('--exit', function() { var behaviors = { @@ -9,13 +8,29 @@ describe('--exit', function() { disabled: '--no-exit' }; + // subprocess + var mocha; + + function killSubprocess() { + mocha.kill('SIGKILL'); + } + + // these two handlers deal with a ctrl-c on command-line + before(function() { + process.on('SIGINT', killSubprocess); + }); + + after(function() { + process.removeListener('SIGINT', killSubprocess); + }); + /** * Returns a test that executes Mocha in a subprocess with either * `--exit`, `--no-exit`, or default behavior. * * @param {boolean} shouldExit - Expected result; `true` if Mocha should * have force-killed the process. - * @param {string} [behavior] - 'enabled' or 'disabled' + * @param {"enabled"|"disabled"} [behavior] - 'enabled' or 'disabled'; omit for default * @returns {Function} async function implementing the test */ var runExit = function(shouldExit, behavior) { @@ -28,8 +43,7 @@ describe('--exit', function() { var timeoutObj; var fixture = 'exit.fixture.js'; var args = behaviors[behavior] ? [behaviors[behavior]] : []; - - var mocha = runMochaJSON(fixture, args, function postmortem(err) { + mocha = runMocha(fixture, args, function postmortem(err) { clearTimeout(timeoutObj); if (err) { return done(err); @@ -41,15 +55,13 @@ describe('--exit', function() { // If this callback happens, then Mocha didn't automatically exit. timeoutObj = setTimeout(function() { didExit = false; - // This is the only way to kill the child, afaik. - // After the process ends, the callback to `run()` above is handled. - mocha.kill('SIGINT'); + killSubprocess(); }, timeout - 500); }; }; describe('default behavior', function() { - it('should force exit after root suite completion', runExit(false)); + it('should not force exit after root suite completion', runExit(false)); }); describe('when enabled', function() { From a94e2d32135e0e6ede9baa2bdb7fd24e1fd56122 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 10:06:04 -0700 Subject: [PATCH 1466/1771] travis: add job names, add Node.js v14 to matrix - fix webhooks - remove webhook for `mochajs/mocha` - add v14 to Appveyor Ref: #4198 --- .travis.yml | 30 +++++++++++++++++++++--------- appveyor.yml | 1 + 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index a3874504dd..6d7a36ebe1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ stages: # defaults language: node_js -node_js: '13' +node_js: '14' addons: apt: packages: @@ -38,15 +38,24 @@ jobs: include: - script: COVERAGE=1 npm start test.node after_success: npm start coveralls + name: 'Latest Node.js (with coverage)' + + - &node + script: npm start test.node + node_js: '13' + name: 'Node.js v13' - &node script: npm start test.node node_js: '12' + name: 'Node.js v12' - <<: *node node_js: '10' + name: 'Node.js v10' - script: npm start test.bundle test.browser + name: 'Browser' node_js: 12 install: npm ci # we need the native modules here addons: @@ -59,6 +68,7 @@ jobs: - stage: lint script: npm start lint + name: 'JS & Markdown' # smoke tests use default npm. - &smoke @@ -66,7 +76,7 @@ jobs: env: null before_install: true install: npm install --production - + name: 'Latest Node.js' script: ./bin/mocha --no-config --reporter spec test/sanity/sanity.spec.js cache: directories: @@ -75,19 +85,21 @@ jobs: - <<: *smoke node_js: '12' + name: 'Node.js v12' - <<: *smoke node_js: '10' + name: 'Node.js v10' - stage: precache script: true + name: 'Prime cache' notifications: email: false - urls: - # for gitter mochajs/mocha - - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU= - # for gitter mochajs/contributors - - secure: rGMGYWBaZgEa9i997jJHKzjI8WxECqLi6BqsMhvstDq9EeTeXkZFVfz4r6G3Xugsk3tFwb/pDpiYo1OK36kA5arUJTCia51u4Wn+c7lHKcpef/vXztoyucvw6/jXdVm/FQz1jztYYbqdyAOWC2BV8gYvg5F8TpK05UGCe5R0bRA= - on_success: change - on_failure: always + webhooks: + urls: + # for gitter mochajs/contributors + - secure: rGMGYWBaZgEa9i997jJHKzjI8WxECqLi6BqsMhvstDq9EeTeXkZFVfz4r6G3Xugsk3tFwb/pDpiYo1OK36kA5arUJTCia51u4Wn+c7lHKcpef/vXztoyucvw6/jXdVm/FQz1jztYYbqdyAOWC2BV8gYvg5F8TpK05UGCe5R0bRA= + on_success: change + on_failure: always diff --git a/appveyor.yml b/appveyor.yml index af8559d76f..56d8a541ef 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,6 +12,7 @@ shallow_clone: true clone_depth: 1 environment: matrix: + - nodejs_version: '14' - nodejs_version: '13' - nodejs_version: '12' - nodejs_version: '10' From a2efd11a245d369231f131343406940aa291f0f8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 10:11:19 -0700 Subject: [PATCH 1467/1771] better debug output - make sure that template strings aren't used in debug statements, since they are eager Ref: #4198 --- bin/mocha | 9 +++++++-- lib/cli/config.js | 8 ++++---- lib/cli/options.js | 6 +++--- lib/cli/run-helpers.js | 6 +++--- lib/runner.js | 40 +++++++++++++++++++++++++++++----------- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/bin/mocha b/bin/mocha index 9c63463790..bc9aa81a0f 100755 --- a/bin/mocha +++ b/bin/mocha @@ -34,7 +34,7 @@ debug('loaded opts', opts); */ const disableTimeouts = value => { if (impliesNoTimeouts(value)) { - debug(`option "${value}" disabled timeouts`); + debug('option %s disabled timeouts', value); mochaArgs.timeout = 0; delete mochaArgs.timeouts; delete mochaArgs.t; @@ -108,7 +108,11 @@ if (Object.keys(nodeArgs).length) { unparse(mochaArgs, {alias: aliases}) ); - debug(`exec ${process.execPath} w/ args:`, args); + debug( + 'forking child process via command: %s %s', + process.execPath, + args.join(' ') + ); const proc = spawn(process.execPath, args, { stdio: 'inherit' @@ -130,5 +134,6 @@ if (Object.keys(nodeArgs).length) { proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. }); } else { + debug('running Mocha in-process'); require('../lib/cli/cli').main(unparse(mochaArgs, {alias: aliases})); } diff --git a/lib/cli/config.js b/lib/cli/config.js index 1be9f9c4c0..932d6c45f4 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -42,11 +42,11 @@ const parsers = (exports.parsers = { js: filepath => { const cwdFilepath = path.resolve(filepath); try { - debug(`parsers: load using cwd-relative path: "${cwdFilepath}"`); + debug('parsers: load using cwd-relative path: "%s"', cwdFilepath); return require(cwdFilepath); } catch (err) { if (isModuleNotFoundError(err)) { - debug(`parsers: retry load as module-relative path: "${filepath}"`); + debug('parsers: retry load as module-relative path: "%s"', filepath); return require(filepath); } else { throw err; // rethrow @@ -69,7 +69,7 @@ const parsers = (exports.parsers = { */ exports.loadConfig = filepath => { let config = {}; - debug(`loadConfig: "${filepath}"`); + debug('loadConfig: trying to parse config at %s', filepath); const ext = path.extname(filepath); try { @@ -95,7 +95,7 @@ exports.loadConfig = filepath => { exports.findConfig = (cwd = process.cwd()) => { const filepath = findUp.sync(exports.CONFIG_FILES, {cwd}); if (filepath) { - debug(`findConfig: found "${filepath}"`); + debug('findConfig: found config file %s', filepath); } return filepath; }; diff --git a/lib/cli/options.js b/lib/cli/options.js index 9f9f988e70..554a294b90 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -178,16 +178,16 @@ const loadPkgRc = (args = {}) => { try { const pkg = JSON.parse(fs.readFileSync(filepath, 'utf8')); if (pkg.mocha) { - debug(`'mocha' prop of package.json parsed:`, pkg.mocha); + debug('`mocha` prop of package.json parsed: %O', pkg.mocha); result = pkg.mocha; } else { - debug(`no config found in ${filepath}`); + debug('no config found in %s', filepath); } } catch (err) { if (args.package) { throw new Error(`Unable to read/parse ${filepath}: ${err}`); } - debug(`failed to read default package.json at ${filepath}; ignoring`); + debug('failed to read default package.json at %s; ignoring', filepath); } } return result; diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 72823c48f6..58bae02e6f 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -82,10 +82,10 @@ exports.handleRequires = (requires = []) => { let modpath = mod; if (fs.existsSync(mod, {cwd}) || fs.existsSync(`${mod}.js`, {cwd})) { modpath = path.resolve(mod); - debug(`resolved ${mod} to ${modpath}`); + debug('resolved %s to %s', mod, modpath); } require(modpath); - debug(`loaded require "${mod}"`); + debug('loaded required module "%s"', mod); }); }; @@ -101,7 +101,7 @@ exports.handleRequires = (requires = []) => { */ const singleRun = async (mocha, {exit}, fileCollectParams) => { const files = collectFiles(fileCollectParams); - debug('running tests with files', files); + debug('single run with %d file(s)', files.length); mocha.files = files; await mocha.loadFilesAsync(); diff --git a/lib/runner.js b/lib/runner.js index c60e562a81..60b5537302 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -173,7 +173,7 @@ inherits(Runner, EventEmitter); * @return {Runner} Runner instance. */ Runner.prototype.grep = function(re, invert) { - debug('grep %s', re); + debug('grep(): setting to %s', re); this._grep = re; this._invert = invert; this.total = this.grepTotal(this.suite); @@ -238,7 +238,7 @@ Runner.prototype.globals = function(arr) { if (!arguments.length) { return this._globals; } - debug('globals %j', arr); + debug('globals(): setting to %O', arr); this._globals = this._globals.concat(arr); return this; }; @@ -718,9 +718,10 @@ Runner.prototype.runSuite = function(suite, fn) { var self = this; var total = this.grepTotal(suite); - debug('run suite %s', suite.fullTitle()); + debug('runSuite(): running %s', suite.fullTitle()); if (!total || (self.failures && suite._bail)) { + debug('runSuite(): bailing'); return fn(); } @@ -791,17 +792,19 @@ Runner.prototype.runSuite = function(suite, fn) { */ Runner.prototype.uncaught = function(err) { if (err instanceof Pending) { + debug('uncaught(): caught a Pending'); return; } // browser does not exit script when throwing in global.onerror() if (this.allowUncaught && !process.browser) { + debug('uncaught(): bubbling exception due to --allow-uncaught'); throw err; } if (err) { - debug('uncaught exception %O', err); + debug('uncaught(): got truthy exception %O', err); } else { - debug('uncaught undefined/falsy exception'); + debug('uncaught(): undefined/falsy exception'); err = createInvalidExceptionError( 'Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger', err @@ -810,6 +813,7 @@ Runner.prototype.uncaught = function(err) { if (!isError(err)) { err = thrown2Error(err); + debug('uncaught(): converted "error" %o to Error', err); } err.uncaught = true; @@ -817,12 +821,15 @@ Runner.prototype.uncaught = function(err) { if (!runnable) { runnable = new Runnable('Uncaught error outside test suite'); + debug('uncaught(): no current Runnable; created a phony one'); runnable.parent = this.suite; if (this.started) { + debug('uncaught(): failing gracefully'); this.fail(runnable, err); } else { // Can't recover from this failure + debug('uncaught(): test run has not yet started; unrecoverable'); this.emit(constants.EVENT_RUN_BEGIN); this.fail(runnable, err); this.emit(constants.EVENT_RUN_END); @@ -834,9 +841,11 @@ Runner.prototype.uncaught = function(err) { runnable.clearTimeout(); if (runnable.isFailed()) { + debug('uncaught(): Runnable has already failed'); // Ignore error if already failed return; } else if (runnable.isPending()) { + debug('uncaught(): pending Runnable wound up failing!'); // report 'pending test' retrospectively as failed this.fail(runnable, err, true); return; @@ -845,10 +854,11 @@ Runner.prototype.uncaught = function(err) { // we cannot recover gracefully if a Runnable has already passed // then fails asynchronously if (runnable.isPassed()) { + debug('uncaught(): Runnable has already passed; bailing gracefully'); this.fail(runnable, err); this.abort(); } else { - debug(runnable); + debug('uncaught(): forcing Runnable to complete with Error'); return runnable.callback(err); } }; @@ -884,24 +894,31 @@ Runner.prototype.run = function(fn) { } function start() { + debug('run(): starting'); // If there is an `only` filter if (rootSuite.hasOnly()) { rootSuite.filterOnly(); + debug('run(): filtered exclusive Runnables'); } self.started = true; if (self._delay) { self.emit(constants.EVENT_DELAY_END); + debug('run(): "delay" ended'); } + debug('run(): emitting %s', constants.EVENT_RUN_BEGIN); self.emit(constants.EVENT_RUN_BEGIN); + debug('run(): emitted %s', constants.EVENT_RUN_BEGIN); self.runSuite(rootSuite, function() { - debug('finished running'); + debug( + 'run(): root suite completed; emitting %s', + constants.EVENT_RUN_END + ); self.emit(constants.EVENT_RUN_END); + debug('run(): emitted %s', constants.EVENT_RUN_END); }); } - debug(constants.EVENT_RUN_BEGIN); - // references cleanup to avoid memory leaks this.on(constants.EVENT_SUITE_END, function(suite) { suite.cleanReferences(); @@ -909,9 +926,9 @@ Runner.prototype.run = function(fn) { // callback this.on(constants.EVENT_RUN_END, function() { - debug(constants.EVENT_RUN_END); process.removeListener('uncaughtException', uncaught); process.on('uncaughtException', self.uncaughtEnd); + debug('run(): emitted %s', constants.EVENT_RUN_END); fn(self.failures); }); @@ -924,6 +941,7 @@ Runner.prototype.run = function(fn) { // might be nice to debounce some dots while we wait. this.emit(constants.EVENT_DELAY_BEGIN, rootSuite); rootSuite.once(EVENT_ROOT_SUITE_RUN, start); + debug('run(): waiting for green light due to --delay'); } else { Runner.immediately(function() { start(); @@ -941,7 +959,7 @@ Runner.prototype.run = function(fn) { * @return {Runner} Runner instance. */ Runner.prototype.abort = function() { - debug('aborting'); + debug('abort(): aborting'); this._abort = true; return this; From 27b799e2645964b96c2675e4eef815d910f90107 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 10:08:11 -0700 Subject: [PATCH 1468/1771] fix nyc ignorelist should keep more garbage out of the coverage Ref: #4198 --- .nycrc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.nycrc b/.nycrc index 8848fa90fd..d4091b1a0f 100644 --- a/.nycrc +++ b/.nycrc @@ -4,7 +4,17 @@ "text-summary" ], "exclude": [ - "lib/browser", - "test/**/*" + "coverage/**", + "packages/*/test{,s}/**", + "**/*.d.ts", + "test{,s}/**", + "test{,-*}.{js,cjs,mjs,ts}", + "**/*{.,-}test.{js,cjs,mjs,ts}", + "**/__tests__/**", + "**/{karma,rollup,webpack}.config.js", + "**/{babel.config,.eslintrc,.mocharc}.{js,cjs}", + "lib/browser/**", + "package-scripts.js", + "scripts/**" ] } From 13e94b1511ff3ecbb69472f3f92ac7bf889d11a2 Mon Sep 17 00:00:00 2001 From: juergba Date: Fri, 24 Apr 2020 14:36:42 +0200 Subject: [PATCH 1469/1771] type check before calling retriedTest() --- lib/runner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runner.js b/lib/runner.js index 60b5537302..aabffda96a 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -134,7 +134,7 @@ function Runner(suite, delay) { this.total = suite.total(); this.failures = 0; this.on(constants.EVENT_TEST_END, function(test) { - if (test.retriedTest() && test.parent) { + if (test.type === 'test' && test.retriedTest() && test.parent) { var idx = test.parent.tests && test.parent.tests.indexOf(test.retriedTest()); if (idx > -1) test.parent.tests[idx] = test; From 4c0231c7929b70722a143359e3e5f6eb37f1f490 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 25 Apr 2020 09:18:25 -0700 Subject: [PATCH 1470/1771] add test case: type check before calling retriedTest() --- test/unit/runner.spec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 79edfc47a1..692559f1ed 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -452,6 +452,13 @@ describe('Runner', function() { done(); }); }); + + // karma-mocha is inexplicably doing this with a Hook + it('should not throw an exception if something emits EVENT_TEST_END with a non-Test object', function() { + expect(function() { + runner.emit(EVENT_TEST_END, {}); + }, 'not to throw'); + }); }); describe('.runTest(fn)', function() { From 46f727ec98d322af29e7a75c678b23bdd276e1b5 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 26 Apr 2020 08:47:33 +0200 Subject: [PATCH 1471/1771] update CHANGELOG for v7.1.2 [ci skip] --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc6352d79c..3792a6edbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 7.1.2 / 2020-04-26 + +## :nut_and_bolt: Other + +- [#4251](https://github.com/mochajs/mocha/issues/4251): Prevent karma-mocha from stalling ([**@juergba**](https://github.com/juergba)) +- [#4222](https://github.com/mochajs/mocha/issues/4222): Update dependency mkdirp to v0.5.5 ([**@outsideris**](https://github.com/outsideris)) + +## :book: Documentation + +- [#4208](https://github.com/mochajs/mocha/issues/4208): Add Wallaby logo to site ([**@boneskull**](https://github.com/boneskull)) + # 7.1.1 / 2020-03-18 ## :lock: Security Fixes From e7add63e733d79969a43ea5a93f3ccff5a722c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 26 Apr 2020 12:35:16 +0200 Subject: [PATCH 1472/1771] Mark HTTP 429 responses as allowed failures in hyperlink check. We sometimes get these from unpkg and it shouldnt block out builds (#4253) --- package-scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-scripts.js b/package-scripts.js index 5e0b1736ef..7406018366 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -267,7 +267,7 @@ module.exports = { }, linkcheck: { script: - 'hyperlink -ri --canonicalroot https://mochajs.org --skip ".js.html#line" docs/_site/index.html' + 'hyperlink -ri --canonicalroot https://mochajs.org --skip ".js.html#line" docs/_site/index.html --todo "HTTP 429 Too Many Requests"' }, postbuild: { script: From 8bc7579579730a5d1e7dc56e84f515c9ee949e87 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Tue, 28 Apr 2020 11:25:33 +0100 Subject: [PATCH 1473/1771] Update @mocha/docdash to 2.1.3 --- package-lock.json | 102 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index b299eb745e..a7c70cbcdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -429,9 +429,9 @@ "dev": true }, "@mocha/docdash": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.2.tgz", - "integrity": "sha512-XQMLYVel+tWiNF9u74OX6GEzMbHh9WxrSRmOZjbmjRl5Gn1tdhNeGX5CA9wjf2OxdIe8RoJb63nqFM9wQVkdSA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.3.tgz", + "integrity": "sha512-7LL6uH/VtQb+c2VUPeMo46/6BySwLL0CWftK8qa8b2OvSJOkdhJ2K3aB2ptFI9KOzZzxlS+GIExDmMqQJH7ljw==", "dev": true, "requires": { "taffydb": "^2.7.3" @@ -978,7 +978,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1838,7 +1838,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1861,7 +1861,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -3106,7 +3106,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -3149,7 +3149,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -3427,7 +3427,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -3630,7 +3630,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3725,7 +3725,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -4321,7 +4321,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -4334,7 +4334,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -4349,7 +4349,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, "cross-env": { @@ -4422,7 +4422,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -5059,7 +5059,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -5269,7 +5269,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -5573,7 +5573,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -6186,7 +6186,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -6214,7 +6214,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -7223,7 +7223,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7232,7 +7232,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, @@ -7633,7 +7633,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -7662,7 +7662,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8591,7 +8591,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9360,7 +9360,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10392,7 +10392,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10601,7 +10601,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10812,7 +10812,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10828,7 +10828,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10853,7 +10853,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10995,7 +10995,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11283,7 +11283,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -12235,7 +12235,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12256,7 +12256,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12626,7 +12626,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12712,7 +12712,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -12760,7 +12760,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13559,7 +13559,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -14730,7 +14730,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14800,7 +14800,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -14853,7 +14853,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15163,7 +15163,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15246,7 +15246,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15851,7 +15851,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15950,7 +15950,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -16005,7 +16005,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16598,7 +16598,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16758,7 +16758,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16839,7 +16839,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18465,7 +18465,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-encoding": { diff --git a/package.json b/package.json index 14dc08d092..3861b24f18 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@11ty/eleventy": "^0.10.0", - "@mocha/docdash": "^2.1.2", + "@mocha/docdash": "^2.1.3", "assetgraph-builder": "^8.0.0", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", From 400bf9b9319bdf8f0d9aa05ff8c7a54f6fe65d2a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 11:58:56 -0700 Subject: [PATCH 1474/1771] refactor validatePlugins to throw coded errors - add `createInvalidPluginError` for reporters, UIs, and future plugins - ensures the original error is output if the module exists, but it throws (see `test/node-unit/cli/fixtures/bad-module.fixture.js`) - remove unneeded `process.cwd()` from call to `path.resolve()` Ref: #4198 --- lib/cli/run-helpers.js | 49 +++++--- lib/errors.js | 23 +++- .../cli/fixtures/bad-module.fixture.js | 1 + test/node-unit/cli/run-helpers.spec.js | 115 ++++++++++++------ 4 files changed, 138 insertions(+), 50 deletions(-) create mode 100644 test/node-unit/cli/fixtures/bad-module.fixture.js diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 58bae02e6f..ebb0bdd071 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -12,8 +12,10 @@ const path = require('path'); const debug = require('debug')('mocha:cli:run:helpers'); const watchRun = require('./watch-run'); const collectFiles = require('./collect-files'); +const {format} = require('util'); const cwd = (exports.cwd = process.cwd()); +const {createInvalidPluginError} = require('../errors'); /** * Exits Mocha when tests + code under test has finished execution (default) @@ -146,35 +148,52 @@ exports.runMocha = async (mocha, options) => { }; /** - * Used for `--reporter` and `--ui`. Ensures there's only one, and asserts - * that it actually exists. - * @todo XXX This must get run after requires are processed, as it'll prevent - * interfaces from loading. + * Used for `--reporter` and `--ui`. Ensures there's only one, and asserts that + * it actually exists. This must be run _after_ requires are processed (see + * {@link handleRequires}), as it'll prevent interfaces from loading otherwise. * @param {Object} opts - Options object - * @param {string} key - Resolvable module name or path - * @param {Object} [map] - An object perhaps having key `key` + * @param {"reporter"|"interface"} pluginType - Type of plugin. + * @param {Object} [map] - An object perhaps having key `key`. Used as a cache + * of sorts; `Mocha.reporters` is one, where each key corresponds to a reporter + * name * @private */ -exports.validatePlugin = (opts, key, map = {}) => { - if (Array.isArray(opts[key])) { - throw new TypeError(`"--${key} <${key}>" can only be specified once`); +exports.validatePlugin = (opts, pluginType, map = {}) => { + /** + * This should be a unique identifier; either a string (present in `map`), + * or a resolvable (via `require.resolve`) module ID/path. + * @type {string} + */ + const pluginId = opts[pluginType]; + + if (Array.isArray(pluginId)) { + throw createInvalidPluginError( + `"--${pluginType}" can only be specified once`, + pluginType + ); } - const unknownError = () => new Error(`Unknown "${key}": ${opts[key]}`); + const unknownError = err => + createInvalidPluginError( + format('Could not load %s "%s":\n\n %O', pluginType, pluginId, err), + pluginType, + pluginId + ); - if (!map[opts[key]]) { + // if this exists, then it's already loaded, so nothing more to do. + if (!map[pluginId]) { try { - opts[key] = require(opts[key]); + opts[pluginType] = require(pluginId); } catch (err) { if (err.code === 'MODULE_NOT_FOUND') { // Try to load reporters from a path (absolute or relative) try { - opts[key] = require(path.resolve(process.cwd(), opts[key])); + opts[pluginType] = require(path.resolve(pluginId)); } catch (err) { - throw unknownError(); + throw unknownError(err); } } else { - throw unknownError(); + throw unknownError(err); } } } diff --git a/lib/errors.js b/lib/errors.js index fafee70eee..099bc579ab 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -129,6 +129,26 @@ function createInvalidExceptionError(message, value) { return err; } +/** + * Dynamically creates a plugin-type-specific error based on plugin type + * @param {string} message - Error message + * @param {"reporter"|"interface"} pluginType - Plugin type. Future: expand as needed + * @param {string} [pluginId] - Name/path of plugin, if any + * @throws When `pluginType` is not known + * @public + * @returns {Error} + */ +function createInvalidPluginError(message, pluginType, pluginId) { + switch (pluginType) { + case 'reporter': + return createInvalidReporterError(message, pluginId); + case 'interface': + return createInvalidInterfaceError(message, pluginId); + default: + throw new Error('unknown pluginType "' + pluginType + '"'); + } +} + module.exports = { createInvalidArgumentTypeError: createInvalidArgumentTypeError, createInvalidArgumentValueError: createInvalidArgumentValueError, @@ -137,5 +157,6 @@ module.exports = { createInvalidReporterError: createInvalidReporterError, createMissingArgumentError: createMissingArgumentError, createNoFilesMatchPatternError: createNoFilesMatchPatternError, - createUnsupportedError: createUnsupportedError + createUnsupportedError: createUnsupportedError, + createInvalidPluginError: createInvalidPluginError }; diff --git a/test/node-unit/cli/fixtures/bad-module.fixture.js b/test/node-unit/cli/fixtures/bad-module.fixture.js new file mode 100644 index 0000000000..18fb55ce88 --- /dev/null +++ b/test/node-unit/cli/fixtures/bad-module.fixture.js @@ -0,0 +1 @@ +throw new Error('this module is wonky'); diff --git a/test/node-unit/cli/run-helpers.spec.js b/test/node-unit/cli/run-helpers.spec.js index a2a63335f5..00357bbcb5 100644 --- a/test/node-unit/cli/run-helpers.spec.js +++ b/test/node-unit/cli/run-helpers.spec.js @@ -1,49 +1,96 @@ 'use strict'; const {validatePlugin, list} = require('../../../lib/cli/run-helpers'); -const {createSandbox} = require('sinon'); -describe('cli "run" command', function() { - let sandbox; +describe('run helper functions', function() { + describe('validatePlugin()', function() { + describe('when used with "reporter" key', function() { + it('should disallow an array of names', function() { + expect( + () => validatePlugin({reporter: ['bar']}, 'reporter'), + 'to throw', + { + code: 'ERR_MOCHA_INVALID_REPORTER', + message: /can only be specified once/i + } + ); + }); - beforeEach(function() { - sandbox = createSandbox(); - }); + it('should fail to recognize an unknown reporter', function() { + expect( + () => validatePlugin({reporter: 'bar'}, 'reporter'), + 'to throw', + {code: 'ERR_MOCHA_INVALID_REPORTER', message: /cannot find module/i} + ); + }); + }); - afterEach(function() { - sandbox.restore(); - }); + describe('when used with an "interfaces" key', function() { + it('should disallow an array of names', function() { + expect( + () => validatePlugin({interface: ['bar']}, 'interface'), + 'to throw', + { + code: 'ERR_MOCHA_INVALID_INTERFACE', + message: /can only be specified once/i + } + ); + }); - describe('helpers', function() { - describe('validatePlugin()', function() { - it('should disallow an array of module names', function() { + it('should fail to recognize an unknown interface', function() { expect( - () => validatePlugin({foo: ['bar']}, 'foo'), - 'to throw a', - TypeError + () => validatePlugin({interface: 'bar'}, 'interface'), + 'to throw', + {code: 'ERR_MOCHA_INVALID_INTERFACE', message: /cannot find module/i} ); }); }); - describe('list()', function() { - describe('when provided a flat array', function() { - it('should return a flat array', function() { - expect(list(['foo', 'bar']), 'to equal', ['foo', 'bar']); - }); - }); - describe('when provided a nested array', function() { - it('should return a flat array', function() { - expect(list([['foo', 'bar'], 'baz']), 'to equal', [ - 'foo', - 'bar', - 'baz' - ]); - }); - }); - describe('when given a comma-delimited string', function() { - it('should return a flat array', function() { - expect(list('foo,bar'), 'to equal', ['foo', 'bar']); - }); + describe('when used with an unknown plugin type', function() { + it('should fail', function() { + expect( + () => validatePlugin({frog: 'bar'}, 'frog'), + 'to throw', + /unknown plugin/i + ); + }); + }); + + describe('when a plugin throws an exception upon load', function() { + it('should fail and report the original error', function() { + expect( + () => + validatePlugin( + { + reporter: require.resolve('./fixtures/bad-module.fixture.js') + }, + 'reporter' + ), + 'to throw', + {message: /wonky/, code: 'ERR_MOCHA_INVALID_REPORTER'} + ); + }); + }); + }); + + describe('list()', function() { + describe('when provided a flat array', function() { + it('should return a flat array', function() { + expect(list(['foo', 'bar']), 'to equal', ['foo', 'bar']); + }); + }); + describe('when provided a nested array', function() { + it('should return a flat array', function() { + expect(list([['foo', 'bar'], 'baz']), 'to equal', [ + 'foo', + 'bar', + 'baz' + ]); + }); + }); + describe('when given a comma-delimited string', function() { + it('should return a flat array', function() { + expect(list('foo,bar'), 'to equal', ['foo', 'bar']); }); }); }); From b5e71834a00af7e7394d1bbd1b33efc475d10df1 Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Wed, 29 Apr 2020 11:36:12 +0200 Subject: [PATCH 1475/1771] Fix missing dot in name of configuration file --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index aeaa1c318c..6c66053d8c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1565,7 +1565,7 @@ Node.JS native ESM support still has status: **Stability: 1 - Experimental** - [Custom reporters](#third-party-reporters) and [custom interfaces](#interfaces) can only be CommonJS files - [Required modules](#-require-module-r-module) can only be CommonJS files -- [Configuration file](#configuring-mocha-nodejs) can only be a CommonJS file (`mocharc.js` or `mocharc.cjs`) +- [Configuration file](#configuring-mocha-nodejs) can only be a CommonJS file (`.mocharc.js` or `.mocharc.cjs`) - When using module-level mocks via libs like `proxyquire`, `rewiremock` or `rewire`, hold off on using ES modules for your test files - Node.JS native ESM support does not work with [esm][npm-esm] module @@ -1732,7 +1732,7 @@ tests as shown below: Mocha supports configuration files, typical of modern command-line tools, in several formats: -- **JavaScript**: Create a `.mocharc.js` (or `mocharc.cjs` when using [`"type"="module"`](#nodejs-native-esm-support) in your `package.json`) +- **JavaScript**: Create a `.mocharc.js` (or `.mocharc.cjs` when using [`"type"="module"`](#nodejs-native-esm-support) in your `package.json`) in your project's root directory, and export an object (`module.exports = {/* ... */}`) containing your configuration. - **YAML**: Create a `.mocharc.yaml` (or `.mocharc.yml`) in your project's root directory. - **JSON**: Create a `.mocharc.json` (or `.mocharc.jsonc`) in your project's root directory. Comments — while not valid JSON — are allowed in this file, and will be ignored by Mocha. From 14da63ab4a6aa15194c4d4f797de058880663f26 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 30 Apr 2020 14:26:46 -0700 Subject: [PATCH 1476/1771] adds a bunch of keywords Did you know that if you click on the "testing" icon on npmjs.com, Mocha is completely absent? It wants the keyword `testing`, which we do not have. So I added that and a bunch more. Since all of the other major test frameworks seem to use keywords of others, might as well join that arms race. --- package.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3861b24f18..777d26bd28 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,15 @@ "test", "bdd", "tdd", - "tap" + "tap", + "testing", + "chai", + "assertion", + "ava", + "jest", + "tape", + "jasmine", + "karma" ], "funding": { "type": "opencollective", From 9c965c910e54d588abee688da813cc0a014c6b49 Mon Sep 17 00:00:00 2001 From: Daniel0113 Date: Fri, 1 May 2020 17:50:44 -0400 Subject: [PATCH 1477/1771] Exposing filename in JSON, doc, and json-stream reporters (#4219) * Exposing filename in JSON reporter * Added filename to json-stream reporter * updated tests and also fixed issue with json-stream reporter * added filenames to doc reporter --- lib/reporters/doc.js | 6 ++++++ lib/reporters/json-stream.js | 1 + lib/reporters/json.js | 1 + test/reporters/doc.spec.js | 16 +++++++++++++++ test/reporters/helpers.js | 2 ++ test/reporters/json-stream.spec.js | 8 ++++++++ test/reporters/json.spec.js | 32 +++++++++++++++++++----------- 7 files changed, 54 insertions(+), 12 deletions(-) diff --git a/lib/reporters/doc.js b/lib/reporters/doc.js index 5a6af8fb42..fd6b46932d 100644 --- a/lib/reporters/doc.js +++ b/lib/reporters/doc.js @@ -62,6 +62,7 @@ function Doc(runner, options) { runner.on(EVENT_TEST_PASS, function(test) { Base.consoleLog('%s
              %s
              ', indent(), utils.escape(test.title)); + Base.consoleLog('%s
              %s
              ', indent(), utils.escape(test.file)); var code = utils.escape(utils.clean(test.body)); Base.consoleLog('%s
              %s
              ', indent(), code); }); @@ -72,6 +73,11 @@ function Doc(runner, options) { indent(), utils.escape(test.title) ); + Base.consoleLog( + '%s
              %s
              ', + indent(), + utils.escape(test.file) + ); var code = utils.escape(utils.clean(test.body)); Base.consoleLog( '%s
              %s
              ', diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js index 27282987ea..8caa8adfce 100644 --- a/lib/reporters/json-stream.js +++ b/lib/reporters/json-stream.js @@ -82,6 +82,7 @@ function clean(test) { return { title: test.title, fullTitle: test.fullTitle(), + file: test.file, duration: test.duration, currentRetry: test.currentRetry() }; diff --git a/lib/reporters/json.js b/lib/reporters/json.js index 12b6289cd7..a46776ba9c 100644 --- a/lib/reporters/json.js +++ b/lib/reporters/json.js @@ -87,6 +87,7 @@ function clean(test) { return { title: test.title, fullTitle: test.fullTitle(), + file: test.file, duration: test.duration, currentRetry: test.currentRetry(), err: cleanCycles(err) diff --git a/test/reporters/doc.spec.js b/test/reporters/doc.spec.js index fb2703f83c..ce84a5a1b3 100644 --- a/test/reporters/doc.spec.js +++ b/test/reporters/doc.spec.js @@ -134,9 +134,11 @@ describe('Doc reporter', function() { describe("on 'pass' event", function() { var expectedTitle = 'some tite'; + var expectedFile = 'testFile.spec.js'; var expectedBody = 'some body'; var test = { title: expectedTitle, + file: expectedFile, body: expectedBody, slow: function() { return ''; @@ -148,6 +150,7 @@ describe('Doc reporter', function() { var stdout = runReporter(this, runner, options); var expectedArray = [ '
              ' + expectedTitle + '
              \n', + '
              ' + expectedFile + '
              \n', '
              ' + expectedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); @@ -155,18 +158,23 @@ describe('Doc reporter', function() { it('should escape title and body where necessary', function() { var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedFile = '
              ' + expectedFile + '
              '; var unescapedBody = '
              ' + expectedBody + '
              '; test.title = unescapedTitle; + test.file = unescapedFile; test.body = unescapedBody; var expectedEscapedTitle = '<div>' + expectedTitle + '</div>'; + var expectedEscapedFile = + '<div>' + expectedFile + '</div>'; var expectedEscapedBody = '<div>' + expectedBody + '</div>'; runner = createMockRunner('pass', EVENT_TEST_PASS, null, null, test); var stdout = runReporter(this, runner, options); var expectedArray = [ '
              ' + expectedEscapedTitle + '
              \n', + '
              ' + expectedEscapedFile + '
              \n', '
              ' + expectedEscapedBody + '
              \n' ]; expect(stdout, 'to equal', expectedArray); @@ -175,10 +183,12 @@ describe('Doc reporter', function() { describe("on 'fail' event", function() { var expectedTitle = 'some tite'; + var expectedFile = 'testFile.spec.js'; var expectedBody = 'some body'; var expectedError = 'some error'; var test = { title: expectedTitle, + file: expectedFile, body: expectedBody, slow: function() { return ''; @@ -197,6 +207,7 @@ describe('Doc reporter', function() { var stdout = runReporter(this, runner, options); var expectedArray = [ '
              ' + expectedTitle + '
              \n', + '
              ' + expectedFile + '
              \n', '
              ' +
                           expectedBody +
                           '
              \n', @@ -207,13 +218,17 @@ describe('Doc reporter', function() { it('should escape title, body, and error where necessary', function() { var unescapedTitle = '
              ' + expectedTitle + '
              '; + var unescapedFile = '
              ' + expectedFile + '
              '; var unescapedBody = '
              ' + expectedBody + '
              '; var unescapedError = '
              ' + expectedError + '
              '; test.title = unescapedTitle; + test.file = unescapedFile; test.body = unescapedBody; var expectedEscapedTitle = '<div>' + expectedTitle + '</div>'; + var expectedEscapedFile = + '<div>' + expectedFile + '</div>'; var expectedEscapedBody = '<div>' + expectedBody + '</div>'; var expectedEscapedError = @@ -229,6 +244,7 @@ describe('Doc reporter', function() { var stdout = runReporter(this, runner, options); var expectedArray = [ '
              ' + expectedEscapedTitle + '
              \n', + '
              ' + expectedEscapedFile + '
              \n', '
              ' +
                           expectedEscapedBody +
                           '
              \n', diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 45c4d916de..f712e19e8b 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -163,6 +163,7 @@ function createElements(argObj) { function makeExpectedTest( expectedTitle, expectedFullTitle, + expectedFile, expectedDuration, currentRetry, expectedBody @@ -172,6 +173,7 @@ function makeExpectedTest( fullTitle: function() { return expectedFullTitle; }, + file: expectedFile, duration: expectedDuration, currentRetry: function() { return currentRetry; diff --git a/test/reporters/json-stream.spec.js b/test/reporters/json-stream.spec.js index de83f861b2..613b9279f8 100644 --- a/test/reporters/json-stream.spec.js +++ b/test/reporters/json-stream.spec.js @@ -20,11 +20,13 @@ describe('JSON Stream reporter', function() { var runReporter = makeRunReporter(JSONStream); var expectedTitle = 'some title'; var expectedFullTitle = 'full title'; + var expectedFile = 'someTest.spec.js'; var expectedDuration = 1000; var currentRetry = 1; var expectedTest = makeExpectedTest( expectedTitle, expectedFullTitle, + expectedFile, expectedDuration, currentRetry ); @@ -70,6 +72,8 @@ describe('JSON Stream reporter', function() { dQuote(expectedTitle) + ',"fullTitle":' + dQuote(expectedFullTitle) + + ',"file":' + + dQuote(expectedFile) + ',"duration":' + expectedDuration + ',"currentRetry":' + @@ -101,6 +105,8 @@ describe('JSON Stream reporter', function() { dQuote(expectedTitle) + ',"fullTitle":' + dQuote(expectedFullTitle) + + ',"file":' + + dQuote(expectedFile) + ',"duration":' + expectedDuration + ',"currentRetry":' + @@ -135,6 +141,8 @@ describe('JSON Stream reporter', function() { dQuote(expectedTitle) + ',"fullTitle":' + dQuote(expectedFullTitle) + + ',"file":' + + dQuote(expectedFile) + ',"duration":' + expectedDuration + ',"currentRetry":' + diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index f6299dd134..9aa7e7a208 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -11,6 +11,7 @@ describe('JSON reporter', function() { var suite; var runner; var testTitle = 'json test 1'; + var testFile = 'someTest.spec.js'; var noop = function() {}; beforeEach(function() { @@ -36,11 +37,12 @@ describe('JSON reporter', function() { it('should have 1 test failure', function(done) { var error = {message: 'oh shit'}; - suite.addTest( - new Test(testTitle, function(done) { - done(new Error(error.message)); - }) - ); + var test = new Test(testTitle, function(done) { + done(new Error(error.message)); + }); + + test.file = testFile; + suite.addTest(test); runner.run(function(failureCount) { sandbox.restore(); @@ -49,6 +51,7 @@ describe('JSON reporter', function() { failures: [ { title: testTitle, + file: testFile, err: { message: error.message } @@ -62,7 +65,9 @@ describe('JSON reporter', function() { }); it('should have 1 test pending', function(done) { - suite.addTest(new Test(testTitle)); + var test = new Test(testTitle); + test.file = testFile; + suite.addTest(test); runner.run(function(failureCount) { sandbox.restore(); @@ -70,7 +75,8 @@ describe('JSON reporter', function() { testResults: { pending: [ { - title: testTitle + title: testTitle, + file: testFile } ] } @@ -88,11 +94,12 @@ describe('JSON reporter', function() { } var error = new CircleError(); - suite.addTest( - new Test(testTitle, function(done) { - throw error; - }) - ); + var test = new Test(testTitle, function(done) { + throw error; + }); + + test.file = testFile; + suite.addTest(test); runner.run(function(failureCount) { sandbox.restore(); @@ -101,6 +108,7 @@ describe('JSON reporter', function() { failures: [ { title: testTitle, + file: testFile, err: { message: error.message } From 2509ab5f261e22bfd4bad10e59002cd8878c19d9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 4 May 2020 12:56:44 -0700 Subject: [PATCH 1478/1771] assorted test fixes & refactors (#4240) - increase default timeout for wiggle room - specify `watch-ignore` in case we run our own tests in watch mode - reformat `.mocharc.yml` - `integration/fixtures/uncaught/listeners.fixture.js`: reduce number of listeners created to avoid max listener warning - `integration/fixtures/diffs.spec.js`: do not pass `-C`; the helper already does this - `integration/options/watch.spec.js`: do not use context object; be more specific about spawn options. tweak timings - `node-unit/mocha.spec.js`: make more unit-test-like insofar as that's possible when testing w/ `require()` - `node-unit/cli/config.spec.js`: rewiremock fixes; assertion tweaks; add test for `.cjs` extension - `node-unit/cli/options.spec.js`: rewiremock fixes; increase timeout - `unit/hook-timeout.spec.js`: do not override default (configured) timeout - `unit/runner.spec.js`: leverage [unexpected-eventemitter](https://npm.im/unexpected-eventemitter) - `unit/throw.spec.js`: proper teardown: remove uncaught exception listeners - `unit/timeout.spec.js`: increase timeout to _greater than_ default (configured) value - `example/config/.mocharc.yml`: quote yaml strings BONUS - fixes a weird call to `Mocha.unloadFile()` from `Mocha#unloadFiles()` Ref: #4198 --- .mocharc.yml | 19 ++- example/config/.mocharc.yml | 22 ++-- lib/mocha.js | 4 +- test/integration/diffs.spec.js | 2 +- .../fixtures/uncaught/listeners.fixture.js | 3 +- test/integration/options/watch.spec.js | 124 ++++++++---------- test/node-unit/cli/config.spec.js | 65 +++++---- test/node-unit/cli/options.spec.js | 4 +- test/node-unit/fixtures/dumb-module.js | 0 test/node-unit/fixtures/dumber-module.js | 0 test/node-unit/mocha.spec.js | 106 ++++++++------- test/unit/hook-timeout.spec.js | 3 +- test/unit/runner.spec.js | 12 +- test/unit/throw.spec.js | 1 + test/unit/timeout.spec.js | 2 +- 15 files changed, 196 insertions(+), 171 deletions(-) create mode 100644 test/node-unit/fixtures/dumb-module.js create mode 100644 test/node-unit/fixtures/dumber-module.js diff --git a/.mocharc.yml b/.mocharc.yml index fc4c97339c..dfb82e07f6 100644 --- a/.mocharc.yml +++ b/.mocharc.yml @@ -1,7 +1,14 @@ -require: test/setup -ui: bdd +require: 'test/setup' +ui: 'bdd' global: - - okGlobalA,okGlobalB - - okGlobalC - - callback* -timeout: 300 + - 'okGlobalA,okGlobalB' + - 'okGlobalC' + - 'callback*' +timeout: 1000 +watch-ignore: + - '.*' + - 'docs/_dist/**' + - 'docs/_site/**' + - 'node_modules' + - 'coverage' + - 'cache' diff --git a/example/config/.mocharc.yml b/example/config/.mocharc.yml index da5a0a0c4f..a310525b86 100644 --- a/example/config/.mocharc.yml +++ b/example/config/.mocharc.yml @@ -8,39 +8,39 @@ delay: false diff: true exit: false # could be expressed as "no-exit: true" extension: - - js + - 'js' # fgrep and grep are mutually exclusive # fgrep: something file: - - /path/to/some/file - - /path/to/some/other/file + - '/path/to/some/file' + - '/path/to/some/other/file' forbid-only: false forbid-pending: false full-trace: false global: - - jQuery - - $ + - 'jQuery' + - '$' # fgrep and grep are mutually exclusive # grep: something growl: false ignore: - - /path/to/some/ignored/file + - '/path/to/some/ignored/file' inline-diffs: false # needs to be used with grep or fgrep # invert: false recursive: false -reporter: spec +reporter: 'spec' reporter-option: - - foo=bar - - baz=quux + - 'foo=bar' + - 'baz=quux' require: '@babel/register' retries: 1 slow: 75 sort: false -spec: test/**/*.spec.js # the positional arguments! +spec: 'test/**/*.spec.js' # the positional arguments! timeout: false # same as "no-timeout: true" or "timeout: 0" trace-warnings: true # node flags ok -ui: bdd +ui: 'bdd' v8-stack-trace-limit: 100 # V8 flags are prepended with "v8-" watch: false watch-files: diff --git a/lib/mocha.js b/lib/mocha.js index 017daa1e2c..40718d09e9 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -388,7 +388,9 @@ Mocha.unloadFile = function(file) { * @chainable */ Mocha.prototype.unloadFiles = function() { - this.files.forEach(Mocha.unloadFile); + this.files.forEach(function(file) { + Mocha.unloadFile(file); + }); return this; }; diff --git a/test/integration/diffs.spec.js b/test/integration/diffs.spec.js index 44b30de1ae..ac9ad18d26 100644 --- a/test/integration/diffs.spec.js +++ b/test/integration/diffs.spec.js @@ -72,7 +72,7 @@ describe('diffs', function() { var diffs, expected; before(function(done) { - run('diffs/diffs.fixture.js', ['-C'], function(err, res) { + run('diffs/diffs.fixture.js', [], function(err, res) { if (err) { done(err); return; diff --git a/test/integration/fixtures/uncaught/listeners.fixture.js b/test/integration/fixtures/uncaught/listeners.fixture.js index 3ad398cfe0..69c4059294 100644 --- a/test/integration/fixtures/uncaught/listeners.fixture.js +++ b/test/integration/fixtures/uncaught/listeners.fixture.js @@ -3,7 +3,8 @@ const assert = require('assert'); const mocha = require("../../../../lib/mocha"); -for (let i = 0; i < 15; i++) { +// keep this low to avoid warning +for (let i = 0; i < 5; i++) { const r = new mocha.Runner(new mocha.Suite("" + i, undefined)); r.run(); } diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index f5cd382dee..259a9416d4 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -7,24 +7,24 @@ const helpers = require('../helpers'); describe('--watch', function() { describe('when enabled', function() { - this.timeout(10 * 1000); - this.slow(3000); + let tempDir; + this.slow(5000); beforeEach(function() { - this.tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-')); + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mocha-')); }); afterEach(function() { - if (this.tempDir) { - return fs.remove(this.tempDir); + if (tempDir) { + return fs.remove(tempDir); } }); it('reruns test when watched test file is touched', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - return runMochaWatch([testFile], this.tempDir, () => { + return runMochaWatch([testFile], tempDir, () => { touchFile(testFile); }).then(results => { expect(results, 'to have length', 2); @@ -32,15 +32,15 @@ describe('--watch', function() { }); it('reruns test when file matching --watch-files changes', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'dir/file.xyz'); + const watchedFile = path.join(tempDir, 'dir/file.xyz'); touchFile(watchedFile); return runMochaWatch( [testFile, '--watch-files', 'dir/*.xyz'], - this.tempDir, + tempDir, () => { touchFile(watchedFile); } @@ -50,13 +50,13 @@ describe('--watch', function() { }); it('reruns test when file matching --watch-files is added', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'lib/file.xyz'); + const watchedFile = path.join(tempDir, 'lib/file.xyz'); return runMochaWatch( [testFile, '--watch-files', '**/*.xyz'], - this.tempDir, + tempDir, () => { touchFile(watchedFile); } @@ -66,15 +66,15 @@ describe('--watch', function() { }); it('reruns test when file matching --watch-files is removed', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'lib/file.xyz'); + const watchedFile = path.join(tempDir, 'lib/file.xyz'); touchFile(watchedFile); return runMochaWatch( [testFile, '--watch-files', 'lib/**/*.xyz'], - this.tempDir, + tempDir, () => { fs.removeSync(watchedFile); } @@ -84,15 +84,15 @@ describe('--watch', function() { }); it('does not rerun test when file not matching --watch-files is changed', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'dir/file.js'); + const watchedFile = path.join(tempDir, 'dir/file.js'); touchFile(watchedFile); return runMochaWatch( [testFile, '--watch-files', 'dir/*.xyz'], - this.tempDir, + tempDir, () => { touchFile(watchedFile); } @@ -102,14 +102,14 @@ describe('--watch', function() { }); it('picks up new test files when they are added', function() { - const testFile = path.join(this.tempDir, 'test/a.js'); + const testFile = path.join(tempDir, 'test/a.js'); copyFixture('__default__', testFile); return runMochaWatch( ['test/**/*.js', '--watch-files', 'test/**/*.js'], - this.tempDir, + tempDir, () => { - const addedTestFile = path.join(this.tempDir, 'test/b.js'); + const addedTestFile = path.join(tempDir, 'test/b.js'); copyFixture('passing', addedTestFile); } ).then(results => { @@ -120,28 +120,24 @@ describe('--watch', function() { }); it('reruns test when file matching --extension is changed', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'file.xyz'); + const watchedFile = path.join(tempDir, 'file.xyz'); touchFile(watchedFile); - return runMochaWatch( - [testFile, '--extension', 'xyz,js'], - this.tempDir, - () => { - touchFile(watchedFile); - } - ).then(results => { + return runMochaWatch([testFile, '--extension', 'xyz,js'], tempDir, () => { + touchFile(watchedFile); + }).then(results => { expect(results, 'to have length', 2); }); }); it('reruns when "rs\\n" typed', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - return runMochaWatch([testFile], this.tempDir, mochaProcess => { + return runMochaWatch([testFile], tempDir, mochaProcess => { mochaProcess.stdin.write('rs\n'); }).then(results => { expect(results, 'to have length', 2); @@ -149,54 +145,42 @@ describe('--watch', function() { }); it('reruns test when file starting with . and matching --extension is changed', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, '.file.xyz'); + const watchedFile = path.join(tempDir, '.file.xyz'); touchFile(watchedFile); - return runMochaWatch( - [testFile, '--extension', 'xyz,js'], - this.tempDir, - () => { - touchFile(watchedFile); - } - ).then(results => { + return runMochaWatch([testFile, '--extension', 'xyz,js'], tempDir, () => { + touchFile(watchedFile); + }).then(results => { expect(results, 'to have length', 2); }); }); it('ignores files in "node_modules" and ".git" by default', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const nodeModulesFile = path.join( - this.tempDir, - 'node_modules', - 'file.xyz' - ); - const gitFile = path.join(this.tempDir, '.git', 'file.xyz'); + const nodeModulesFile = path.join(tempDir, 'node_modules', 'file.xyz'); + const gitFile = path.join(tempDir, '.git', 'file.xyz'); touchFile(gitFile); touchFile(nodeModulesFile); - return runMochaWatch( - [testFile, '--extension', 'xyz,js'], - this.tempDir, - () => { - touchFile(gitFile); - touchFile(nodeModulesFile); - } - ).then(results => { + return runMochaWatch([testFile, '--extension', 'xyz,js'], tempDir, () => { + touchFile(gitFile); + touchFile(nodeModulesFile); + }).then(results => { expect(results, 'to have length', 1); }); }); it('ignores files matching --watch-ignore', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); - const watchedFile = path.join(this.tempDir, 'dir/file-to-ignore.xyz'); + const watchedFile = path.join(tempDir, 'dir/file-to-ignore.xyz'); touchFile(watchedFile); return runMochaWatch( @@ -207,7 +191,7 @@ describe('--watch', function() { '--watch-ignore', 'dir/*ignore*' ], - this.tempDir, + tempDir, () => { touchFile(watchedFile); } @@ -217,12 +201,12 @@ describe('--watch', function() { }); it('reloads test files when they change', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('options/watch/test-file-change', testFile); return runMochaWatch( [testFile, '--watch-files', '**/*.js'], - this.tempDir, + tempDir, () => { replaceFileContents( testFile, @@ -240,15 +224,15 @@ describe('--watch', function() { }); it('reloads test dependencies when they change', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('options/watch/test-with-dependency', testFile); - const dependency = path.join(this.tempDir, 'lib', 'dependency.js'); + const dependency = path.join(tempDir, 'lib', 'dependency.js'); copyFixture('options/watch/dependency', dependency); return runMochaWatch( [testFile, '--watch-files', 'lib/**/*.js'], - this.tempDir, + tempDir, () => { replaceFileContents( dependency, @@ -267,10 +251,10 @@ describe('--watch', function() { // Regression test for https://github.com/mochajs/mocha/issues/2027 it('respects --fgrep on re-runs', function() { - const testFile = path.join(this.tempDir, 'test.js'); + const testFile = path.join(tempDir, 'test.js'); copyFixture('options/grep', testFile); - return runMochaWatch([testFile, '--fgrep', 'match'], this.tempDir, () => { + return runMochaWatch([testFile, '--fgrep', 'match'], tempDir, () => { touchFile(testFile); }).then(results => { expect(results, 'to have length', 2); @@ -293,12 +277,12 @@ describe('--watch', function() { function runMochaWatch(args, cwd, change) { const [mochaProcess, resultPromise] = helpers.invokeMochaAsync( [...args, '--watch', '--reporter', 'json'], - {cwd, stdio: 'pipe'} + {cwd, stdio: ['pipe', 'pipe', 'inherit']} ); - return sleep(1000) + return sleep(2000) .then(() => change(mochaProcess)) - .then(() => sleep(1000)) + .then(() => sleep(2000)) .then(() => { mochaProcess.kill('SIGINT'); return resultPromise; diff --git a/test/node-unit/cli/config.spec.js b/test/node-unit/cli/config.spec.js index 2823cdcd24..2d49423b2b 100644 --- a/test/node-unit/cli/config.spec.js +++ b/test/node-unit/cli/config.spec.js @@ -1,12 +1,11 @@ 'use strict'; -const {loadConfig, parsers, CONFIG_FILES} = require('../../../lib/cli/config'); const {createSandbox} = require('sinon'); const rewiremock = require('rewiremock/node'); describe('cli/config', function() { let sandbox; - const config = {ok: true}; + const phonyConfigObject = {ok: true}; beforeEach(function() { sandbox = createSandbox(); @@ -17,11 +16,22 @@ describe('cli/config', function() { }); describe('loadConfig()', function() { + let parsers; + let loadConfig; + + beforeEach(function() { + const config = rewiremock.proxy( + require.resolve('../../../lib/cli/config') + ); + parsers = config.parsers; + loadConfig = config.loadConfig; + }); + describe('when parsing succeeds', function() { beforeEach(function() { - sandbox.stub(parsers, 'yaml').returns(config); - sandbox.stub(parsers, 'json').returns(config); - sandbox.stub(parsers, 'js').returns(config); + sandbox.stub(parsers, 'yaml').returns(phonyConfigObject); + sandbox.stub(parsers, 'json').returns(phonyConfigObject); + sandbox.stub(parsers, 'js').returns(phonyConfigObject); }); describe('when supplied a filepath with ".yaml" extension', function() { @@ -30,8 +40,8 @@ describe('cli/config', function() { it('should use the YAML parser', function() { loadConfig(filepath); expect(parsers.yaml, 'to have calls satisfying', [ - {args: [filepath], returned: config} - ]).and('was called times', 1); + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); }); }); @@ -41,8 +51,8 @@ describe('cli/config', function() { it('should use the YAML parser', function() { loadConfig(filepath); expect(parsers.yaml, 'to have calls satisfying', [ - {args: [filepath], returned: config} - ]).and('was called times', 1); + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); }); }); @@ -52,8 +62,19 @@ describe('cli/config', function() { it('should use the JS parser', function() { loadConfig(filepath); expect(parsers.js, 'to have calls satisfying', [ - {args: [filepath], returned: config} - ]).and('was called times', 1); + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); + }); + }); + + describe('when supplied a filepath with ".cjs" extension', function() { + const filepath = 'foo.cjs'; + + it('should use the JS parser', function() { + loadConfig(filepath); + expect(parsers.js, 'to have calls satisfying', [ + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); }); }); @@ -63,8 +84,8 @@ describe('cli/config', function() { it('should use the JSON parser', function() { loadConfig('foo.jsonc'); expect(parsers.json, 'to have calls satisfying', [ - {args: [filepath], returned: config} - ]).and('was called times', 1); + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); }); }); @@ -74,15 +95,15 @@ describe('cli/config', function() { it('should use the JSON parser', function() { loadConfig('foo.json'); expect(parsers.json, 'to have calls satisfying', [ - {args: [filepath], returned: config} - ]).and('was called times', 1); + {args: [filepath], returned: phonyConfigObject} + ]).and('was called once'); }); }); }); describe('when supplied a filepath with unsupported extension', function() { beforeEach(function() { - sandbox.stub(parsers, 'json').returns(config); + sandbox.stub(parsers, 'json').returns(phonyConfigObject); }); it('should use the JSON parser', function() { @@ -105,20 +126,18 @@ describe('cli/config', function() { describe('findConfig()', function() { let findup; let findConfig; + let CONFIG_FILES; beforeEach(function() { findup = {sync: sandbox.stub().returns('/some/path/.mocharc.js')}; - rewiremock.enable(); - findConfig = rewiremock.proxy( + const config = rewiremock.proxy( require.resolve('../../../lib/cli/config'), r => ({ 'find-up': r.by(() => findup) }) - ).findConfig; - }); - - afterEach(function() { - rewiremock.disable(); + ); + findConfig = config.findConfig; + CONFIG_FILES = config.CONFIG_FILES; }); it('should look for one of the config files using findup-sync', function() { diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index d60de8e268..085ba5fc71 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -40,12 +40,10 @@ describe('options', function() { beforeEach(function() { sandbox = createSandbox(); - rewiremock.enable(); }); afterEach(function() { sandbox.restore(); - rewiremock.disable(); }); /** @@ -58,7 +56,7 @@ describe('options', function() { describe('loadOptions()', function() { describe('when no parameter provided', function() { beforeEach(function() { - this.timeout(500); + this.timeout(1000); readFileSync = sandbox.stub(); readFileSync.onFirstCall().returns('{}'); findConfig = sandbox.stub().returns('/some/.mocharc.json'); diff --git a/test/node-unit/fixtures/dumb-module.js b/test/node-unit/fixtures/dumb-module.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/node-unit/fixtures/dumber-module.js b/test/node-unit/fixtures/dumber-module.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index 314a012023..54f8afbc54 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -1,72 +1,82 @@ 'use strict'; -const path = require('path'); const Mocha = require('../../lib/mocha'); const utils = require('../../lib/utils'); +const {createSandbox} = require('sinon'); describe('Mocha', function() { const opts = {reporter: utils.noop}; // no output - const testFiles = [ - __filename, - path.join(__dirname, 'cli', 'config.spec.js'), - path.join(__dirname, 'cli', 'run.spec.js') - ]; - const resolvedTestFiles = testFiles.map(require.resolve); + const dumbFilepath = require.resolve('./fixtures/dumb-module'); + const dumberFilepath = require.resolve('./fixtures/dumber-module'); - describe('#addFile', function() { - it('should add the given file to the files array', function() { - const mocha = new Mocha(opts); - mocha.addFile(__filename); - expect(mocha.files, 'to have length', 1).and('to contain', __filename); - }); + let mocha; + let sandbox; - it('should be chainable', function() { - const mocha = new Mocha(opts); - expect(mocha.addFile(__filename), 'to be', mocha); - }); + beforeEach(function() { + sandbox = createSandbox(); + mocha = new Mocha(opts); + delete require.cache[dumbFilepath]; + delete require.cache[dumberFilepath]; }); - describe('#loadFiles', function() { - it('should load all files from the files array', function() { - const mocha = new Mocha(opts); + afterEach(function() { + delete require.cache[dumbFilepath]; + delete require.cache[dumberFilepath]; + sandbox.restore(); + }); - testFiles.forEach(mocha.addFile, mocha); - mocha.loadFiles(); - expect(require.cache, 'to have keys', resolvedTestFiles); - }); + describe('instance method', function() { + describe('addFile()', function() { + it('should add the given file to the files array', function() { + mocha.addFile('some-file.js'); + expect(mocha.files, 'to exhaustively satisfy', ['some-file.js']); + }); - it('should execute the optional callback if given', function() { - const mocha = new Mocha(opts); - expect(cb => { - mocha.loadFiles(cb); - }, 'to call the callback'); + it('should be chainable', function() { + expect(mocha.addFile('some-file.js'), 'to be', mocha); + }); }); - }); - describe('.unloadFile', function() { - it('should unload a specific file from cache', function() { - const resolvedFilePath = require.resolve(__filename); - require(__filename); - expect(require.cache, 'to have key', resolvedFilePath); + describe('loadFiles()', function() { + it('should load all files from the files array', function() { + this.timeout(1000); + mocha.files = [dumbFilepath, dumberFilepath]; + mocha.loadFiles(); + expect(require.cache, 'to have keys', [dumbFilepath, dumberFilepath]); + }); - Mocha.unloadFile(__filename); - expect(require.cache, 'not to have key', resolvedFilePath); + it('should execute the optional callback if given', function() { + expect(cb => { + mocha.loadFiles(cb); + }, 'to call the callback'); + }); }); - }); - describe('#unloadFiles', function() { - it('should unload all test files from cache', function() { - const mocha = new Mocha(opts); + describe('unloadFiles()', function() { + it('should delegate Mocha.unloadFile() for each item in its list of files', function() { + mocha.files = [dumbFilepath, dumberFilepath]; + sandbox.stub(Mocha, 'unloadFile'); + mocha.unloadFiles(); + expect(Mocha.unloadFile, 'to have a call exhaustively satisfying', [ + dumbFilepath + ]) + .and('to have a call exhaustively satisfying', [dumberFilepath]) + .and('was called twice'); + }); - testFiles.forEach(mocha.addFile, mocha); - mocha.loadFiles(); - mocha.unloadFiles(); - expect(require.cache, 'not to have keys', resolvedTestFiles); + it('should be chainable', function() { + expect(mocha.unloadFiles(), 'to be', mocha); + }); }); + }); - it('should be chainable', function() { - const mocha = new Mocha(opts); - expect(mocha.unloadFiles(), 'to be', mocha); + describe('static method', function() { + describe('unloadFile()', function() { + it('should unload a specific file from cache', function() { + require(dumbFilepath); + Mocha.unloadFile(dumbFilepath); + expect(require.cache, 'not to have key', dumbFilepath); + }); }); }); }); diff --git a/test/unit/hook-timeout.spec.js b/test/unit/hook-timeout.spec.js index df3605518a..8c1b1f4735 100644 --- a/test/unit/hook-timeout.spec.js +++ b/test/unit/hook-timeout.spec.js @@ -1,8 +1,7 @@ 'use strict'; before(function(done) { - this.timeout(100); - setTimeout(done, 50); + setTimeout(done, 100); }); it('should work', function(done) { diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 692559f1ed..c48e2d0e8e 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -416,10 +416,14 @@ describe('Runner', function() { hook.parent = suite; var err = new Error('error'); suite.bail(false); - runner.on(EVENT_RUN_END, function() { - throw new Error('"end" was emit, but the bail is false'); - }); - runner.failHook(hook, err); + expect( + function() { + runner.failHook(hook, err); + }, + 'not to emit from', + hook, + EVENT_RUN_END + ); done(); }); }); diff --git a/test/unit/throw.spec.js b/test/unit/throw.spec.js index 2dc3c8a759..1e02a3a085 100644 --- a/test/unit/throw.spec.js +++ b/test/unit/throw.spec.js @@ -25,6 +25,7 @@ describe('a test that throws', function() { }); afterEach(function() { + process.removeAllListeners('uncaughtException'); uncaughtHandlers.forEach(function(listener) { process.on('uncaughtException', listener); }); diff --git a/test/unit/timeout.spec.js b/test/unit/timeout.spec.js index ce95edcb81..e96f4b5d23 100644 --- a/test/unit/timeout.spec.js +++ b/test/unit/timeout.spec.js @@ -14,7 +14,7 @@ describe('timeouts', function() { }); it('should allow overriding per-test', function(done) { - this.timeout(200); + this.timeout(1500); setTimeout(function() { done(); }, 50); From 240cb3d245c74f525b3612a56472b1d89304820a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 4 May 2020 12:57:30 -0700 Subject: [PATCH 1479/1771] test helper improvements (#4241) * test helper improvements - enables `RawResult` (the result of `invokeMocha()` or `invokeMochaAsync()`) to check the exit code via `to have code` assertion - add passed/failing/pending assertions for `RawRunResult` (the result of `runMocha()` or `runMochaAsync()`) - expose `getSummary()`, which can be used with a `RawResult` (when not failing) - reorganize the module a bit - create `runMochaAsync()` and `runMochaJSONAsync()` which are like `runMocha()` and `runMochaJSON()` except return `Promise`s - better trapping of JSON parse errors - better default handling of `STDERR` output in subprocesses (print it instead of suppress it!) - do not let the `DEBUG` env variable reach subprocesses _unless it was explicitly supplied_ - add an easily copy-paste-able `command` prop to summary - add some missing docstrings Ref: #4198 * increase timeout in watch test for CI the same code should be in PR #4240 --- test/assertions.js | 20 ++- test/integration/helpers.js | 308 +++++++++++++++++++++++------------- 2 files changed, 215 insertions(+), 113 deletions(-) diff --git a/test/assertions.js b/test/assertions.js index 7453392059..ef678ff4ea 100644 --- a/test/assertions.js +++ b/test/assertions.js @@ -118,6 +118,24 @@ exports.mixinMochaAssertions = function(expect) { }); } ) + .addAssertion( + ' [not] to have failed [test] count ', + function(expect, result, count) { + expect(result.failing, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have passed [test] count ', + function(expect, result, count) { + expect(result.passing, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have pending [test] count ', + function(expect, result, count) { + expect(result.pending, '[not] to be', count); + } + ) .addAssertion(' [not] to have test count ', function( expect, result, @@ -315,7 +333,7 @@ exports.mixinMochaAssertions = function(expect) { } ) .addAssertion( - ' to have [exit] code ', + ' to have [exit] code ', function(expect, result, code) { expect(result.code, 'to be', code); } diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 799f477539..17a1acfea1 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -4,116 +4,13 @@ var format = require('util').format; var spawn = require('cross-spawn').spawn; var path = require('path'); var Base = require('../../lib/reporters/base'); - +var debug = require('debug')('mocha:tests:integration:helpers'); var DEFAULT_FIXTURE = resolveFixturePath('__default__'); var MOCHA_EXECUTABLE = require.resolve('../../bin/mocha'); var _MOCHA_EXECUTABLE = require.resolve('../../bin/_mocha'); module.exports = { DEFAULT_FIXTURE: DEFAULT_FIXTURE, - /** - * Invokes the mocha binary for the given fixture with color output disabled. - * Accepts an array of additional command line args to pass. The callback is - * invoked with a summary of the run, in addition to its output. The summary - * includes the number of passing, pending, and failing tests, as well as the - * exit code. Useful for testing different reporters. - * - * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you - * want it. - * Example response: - * { - * pending: 0, - * passing: 0, - * failing: 1, - * code: 1, - * output: '...' - * } - * - * @param {string} fixturePath - Path to fixture .js file - * @param {string[]} args - Extra args to mocha executable - * @param {Function} fn - Callback - * @param {Object} [opts] - Options for `spawn()` - * @returns {ChildProcess} Mocha process - */ - runMocha: function(fixturePath, args, fn, opts) { - if (typeof args === 'function') { - opts = fn; - fn = args; - args = []; - } - - var path; - - path = resolveFixturePath(fixturePath); - args = args || []; - - return invokeSubMocha( - args.concat(['-C', path]), - function(err, res) { - if (err) { - return fn(err); - } - - fn(null, getSummary(res)); - }, - opts - ); - }, - - /** - * Invokes the mocha binary for the given fixture using the JSON reporter, - * returning the parsed output, as well as exit code. - * - * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you - * want it. - * @param {string} fixturePath - Path from __dirname__ - * @param {string[]} args - Array of args - * @param {Function} fn - Callback - * @param {Object} [opts] - Opts for `spawn()` - * @returns {*} Parsed object - */ - runMochaJSON: function(fixturePath, args, fn, opts) { - if (typeof args === 'function') { - opts = fn; - fn = args; - args = []; - } - - var path; - - path = resolveFixturePath(fixturePath); - args = (args || []).concat('--reporter', 'json', path); - - return invokeMocha( - args, - function(err, res) { - if (err) { - return fn(err); - } - - var result; - try { - // attempt to catch a JSON parsing error *only* here. - // previously, the callback was called within this `try` block, - // which would result in errors thrown from the callback - // getting caught by the `catch` block below. - result = toJSONRunResult(res); - } catch (err) { - return fn( - new Error( - format( - 'Failed to parse JSON reporter output. Error:\n%O\nResult:\n%O', - err, - res - ) - ) - ); - } - fn(null, result); - }, - opts - ); - }, /** * regular expression used for splitting lines based on new line / dot symbol. @@ -146,6 +43,8 @@ module.exports = { invokeNode: invokeNode, + getSummary: getSummary, + /** * Resolves the path to a fixture to the full path. */ @@ -160,9 +59,166 @@ module.exports = { */ escapeRegExp: function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string - } + }, + + runMocha: runMocha, + runMochaJSON: runMochaJSON, + runMochaAsync: runMochaAsync, + runMochaJSONAsync: runMochaJSONAsync }; +/** + * Invokes the mocha binary for the given fixture with color output disabled. + * Accepts an array of additional command line args to pass. The callback is + * invoked with a summary of the run, in addition to its output. The summary + * includes the number of passing, pending, and failing tests, as well as the + * exit code. Useful for testing different reporters. + * + * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you + * want it. + * Example response: + * { + * pending: 0, + * passing: 0, + * failing: 1, + * code: 1, + * output: '...' + * } + * + * @param {string} fixturePath - Path to fixture .js file + * @param {string[]} args - Extra args to mocha executable + * @param {Function} fn - Callback + * @param {Object} [opts] - Options for `spawn()` + * @returns {ChildProcess} Mocha process + */ +function runMocha(fixturePath, args, fn, opts) { + if (typeof args === 'function') { + opts = fn; + fn = args; + args = []; + } + + var path; + + path = resolveFixturePath(fixturePath); + args = args || []; + + return invokeSubMocha( + args.concat(path), + function(err, res) { + if (err) { + return fn(err); + } + + fn(null, getSummary(res)); + }, + opts + ); +} + +/** + * Invokes the mocha binary for the given fixture using the JSON reporter, + * returning the parsed output, as well as exit code. + * + * By default, `STDERR` is ignored. Pass `{stdio: 'pipe'}` as `opts` if you + * want it. + * @param {string} fixturePath - Path from __dirname__ + * @param {string[]} args - Array of args + * @param {Function} fn - Callback + * @param {Object} [opts] - Opts for `spawn()` + * @returns {*} Parsed object + */ +function runMochaJSON(fixturePath, args, fn, opts) { + if (typeof args === 'function') { + opts = fn; + fn = args; + args = []; + } + + var path; + + path = resolveFixturePath(fixturePath); + args = (args || []).concat('--reporter', 'json', path); + + return invokeMocha( + args, + function(err, res) { + if (err) { + return fn(err); + } + + var result; + try { + // attempt to catch a JSON parsing error *only* here. + // previously, the callback was called within this `try` block, + // which would result in errors thrown from the callback + // getting caught by the `catch` block below. + result = toJSONRunResult(res); + } catch (err) { + return fn( + new Error( + format( + 'Failed to parse JSON reporter output. Error:\n%O\nResult:\n%O', + err, + res + ) + ) + ); + } + fn(null, result); + }, + opts + ); +} + +/** + * + * If you need more granular control, try {@link invokeMochaAsync} instead. + * + * Like {@link runMocha}, but returns a `Promise`. + * @param {string} fixturePath - Path to (or name of, or basename of) fixture file + * @param {Options} [args] - Command-line arguments to the `mocha` executable + * @param {Object} [opts] - Options for `child_process.spawn`. + * @returns {Promise} + */ +function runMochaAsync(fixturePath, args, opts) { + return new Promise(function(resolve, reject) { + runMocha( + fixturePath, + args, + function(err, result) { + if (err) { + return reject(err); + } + resolve(result); + }, + opts + ); + }); +} + +/** + * Like {@link runMochaJSON}, but returns a `Promise`. + * @param {string} fixturePath - Path to (or name of, or basename of) fixture file + * @param {Options} [args] - Command-line args + * @param {Object} [opts] - Options for `child_process.spawn` + */ +function runMochaJSONAsync(fixturePath, args, opts) { + return new Promise(function(resolve, reject) { + runMochaJSON( + fixturePath, + args, + function(err, result) { + if (err) { + return reject(err); + } + resolve(result); + }, + opts + ); + }); +} + /** * Coerce output as returned by _spawnMochaWithListeners using JSON reporter into a JSONRunResult as * recognized by our custom unexpected assertions @@ -171,9 +227,15 @@ module.exports = { */ function toJSONRunResult(result) { var code = result.code; - result = JSON.parse(result.output); - result.code = code; - return result; + try { + result = JSON.parse(result.output); + result.code = code; + return result; + } catch (err) { + throw new Error( + `Couldn't parse JSON: ${err.message}\n\nOriginal result output: ${result.output}` + ); + } } /** @@ -267,16 +329,24 @@ function invokeSubMocha(args, fn, opts) { */ function _spawnMochaWithListeners(args, fn, opts) { var output = ''; + opts = opts || {}; if (opts === 'pipe') { - opts = {stdio: 'pipe'}; + opts = {stdio: ['inherit', 'pipe', 'pipe']}; } + var env = Object.assign({}, process.env); + // prevent DEBUG from borking STDERR when piping, unless explicitly set via `opts` + delete env.DEBUG; + opts = Object.assign( { cwd: process.cwd(), - stdio: ['ignore', 'pipe', 'ignore'] + stdio: ['inherit', 'pipe', 'inherit'], + env: env }, - opts || {} + opts ); + + debug('spawning: %s', [process.execPath].concat(args).join(' ')); var mocha = spawn(process.execPath, args, opts); var listener = function(data) { output += data; @@ -292,7 +362,8 @@ function _spawnMochaWithListeners(args, fn, opts) { fn(null, { output: output, code: code, - args: args + args: args, + command: args.join(' ') }); }); @@ -306,6 +377,11 @@ function resolveFixturePath(fixture) { return path.join('test', 'integration', 'fixtures', fixture); } +/** + * Parses some `mocha` reporter output and returns a summary based on the "epilogue" + * @param {string} res - Typically output of STDOUT from the 'spec' reporter + * @returns {Summary} + */ function getSummary(res) { return ['passing', 'pending', 'failing'].reduce(function(summary, type) { var pattern, match; @@ -317,3 +393,11 @@ function getSummary(res) { return summary; }, res); } + +/** + * A summary of a `mocha` run + * @typedef {Object} Summary + * @property {number} passing - Number of passing tests + * @property {number} pending - Number of pending tests + * @property {number} failing - Number of failing tests + */ From 65daa9a4d26d3a2163510f5cd8b79bce117710ee Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 4 May 2020 17:05:08 -0700 Subject: [PATCH 1480/1771] rename fixtures to have .fixture.js extension --- .../fixtures/{dumb-module.js => dumb-module.fixture.js} | 0 .../fixtures/{dumber-module.js => dumber-module.fixture.js} | 0 test/node-unit/mocha.spec.js | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename test/node-unit/fixtures/{dumb-module.js => dumb-module.fixture.js} (100%) rename test/node-unit/fixtures/{dumber-module.js => dumber-module.fixture.js} (100%) diff --git a/test/node-unit/fixtures/dumb-module.js b/test/node-unit/fixtures/dumb-module.fixture.js similarity index 100% rename from test/node-unit/fixtures/dumb-module.js rename to test/node-unit/fixtures/dumb-module.fixture.js diff --git a/test/node-unit/fixtures/dumber-module.js b/test/node-unit/fixtures/dumber-module.fixture.js similarity index 100% rename from test/node-unit/fixtures/dumber-module.js rename to test/node-unit/fixtures/dumber-module.fixture.js diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index 54f8afbc54..456232da75 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -6,8 +6,8 @@ const {createSandbox} = require('sinon'); describe('Mocha', function() { const opts = {reporter: utils.noop}; // no output - const dumbFilepath = require.resolve('./fixtures/dumb-module'); - const dumberFilepath = require.resolve('./fixtures/dumber-module'); + const dumbFilepath = require.resolve('./fixtures/dumb-module.fixture.js'); + const dumberFilepath = require.resolve('./fixtures/dumber-module.fixture.js'); let mocha; let sandbox; From 8b6a76c8dc64e8a16f3c995f22a53fbc86b3f173 Mon Sep 17 00:00:00 2001 From: Emanuele Date: Tue, 5 May 2020 19:47:18 +0100 Subject: [PATCH 1481/1771] fix: check if module.paths really exists (#4194); closes #2505 --- lib/cli/cli.js | 4 +++- lib/mocha.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index dee8e70dd4..af0e7841d6 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -30,7 +30,9 @@ const {repository, homepage, version, gitter} = require('../../package.json'); exports.main = (argv = process.argv.slice(2)) => { debug('entered main with raw args', argv); // ensure we can require() from current working directory - module.paths.push(process.cwd(), path.resolve('node_modules')); + if (typeof module.paths !== 'undefined') { + module.paths.push(process.cwd(), path.resolve('node_modules')); + } Error.stackTraceLimit = Infinity; // configurable via --stack-trace-limit? diff --git a/lib/mocha.js b/lib/mocha.js index 40718d09e9..bc5462daac 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -29,7 +29,7 @@ exports = module.exports = Mocha; * To require local UIs and reporters when running in node. */ -if (!process.browser) { +if (!process.browser && typeof module.paths !== 'undefined') { var cwd = process.cwd(); module.paths.push(cwd, path.join(cwd, 'node_modules')); } From c0137eb698add08f29035467ea1dc230904f82ba Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Wed, 6 May 2020 12:44:12 +0100 Subject: [PATCH 1482/1771] Remove enableTimeout api + allow overriding a disabled timeout (#4260) * Reset enableTimeouts. Integration test * Spec update * Use function which logs * Remove _enableTimeouts * Defensive check for 0 * Use correct timeout value * Remove superfluous logic. * Add note about `enableTimeouts` to docs * Update comment * Lint fix * Disable if setting == or grtr to upper * Swap asser to expect * Excl docs in coverage + clamp in suite. * Add note about async tests --- .nycrc | 1 + docs/index.md | 2 + lib/context.js | 15 ---- lib/mocha.js | 17 ---- lib/runnable.js | 33 +++----- lib/suite.js | 30 ++----- lib/test.js | 1 - .../fixtures/timeout-override.fixture.js | 9 +++ test/integration/timeout.spec.js | 11 +++ test/unit/context.spec.js | 6 -- test/unit/mocha.spec.js | 13 --- test/unit/runnable.spec.js | 80 ++++--------------- test/unit/test.spec.js | 5 -- test/unit/timeout.spec.js | 10 +-- 14 files changed, 54 insertions(+), 179 deletions(-) create mode 100644 test/integration/fixtures/timeout-override.fixture.js diff --git a/.nycrc b/.nycrc index d4091b1a0f..aac56b8030 100644 --- a/.nycrc +++ b/.nycrc @@ -5,6 +5,7 @@ ], "exclude": [ "coverage/**", + "docs/**", "packages/*/test{,s}/**", "**/*.d.ts", "test{,s}/**", diff --git a/docs/index.md b/docs/index.md index 6c66053d8c..415430a3d4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -809,6 +809,8 @@ describe('a suite of tests', function() { Again, use `this.timeout(0)` to disable the timeout for a hook. > In v3.0.0 or newer, a parameter passed to `this.timeout()` greater than the [maximum delay value][mdn-settimeout-maxdelay] will cause the timeout to be disabled. +> In v8.0.0 or newer, `this.enableTimeouts()` has been removed. +> **Warning:** With async tests if you disable timeouts via `this.timeout(0)` and then do not call `done()`, your test will exit silently. ## Diffs diff --git a/lib/context.js b/lib/context.js index 4c6b0c23e5..2497ded868 100644 --- a/lib/context.js +++ b/lib/context.js @@ -45,21 +45,6 @@ Context.prototype.timeout = function(ms) { return this; }; -/** - * Set test timeout `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Context} self - */ -Context.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this.runnable().enableTimeouts(); - } - this.runnable().enableTimeouts(enabled); - return this; -}; - /** * Set or get test slowness threshold `ms`. * diff --git a/lib/mocha.js b/lib/mocha.js index bc5462daac..d7d1d54709 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -627,7 +627,6 @@ Mocha.prototype.diff = function(diff) { * @public * @see [CLI option](../#-timeout-ms-t-ms) * @see [Timeouts](../#timeouts) - * @see {@link Mocha#enableTimeouts} * @param {number|string} msecs - Timeout threshold value. * @return {Mocha} this * @chainable @@ -686,22 +685,6 @@ Mocha.prototype.slow = function(msecs) { return this; }; -/** - * Enables or disables timeouts. - * - * @public - * @see [CLI option](../#-timeout-ms-t-ms) - * @param {boolean} enableTimeouts - Whether to enable timeouts. - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.enableTimeouts = function(enableTimeouts) { - this.suite.enableTimeouts( - arguments.length && enableTimeouts !== undefined ? enableTimeouts : true - ); - return this; -}; - /** * Forces all tests to either accept a `done` callback or return a promise. * diff --git a/lib/runnable.js b/lib/runnable.js index bdd6fffe5c..ed585eb93f 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -35,7 +35,6 @@ function Runnable(title, fn) { this.sync = !this.async; this._timeout = 2000; this._slow = 75; - this._enableTimeouts = true; this.timedOut = false; this._retries = -1; this._currentRetry = 0; @@ -83,10 +82,12 @@ Runnable.prototype.timeout = function(ms) { // see #1652 for reasoning if (ms === range[0] || ms === range[1]) { - this._enableTimeouts = false; + this._timeout = 0; + } else { + this._timeout = ms; } - debug('timeout %d', ms); - this._timeout = ms; + debug('timeout %d', this._timeout); + if (this.timer) { this.resetTimeout(); } @@ -112,22 +113,6 @@ Runnable.prototype.slow = function(ms) { return this; }; -/** - * Set and get whether timeout is `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Runnable|boolean} enabled or Runnable instance. - */ -Runnable.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this._enableTimeouts; - } - debug('enableTimeouts %s', enabled); - this._enableTimeouts = enabled; - return this; -}; - /** * Halt and mark as pending. * @@ -229,14 +214,14 @@ Runnable.prototype.clearTimeout = function() { */ Runnable.prototype.resetTimeout = function() { var self = this; - var ms = this.timeout() || 1e9; + var ms = this.timeout(); - if (!this._enableTimeouts) { + if (ms === 0) { return; } this.clearTimeout(); this.timer = setTimeout(function() { - if (!self._enableTimeouts) { + if (self.timeout() === 0) { return; } self.callback(self._timeoutError(ms)); @@ -306,7 +291,7 @@ Runnable.prototype.run = function(fn) { self.clearTimeout(); self.duration = new Date() - start; finished = true; - if (!err && self.duration > ms && self._enableTimeouts) { + if (!err && self.duration > ms && ms > 0) { err = self._timeoutError(ms); } fn(err); diff --git a/lib/suite.js b/lib/suite.js index 191d946b50..2a64e2db8f 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -68,7 +68,6 @@ function Suite(title, parentContext, isRoot) { this._afterAll = []; this.root = isRoot === true; this._timeout = 2000; - this._enableTimeouts = true; this._slow = 75; this._bail = false; this._retries = -1; @@ -105,7 +104,6 @@ Suite.prototype.clone = function() { suite.root = this.root; suite.timeout(this.timeout()); suite.retries(this.retries()); - suite.enableTimeouts(this.enableTimeouts()); suite.slow(this.slow()); suite.bail(this.bail()); return suite; @@ -123,12 +121,15 @@ Suite.prototype.timeout = function(ms) { if (!arguments.length) { return this._timeout; } - if (ms.toString() === '0') { - this._enableTimeouts = false; - } if (typeof ms === 'string') { ms = milliseconds(ms); } + + // Clamp to range + var INT_MAX = Math.pow(2, 31) - 1; + var range = [0, INT_MAX]; + ms = utils.clamp(ms, range); + debug('timeout %d', ms); this._timeout = parseInt(ms, 10); return this; @@ -150,22 +151,6 @@ Suite.prototype.retries = function(n) { return this; }; -/** - * Set or get timeout to `enabled`. - * - * @private - * @param {boolean} enabled - * @return {Suite|boolean} self or enabled - */ -Suite.prototype.enableTimeouts = function(enabled) { - if (!arguments.length) { - return this._enableTimeouts; - } - debug('enableTimeouts %s', enabled); - this._enableTimeouts = enabled; - return this; -}; - /** * Set or get slow `ms` or short-hand such as "2s". * @@ -222,7 +207,6 @@ Suite.prototype._createHook = function(title, fn) { hook.parent = this; hook.timeout(this.timeout()); hook.retries(this.retries()); - hook.enableTimeouts(this.enableTimeouts()); hook.slow(this.slow()); hook.ctx = this.ctx; hook.file = this.file; @@ -337,7 +321,6 @@ Suite.prototype.addSuite = function(suite) { suite.root = false; suite.timeout(this.timeout()); suite.retries(this.retries()); - suite.enableTimeouts(this.enableTimeouts()); suite.slow(this.slow()); suite.bail(this.bail()); this.suites.push(suite); @@ -356,7 +339,6 @@ Suite.prototype.addTest = function(test) { test.parent = this; test.timeout(this.timeout()); test.retries(this.retries()); - test.enableTimeouts(this.enableTimeouts()); test.slow(this.slow()); test.ctx = this.ctx; this.tests.push(test); diff --git a/lib/test.js b/lib/test.js index 87f1ccce7d..29c74b4563 100644 --- a/lib/test.js +++ b/lib/test.js @@ -61,7 +61,6 @@ Test.prototype.clone = function() { var test = new Test(this.title, this.fn); test.timeout(this.timeout()); test.slow(this.slow()); - test.enableTimeouts(this.enableTimeouts()); test.retries(this.retries()); test.currentRetry(this.currentRetry()); test.retriedTest(this.retriedTest() || this); diff --git a/test/integration/fixtures/timeout-override.fixture.js b/test/integration/fixtures/timeout-override.fixture.js new file mode 100644 index 0000000000..c780024824 --- /dev/null +++ b/test/integration/fixtures/timeout-override.fixture.js @@ -0,0 +1,9 @@ +'use strict'; + +describe('timeout override', function() { + it('should fail async test due to re-enable', function(done) { + this.timeout(0); + this.timeout(1); + setTimeout(done, 2); + }); +}); diff --git a/test/integration/timeout.spec.js b/test/integration/timeout.spec.js index 53dfb58274..0f98467acc 100644 --- a/test/integration/timeout.spec.js +++ b/test/integration/timeout.spec.js @@ -18,4 +18,15 @@ describe('this.timeout()', function() { done(); }); }); + + it('should allow overriding if disabled per-test', function(done) { + run('timeout-override.fixture.js', args, function(err, res) { + if (err) { + done(err); + return; + } + expect(res.stats.failures, 'to be', 1); + done(); + }); + }); }); diff --git a/test/unit/context.spec.js b/test/unit/context.spec.js index 3f4d756469..d04b1ececa 100644 --- a/test/unit/context.spec.js +++ b/test/unit/context.spec.js @@ -90,12 +90,6 @@ describe('methods', function() { }); }); - describe('enableTimeouts()', function() { - it('should return the enableTimeouts', function() { - expect(this.enableTimeouts(), 'to be', true); - }); - }); - describe('retries', function() { it('should return the number of retries', function() { expect(this.retries(), 'to be', -1); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index a317ca7c39..8839a2d0ed 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -159,19 +159,6 @@ describe('Mocha', function() { }); }); - describe('#enableTimeouts()', function() { - it('should set the suite._enableTimeouts to true if no argument', function() { - var mocha = new Mocha(opts); - mocha.enableTimeouts(); - expect(mocha.suite._enableTimeouts, 'to be', true); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.enableTimeouts(), 'to be', mocha); - }); - }); - describe('#diff()', function() { it('should set the diff option to true', function() { var mocha = new Mocha(opts); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index 2c079c3b40..fa328441ca 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -8,19 +8,19 @@ var STATE_FAILED = Runnable.constants.STATE_FAILED; describe('Runnable(title, fn)', function() { describe('#timeout(ms)', function() { - var MIN_TIMEOUT = 0; + var DISABLED_TIMEOUTS = 0; var MAX_TIMEOUT = 2147483647; // INT_MAX (32-bit signed integer) describe('when value is less than lower bound', function() { it('should clamp to lower bound given numeric', function() { var run = new Runnable(); run.timeout(-1); - expect(run.timeout(), 'to be', MIN_TIMEOUT); + expect(run.timeout(), 'to be', DISABLED_TIMEOUTS); }); it('should clamp to lower bound given timestamp', function() { var run = new Runnable(); run.timeout('-1 ms'); - expect(run.timeout(), 'to be', MIN_TIMEOUT); + expect(run.timeout(), 'to be', DISABLED_TIMEOUTS); }); }); @@ -29,25 +29,17 @@ describe('Runnable(title, fn)', function() { beforeEach(function() { run = new Runnable(); - run.timeout(MIN_TIMEOUT); + run.timeout(DISABLED_TIMEOUTS); }); describe('given numeric value', function() { - it('should set the timeout value', function() { - expect(run.timeout(), 'to be', MIN_TIMEOUT); - }); - - it('should disable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); + it('should set the timeout value to disabled', function() { + expect(run.timeout(), 'to be', DISABLED_TIMEOUTS); }); }); describe('given string timestamp', function() { - it('should set the timeout value', function() { - expect(run.timeout(), 'to be', MIN_TIMEOUT); - }); - - it('should disable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); + it('should set the timeout value to disabled', function() { + expect(run.timeout(), 'to be', DISABLED_TIMEOUTS); }); }); }); @@ -65,20 +57,12 @@ describe('Runnable(title, fn)', function() { it('should set the timeout value', function() { expect(run.timeout(), 'to be', timeout); }); - - it('should enable timeouts', function() { - expect(run.enableTimeouts(), 'to be true'); - }); }); describe('given string timestamp', function() { it('should set the timeout value', function() { expect(run.timeout(), 'to be', timeout); }); - - it('should enable timeouts', function() { - expect(run.enableTimeouts(), 'to be true'); - }); }); }); @@ -90,22 +74,8 @@ describe('Runnable(title, fn)', function() { run.timeout(MAX_TIMEOUT); }); describe('given numeric value', function() { - it('should set the timeout value', function() { - expect(run.timeout(), 'to be', MAX_TIMEOUT); - }); - - it('should disable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); - }); - }); - - describe('given string timestamp', function() { - it('should set the timeout value', function() { - expect(run.timeout(), 'to be', MAX_TIMEOUT); - }); - - it('should disable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); + it('should set the disabled timeout value', function() { + expect(run.timeout(), 'to be', 0); }); }); }); @@ -120,35 +90,13 @@ describe('Runnable(title, fn)', function() { }); describe('given numeric value', function() { - it('should clamp the value to max timeout', function() { - expect(run.timeout(), 'to be', MAX_TIMEOUT); - }); - - it('should enable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); - }); - }); - - describe('given string timestamp', function() { - it('should clamp the value to max timeout', function() { - expect(run.timeout(), 'to be', MAX_TIMEOUT); - }); - - it('should enable timeouts', function() { - expect(run.enableTimeouts(), 'to be false'); + it('should set the disabled timeout value', function() { + expect(run.timeout(), 'to be', 0); }); }); }); }); - describe('#enableTimeouts(enabled)', function() { - it('should set enabled', function() { - var run = new Runnable(); - run.enableTimeouts(false); - expect(run.enableTimeouts(), 'to be false'); - }); - }); - describe('#slow(ms)', function() { var run; @@ -314,7 +262,7 @@ describe('Runnable(title, fn)', function() { }, 2); }); runnable.timeout(1); - runnable.enableTimeouts(false); + runnable.timeout(0); runnable.run(function(err) { expect(err, 'to be falsy'); done(); @@ -721,7 +669,7 @@ describe('Runnable(title, fn)', function() { var runnable = new Runnable('foo', function() {}); runnable.timeout(10); runnable.resetTimeout(); - runnable.enableTimeouts(false); + runnable.timeout(0); setTimeout(function() { expect(runnable.timedOut, 'to be', false); done(); diff --git a/test/unit/test.spec.js b/test/unit/test.spec.js index 7bf739d47e..4ccd891bac 100644 --- a/test/unit/test.spec.js +++ b/test/unit/test.spec.js @@ -10,7 +10,6 @@ describe('Test', function() { this._test = new Test('To be cloned', function() {}); this._test._timeout = 3043; this._test._slow = 101; - this._test._enableTimeouts = true; this._test._retries = 3; this._test._currentRetry = 1; this._test._allowedGlobals = ['foo']; @@ -30,10 +29,6 @@ describe('Test', function() { expect(this._test.clone().slow(), 'to be', 101); }); - it('should copy the enableTimeouts value', function() { - expect(this._test.clone().enableTimeouts(), 'to be', true); - }); - it('should copy the retries value', function() { expect(this._test.clone().retries(), 'to be', 3); }); diff --git a/test/unit/timeout.spec.js b/test/unit/timeout.spec.js index e96f4b5d23..5cf3dce3b7 100644 --- a/test/unit/timeout.spec.js +++ b/test/unit/timeout.spec.js @@ -21,12 +21,6 @@ describe('timeouts', function() { }); describe('disabling', function() { - it('should allow overriding per-test', function(done) { - this.enableTimeouts(false); - this.timeout(1); - setTimeout(done, 2); - }); - it('should work with timeout(0)', function(done) { this.timeout(0); setTimeout(done, 1); @@ -52,13 +46,13 @@ describe('timeouts', function() { }); }); - describe('using enableTimeouts(false)', function() { + describe('using timeout(0)', function() { this.timeout(4); it('should suppress timeout(4)', function(done) { this.slow(100); // The test is in the before() call. - this.enableTimeouts(false); + this.timeout(0); setTimeout(done, 50); }); }); From fbe3ce4f7d5c27fec3fa1e32ee86b23b169e02d2 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Mon, 11 May 2020 21:55:24 +0200 Subject: [PATCH 1483/1771] Add ability to run tests in a mocha instance multiple times (#4234); closes #2783 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add ability to run tests in a mocha instance multiple times * Rename `autoDispsoe` to `cleanReferencesAfterRun`, Rename since we cannot dispose the entire mocha instance after a test run. We should keep the process.on('uncaughtException') handlers in place in order to not break existing functionality. * Allow `unloadFiles` to reset `referencesCleaned`. * Complete rename of _cleanReferencesAfterRun * Add integration test for running a suite multiple times * improve api docs * Docs: fix dead link * Make sure tests run on older node versions * Remove `.only` 😅 * Implement `process.listenerCount` in the browser * Implement mocha states in a finite state machine * Fix some small remarks * Make integration tests more damp * Keep `Runner` api backward compatible * Unload files when disposed * Runnable.reset should also reset `err` and `state` * Also reset hooks Co-authored-by: Christopher Hiller --- browser-entry.js | 11 ++ lib/errors.js | 33 +++- lib/hook.js | 8 + lib/mocha.js | 110 +++++++++++- lib/runnable.js | 15 +- lib/runner.js | 88 +++++++-- lib/suite.js | 32 +++- lib/test.js | 13 +- .../multiple-runs/clean-references.fixture.js | 6 + .../fixtures/multiple-runs/dispose.fixture.js | 6 + ...uns-with-different-output-suite.fixture.js | 19 ++ ...ns-with-flaky-before-each-suite.fixture.js | 18 ++ ...ple-runs-with-flaky-before-each.fixture.js | 13 ++ .../multiple-runs/run-thrice-helper.js | 24 +++ .../multiple-runs/run-thrice.fixture.js | 6 + ...previous-is-still-running-suite.fixture.js | 5 + ...un-if-previous-is-still-running.fixture.js | 12 ++ test/integration/multiple-runs.spec.js | 89 ++++++++++ test/unit/hook.spec.js | 44 +++++ test/unit/mocha.spec.js | 167 ++++++++++++++++++ test/unit/runnable.spec.js | 23 +++ test/unit/runner.spec.js | 61 ++++++- test/unit/suite.spec.js | 42 +++++ test/unit/test.spec.js | 34 +++- 24 files changed, 853 insertions(+), 26 deletions(-) create mode 100644 test/integration/fixtures/multiple-runs/clean-references.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/dispose.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/multiple-runs-with-different-output-suite.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each-suite.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/run-thrice-helper.js create mode 100644 test/integration/fixtures/multiple-runs/run-thrice.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running-suite.fixture.js create mode 100644 test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture.js create mode 100644 test/integration/multiple-runs.spec.js create mode 100644 test/unit/hook.spec.js diff --git a/browser-entry.js b/browser-entry.js index 3e9cbbaf90..114d2f7213 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -52,6 +52,17 @@ process.removeListener = function(e, fn) { } }; +/** + * Implements listenerCount for 'uncaughtException'. + */ + +process.listenerCount = function(name) { + if (name === 'uncaughtException') { + return uncaughtExceptionHandlers.length; + } + return 0; +}; + /** * Implements uncaughtException listener. */ diff --git a/lib/errors.js b/lib/errors.js index 099bc579ab..a85c8c24b9 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -149,6 +149,35 @@ function createInvalidPluginError(message, pluginType, pluginId) { } } +/** + * Creates an error object to be thrown when a mocha object's `run` method is executed while it is already disposed. + * @param {string} message The error message to be displayed. + * @param {boolean} cleanReferencesAfterRun the value of `cleanReferencesAfterRun` + * @param {Mocha} instance the mocha instance that throw this error + */ +function createMochaInstanceAlreadyDisposedError( + message, + cleanReferencesAfterRun, + instance +) { + var err = new Error(message); + err.code = 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED'; + err.cleanReferencesAfterRun = cleanReferencesAfterRun; + err.instance = instance; + return err; +} + +/** + * Creates an error object to be thrown when a mocha object's `run` method is called while a test run is in progress. + * @param {string} message The error message to be displayed. + */ +function createMochaInstanceAlreadyRunningError(message, instance) { + var err = new Error(message); + err.code = 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING'; + err.instance = instance; + return err; +} + module.exports = { createInvalidArgumentTypeError: createInvalidArgumentTypeError, createInvalidArgumentValueError: createInvalidArgumentValueError, @@ -158,5 +187,7 @@ module.exports = { createMissingArgumentError: createMissingArgumentError, createNoFilesMatchPatternError: createNoFilesMatchPatternError, createUnsupportedError: createUnsupportedError, - createInvalidPluginError: createInvalidPluginError + createInvalidPluginError: createInvalidPluginError, + createMochaInstanceAlreadyDisposedError: createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError: createMochaInstanceAlreadyRunningError }; diff --git a/lib/hook.js b/lib/hook.js index 71440d23d0..6560715fc5 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -27,6 +27,14 @@ function Hook(title, fn) { */ inherits(Hook, Runnable); +/** + * Resets the state for a next run. + */ +Hook.prototype.reset = function() { + Runnable.prototype.reset.call(this); + delete this._error; +}; + /** * Get or set the test `err`. * diff --git a/lib/mocha.js b/lib/mocha.js index d7d1d54709..5a8fb32202 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -18,6 +18,10 @@ var esmUtils = utils.supportsEsModules() ? require('./esm-utils') : undefined; var createStatsCollector = require('./stats-collector'); var createInvalidReporterError = errors.createInvalidReporterError; var createInvalidInterfaceError = errors.createInvalidInterfaceError; +var createMochaInstanceAlreadyDisposedError = + errors.createMochaInstanceAlreadyDisposedError; +var createMochaInstanceAlreadyRunningError = + errors.createMochaInstanceAlreadyRunningError; var EVENT_FILE_PRE_REQUIRE = Suite.constants.EVENT_FILE_PRE_REQUIRE; var EVENT_FILE_POST_REQUIRE = Suite.constants.EVENT_FILE_POST_REQUIRE; var EVENT_FILE_REQUIRE = Suite.constants.EVENT_FILE_REQUIRE; @@ -25,6 +29,30 @@ var sQuote = utils.sQuote; exports = module.exports = Mocha; +/** + * A Mocha instance is a finite state machine. + * These are the states it can be in. + */ +var mochaStates = utils.defineConstants({ + /** + * Initial state of the mocha instance + */ + INIT: 'init', + /** + * Mocha instance is running tests + */ + RUNNING: 'running', + /** + * Mocha instance is done running tests and references to test functions and hooks are cleaned. + * You can reset this state by unloading the test files. + */ + REFERENCES_CLEANED: 'referencesCleaned', + /** + * Mocha instance is disposed and can no longer be used. + */ + DISPOSED: 'disposed' +}); + /** * To require local UIs and reporters when running in node. */ @@ -97,6 +125,7 @@ function Mocha(options) { this.options = options; // root suite this.suite = new exports.Suite('', new exports.Context(), true); + this._cleanReferencesAfterRun = true; this.grep(options.grep) .fgrep(options.fgrep) @@ -388,9 +417,18 @@ Mocha.unloadFile = function(file) { * @chainable */ Mocha.prototype.unloadFiles = function() { + if (this._state === mochaStates.DISPOSED) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, it cannot be used again.', + this._cleanReferencesAfterRun, + this + ); + } + this.files.forEach(function(file) { Mocha.unloadFile(file); }); + this._state = mochaStates.INIT; return this; }; @@ -490,6 +528,38 @@ Mocha.prototype.checkLeaks = function(checkLeaks) { return this; }; +/** + * Enables or disables whether or not to dispose after each test run. + * Disable this to ensure you can run the test suite multiple times. + * If disabled, be sure to dispose mocha when you're done to prevent memory leaks. + * @public + * @see {@link Mocha#dispose} + * @param {boolean} cleanReferencesAfterRun + * @return {Mocha} this + * @chainable + */ +Mocha.prototype.cleanReferencesAfterRun = function(cleanReferencesAfterRun) { + this._cleanReferencesAfterRun = cleanReferencesAfterRun !== false; + return this; +}; + +/** + * Manually dispose this mocha instance. Mark this instance as `disposed` and unable to run more tests. + * It also removes function references to tests functions and hooks, so variables trapped in closures can be cleaned by the garbage collector. + * @public + */ +Mocha.prototype.dispose = function() { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Cannot dispose while the mocha instance is still running tests.' + ); + } + this.unloadFiles(); + this._previousRunner && this._previousRunner.dispose(); + this.suite.dispose(); + this._state = mochaStates.DISPOSED; +}; + /** * Displays full stack trace upon test failure. * @@ -770,6 +840,28 @@ Mocha.prototype.forbidPending = function(forbidPending) { return this; }; +/** + * Throws an error if mocha is in the wrong state to be able to transition to a "running" state. + */ +Mocha.prototype._guardRunningStateTransition = function() { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Mocha instance is currently running tests, cannot start a next test run until this one is done', + this + ); + } + if ( + this._state === mochaStates.DISPOSED || + this._state === mochaStates.REFERENCES_CLEANED + ) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + this._cleanReferencesAfterRun, + this + ); + } +}; + /** * Mocha version as specified by "package.json". * @@ -810,13 +902,23 @@ Object.defineProperty(Mocha.prototype, 'version', { * mocha.run(failures => process.exitCode = failures ? 1 : 0); */ Mocha.prototype.run = function(fn) { + this._guardRunningStateTransition(); + this._state = mochaStates.RUNNING; + if (this._previousRunner) { + this._previousRunner.dispose(); + this.suite.reset(); + } if (this.files.length && !this.loadAsync) { this.loadFiles(); } + var self = this; var suite = this.suite; var options = this.options; options.files = this.files; - var runner = new exports.Runner(suite, options.delay); + var runner = new exports.Runner(suite, { + delay: options.delay, + cleanReferencesAfterRun: this._cleanReferencesAfterRun + }); createStatsCollector(runner); var reporter = new this._reporter(runner, options); runner.checkLeaks = options.checkLeaks === true; @@ -841,6 +943,12 @@ Mocha.prototype.run = function(fn) { exports.reporters.Base.hideDiff = !options.diff; function done(failures) { + self._previousRunner = runner; + if (self._cleanReferencesAfterRun) { + self._state = mochaStates.REFERENCES_CLEANED; + } else { + self._state = mochaStates.INIT; + } fn = fn || utils.noop; if (reporter.done) { reporter.done(failures, fn); diff --git a/lib/runnable.js b/lib/runnable.js index ed585eb93f..4d58070f5d 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -35,10 +35,8 @@ function Runnable(title, fn) { this.sync = !this.async; this._timeout = 2000; this._slow = 75; - this.timedOut = false; this._retries = -1; - this._currentRetry = 0; - this.pending = false; + this.reset(); } /** @@ -46,6 +44,17 @@ function Runnable(title, fn) { */ utils.inherits(Runnable, EventEmitter); +/** + * Resets the state initially or for a next run. + */ +Runnable.prototype.reset = function() { + this.timedOut = false; + this._currentRetry = 0; + this.pending = false; + delete this.state; + delete this.err; +}; + /** * Get current timeout value in msecs. * diff --git a/lib/runner.js b/lib/runner.js index aabffda96a..d87c41820d 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -121,18 +121,30 @@ module.exports = Runner; * @extends external:EventEmitter * @public * @class - * @param {Suite} suite Root suite - * @param {boolean} [delay] Whether to delay execution of root suite until ready. + * @param {Suite} suite - Root suite + * @param {Object|boolean} [opts] - Options. If `boolean`, whether or not to delay execution of root suite until ready (for backwards compatibility). + * @param {boolean} [opts.delay] - Whether to delay execution of root suite until ready. + * @param {boolean} [opts.cleanReferencesAfterRun] - Whether to clean references to test fns and hooks when a suite is done. */ -function Runner(suite, delay) { +function Runner(suite, opts) { + if (opts === undefined) { + opts = {}; + } + if (typeof opts === 'boolean') { + this._delay = opts; + opts = {}; + } else { + this._delay = opts.delay; + } var self = this; this._globals = []; this._abort = false; - this._delay = delay; this.suite = suite; this.started = false; + this._opts = opts; this.total = suite.total(); this.failures = 0; + this._eventListeners = []; this.on(constants.EVENT_TEST_END, function(test) { if (test.type === 'test' && test.retriedTest() && test.parent) { var idx = @@ -162,6 +174,53 @@ Runner.immediately = global.setImmediate || process.nextTick; */ inherits(Runner, EventEmitter); +/** + * Replacement for `target.on(eventName, listener)` that does bookkeeping to remove them when this runner instance is disposed. + * @param target {EventEmitter} + * @param eventName {string} + * @param fn {function} + */ +Runner.prototype._addEventListener = function(target, eventName, listener) { + target.on(eventName, listener); + this._eventListeners.push([target, eventName, listener]); +}; + +/** + * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping. + * @param target {EventEmitter} + * @param eventName {string} + * @param fn {function} + */ +Runner.prototype._removeEventListener = function(target, eventName, listener) { + var eventListenerIndex = this._eventListeners.findIndex(function( + eventListenerDescriptor + ) { + return ( + eventListenerDescriptor[0] === target && + eventListenerDescriptor[1] === eventName && + eventListenerDescriptor[2] === listener + ); + }); + if (eventListenerIndex !== -1) { + var removedListener = this._eventListeners.splice(eventListenerIndex, 1)[0]; + removedListener[0].removeListener(removedListener[1], removedListener[2]); + } +}; + +/** + * Removes all event handlers set during a run on this instance. + * Remark: this does _not_ clean/dispose the tests or suites themselves. + */ +Runner.prototype.dispose = function() { + this.removeAllListeners(); + this._eventListeners.forEach(function(eventListenerDescriptor) { + eventListenerDescriptor[0].removeListener( + eventListenerDescriptor[1], + eventListenerDescriptor[2] + ); + }); +}; + /** * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. @@ -378,7 +437,7 @@ Runner.prototype.hook = function(name, fn) { self.emit(constants.EVENT_HOOK_BEGIN, hook); if (!hook.listeners('error').length) { - hook.on('error', function(err) { + self._addEventListener(hook, 'error', function(err) { self.failHook(hook, err); }); } @@ -530,7 +589,7 @@ Runner.prototype.runTest = function(fn) { if (this.asyncOnly) { test.asyncOnly = true; } - test.on('error', function(err) { + this._addEventListener(test, 'error', function(err) { self.fail(test, err); }); if (this.allowUncaught) { @@ -920,21 +979,24 @@ Runner.prototype.run = function(fn) { } // references cleanup to avoid memory leaks - this.on(constants.EVENT_SUITE_END, function(suite) { - suite.cleanReferences(); - }); + if (this._opts.cleanReferencesAfterRun) { + this.on(constants.EVENT_SUITE_END, function(suite) { + suite.cleanReferences(); + }); + } // callback this.on(constants.EVENT_RUN_END, function() { - process.removeListener('uncaughtException', uncaught); - process.on('uncaughtException', self.uncaughtEnd); + debug(constants.EVENT_RUN_END); + self._removeEventListener(process, 'uncaughtException', uncaught); + self._addEventListener(process, 'uncaughtException', self.uncaughtEnd); debug('run(): emitted %s', constants.EVENT_RUN_END); fn(self.failures); }); // uncaught exception - process.removeListener('uncaughtException', self.uncaughtEnd); - process.on('uncaughtException', uncaught); + self._removeEventListener(process, 'uncaughtException', self.uncaughtEnd); + self._addEventListener(process, 'uncaughtException', uncaught); if (this._delay) { // for reporters, I guess. diff --git a/lib/suite.js b/lib/suite.js index 2a64e2db8f..dc42fd74fd 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -61,19 +61,19 @@ function Suite(title, parentContext, isRoot) { this.ctx = new Context(); this.suites = []; this.tests = []; + this.root = isRoot === true; this.pending = false; + this._retries = -1; this._beforeEach = []; this._beforeAll = []; this._afterEach = []; this._afterAll = []; - this.root = isRoot === true; this._timeout = 2000; this._slow = 75; this._bail = false; - this._retries = -1; this._onlyTests = []; this._onlySuites = []; - this.delayed = false; + this.reset(); this.on('newListener', function(event) { if (deprecatedEvents[event]) { @@ -91,6 +91,22 @@ function Suite(title, parentContext, isRoot) { */ inherits(Suite, EventEmitter); +/** + * Resets the state initially or for a next run. + */ +Suite.prototype.reset = function() { + this.delayed = false; + function doReset(thingToReset) { + thingToReset.reset(); + } + this.suites.forEach(doReset); + this.tests.forEach(doReset); + this._beforeEach.forEach(doReset); + this._afterEach.forEach(doReset); + this._beforeAll.forEach(doReset); + this._afterAll.forEach(doReset); +}; + /** * Return a clone of this `Suite`. * @@ -493,6 +509,16 @@ Suite.prototype.getHooks = function getHooks(name) { return this['_' + name]; }; +/** + * cleans all references from this suite and all child suites. + */ +Suite.prototype.dispose = function() { + this.suites.forEach(function(suite) { + suite.dispose(); + }); + this.cleanReferences(); +}; + /** * Cleans up the references to all the deferred functions * (before/after/beforeEach/afterEach) and tests of a Suite. diff --git a/lib/test.js b/lib/test.js index 29c74b4563..187fe49767 100644 --- a/lib/test.js +++ b/lib/test.js @@ -26,9 +26,9 @@ function Test(title, fn) { 'string' ); } - Runnable.call(this, title, fn); - this.pending = !fn; this.type = 'test'; + Runnable.call(this, title, fn); + this.reset(); } /** @@ -36,6 +36,15 @@ function Test(title, fn) { */ utils.inherits(Test, Runnable); +/** + * Resets the state initially or for a next run. + */ +Test.prototype.reset = function() { + Runnable.prototype.reset.call(this); + this.pending = !this.fn; + delete this.state; +}; + /** * Set or get retried test * diff --git a/test/integration/fixtures/multiple-runs/clean-references.fixture.js b/test/integration/fixtures/multiple-runs/clean-references.fixture.js new file mode 100644 index 0000000000..2f204a0b74 --- /dev/null +++ b/test/integration/fixtures/multiple-runs/clean-references.fixture.js @@ -0,0 +1,6 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({ reporter: 'json' }); +mocha.cleanReferencesAfterRun(true); +require('./run-thrice-helper')(mocha); diff --git a/test/integration/fixtures/multiple-runs/dispose.fixture.js b/test/integration/fixtures/multiple-runs/dispose.fixture.js new file mode 100644 index 0000000000..c0d3c4d7ba --- /dev/null +++ b/test/integration/fixtures/multiple-runs/dispose.fixture.js @@ -0,0 +1,6 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({ reporter: 'json' }); +mocha.dispose(); +require('./run-thrice-helper')(mocha); diff --git a/test/integration/fixtures/multiple-runs/multiple-runs-with-different-output-suite.fixture.js b/test/integration/fixtures/multiple-runs/multiple-runs-with-different-output-suite.fixture.js new file mode 100644 index 0000000000..903f661bf9 --- /dev/null +++ b/test/integration/fixtures/multiple-runs/multiple-runs-with-different-output-suite.fixture.js @@ -0,0 +1,19 @@ +describe('Multiple runs', () => { + + /** + * Shared state! Bad practice, but nice for this test + */ + let i = 0; + + it('should skip, fail and pass respectively', function () { + switch (i++) { + case 0: + this.skip(); + case 1: + throw new Error('Expected error'); + default: + // this is fine ☕ + break; + } + }); +}); diff --git a/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each-suite.fixture.js b/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each-suite.fixture.js new file mode 100644 index 0000000000..7863fb223e --- /dev/null +++ b/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each-suite.fixture.js @@ -0,0 +1,18 @@ +describe('Multiple runs', () => { + + /** + * Shared state! Bad practice, but nice for this test + */ + let i = 0; + + beforeEach(function () { + if (i++ === 0) { + throw new Error('Expected error for this test'); + } + }); + + + it('should be a dummy test', function () { + // this is fine ☕ + }); +}); diff --git a/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture.js b/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture.js new file mode 100644 index 0000000000..1a4707705f --- /dev/null +++ b/test/integration/fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture.js @@ -0,0 +1,13 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({ reporter: 'json' }); +mocha.cleanReferencesAfterRun(false); +mocha.addFile(require.resolve('./multiple-runs-with-flaky-before-each-suite.fixture.js')); +console.log('['); +mocha.run(() => { + console.log(','); + mocha.run(() => { + console.log(']'); + }); +}); diff --git a/test/integration/fixtures/multiple-runs/run-thrice-helper.js b/test/integration/fixtures/multiple-runs/run-thrice-helper.js new file mode 100644 index 0000000000..58f2c9de5e --- /dev/null +++ b/test/integration/fixtures/multiple-runs/run-thrice-helper.js @@ -0,0 +1,24 @@ +module.exports = function (mocha) { + mocha.addFile(require.resolve('./multiple-runs-with-different-output-suite.fixture.js')); + console.log('['); + try { + mocha.run(() => { + console.log(','); + try { + mocha.run(() => { + console.log(','); + mocha.run(() => { + console.log(']'); + }); + }); + } catch (err) { + console.error(err.code); + throw err; + } + }); + } catch (err) { + console.error(err.code); + throw err; + } + +} diff --git a/test/integration/fixtures/multiple-runs/run-thrice.fixture.js b/test/integration/fixtures/multiple-runs/run-thrice.fixture.js new file mode 100644 index 0000000000..3c63ec3725 --- /dev/null +++ b/test/integration/fixtures/multiple-runs/run-thrice.fixture.js @@ -0,0 +1,6 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({ reporter: 'json' }); +mocha.cleanReferencesAfterRun(false); +require('./run-thrice-helper')(mocha); diff --git a/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running-suite.fixture.js b/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running-suite.fixture.js new file mode 100644 index 0000000000..a8ecaf76e5 --- /dev/null +++ b/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running-suite.fixture.js @@ -0,0 +1,5 @@ +describe('slow suite', () => { + it('should be slow', (done) => { + setTimeout(200, done); + }); +}); diff --git a/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture.js b/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture.js new file mode 100644 index 0000000000..1b031334b1 --- /dev/null +++ b/test/integration/fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture.js @@ -0,0 +1,12 @@ +'use strict'; +const Mocha = require('../../../../lib/mocha'); + +const mocha = new Mocha({ reporter: 'json' }); +mocha.addFile(require.resolve('./start-second-run-if-previous-is-still-running-suite.fixture.js')); +mocha.run(); +try { + mocha.run(); +} catch (err) { + console.error(err.code); +} + diff --git a/test/integration/multiple-runs.spec.js b/test/integration/multiple-runs.spec.js new file mode 100644 index 0000000000..61d672d4b2 --- /dev/null +++ b/test/integration/multiple-runs.spec.js @@ -0,0 +1,89 @@ +'use strict'; + +var invokeNode = require('./helpers').invokeNode; + +describe('multiple runs', function(done) { + it('should be allowed to run multiple times if cleanReferences is turned off', function(done) { + var path = require.resolve( + './fixtures/multiple-runs/run-thrice.fixture.js' + ); + invokeNode([path], function(err, res) { + expect(err, 'to be null'); + expect(res.code, 'to be', 0); + var results = JSON.parse(res.output); + expect(results, 'to have length', 3); + expect(results[0].pending, 'to have length', 1); + expect(results[0].failures, 'to have length', 0); + expect(results[0].passes, 'to have length', 0); + expect(results[1].pending, 'to have length', 0); + expect(results[1].failures, 'to have length', 1); + expect(results[1].passes, 'to have length', 0); + expect(results[2].pending, 'to have length', 0); + expect(results[2].failures, 'to have length', 0); + expect(results[2].passes, 'to have length', 1); + done(); + }); + }); + + it('should not be allowed if cleanReferences is true', function(done) { + var path = require.resolve( + './fixtures/multiple-runs/clean-references.fixture.js' + ); + invokeNode( + [path], + function(err, res) { + expect(err, 'to be null'); + expect(res.code, 'not to be', 0); + expect(res.output, 'to contain', 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED'); + done(); + }, + {stdio: ['ignore', 'pipe', 'pipe']} + ); + }); + + it('should not be allowed if the instance is disposed', function(done) { + var path = require.resolve('./fixtures/multiple-runs/dispose.fixture.js'); + invokeNode( + [path, '--directly-dispose'], + function(err, res) { + expect(err, 'to be null'); + expect(res.code, 'not to be', 0); + expect(res.output, 'to contain', 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED'); + done(); + }, + {stdio: ['ignore', 'pipe', 'pipe']} + ); + }); + + it('should not be allowed to run while a previous run is in progress', function(done) { + var path = require.resolve( + './fixtures/multiple-runs/start-second-run-if-previous-is-still-running.fixture' + ); + invokeNode( + [path], + function(err, res) { + expect(err, 'to be null'); + expect(res.output, 'to contain', 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING'); + done(); + }, + {stdio: ['ignore', 'pipe', 'pipe']} + ); + }); + + it('should reset the hooks between runs', function(done) { + var path = require.resolve( + './fixtures/multiple-runs/multiple-runs-with-flaky-before-each.fixture' + ); + invokeNode([path], function(err, res) { + expect(err, 'to be null'); + expect(res.code, 'to be', 0); + var results = JSON.parse(res.output); + expect(results, 'to have length', 2); + expect(results[0].failures, 'to have length', 1); + expect(results[0].passes, 'to have length', 0); + expect(results[1].passes, 'to have length', 1); + expect(results[1].failures, 'to have length', 0); + done(); + }); + }); +}); diff --git a/test/unit/hook.spec.js b/test/unit/hook.spec.js new file mode 100644 index 0000000000..b02a6c5120 --- /dev/null +++ b/test/unit/hook.spec.js @@ -0,0 +1,44 @@ +'use strict'; +var sinon = require('sinon'); +var Mocha = require('../../lib/mocha'); +var Hook = Mocha.Hook; +var Runnable = Mocha.Runnable; + +describe(Hook.name, function() { + var hook; + + beforeEach(function() { + hook = new Hook('Some hook', function() {}); + }); + + afterEach(function() { + sinon.restore(); + }); + + describe('error', function() { + it('should set the hook._error', function() { + var expectedError = new Error('Expected error'); + hook.error(expectedError); + expect(hook._error, 'to be', expectedError); + }); + it('should get the hook._error when called without arguments', function() { + var expectedError = new Error('Expected error'); + hook._error = expectedError; + expect(hook.error(), 'to be', expectedError); + }); + }); + + describe('reset', function() { + it('should call Runnable.reset', function() { + var runnableResetStub = sinon.stub(Runnable.prototype, 'reset'); + hook.reset(); + expect(runnableResetStub, 'was called once'); + }); + + it('should reset the error state', function() { + hook.error(new Error('Expected error for test')); + hook.reset(); + expect(hook.error(), 'to be undefined'); + }); + }); +}); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 8839a2d0ed..c676d5f96b 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -22,6 +22,10 @@ describe('Mocha', function() { sandbox.stub(Mocha.prototype, 'global').returnsThis(); }); + it('should set _cleanReferencesAfterRun to true', function() { + expect(new Mocha()._cleanReferencesAfterRun, 'to be', true); + }); + describe('when "options.timeout" is `undefined`', function() { it('should not attempt to set timeout', function() { // eslint-disable-next-line no-new @@ -127,6 +131,25 @@ describe('Mocha', function() { }); }); + describe('#cleanReferencesAfterRun()', function() { + it('should set the _cleanReferencesAfterRun attribute', function() { + var mocha = new Mocha(opts); + mocha.cleanReferencesAfterRun(); + expect(mocha._cleanReferencesAfterRun, 'to be', true); + }); + + it('should set the _cleanReferencesAfterRun attribute to false', function() { + var mocha = new Mocha(opts); + mocha.cleanReferencesAfterRun(false); + expect(mocha._cleanReferencesAfterRun, 'to be', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.cleanReferencesAfterRun(), 'to be', mocha); + }); + }); + describe('#color()', function() { it('should set the color option to true', function() { var mocha = new Mocha(opts); @@ -178,6 +201,32 @@ describe('Mocha', function() { }); }); + describe('#dispose()', function() { + it('should dispose the root suite', function() { + var mocha = new Mocha(opts); + var disposeStub = sandbox.stub(mocha.suite, 'dispose'); + mocha.dispose(); + expect(disposeStub, 'was called once'); + }); + + it('should dispose previous test runner', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + var disposeStub = sandbox.stub(Mocha.Runner.prototype, 'dispose'); + mocha.run(); + runStub.callArg(0); + mocha.dispose(); + expect(disposeStub, 'was called once'); + }); + + it('should unload the files', function() { + var mocha = new Mocha(opts); + var unloadFilesStub = sandbox.stub(mocha, 'unloadFiles'); + mocha.dispose(); + expect(unloadFilesStub, 'was called once'); + }); + }); + describe('#forbidOnly()', function() { it('should set the forbidOnly option to true', function() { var mocha = new Mocha(opts); @@ -434,6 +483,99 @@ describe('Mocha', function() { mocha.run().on('end', done); }); + it('should throw if a run is in progress', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + mocha.run(); + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is currently running tests, cannot start a next test run until this one is done', + code: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', + instance: mocha + } + ); + expect(runStub, 'was called once'); + }); + + it('should throw the instance is already disposed', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + mocha.dispose(); + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + cleanReferencesAfterRun: true, + instance: mocha + } + ); + expect(runStub, 'was called times', 0); + }); + + it('should throw if a run for a second time', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + mocha.run(); + runStub.callArg(0); + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + instance: mocha + } + ); + expect(runStub, 'was called once'); + }); + + it('should allow multiple runs if `cleanReferencesAfterRun` is disabled', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + mocha.cleanReferencesAfterRun(false); + mocha.run(); + runStub.callArg(0); + mocha.run(); + runStub.callArg(0); + expect(runStub, 'called times', 2); + }); + + it('should reset between runs', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + var resetStub = sandbox.stub(Mocha.Suite.prototype, 'reset'); + mocha.cleanReferencesAfterRun(false); + mocha.run(); + runStub.callArg(0); + mocha.run(); + expect(resetStub, 'was called once'); + }); + + it('should dispose the previous runner when the next run starts', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + var disposeStub = sandbox.stub(Mocha.Runner.prototype, 'dispose'); + mocha.cleanReferencesAfterRun(false); + mocha.run(); + runStub.callArg(0); + expect(disposeStub, 'was not called'); + mocha.run(); + expect(disposeStub, 'was called once'); + }); + describe('#reporter("xunit")#run(fn)', function() { // :TBD: Why does specifying reporter differentiate this test from preceding one it('should not raise errors if callback was not provided', function() { @@ -449,4 +591,29 @@ describe('Mocha', function() { }); }); }); + + describe('#unloadFiles()', function() { + it('should reset referencesCleaned and allow for next run', function() { + var mocha = new Mocha(opts); + var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); + mocha.run(); + runStub.callArg(0); + mocha.unloadFiles(); + expect(function() { + mocha.run(); + }, 'not to throw'); + }); + + it('should not be allowed when the current instance is already disposed', function() { + var mocha = new Mocha(opts); + mocha.dispose(); + expect( + function() { + mocha.unloadFiles(); + }, + 'to throw', + 'Mocha instance is already disposed, it cannot be used again.' + ); + }); + }); }); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index fa328441ca..bdd2dc145e 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -127,6 +127,29 @@ describe('Runnable(title, fn)', function() { }); }); + describe('#reset', function() { + var run; + + beforeEach(function() { + run = new Runnable(); + }); + + it('should reset current run state', function() { + run.timedOut = true; + run._currentRetry = 5; + run.pending = true; + run.err = new Error(); + run.state = 'error'; + + run.reset(); + expect(run.timedOut, 'to be false'); + expect(run._currentRetry, 'to be', 0); + expect(run.pending, 'to be false'); + expect(run.err, 'to be undefined'); + expect(run.state, 'to be undefined'); + }); + }); + describe('.title', function() { it('should be present', function() { expect(new Runnable('foo').title, 'to be', 'foo'); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index c48e2d0e8e..d36d0f2f1f 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -15,6 +15,7 @@ var EVENT_TEST_FAIL = Runner.constants.EVENT_TEST_FAIL; var EVENT_TEST_RETRY = Runner.constants.EVENT_TEST_RETRY; var EVENT_TEST_END = Runner.constants.EVENT_TEST_END; var EVENT_RUN_END = Runner.constants.EVENT_RUN_END; +var EVENT_SUITE_END = Runner.constants.EVENT_SUITE_END; var STATE_FAILED = Runnable.constants.STATE_FAILED; describe('Runner', function() { @@ -24,7 +25,7 @@ describe('Runner', function() { beforeEach(function() { suite = new Suite('Suite', 'root'); - runner = new Runner(suite); + runner = new Runner(suite, {cleanReferencesAfterRun: true}); runner.checkLeaks = true; sandbox = sinon.createSandbox(); }); @@ -456,13 +457,69 @@ describe('Runner', function() { done(); }); }); - // karma-mocha is inexplicably doing this with a Hook it('should not throw an exception if something emits EVENT_TEST_END with a non-Test object', function() { expect(function() { runner.emit(EVENT_TEST_END, {}); }, 'not to throw'); }); + + it('should clean references after a run', function() { + runner = new Runner(suite, {delay: false, cleanReferencesAfterRun: true}); + var cleanReferencesStub = sandbox.stub(suite, 'cleanReferences'); + runner.run(); + runner.emit(EVENT_SUITE_END, suite); + expect(cleanReferencesStub, 'was called once'); + }); + + it('should not clean references after a run when `cleanReferencesAfterRun` is `false`', function() { + runner = new Runner(suite, { + delay: false, + cleanReferencesAfterRun: false + }); + var cleanReferencesStub = sandbox.stub(suite, 'cleanReferences'); + runner.run(); + runner.emit(EVENT_SUITE_END, suite); + expect(cleanReferencesStub, 'was not called'); + }); + }); + + describe('.dispose', function() { + it('should remove all listeners from itself', function() { + runner.on('disposeShouldRemoveThis', noop); + runner.dispose(); + expect(runner.listenerCount('disposeShouldRemoveThis'), 'to be', 0); + }); + + it('should remove "error" listeners from a test', function() { + var fn = sandbox.stub(); + runner.test = new Test('test for dispose', fn); + runner.runTest(noop); + // sanity check + expect(runner.test.listenerCount('error'), 'to be', 1); + runner.dispose(); + expect(runner.test.listenerCount('error'), 'to be', 0); + }); + + it('should remove "uncaughtException" listeners from the process', function() { + var normalUncaughtExceptionListenerCount = process.listenerCount( + 'uncaughtException' + ); + sandbox.stub(); + runner.run(noop); + // sanity check + expect( + process.listenerCount('uncaughtException'), + 'to be', + normalUncaughtExceptionListenerCount + 1 + ); + runner.dispose(); + expect( + process.listenerCount('uncaughtException'), + 'to be', + normalUncaughtExceptionListenerCount + ); + }); }); describe('.runTest(fn)', function() { diff --git a/test/unit/suite.spec.js b/test/unit/suite.spec.js index 1be948e1c6..a5063b7f91 100644 --- a/test/unit/suite.spec.js +++ b/test/unit/suite.spec.js @@ -80,6 +80,48 @@ describe('Suite', function() { }); }); + describe('.reset()', function() { + beforeEach(function() { + this.suite = new Suite('Suite to be reset', function() {}); + }); + + it('should reset the `delayed` state', function() { + this.suite.delayed = true; + this.suite.reset(); + expect(this.suite.delayed, 'to be', false); + }); + + it('should forward reset to suites and tests', function() { + var childSuite = new Suite('child suite', this.suite.context); + var test = new Test('test', function() {}); + this.suite.addSuite(childSuite); + this.suite.addTest(test); + var testResetStub = sandbox.stub(test, 'reset'); + var suiteResetStub = sandbox.stub(childSuite, 'reset'); + this.suite.reset(); + expect(testResetStub, 'was called once'); + expect(suiteResetStub, 'was called once'); + }); + + it('should forward reset to all hooks', function() { + this.suite.beforeEach(function() {}); + this.suite.afterEach(function() {}); + this.suite.beforeAll(function() {}); + this.suite.afterAll(function() {}); + sinon.stub(this.suite.getHooks('beforeEach')[0], 'reset'); + sinon.stub(this.suite.getHooks('afterEach')[0], 'reset'); + sinon.stub(this.suite.getHooks('beforeAll')[0], 'reset'); + sinon.stub(this.suite.getHooks('afterAll')[0], 'reset'); + + this.suite.reset(); + + expect(this.suite.getHooks('beforeEach')[0].reset, 'was called once'); + expect(this.suite.getHooks('afterEach')[0].reset, 'was called once'); + expect(this.suite.getHooks('beforeAll')[0].reset, 'was called once'); + expect(this.suite.getHooks('afterAll')[0].reset, 'was called once'); + }); + }); + describe('.timeout()', function() { beforeEach(function() { this.suite = new Suite('A Suite'); diff --git a/test/unit/test.spec.js b/test/unit/test.spec.js index 4ccd891bac..62a6d0667c 100644 --- a/test/unit/test.spec.js +++ b/test/unit/test.spec.js @@ -1,10 +1,24 @@ 'use strict'; +var sinon = require('sinon'); var mocha = require('../../lib/mocha'); var Test = mocha.Test; -var sinon = require('sinon'); +var Runnable = mocha.Runnable; describe('Test', function() { + /** + * @type {sinon.SinonSandbox} + */ + var sandbox; + + beforeEach(function() { + sandbox = sinon.createSandbox(); + }); + + afterEach(function() { + sandbox.restore(); + }); + describe('.clone()', function() { beforeEach(function() { this._test = new Test('To be cloned', function() {}); @@ -56,6 +70,24 @@ describe('Test', function() { }); }); + describe('.reset()', function() { + beforeEach(function() { + this._test = new Test('Test to be reset', function() {}); + }); + + it('should reset the run state', function() { + this._test.pending = true; + this._test.reset(); + expect(this._test.pending, 'to be', false); + }); + + it('should call Runnable.reset', function() { + var runnableResetStub = sandbox.stub(Runnable.prototype, 'reset'); + this._test.reset(); + expect(runnableResetStub, 'was called once'); + }); + }); + describe('.isPending()', function() { beforeEach(function() { this._test = new Test('Is it skipped', function() {}); From 184036f00878c041252601d5959bf86b2d8d80b6 Mon Sep 17 00:00:00 2001 From: Arvid Ottenberg Date: Tue, 12 May 2020 20:03:47 +0200 Subject: [PATCH 1484/1771] --forbid-only doesn't recognize `it.only` when `before` crashes (#4256); closes #3840 * add fixtures that result in it.only combined with --forbid-only bug * adapt forbidonly test cases to cover it.only bug * check if forbid only option is set prior to marking a test only and throw error * change name of only test back to previous * use custom assertion for expecting error in forbidOnly tests * remove empty line * use createUnsupportedError instead of throw new Error * use createUnsupportedError instead of throw new Error * remove check if suite hasOnly and forbidOnly option is set as this is done before runtime * implement markOnly instance method in suite class * add unit test for suites markOnly method * throw exception if --forbid-only option is set even if suite is not selected by grep * adapt forbidOnly integration tests to check for failure if only suite is not selected by grep * fix jsdocs of suite markonly * Revert "fix jsdocs of suite markonly" This reverts commit cffc71a5c55114805a05a08c131439b993cf7d1c. * Revert "adapt forbidOnly integration tests to check for failure if only suite is not selected by grep" This reverts commit 336425ad89d9fbc7b728040ae02c9ec013cf727e. * Revert "throw exception if --forbid-only option is set even if suite is not selected by grep" This reverts commit f87178241fc74a54739497a5f1faedbf1cab5e76. * Revert "add unit test for suites markOnly method" This reverts commit c2c8dc8b2fc2fdaf73c2edaf5afee78edbf15576. * Revert "implement markOnly instance method in suite class" This reverts commit 4b37e3c1f6ecee6a90ef8c12dc8e3e7baabe98b1. --- lib/interfaces/common.js | 7 +- lib/runner.js | 5 -- .../forbid-only/only-before-each.fixture.js | 8 +++ .../forbid-only/only-before.fixture.js | 8 +++ test/integration/options/forbidOnly.spec.js | 70 +++++++++++++------ 5 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 test/integration/fixtures/options/forbid-only/only-before-each.fixture.js create mode 100644 test/integration/fixtures/options/forbid-only/only-before.fixture.js diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 7991e113f7..e7e84b2511 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -3,6 +3,7 @@ var Suite = require('../suite'); var errors = require('../errors'); var createMissingArgumentError = errors.createMissingArgumentError; +var createUnsupportedError = errors.createUnsupportedError; /** * Functions common to more than one interface. @@ -126,14 +127,14 @@ module.exports = function(suites, context, mocha) { suites.unshift(suite); if (opts.isOnly) { if (mocha.options.forbidOnly && shouldBeTested(suite)) { - throw new Error('`.only` forbidden'); + throw createUnsupportedError('`.only` forbidden'); } suite.parent.appendOnlySuite(suite); } if (suite.pending) { if (mocha.options.forbidPending && shouldBeTested(suite)) { - throw new Error('Pending test forbidden'); + throw createUnsupportedError('Pending test forbidden'); } } if (typeof opts.fn === 'function') { @@ -165,6 +166,8 @@ module.exports = function(suites, context, mocha) { * @returns {*} */ only: function(mocha, test) { + if (mocha.options.forbidOnly) + throw createUnsupportedError('`.only` forbidden'); test.markOnly(); return test; }, diff --git a/lib/runner.js b/lib/runner.js index d87c41820d..2f38fa8e96 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -581,11 +581,6 @@ Runner.prototype.runTest = function(fn) { return; } - var suite = this.parents().reverse()[0] || this.suite; - if (this.forbidOnly && suite.hasOnly()) { - fn(new Error('`.only` forbidden')); - return; - } if (this.asyncOnly) { test.asyncOnly = true; } diff --git a/test/integration/fixtures/options/forbid-only/only-before-each.fixture.js b/test/integration/fixtures/options/forbid-only/only-before-each.fixture.js new file mode 100644 index 0000000000..19bfb86409 --- /dev/null +++ b/test/integration/fixtures/options/forbid-only/only-before-each.fixture.js @@ -0,0 +1,8 @@ +'use strict'; + +describe('test marked with only and beforeEach has skip', function() { + beforeEach(function() { + this.skip(); + }); + it.only('only test', function() {}); +}); diff --git a/test/integration/fixtures/options/forbid-only/only-before.fixture.js b/test/integration/fixtures/options/forbid-only/only-before.fixture.js new file mode 100644 index 0000000000..3924ac4082 --- /dev/null +++ b/test/integration/fixtures/options/forbid-only/only-before.fixture.js @@ -0,0 +1,8 @@ +'use strict'; + +describe('test marked with only and before has skip', function() { + before(function() { + this.skip(); + }); + it.only('only test', function() {}); +}); diff --git a/test/integration/options/forbidOnly.spec.js b/test/integration/options/forbidOnly.spec.js index 592f0f25df..1886becb7d 100644 --- a/test/integration/options/forbidOnly.spec.js +++ b/test/integration/options/forbidOnly.spec.js @@ -26,13 +26,19 @@ describe('--forbid-only', function() { it('should fail if there are tests marked only', function(done) { var fixture = path.join('options', 'forbid-only', 'only'); - runMochaJSON(fixture, args, function(err, res) { - if (err) { - return done(err); - } - expect(res, 'to have failed with error', onlyErrorMessage); - done(); - }); + var spawnOpts = {stdio: 'pipe'}; + runMocha( + fixture, + args, + function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); + done(); + }, + spawnOpts + ); }); it('should fail if there are tests in suites marked only', function(done) { @@ -45,11 +51,7 @@ describe('--forbid-only', function() { if (err) { return done(err); } - - expect(res, 'to satisfy', { - code: 1, - output: new RegExp(onlyErrorMessage) - }); + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); done(); }, spawnOpts @@ -66,10 +68,7 @@ describe('--forbid-only', function() { if (err) { return done(err); } - expect(res, 'to satisfy', { - code: 1, - output: new RegExp(onlyErrorMessage) - }); + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); done(); }, spawnOpts @@ -86,10 +85,7 @@ describe('--forbid-only', function() { if (err) { return done(err); } - expect(res, 'to satisfy', { - code: 1, - output: new RegExp(onlyErrorMessage) - }); + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); done(); }, spawnOpts @@ -124,4 +120,38 @@ describe('--forbid-only', function() { } ); }); + + it('should fail even if before has "skip"', function(done) { + var fixture = path.join('options', 'forbid-only', 'only-before'); + var spawnOpts = {stdio: 'pipe'}; + runMocha( + fixture, + args, + function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); + done(); + }, + spawnOpts + ); + }); + + it('should fail even if beforeEach has "skip"', function(done) { + var fixture = path.join('options', 'forbid-only', 'only-before-each'); + var spawnOpts = {stdio: 'pipe'}; + runMocha( + fixture, + args, + function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); + done(); + }, + spawnOpts + ); + }); }); From 81e203c8906a858e7648be0914cb8e8dbc35622f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 14 May 2020 11:26:04 -0700 Subject: [PATCH 1485/1771] fix test/unit/hook.spec.js (#4288) * fix test/unit/hook.spec.js `Function.prototype.name` is not available in IE11, and will cause the browser tests to fail. * another IE11 fix: avoid Array.prototype.findIndex Signed-off-by: Christopher Hiller --- lib/runner.js | 15 +++++++++------ test/unit/hook.spec.js | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 2f38fa8e96..7eabb5a1cf 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -192,15 +192,18 @@ Runner.prototype._addEventListener = function(target, eventName, listener) { * @param fn {function} */ Runner.prototype._removeEventListener = function(target, eventName, listener) { - var eventListenerIndex = this._eventListeners.findIndex(function( - eventListenerDescriptor - ) { - return ( + var eventListenerIndex = -1; + for (var i = 0; i < this._eventListeners.length; i++) { + var eventListenerDescriptor = this._eventListeners[i]; + if ( eventListenerDescriptor[0] === target && eventListenerDescriptor[1] === eventName && eventListenerDescriptor[2] === listener - ); - }); + ) { + eventListenerIndex = i; + break; + } + } if (eventListenerIndex !== -1) { var removedListener = this._eventListeners.splice(eventListenerIndex, 1)[0]; removedListener[0].removeListener(removedListener[1], removedListener[2]); diff --git a/test/unit/hook.spec.js b/test/unit/hook.spec.js index b02a6c5120..5fb51733e1 100644 --- a/test/unit/hook.spec.js +++ b/test/unit/hook.spec.js @@ -4,7 +4,7 @@ var Mocha = require('../../lib/mocha'); var Hook = Mocha.Hook; var Runnable = Mocha.Runnable; -describe(Hook.name, function() { +describe('Hook', function() { var hook; beforeEach(function() { From 1a4646dd2f7b35010c2488edcb2d5f4cfb2f14a8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 14 May 2020 14:49:44 -0700 Subject: [PATCH 1486/1771] fix improper warnings for invalid reporters (#4275) * fix improper warnings for invalid reporters also: reorganize, add, and refactor a bunch of problematic unit tests for `lib/mocha.js`. better isolation except where we can't really do that (calling `require`) there's still missing tests in here, but this is an improvement. * restrict use of Object.assign in ESLint config * add wrapper around process.cwd() - better isolation - a use of `process.cwd()` in `lib/runner.js` was left in place to avoid conflicts, because another PR will remove it --- .eslintrc.yml | 11 +- lib/cli/cli.js | 3 +- lib/cli/config.js | 3 +- lib/mocha.js | 18 +- lib/utils.js | 12 +- package-lock.json | 110 +- package.json | 2 +- .../fixtures/wonky-reporter.fixture.js | 1 + test/node-unit/mocha.spec.js | 157 ++- test/node-unit/utils.spec.js | 20 + test/unit/mocha.spec.js | 1117 ++++++++++------- 11 files changed, 900 insertions(+), 554 deletions(-) create mode 100644 test/node-unit/fixtures/wonky-reporter.fixture.js create mode 100644 test/node-unit/utils.spec.js diff --git a/.eslintrc.yml b/.eslintrc.yml index 34c77cabe4..43d8bcfd9e 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -14,6 +14,11 @@ rules: strict: - error - safe + # disallow Object.assign + no-restricted-properties: + - error + - object: 'Object' + property: 'assign' overrides: - files: - scripts/**/*.js @@ -31,6 +36,11 @@ overrides: ecmaVersion: 2018 env: browser: false + rules: + no-restricted-properties: + - off + - object: 'Object' + property: 'assign' - files: - esm-utils.js parserOptions: @@ -79,7 +89,6 @@ overrides: # disallow property access of `global..*` - selector: '*[object.object.name=global][object.property.name=/(Date|(set|clear)(Timeout|Immediate|Interval))/]:expression' message: *GH-237 - - files: - test/**/*.mjs parserOptions: diff --git a/lib/cli/cli.js b/lib/cli/cli.js index af0e7841d6..59fd2f4af4 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -19,6 +19,7 @@ const {loadOptions, YARGS_PARSER_CONFIG} = require('./options'); const commands = require('./commands'); const ansi = require('ansi-colors'); const {repository, homepage, version, gitter} = require('../../package.json'); +const {cwd} = require('../utils'); /** * - Accepts an `Array` of arguments @@ -31,7 +32,7 @@ exports.main = (argv = process.argv.slice(2)) => { debug('entered main with raw args', argv); // ensure we can require() from current working directory if (typeof module.paths !== 'undefined') { - module.paths.push(process.cwd(), path.resolve('node_modules')); + module.paths.push(cwd(), path.resolve('node_modules')); } Error.stackTraceLimit = Infinity; // configurable via --stack-trace-limit? diff --git a/lib/cli/config.js b/lib/cli/config.js index 932d6c45f4..1fa1e0555e 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -11,6 +11,7 @@ const fs = require('fs'); const path = require('path'); const debug = require('debug')('mocha:cli:config'); const findUp = require('find-up'); +const utils = require('../utils'); /** * These are the valid config files, in order of precedence; @@ -92,7 +93,7 @@ exports.loadConfig = filepath => { * @param {string} [cwd] - Current working directory * @returns {string|null} Filepath to config, if found */ -exports.findConfig = (cwd = process.cwd()) => { +exports.findConfig = (cwd = utils.cwd()) => { const filepath = findUp.sync(exports.CONFIG_FILES, {cwd}); if (filepath) { debug('findConfig: found config file %s', filepath); diff --git a/lib/mocha.js b/lib/mocha.js index 5a8fb32202..6817ff880b 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -58,7 +58,7 @@ var mochaStates = utils.defineConstants({ */ if (!process.browser && typeof module.paths !== 'undefined') { - var cwd = process.cwd(); + var cwd = utils.cwd(); module.paths.push(cwd, path.join(cwd, 'node_modules')); } @@ -231,24 +231,24 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { _reporter = require(reporter); } catch (err) { if ( - err.code !== 'MODULE_NOT_FOUND' || - err.message.indexOf('Cannot find module') !== -1 + err.code === 'MODULE_NOT_FOUND' || + err.message.indexOf('Cannot find module') >= 0 ) { // Try to load reporters from a path (absolute or relative) try { - _reporter = require(path.resolve(process.cwd(), reporter)); + _reporter = require(path.resolve(utils.cwd(), reporter)); } catch (_err) { - _err.code !== 'MODULE_NOT_FOUND' || - _err.message.indexOf('Cannot find module') !== -1 - ? console.warn(sQuote(reporter) + ' reporter not found') - : console.warn( + _err.code === 'MODULE_NOT_FOUND' || + _err.message.indexOf('Cannot find module') >= 0 + ? utils.warn(sQuote(reporter) + ' reporter not found') + : utils.warn( sQuote(reporter) + ' reporter blew up with error:\n' + err.stack ); } } else { - console.warn( + utils.warn( sQuote(reporter) + ' reporter blew up with error:\n' + err.stack ); } diff --git a/lib/utils.js b/lib/utils.js index 6ab1277409..4e6b194249 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -637,7 +637,7 @@ exports.stackTraceFilter = function() { var slash = path.sep; var cwd; if (is.node) { - cwd = process.cwd() + slash; + cwd = exports.cwd() + slash; } else { cwd = (typeof location === 'undefined' ? window.location @@ -821,3 +821,13 @@ exports.supportsEsModules = function() { } } }; + +/** + * Returns current working directory + * + * Wrapper around `process.cwd()` for isolation + * @private + */ +exports.cwd = function cwd() { + return process.cwd(); +}; diff --git a/package-lock.json b/package-lock.json index a7c70cbcdf..21ae2b1c3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -978,7 +978,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1838,7 +1838,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1861,7 +1861,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -3106,7 +3106,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -3149,7 +3149,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -3427,7 +3427,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -3630,7 +3630,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3725,7 +3725,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -4321,7 +4321,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -4334,7 +4334,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -4349,7 +4349,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", + "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", "dev": true }, "cross-env": { @@ -4422,7 +4422,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -5059,7 +5059,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -5269,7 +5269,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -5573,7 +5573,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -6186,7 +6186,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -6214,7 +6214,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -7223,7 +7223,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -7232,7 +7232,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, @@ -7633,7 +7633,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -7662,7 +7662,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -8591,7 +8591,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9360,7 +9360,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -10392,7 +10392,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, @@ -10601,7 +10601,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -10812,7 +10812,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -10828,7 +10828,7 @@ "dependencies": { "lru-cache": { "version": "2.5.0", - "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", "dev": true } @@ -10853,7 +10853,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10995,7 +10995,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11283,7 +11283,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -12235,7 +12235,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -12256,7 +12256,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -12626,7 +12626,7 @@ }, "pause-stream": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { @@ -12712,7 +12712,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -12760,7 +12760,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -13559,7 +13559,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -14631,9 +14631,9 @@ "dev": true }, "rewiremock": { - "version": "3.13.9", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.9.tgz", - "integrity": "sha512-FDk5uCyvfwgYZtZ9MKdpg6QiSSdjB/a/vU5luKjoJddaqcZz5+u4dXhc3Qf4vNMvDXvnOyodNd1riE5yeqoxaA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.1.tgz", + "integrity": "sha512-fxjaEv7Iq/mXURg0WLhcss/9jr5VJ8pPduTnYxwjwVaPNSaUZxVowxU9WwLdrQllxWLecb72WnGkurFL1m8Cxw==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -14642,7 +14642,7 @@ "lodash.template": "^4.4.0", "node-libs-browser": "^2.1.0", "path-parse": "^1.0.5", - "wipe-node-cache": "^2.1.0", + "wipe-node-cache": "^2.1.2", "wipe-webpack-cache": "^2.1.0" } }, @@ -14730,7 +14730,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14800,7 +14800,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "saxes": { @@ -14853,7 +14853,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -15163,7 +15163,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -15246,7 +15246,7 @@ }, "shasum": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { @@ -15851,7 +15851,7 @@ }, "split": { "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { @@ -15950,7 +15950,7 @@ }, "starts-with": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/starts-with/-/starts-with-1.0.2.tgz", "integrity": "sha1-Fnk6cp2J1M89T7LtovkIrjV/GW8=", "dev": true }, @@ -16005,7 +16005,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { @@ -16598,7 +16598,7 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, @@ -16758,7 +16758,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -16839,7 +16839,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18465,7 +18465,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "whatwg-encoding": { @@ -18537,9 +18537,9 @@ "dev": true }, "wipe-node-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.1.tgz", - "integrity": "sha512-b2LdVay9YDim1Y5CTGYXZFxi8MuB5H1QHFApQu9+SERwqYuS8dwh8M4hhXEBut/z8pi1BCfAtEQM8280iT/oJg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.2.tgz", + "integrity": "sha512-m7NXa8qSxBGMtdQilOu53ctMaIBXy93FOP04EC1Uf4bpsE+r+adfLKwIMIvGbABsznaSNxK/ErD4xXDyY5og9w==", "dev": true }, "wipe-webpack-cache": { diff --git a/package.json b/package.json index 777d26bd28..73b65cfb12 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "remark": "^11.0.2", "remark-github": "^8.0.0", "remark-inline-links": "^3.1.3", - "rewiremock": "^3.13.9", + "rewiremock": "^3.14.1", "rimraf": "^3.0.2", "sinon": "^9.0.1", "strip-ansi": "^6.0.0", diff --git a/test/node-unit/fixtures/wonky-reporter.fixture.js b/test/node-unit/fixtures/wonky-reporter.fixture.js new file mode 100644 index 0000000000..7ef80c00ac --- /dev/null +++ b/test/node-unit/fixtures/wonky-reporter.fixture.js @@ -0,0 +1 @@ +throw new Error('bad weirdness in this one'); diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index 456232da75..2b9c99a59a 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -1,31 +1,63 @@ 'use strict'; -const Mocha = require('../../lib/mocha'); -const utils = require('../../lib/utils'); +const path = require('path'); +const rewiremock = require('rewiremock/node'); const {createSandbox} = require('sinon'); +const {EventEmitter} = require('events'); -describe('Mocha', function() { - const opts = {reporter: utils.noop}; // no output - const dumbFilepath = require.resolve('./fixtures/dumb-module.fixture.js'); - const dumberFilepath = require.resolve('./fixtures/dumber-module.fixture.js'); +const MODULE_PATH = require.resolve('../../lib/mocha.js'); +const DUMB_FIXTURE_PATH = require.resolve('./fixtures/dumb-module.fixture.js'); +const DUMBER_FIXTURE_PATH = require.resolve( + './fixtures/dumber-module.fixture.js' +); - let mocha; +describe('Mocha', function() { + let stubs; + let opts; + let Mocha; let sandbox; beforeEach(function() { sandbox = createSandbox(); - mocha = new Mocha(opts); - delete require.cache[dumbFilepath]; - delete require.cache[dumberFilepath]; + opts = {reporter: sandbox.stub()}; + + stubs = {}; + stubs.utils = { + supportsEsModules: sandbox.stub().returns(false), + warn: sandbox.stub(), + isString: sandbox.stub(), + noop: sandbox.stub(), + cwd: sandbox.stub().returns(process.cwd()) + }; + stubs.suite = Object.assign(sandbox.createStubInstance(EventEmitter), { + slow: sandbox.stub(), + timeout: sandbox.stub(), + bail: sandbox.stub() + }); + stubs.Suite = sandbox.stub().returns(stubs.suite); + stubs.Suite.constants = {}; + + Mocha = rewiremock.proxy(MODULE_PATH, r => ({ + '../../lib/utils': r.with(stubs.utils).callThrough(), + '../../lib/suite': stubs.Suite + })); + delete require.cache[DUMB_FIXTURE_PATH]; + delete require.cache[DUMBER_FIXTURE_PATH]; }); afterEach(function() { - delete require.cache[dumbFilepath]; - delete require.cache[dumberFilepath]; + delete require.cache[DUMB_FIXTURE_PATH]; + delete require.cache[DUMBER_FIXTURE_PATH]; sandbox.restore(); }); describe('instance method', function() { + let mocha; + + beforeEach(function() { + mocha = new Mocha(opts); + }); + describe('addFile()', function() { it('should add the given file to the files array', function() { mocha.addFile('some-file.js'); @@ -40,9 +72,12 @@ describe('Mocha', function() { describe('loadFiles()', function() { it('should load all files from the files array', function() { this.timeout(1000); - mocha.files = [dumbFilepath, dumberFilepath]; + mocha.files = [DUMB_FIXTURE_PATH, DUMBER_FIXTURE_PATH]; mocha.loadFiles(); - expect(require.cache, 'to have keys', [dumbFilepath, dumberFilepath]); + expect(require.cache, 'to have keys', [ + DUMB_FIXTURE_PATH, + DUMBER_FIXTURE_PATH + ]); }); it('should execute the optional callback if given', function() { @@ -54,13 +89,13 @@ describe('Mocha', function() { describe('unloadFiles()', function() { it('should delegate Mocha.unloadFile() for each item in its list of files', function() { - mocha.files = [dumbFilepath, dumberFilepath]; + mocha.files = [DUMB_FIXTURE_PATH, DUMBER_FIXTURE_PATH]; sandbox.stub(Mocha, 'unloadFile'); mocha.unloadFiles(); expect(Mocha.unloadFile, 'to have a call exhaustively satisfying', [ - dumbFilepath + DUMB_FIXTURE_PATH ]) - .and('to have a call exhaustively satisfying', [dumberFilepath]) + .and('to have a call exhaustively satisfying', [DUMBER_FIXTURE_PATH]) .and('was called twice'); }); @@ -68,14 +103,96 @@ describe('Mocha', function() { expect(mocha.unloadFiles(), 'to be', mocha); }); }); + + describe('reporter()', function() { + describe('when a reporter exists relative to the cwd', function() { + beforeEach(function() { + stubs.utils.cwd.returns( + path.resolve(__dirname, '..', '..', 'lib', 'reporters') + ); + }); + + it('should load from current working directory', function() { + expect(function() { + mocha.reporter('./spec.js'); + }, 'not to throw'); + }); + + describe('when the reporter throws upon load', function() { + it('should throw "invalid reporter" exception', function() { + expect( + function() { + mocha.reporter( + '../../test/node-unit/fixtures/wonky-reporter.fixture.js' + ); + }, + 'to throw', + { + code: 'ERR_MOCHA_INVALID_REPORTER' + } + ); + }); + + it('should warn about the error before throwing', function() { + try { + mocha.reporter( + '../../test/node-unit/fixtures/wonky-reporter.fixture.js' + ); + } catch (ignored) { + } finally { + expect(stubs.utils.warn, 'to have a call satisfying', [ + expect.it('to match', /reporter blew up/) + ]); + } + }); + }); + }); + + describe('when a reporter exists relative to the "mocha" module path', function() { + it('should load from module path', function() { + expect(function() { + mocha.reporter('./reporters/spec'); + }, 'not to throw'); + }); + + describe('when the reporter throws upon load', function() { + it('should throw "invalid reporter" exception', function() { + expect( + function() { + mocha.reporter( + '../../test/node-nit/fixtures/wonky-reporter.fixture.js' + ); + }, + 'to throw', + { + code: 'ERR_MOCHA_INVALID_REPORTER' + } + ); + }); + + it('should warn about the error before throwing', function() { + try { + mocha.reporter( + require.resolve('./fixtures/wonky-reporter.fixture.js') + ); + } catch (ignored) { + } finally { + expect(stubs.utils.warn, 'to have a call satisfying', [ + expect.it('to match', /reporter blew up/) + ]); + } + }); + }); + }); + }); }); describe('static method', function() { describe('unloadFile()', function() { it('should unload a specific file from cache', function() { - require(dumbFilepath); - Mocha.unloadFile(dumbFilepath); - expect(require.cache, 'not to have key', dumbFilepath); + require(DUMB_FIXTURE_PATH); + Mocha.unloadFile(DUMB_FIXTURE_PATH); + expect(require.cache, 'not to have key', DUMB_FIXTURE_PATH); }); }); }); diff --git a/test/node-unit/utils.spec.js b/test/node-unit/utils.spec.js new file mode 100644 index 0000000000..c0b6294450 --- /dev/null +++ b/test/node-unit/utils.spec.js @@ -0,0 +1,20 @@ +'use strict'; + +const rewiremock = require('rewiremock/node'); + +describe('utils', function() { + let utils; + + beforeEach(function() { + // add deps to be mocked as needed to second parameter + utils = rewiremock.proxy('../../lib/utils', {}); + }); + + describe('function', function() { + describe('cwd()', function() { + it('should return the current working directory', function() { + expect(utils.cwd(), 'to be', process.cwd()); + }); + }); + }); +}); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index c676d5f96b..96aad6e66c 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -1,15 +1,89 @@ 'use strict'; -var utils = require('../../lib/utils'); -var Mocha = require('../../lib/mocha'); var sinon = require('sinon'); +var EventEmitter = require('events').EventEmitter; +var Mocha = require('../../lib/mocha'); +var utils = require('../../lib/utils'); describe('Mocha', function() { - var opts = {reporter: utils.noop}; // no output + /** + * Options for `Mocha` constructor + */ + var opts; + + /** + * Sinon sandbox + * @see https://sinonjs.org/releases/v9.0.2/sandbox/ + */ var sandbox; + /** + * Stub `Runner` constructor; returns a stubbed `EventEmitter` + */ + var Runner; + + /** + * Stub `Suite` constructor; returns a stubbed `EventEmitter` + */ + var Suite; + + /** + * Stub `Suite` instance (root suite in our case) + */ + var suite; + + /** + * Stub `Runner` (`EventEmitter`) instance + */ + var runner; + + /** + * Stub `Base` reporter constructor + */ + var Base; + + /** + * Instance of a hypothetical reporter + */ + var reporterInstance; + beforeEach(function() { sandbox = sinon.createSandbox(); + reporterInstance = {}; + opts = {reporter: sandbox.stub().returns(reporterInstance)}; + Base = sandbox.stub().returns({}); + runner = utils.assign(sandbox.createStubInstance(EventEmitter), { + run: sandbox + .stub() + .callsArgAsync(0) + .returnsThis(), + globals: sandbox.stub(), + grep: sandbox.stub(), + dispose: sandbox.stub() + }); + Runner = sandbox.stub().returns(runner); + // the Runner constructor is the main export, and constants is a static prop. + // we don't need the constants themselves, but the object cannot be undefined + Runner.constants = {}; + suite = utils.assign(sandbox.createStubInstance(EventEmitter), { + slow: sandbox.stub(), + timeout: sandbox.stub(), + bail: sandbox.stub(), + dispose: sandbox.stub(), + reset: sandbox.stub() + }); + Suite = sandbox.stub().returns(suite); + Suite.constants = {}; + + sandbox.stub(utils, 'supportsEsModules').returns(false); + sandbox.stub(utils, 'warn'); + sandbox.stub(utils, 'isString'); + sandbox.stub(utils, 'noop'); + + Mocha.Runner = Runner; + Mocha.reporters.Base = Mocha.reporters.base = Base; + sandbox.stub(Mocha.reporters, 'spec'); + Mocha.Suite = Suite; }); afterEach(function() { @@ -26,7 +100,7 @@ describe('Mocha', function() { expect(new Mocha()._cleanReferencesAfterRun, 'to be', true); }); - describe('when "options.timeout" is `undefined`', function() { + describe('when `timeout` option is `undefined`', function() { it('should not attempt to set timeout', function() { // eslint-disable-next-line no-new new Mocha({timeout: undefined}); @@ -34,7 +108,7 @@ describe('Mocha', function() { }); }); - describe('when "options.timeout" is `false`', function() { + describe('when `timeout` is `false`', function() { it('should set a timeout of 0', function() { // eslint-disable-next-line no-new new Mocha({timeout: false}); @@ -44,8 +118,8 @@ describe('Mocha', function() { }); }); - describe('when "options.global" is provided', function() { - it('should pass "options.global" to #global()', function() { + describe('when `global` option is provided', function() { + it('should configure `global` option', function() { // eslint-disable-next-line no-new new Mocha({global: ['singular']}); expect(Mocha.prototype.global, 'to have a call satisfying', [ @@ -55,565 +129,678 @@ describe('Mocha', function() { }); }); - describe('#allowUncaught()', function() { - it('should set the allowUncaught option to true', function() { - var mocha = new Mocha(opts); - mocha.allowUncaught(); - expect(mocha.options, 'to have property', 'allowUncaught', true); - }); + describe('instance method', function() { + var mocha; - it('should set the allowUncaught option to false', function() { - var mocha = new Mocha(opts); - mocha.allowUncaught(false); - expect(mocha.options, 'to have property', 'allowUncaught', false); + beforeEach(function() { + mocha = new Mocha(opts); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.allowUncaught(), 'to be', mocha); - }); - }); + describe('allowUncaught()', function() { + it('should set the allowUncaught option to true', function() { + mocha.allowUncaught(); + expect(mocha.options, 'to have property', 'allowUncaught', true); + }); - describe('#asyncOnly()', function() { - it('should set the asyncOnly option to true', function() { - var mocha = new Mocha(opts); - mocha.asyncOnly(); - expect(mocha.options, 'to have property', 'asyncOnly', true); - }); + it('should set the allowUncaught option to false', function() { + mocha.allowUncaught(false); + expect(mocha.options, 'to have property', 'allowUncaught', false); + }); - it('should set the asyncOnly option to false', function() { - var mocha = new Mocha(opts); - mocha.asyncOnly(false); - expect(mocha.options, 'to have property', 'asyncOnly', false); + it('should be chainable', function() { + expect(mocha.allowUncaught(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.asyncOnly(), 'to be', mocha); - }); - }); + describe('asyncOnly()', function() { + it('should set the asyncOnly option to true', function() { + mocha.asyncOnly(); + expect(mocha.options, 'to have property', 'asyncOnly', true); + }); - describe('#bail()', function() { - it('should set the suite._bail to true if there is no arguments', function() { - var mocha = new Mocha(opts); - mocha.bail(); - expect(mocha.suite._bail, 'to be', true); - }); + it('should set the asyncOnly option to false', function() { + mocha.asyncOnly(false); + expect(mocha.options, 'to have property', 'asyncOnly', false); + }); - it('should set the suite._bail to false', function() { - var mocha = new Mocha(opts); - mocha.bail(false); - expect(mocha.suite._bail, 'to be', false); + it('should be chainable', function() { + expect(mocha.asyncOnly(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.bail(), 'to be', mocha); - }); - }); + describe('bail()', function() { + describe('when provided no arguments', function() { + it('should set the "bail" flag on the root suite', function() { + mocha.bail(); + expect(suite.bail, 'to have a call satisfying', [true]).and( + 'was called once' + ); + }); + }); - describe('#checkLeaks()', function() { - it('should set the checkLeaks option to true', function() { - var mocha = new Mocha(opts); - mocha.checkLeaks(); - expect(mocha.options, 'to have property', 'checkLeaks', true); - }); + describe('when provided a falsy argument', function() { + it('should unset the "bail" flag on the root suite', function() { + mocha.bail(false); + expect(suite.bail, 'to have a call satisfying', [false]).and( + 'was called once' + ); + }); + }); - it('should set the checkLeaks option to false', function() { - var mocha = new Mocha(opts); - mocha.checkLeaks(false); - expect(mocha.options, 'to have property', 'checkLeaks', false); + it('should be chainable', function() { + expect(mocha.bail(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.checkLeaks(), 'to be', mocha); + describe('checkLeaks()', function() { + it('should set the checkLeaks option to true', function() { + mocha.checkLeaks(); + expect(mocha.options, 'to have property', 'checkLeaks', true); + }); }); - }); - describe('#cleanReferencesAfterRun()', function() { - it('should set the _cleanReferencesAfterRun attribute', function() { - var mocha = new Mocha(opts); - mocha.cleanReferencesAfterRun(); - expect(mocha._cleanReferencesAfterRun, 'to be', true); - }); + describe('cleanReferencesAfterRun()', function() { + it('should set the _cleanReferencesAfterRun attribute', function() { + mocha.cleanReferencesAfterRun(); + expect(mocha._cleanReferencesAfterRun, 'to be', true); + }); - it('should set the _cleanReferencesAfterRun attribute to false', function() { - var mocha = new Mocha(opts); - mocha.cleanReferencesAfterRun(false); - expect(mocha._cleanReferencesAfterRun, 'to be', false); - }); + it('should set the _cleanReferencesAfterRun attribute to false', function() { + mocha.cleanReferencesAfterRun(false); + expect(mocha._cleanReferencesAfterRun, 'to be', false); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.cleanReferencesAfterRun(), 'to be', mocha); + it('should be chainable', function() { + expect(mocha.cleanReferencesAfterRun(), 'to be', mocha); + }); }); - }); - describe('#color()', function() { - it('should set the color option to true', function() { - var mocha = new Mocha(opts); - mocha.color(); - expect(mocha.options, 'to have property', 'color', true); - }); + describe('color()', function() { + it('should set the color option to true', function() { + mocha.color(); + expect(mocha.options, 'to have property', 'color', true); + }); - it('should set the color option to false', function() { - var mocha = new Mocha(opts); - mocha.color(false); - expect(mocha.options, 'to have property', 'color', false); - }); + it('should set the color option to false', function() { + mocha.color(false); + expect(mocha.options, 'to have property', 'color', false); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.color(), 'to be', mocha); + it('should be chainable', function() { + expect(mocha.color(), 'to be', mocha); + }); }); - }); - describe('#delay()', function() { - it('should set the delay option to true', function() { - var mocha = new Mocha(opts); - mocha.delay(); - expect(mocha.options, 'to have property', 'delay', true); - }); + describe('delay()', function() { + it('should set the delay option to true', function() { + mocha.delay(); + expect(mocha.options, 'to have property', 'delay', true); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.delay(), 'to be', mocha); + it('should be chainable', function() { + expect(mocha.delay(), 'to be', mocha); + }); }); - }); - describe('#diff()', function() { - it('should set the diff option to true', function() { - var mocha = new Mocha(opts); - mocha.diff(); - expect(mocha.options, 'to have property', 'diff', true); - }); + describe('diff()', function() { + it('should set the diff option to true', function() { + mocha.diff(); + expect(mocha.options, 'to have property', 'diff', true); + }); - it('should set the diff option to false', function() { - var mocha = new Mocha(opts); - mocha.diff(false); - expect(mocha.options, 'to have property', 'diff', false); + describe('when provided `false` argument', function() { + it('should set the diff option to false', function() { + mocha.diff(false); + expect(mocha.options, 'to have property', 'diff', false); + }); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.diff(), 'to be', mocha); - }); - }); + describe('dispose()', function() { + it('should dispose the root suite', function() { + mocha.dispose(); + expect(suite.dispose, 'was called once'); + }); - describe('#dispose()', function() { - it('should dispose the root suite', function() { - var mocha = new Mocha(opts); - var disposeStub = sandbox.stub(mocha.suite, 'dispose'); - mocha.dispose(); - expect(disposeStub, 'was called once'); - }); + it('should dispose previous test runner', function() { + mocha._previousRunner = runner; + mocha.dispose(); + expect(runner.dispose, 'was called once'); + }); - it('should dispose previous test runner', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - var disposeStub = sandbox.stub(Mocha.Runner.prototype, 'dispose'); - mocha.run(); - runStub.callArg(0); - mocha.dispose(); - expect(disposeStub, 'was called once'); + it('should unload the files', function() { + var unloadFilesStub = sandbox.stub(mocha, 'unloadFiles'); + mocha.dispose(); + expect(unloadFilesStub, 'was called once'); + }); }); - it('should unload the files', function() { - var mocha = new Mocha(opts); - var unloadFilesStub = sandbox.stub(mocha, 'unloadFiles'); - mocha.dispose(); - expect(unloadFilesStub, 'was called once'); - }); - }); + describe('forbidOnly()', function() { + it('should set the forbidOnly option to true', function() { + mocha.forbidOnly(); + expect(mocha.options, 'to have property', 'forbidOnly', true); + }); - describe('#forbidOnly()', function() { - it('should set the forbidOnly option to true', function() { - var mocha = new Mocha(opts); - mocha.forbidOnly(); - expect(mocha.options, 'to have property', 'forbidOnly', true); - }); + it('should set the forbidOnly option to false', function() { + mocha.forbidOnly(false); + expect(mocha.options, 'to have property', 'forbidOnly', false); + }); - it('should set the forbidOnly option to false', function() { - var mocha = new Mocha(opts); - mocha.forbidOnly(false); - expect(mocha.options, 'to have property', 'forbidOnly', false); + it('should be chainable', function() { + expect(mocha.forbidOnly(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.forbidOnly(), 'to be', mocha); - }); - }); + describe('forbidPending()', function() { + it('should set the forbidPending option to true', function() { + mocha.forbidPending(); + expect(mocha.options, 'to have property', 'forbidPending', true); + }); - describe('#forbidPending()', function() { - it('should set the forbidPending option to true', function() { - var mocha = new Mocha(opts); - mocha.forbidPending(); - expect(mocha.options, 'to have property', 'forbidPending', true); - }); + it('should set the forbidPending option to false', function() { + mocha.forbidPending(false); + expect(mocha.options, 'to have property', 'forbidPending', false); + }); - it('should set the forbidPending option to false', function() { - var mocha = new Mocha(opts); - mocha.forbidPending(false); - expect(mocha.options, 'to have property', 'forbidPending', false); + it('should be chainable', function() { + expect(mocha.forbidPending(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.forbidPending(), 'to be', mocha); - }); - }); + describe('fullTrace()', function() { + it('should set the fullTrace option to true', function() { + mocha.fullTrace(); + expect(mocha.options, 'to have property', 'fullTrace', true); + }); - describe('#fullTrace()', function() { - it('should set the fullTrace option to true', function() { - var mocha = new Mocha(opts); - mocha.fullTrace(); - expect(mocha.options, 'to have property', 'fullTrace', true); - }); + it('should set the fullTrace option to false', function() { + mocha.fullTrace(false); + expect(mocha.options, 'to have property', 'fullTrace', false); + }); - it('should set the fullTrace option to false', function() { - var mocha = new Mocha(opts); - mocha.fullTrace(false); - expect(mocha.options, 'to have property', 'fullTrace', false); + it('should be chainable', function() { + expect(mocha.fullTrace(), 'to be', mocha); + }); }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.fullTrace(), 'to be', mocha); - }); - }); + describe('global()', function() { + it('should be an empty array initially', function() { + expect(mocha.options.global, 'to be empty'); + }); - describe('#global()', function() { - it('should be an empty array initially', function() { - var mocha = new Mocha(); - expect(mocha.options.global, 'to be empty'); - }); + it('should be chainable', function() { + expect(mocha.global(), 'to be', mocha); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.global(), 'to be', mocha); - }); + describe('when argument is invalid', function() { + it('should not modify the whitelist when given empty string', function() { + mocha.global(''); + expect(mocha.options.global, 'to be empty'); + }); - describe('when argument is invalid', function() { - it('should not modify the whitelist when given empty string', function() { - var mocha = new Mocha(opts); - mocha.global(''); - expect(mocha.options.global, 'to be empty'); + it('should not modify the whitelist when given empty array', function() { + mocha.global([]); + expect(mocha.options.global, 'to be empty'); + }); }); - it('should not modify the whitelist when given empty array', function() { - var mocha = new Mocha(opts); - mocha.global([]); - expect(mocha.options.global, 'to be empty'); + describe('when argument is valid', function() { + var elem = 'foo'; + var elem2 = 'bar'; + var elem3 = 'baz'; + + it('should add string to the whitelist', function() { + mocha.global(elem); + expect(mocha.options.global, 'to contain', elem); + expect(mocha.options.global, 'to have length', 1); + }); + + it('should add contents of string array to the whitelist', function() { + var elems = [elem, elem2]; + mocha.global(elems); + expect(mocha.options.global, 'to contain', elem, elem2); + expect(mocha.options.global, 'to have length', elems.length); + }); + + it('should not have duplicates', function() { + var mocha = new Mocha({global: [elem, elem2]}); + var elems = [elem, elem2, elem3]; + mocha.global(elems); + expect(mocha.options.global, 'to contain', elem, elem2, elem3); + expect(mocha.options.global, 'to have length', elems.length); + }); }); }); - describe('when argument is valid', function() { - var elem = 'foo'; - var elem2 = 'bar'; - var elem3 = 'baz'; - - it('should add string to the whitelist', function() { - var mocha = new Mocha(opts); - mocha.global(elem); - expect(mocha.options.global, 'to contain', elem); - expect(mocha.options.global, 'to have length', 1); + describe('growl()', function() { + describe('if capable of notifications', function() { + it('should set the growl option to true', function() { + mocha.isGrowlCapable = function forceEnable() { + return true; + }; + mocha.growl(); + expect(mocha.options, 'to have property', 'growl', true); + }); }); - it('should add contents of string array to the whitelist', function() { - var mocha = new Mocha(opts); - var elems = [elem, elem2]; - mocha.global(elems); - expect(mocha.options.global, 'to contain', elem, elem2); - expect(mocha.options.global, 'to have length', elems.length); + describe('if not capable of notifications', function() { + it('should set the growl option to false', function() { + mocha.isGrowlCapable = function forceDisable() { + return false; + }; + mocha.growl(); + expect(mocha.options, 'to have property', 'growl', false); + }); }); - it('should not have duplicates', function() { - var mocha = new Mocha({global: [elem, elem2]}); - var elems = [elem, elem2, elem3]; - mocha.global(elems); - expect(mocha.options.global, 'to contain', elem, elem2, elem3); - expect(mocha.options.global, 'to have length', elems.length); + it('should be chainable', function() { + expect(mocha.growl(), 'to be', mocha); }); }); - }); - describe('#growl()', function() { - describe('if capable of notifications', function() { - it('should set the growl option to true', function() { - var mocha = new Mocha(opts); - mocha.isGrowlCapable = function forceEnable() { - return true; - }; - mocha.growl(); - expect(mocha.options, 'to have property', 'growl', true); + describe('inlineDiffs()', function() { + it('should set the inlineDiffs option to true', function() { + mocha.inlineDiffs(); + expect(mocha.options, 'to have property', 'inlineDiffs', true); }); - }); - describe('if not capable of notifications', function() { - it('should set the growl option to false', function() { - var mocha = new Mocha(opts); - mocha.isGrowlCapable = function forceDisable() { - return false; - }; - mocha.growl(); - expect(mocha.options, 'to have property', 'growl', false); + it('should set the inlineDiffs option to false', function() { + mocha.inlineDiffs(false); + expect(mocha.options, 'to have property', 'inlineDiffs', false); }); - }); - - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.growl(), 'to be', mocha); - }); - }); - describe('#inlineDiffs()', function() { - it('should set the inlineDiffs option to true', function() { - var mocha = new Mocha(opts); - mocha.inlineDiffs(); - expect(mocha.options, 'to have property', 'inlineDiffs', true); + it('should be chainable', function() { + expect(mocha.inlineDiffs(), 'to be', mocha); + }); }); - it('should set the inlineDiffs option to false', function() { - var mocha = new Mocha(opts); - mocha.inlineDiffs(false); - expect(mocha.options, 'to have property', 'inlineDiffs', false); - }); + describe('invert()', function() { + it('should set the invert option to true', function() { + mocha.invert(); + expect(mocha.options, 'to have property', 'invert', true); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.inlineDiffs(), 'to be', mocha); + it('should be chainable', function() { + expect(mocha.invert(), 'to be', mocha); + }); }); - }); - describe('#invert()', function() { - it('should set the invert option to true', function() { - var mocha = new Mocha(opts); - mocha.invert(); - expect(mocha.options, 'to have property', 'invert', true); - }); + describe('noHighlighting()', function() { + // :NOTE: Browser-only option... + it('should set the noHighlighting option to true', function() { + mocha.noHighlighting(); + expect(mocha.options, 'to have property', 'noHighlighting', true); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.invert(), 'to be', mocha); + it('should be chainable', function() { + expect(mocha.noHighlighting(), 'to be', mocha); + }); }); - }); - describe('#noHighlighting()', function() { - // :NOTE: Browser-only option... - it('should set the noHighlighting option to true', function() { - var mocha = new Mocha(opts); - mocha.noHighlighting(); - expect(mocha.options, 'to have property', 'noHighlighting', true); - }); + describe('reporter()', function() { + it('should throw reporter error if an invalid reporter is given', function() { + expect( + function() { + mocha.reporter('invalidReporter'); + }, + 'to throw', + { + message: "invalid reporter 'invalidReporter'", + code: 'ERR_MOCHA_INVALID_REPORTER', + reporter: 'invalidReporter' + } + ); + }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.noHighlighting(), 'to be', mocha); - }); - }); + it('should be chainable', function() { + expect(mocha.reporter(), 'to be', mocha); + }); - describe('#reporter()', function() { - it('should throw reporter error if an invalid reporter is given', function() { - var updatedOpts = {reporter: 'invalidReporter', reporterOptions: {}}; - var throwError = function() { - // eslint-disable-next-line no-new - new Mocha(updatedOpts); - }; - expect(throwError, 'to throw', { - message: "invalid reporter 'invalidReporter'", - code: 'ERR_MOCHA_INVALID_REPORTER', - reporter: 'invalidReporter' + it('should keep reporterOption on options', function() { + var mocha = new Mocha({ + reporter: 'spec', + reporterOption: { + foo: 'bar' + } + }); + expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); + // To support the legacy property name that can be used by reporters + expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); }); - }); - it('should be chainable', function() { - var mocha = new Mocha(opts); - expect(mocha.reporter(), 'to be', mocha); - }); + it('should support legacy reporterOptions', function() { + var mocha = new Mocha({ + reporter: 'spec', + reporterOptions: { + foo: 'bar' + } + }); + expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); + // To support the legacy property name that can be used by reporters + expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); + }); - it('should keep reporterOption on options', function() { - var mocha = new Mocha({ - reporter: 'spec', - reporterOption: { - foo: 'bar' - } + describe('when a reporter does not exist', function() { + it('should throw an "invalid reporter" exception', function() { + expect( + function() { + mocha.reporter('no such thing'); + }, + 'to throw', + {code: 'ERR_MOCHA_INVALID_REPORTER'} + ); + }); }); - expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); - // To support the legacy property name that can be used by reporters - expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); }); - it('should support legacy reporterOptions', function() { - var mocha = new Mocha({ - reporter: 'spec', - reporterOptions: { - foo: 'bar' - } + describe('run()', function() { + describe('when files have been added to the Mocha instance', function() { + beforeEach(function() { + sandbox.stub(mocha, 'loadFiles'); + mocha.addFile('some-file.js'); + }); + + describe('when Mocha is set to eagerly load files', function() { + it('should eagerly load files', function(done) { + mocha.run(function() { + expect(mocha.loadFiles, 'was called once'); + done(); + }); + }); + }); + + describe('when Mocha is set to lazily load files', function() { + beforeEach(function() { + mocha.loadAsync = true; + }); + + it('should not eagerly load files', function(done) { + mocha.run(function() { + expect(mocha.loadFiles, 'was not called'); + done(); + }); + }); + }); }); - expect(mocha.options.reporterOption, 'to have property', 'foo', 'bar'); - // To support the legacy property name that can be used by reporters - expect(mocha.options.reporterOptions, 'to have property', 'foo', 'bar'); - }); - }); - describe('#run(fn)', function() { - it('should execute the callback when complete', function(done) { - var mocha = new Mocha(opts); - sandbox.stub(Mocha.Runner.prototype, 'run').callsArg(0); - mocha.run(done); - }); + describe('Runner initialization', function() { + it('should instantiate a Runner', function(done) { + mocha.run(function() { + expect(Runner, 'to have a call satisfying', { + calledWithNew: true, + args: [ + mocha.suite, + { + delay: mocha.options.delay, + cleanReferencesAfterRun: mocha.options.cleanReferencesAfterRun + } + ] + }).and('was called once'); + done(); + }); + }); + + describe('when "grep" option is present', function() { + beforeEach(function() { + mocha.options.grep = /foo/; + mocha.options.invert = false; + }); + + it('should configure "grep"', function(done) { + mocha.run(function() { + expect(runner.grep, 'to have a call satisfying', [ + mocha.options.grep, + mocha.options.invert + ]).and('was called once'); + done(); + }); + }); + }); + + describe('when "global" option is present', function() { + beforeEach(function() { + mocha.options.global = ['foo', 'bar']; + }); + + it('should configure global vars', function(done) { + mocha.run(function() { + expect(runner.globals, 'to have a call satisfying', [ + mocha.options.global + ]).and('was called once'); + done(); + }); + }); + }); + }); - it('should not raise errors if callback was not provided', function() { - sandbox.stub(Mocha.Runner.prototype, 'run'); - var mocha = new Mocha(opts); - expect(function() { - mocha.run(); - }, 'not to throw'); - }); + describe('when "growl" option is present', function() { + beforeEach(function() { + mocha.options.growl = true; + sandbox.stub(Mocha.prototype, '_growl').returnsThis(); + }); + + it('should initialize growl support', function(done) { + mocha.run(function() { + expect(mocha._growl, 'to have a call satisfying', [runner]); + done(); + }); + }); + }); - it('should catch the `start` event if no tests are provided', function(done) { - var mocha = new Mocha(opts); - mocha.run().on('start', done); - }); + describe('Base reporter initialization', function() { + beforeEach(function() { + mocha.options.inlineDiffs = 'some value'; + mocha.options.diff = false; + }); + + describe('when "color" options is set', function() { + beforeEach(function() { + mocha.options.color = 'truthy'; + }); + + it('should configure the Base reporter', function(done) { + mocha.run(function() { + expect(Base, 'to exhaustively satisfy', { + inlineDiffs: 'some value', + hideDiff: true, + useColors: 'truthy' + }); + done(); + }); + }); + }); + + it('should configure the Base reporter', function(done) { + mocha.run(function() { + expect(Base, 'to exhaustively satisfy', { + inlineDiffs: 'some value', + hideDiff: true + }); + done(); + }); + }); + }); - it('should catch the `end` event if no tests are provided', function(done) { - var mocha = new Mocha(opts); - mocha.run().on('end', done); - }); + it('should instantiate a reporter', function(done) { + mocha.run(function() { + expect(opts.reporter, 'to have a call satisfying', { + calledWithNew: true, + args: [runner, mocha.options] + }).and('was called once'); + done(); + }); + }); - it('should throw if a run is in progress', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - mocha.run(); - expect( - function() { - mocha.run(); - }, - 'to throw', - { - message: - 'Mocha instance is currently running tests, cannot start a next test run until this one is done', - code: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', - instance: mocha - } - ); - expect(runStub, 'was called once'); - }); + // TODO: figure out how to stub the stats collector + it('should initialize the stats collector'); - it('should throw the instance is already disposed', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - mocha.dispose(); - expect( - function() { - mocha.run(); - }, - 'to throw', - { - message: - 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', - code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', - cleanReferencesAfterRun: true, - instance: mocha - } - ); - expect(runStub, 'was called times', 0); - }); + describe('when a reporter instance has a "done" method', function() { + beforeEach(function() { + reporterInstance.done = sandbox.stub().callsArgAsync(1); + }); - it('should throw if a run for a second time', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - mocha.run(); - runStub.callArg(0); - expect( - function() { - mocha.run(); - }, - 'to throw', - { - message: - 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', - code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', - instance: mocha - } - ); - expect(runStub, 'was called once'); - }); + it('should call the reporter "done" method', function(done) { + mocha.run(function() { + expect(reporterInstance.done, 'was called once'); + done(); + }); + }); + }); - it('should allow multiple runs if `cleanReferencesAfterRun` is disabled', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - mocha.cleanReferencesAfterRun(false); - mocha.run(); - runStub.callArg(0); - mocha.run(); - runStub.callArg(0); - expect(runStub, 'called times', 2); - }); + it('should execute the callback when complete', function(done) { + mocha.run(done); + }); - it('should reset between runs', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - var resetStub = sandbox.stub(Mocha.Suite.prototype, 'reset'); - mocha.cleanReferencesAfterRun(false); - mocha.run(); - runStub.callArg(0); - mocha.run(); - expect(resetStub, 'was called once'); - }); + describe('when a run is in progress', function() { + it('should throw', function(done) { + mocha.run(done); // this is async! + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is currently running tests, cannot start a next test run until this one is done', + code: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', + instance: mocha + } + ); + }); + + it('should not call `Runner#run`', function(done) { + mocha.run(done); // this is async! + try { + mocha.run(); + } catch (ignored) { + } finally { + expect(runner.run, 'was called once'); + } + }); + }); - it('should dispose the previous runner when the next run starts', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - var disposeStub = sandbox.stub(Mocha.Runner.prototype, 'dispose'); - mocha.cleanReferencesAfterRun(false); - mocha.run(); - runStub.callArg(0); - expect(disposeStub, 'was not called'); - mocha.run(); - expect(disposeStub, 'was called once'); - }); + describe('when the `Mocha` instance is already disposed', function() { + beforeEach(function() { + mocha.dispose(); + }); + + it('should throw', function() { + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + cleanReferencesAfterRun: true, + instance: mocha + } + ); + }); + + it('should not call `Runner#run`', function() { + try { + mocha.run(); + } catch (ignored) { + } finally { + expect(runner.run, 'was not called'); + } + }); + }); - describe('#reporter("xunit")#run(fn)', function() { - // :TBD: Why does specifying reporter differentiate this test from preceding one - it('should not raise errors if callback was not provided', function() { - var mocha = new Mocha(); - expect(function() { + describe('when a run has finished and is called again', function() { + beforeEach(function(done) { + mocha.run(function() { + runner.run.reset(); + done(); + }); + }); + + it('should throw', function() { + expect( + function() { + mocha.run(); + }, + 'to throw', + { + message: + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + instance: mocha + } + ); + }); + + it('should not call `Runner#run()`', function() { try { - mocha.reporter('xunit').run(); - } catch (e) { - console.log(e); - expect.fail(e.message); + mocha.run(); + } catch (ignored) { + } finally { + expect(runner.run, 'was not called'); } - }, 'not to throw'); + }); }); - }); - }); - describe('#unloadFiles()', function() { - it('should reset referencesCleaned and allow for next run', function() { - var mocha = new Mocha(opts); - var runStub = sandbox.stub(Mocha.Runner.prototype, 'run'); - mocha.run(); - runStub.callArg(0); - mocha.unloadFiles(); - expect(function() { - mocha.run(); - }, 'not to throw'); + describe('when Mocha configured for multiple runs and multiple runs are attempted', function() { + beforeEach(function() { + mocha.cleanReferencesAfterRun(false); + }); + + it('should not throw', function(done) { + mocha.run(function() { + mocha.run(done); + }); + }); + + it('should call `Runner#run` for each call', function(done) { + mocha.run(function() { + mocha.run(function() { + expect(runner.run, 'was called twice'); + done(); + }); + }); + }); + + it('should reset the root Suite between runs', function(done) { + mocha.run(function() { + mocha.run(function() { + expect(suite.reset, 'was called once'); + done(); + }); + }); + }); + + it('should dispose the previous runner', function(done) { + mocha.run(function() { + mocha.run(function() { + expect(runner.dispose, 'was called once'); + done(); + }); + }); + }); + }); }); - it('should not be allowed when the current instance is already disposed', function() { - var mocha = new Mocha(opts); - mocha.dispose(); - expect( - function() { + describe('unloadFiles()', function() { + it('should reset referencesCleaned and allow for next run', function(done) { + mocha.run(function() { mocha.unloadFiles(); - }, - 'to throw', - 'Mocha instance is already disposed, it cannot be used again.' - ); + mocha.run(done); + }); + }); + + it('should not be allowed when the current instance is already disposed', function() { + mocha.dispose(); + expect( + function() { + mocha.unloadFiles(); + }, + 'to throw', + 'Mocha instance is already disposed, it cannot be used again.' + ); + }); }); }); }); From 442cf5fccc3545759350e72b276e542e205b12b9 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 15 May 2020 15:34:23 -0700 Subject: [PATCH 1487/1771] add javascript in docs to eslint --- .eslintignore | 5 ++++- .eslintrc.yml | 4 ++++ docs/js/avatars.js | 7 +++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.eslintignore b/.eslintignore index d9a508ec53..a7a33c25c6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,11 @@ coverage/ mocha.js *.fixture.js -docs/ +docs/_site +docs/_dist +docs/example out/ !lib/mocha.js test/integration/fixtures !.*.js +*.min.js diff --git a/.eslintrc.yml b/.eslintrc.yml index 43d8bcfd9e..0834c5c9d2 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -20,6 +20,10 @@ rules: - object: 'Object' property: 'assign' overrides: + - files: + - docs/js/**/*.js + env: + node: false - files: - scripts/**/*.js - package-scripts.js diff --git a/docs/js/avatars.js b/docs/js/avatars.js index 7706fa1e5b..b64294e858 100644 --- a/docs/js/avatars.js +++ b/docs/js/avatars.js @@ -1,9 +1,9 @@ -(function () { +(function() { 'use strict'; var imageLists = document.querySelectorAll('.image-list'); - Array.prototype.forEach.call(imageLists, function (imageList) { + Array.prototype.forEach.call(imageLists, function(imageList) { var images = imageList.querySelectorAll('img'); var counter = images.length; @@ -28,5 +28,4 @@ } } }); - -}()); +})(); From 68eec9e244e32b9b796c472be5ba9bcd70b9ec8b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 15 May 2020 15:38:54 -0700 Subject: [PATCH 1488/1771] smart quotes and such on website; closes #3716 I do not know if this actually works, but it might. Signed-off-by: Christopher Hiller --- .eleventy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 3836c6999e..7f0b10c975 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -7,13 +7,13 @@ module.exports = function(eleventyConfig) { eleventyConfig.addPassthroughCopy('docs/CNAME'); eleventyConfig.addPassthroughCopy('docs/_headers'); eleventyConfig.addPassthroughCopy('docs/favicon.ico'); - eleventyConfig.addPassthroughCopy('docs/example'); /* Markdown Plugins */ const markdown = require('markdown-it')({ html: true, - linkify: true + linkify: true, + typographer: true }); markdown.use(require('markdown-it-anchor'), { From ca0daa36c241d929f511a292f5471bd213aedb9f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 18 May 2020 14:26:57 -0700 Subject: [PATCH 1489/1771] do not commit generated content to VCS; closes #3713 (#4289) * do not commit generated content to VCS This removes `markdown-magic` and replaces its functionality with the built-in data capabilities of 11ty. The TOC, `--help` output, and source files are now all done via global data scripts in `docs/_data`. When building documentation, we will no longer get changes to e.g., `docs/index.md` because of the automatically generated content. * add inclusive language plugin to eleventy Usage of the words as defined in options will result in a warning, and will not break the build. Also: Eleventy should ignore the historical changelogs in `docs/changelogs`. --- .eleventy.js | 8 + .eslintrc.yml | 1 + docs/.eleventyignore | 1 + docs/README.md | 2 +- docs/_data/files.js | 50 ++ docs/_data/toc.js | 21 + docs/_data/usage.js | 21 + docs/api-tutorials/custom-reporter.md | 67 +-- docs/changelogs/README.md | 7 + docs/index.md | 153 +----- package-lock.json | 700 ++++++++++++++++++-------- package-scripts.js | 20 +- package.json | 3 +- scripts/markdown-magic.config.js | 105 ---- 14 files changed, 611 insertions(+), 548 deletions(-) create mode 100644 docs/_data/files.js create mode 100644 docs/_data/toc.js create mode 100644 docs/_data/usage.js create mode 100644 docs/changelogs/README.md delete mode 100644 scripts/markdown-magic.config.js diff --git a/.eleventy.js b/.eleventy.js index 7f0b10c975..04a49f2df9 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,6 +1,14 @@ 'use strict'; module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin( + require('@11ty/eleventy-plugin-inclusive-language'), + { + words: + 'simply,obviously,basically,of course,clearly,everyone knows,however,easy' + } + ); + eleventyConfig.addPassthroughCopy('docs/css'); eleventyConfig.addPassthroughCopy('docs/js'); eleventyConfig.addPassthroughCopy('docs/images'); diff --git a/.eslintrc.yml b/.eslintrc.yml index 0834c5c9d2..2a3fa281df 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -36,6 +36,7 @@ overrides: - test/integration/options/watch.spec.js - test/integration/helpers.js - lib/growl.js + - docs/_data/**/*.js parserOptions: ecmaVersion: 2018 env: diff --git a/docs/.eleventyignore b/docs/.eleventyignore index c81ddf9d39..cb6f694698 100644 --- a/docs/.eleventyignore +++ b/docs/.eleventyignore @@ -4,3 +4,4 @@ LICENSE* .* _dist/ example/ +changelogs/ diff --git a/docs/README.md b/docs/README.md index ab083fe29d..f85b53adec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,7 @@ _So you wanna build the site?_ cp: docs/_dist/_headers: No such file or directory ``` -- See `package-scripts.js` for details on what the builds are actually doing; especially see [markdown-magic](https://npm.im/markdown-magic) for how we're dynamically inserting information into `docs/index.md`. +- See `package-scripts.js` for details on what the builds are actually doing. ## License diff --git a/docs/_data/files.js b/docs/_data/files.js new file mode 100644 index 0000000000..abbf25cbfe --- /dev/null +++ b/docs/_data/files.js @@ -0,0 +1,50 @@ +'use strict'; + +const {resolve, relative, dirname} = require('path'); +const {readFileSync} = require('fs'); + +const PROJECT_ROOT_DIR = resolve(__dirname, '..', '..'); +const FILES = [ + { + slug: 'simplereporter', + path: require.resolve('../../test/integration/fixtures/simple-reporter.js'), + header: '// my-reporter.js' + } +]; + +const HEADER = '```js\n'; +const FOOTER = '```\n'; + +const loadFile = (path, {header} = {}) => { + const relativeDir = relative(dirname(path), PROJECT_ROOT_DIR); + let content = readFileSync(path, 'utf-8'); + // replace relative paths in `require()` to root with "mocha". + // might not work in the general case. not gonna parse an AST for this + // e.g. `require('../../lib/foo')` => `require('mocha/lib/foo')` + // also trim any trailing whitespace + content = content + .replace( + new RegExp(`require\\(['"]${relativeDir}(.*?)['"]\\)`, 'g'), + "require('mocha$1')" + ) + .trim(); + return `${HEADER}${header}\n\n${content}${FOOTER}`; +}; + +/** + * Loads files from disk (see `FILES` above) to be shown as data. + * Used for embedding sources directly into pages + */ +module.exports = () => { + const files = FILES.map(({path, header, slug}) => { + const content = loadFile(path, {header}); + return {slug, content}; + }); + return files.reduce( + (files, {slug, content}) => ({ + ...files, + [slug]: content + }), + {} + ); +}; diff --git a/docs/_data/toc.js b/docs/_data/toc.js new file mode 100644 index 0000000000..9937c6fc10 --- /dev/null +++ b/docs/_data/toc.js @@ -0,0 +1,21 @@ +'use strict'; + +const markdownToc = require('markdown-toc'); +const {readFileSync} = require('fs'); +const {resolve} = require('path'); + +const IGNORED_HEADINGS_REGEXP = /Features|Table of Contents|Backers|Sponsors/i; +const DOCUMENT_PATH = resolve(__dirname, '..', 'index.md'); + +module.exports = () => { + const doc = readFileSync(DOCUMENT_PATH, 'utf-8'); + return markdownToc(doc, { + slugify: require('uslug'), + firsth1: false, + bullets: '-', + maxdepth: 2, + // if filter is supplied, maxdepth is apparently ignored, + // so we have to do it ourselves. + filter: (str, ele) => ele.lvl < 2 && !IGNORED_HEADINGS_REGEXP.test(str) + }).content; +}; diff --git a/docs/_data/usage.js b/docs/_data/usage.js new file mode 100644 index 0000000000..ee13a19de9 --- /dev/null +++ b/docs/_data/usage.js @@ -0,0 +1,21 @@ +'use strict'; + +const stripAnsi = require('strip-ansi'); +const {resolve} = require('path'); +const {execSync} = require('child_process'); + +const executable = require.resolve('../../bin/mocha'); +const flag = '--help'; + +/** + * Return the output of `mocha --help` for display + */ +module.exports = () => { + return stripAnsi( + String( + execSync(`"${process.execPath}" ${executable} ${flag}`, { + cwd: resolve(__dirname, '..') + }) + ).trim() + ); +}; diff --git a/docs/api-tutorials/custom-reporter.md b/docs/api-tutorials/custom-reporter.md index a0cfe48d66..d858b99970 100644 --- a/docs/api-tutorials/custom-reporter.md +++ b/docs/api-tutorials/custom-reporter.md @@ -6,70 +6,7 @@ For example, if `mocha-foo-reporter` was published to the npm registry, you coul If you're looking to get started quickly, here's an example of a custom reporter: - - -```js -// my-reporter.js -'use strict'; - -const Mocha = require('mocha'); -const { - EVENT_RUN_BEGIN, - EVENT_RUN_END, - EVENT_TEST_FAIL, - EVENT_TEST_PASS, - EVENT_SUITE_BEGIN, - EVENT_SUITE_END -} = Mocha.Runner.constants; - -// this reporter outputs test results, indenting two spaces per suite -class MyReporter { - constructor(runner) { - this._indents = 0; - const stats = runner.stats; - - runner - .once(EVENT_RUN_BEGIN, () => { - console.log('start'); - }) - .on(EVENT_SUITE_BEGIN, () => { - this.increaseIndent(); - }) - .on(EVENT_SUITE_END, () => { - this.decreaseIndent(); - }) - .on(EVENT_TEST_PASS, test => { - // Test#fullTitle() returns the suite name(s) - // prepended to the test title - console.log(`${this.indent()}pass: ${test.fullTitle()}`); - }) - .on(EVENT_TEST_FAIL, (test, err) => { - console.log( - `${this.indent()}fail: ${test.fullTitle()} - error: ${err.message}` - ); - }) - .once(EVENT_RUN_END, () => { - console.log(`end: ${stats.passes}/${stats.passes + stats.failures} ok`); - }); - } - - indent() { - return Array(this._indents).join(' '); - } - - increaseIndent() { - this._indents++; - } - - decreaseIndent() { - this._indents--; - } -} - -module.exports = MyReporter; -``` - - +{{ files.simplereporter }} To use this reporter, execute `mocha --reporter /path/to/my-reporter.js`. @@ -110,4 +47,4 @@ The event names are exported from the `constants` property of `Mocha.Runner`: **Please use these constants** instead of the event names in your own reporter! This will ensure compatibility with future versions of Mocha. -> It's important to understand that all `Suite` callbacks will be run _before_ the {@link Runner} emits `EVENT_RUN_BEGIN`. Hooks and tests, however, won't run until _after_ the {@link Runner} emits `EVENT_RUN_BEGIN`. +> It's important to understand that all `Suite` callbacks will be run _before_ the {@link Runner} emits `EVENT_RUN_BEGIN`. Hooks and tests won't run until _after_ the {@link Runner} emits `EVENT_RUN_BEGIN`. diff --git a/docs/changelogs/README.md b/docs/changelogs/README.md new file mode 100644 index 0000000000..2c059575d2 --- /dev/null +++ b/docs/changelogs/README.md @@ -0,0 +1,7 @@ +# Historical Changelogs + +These are changelogs for (very) old versions of Mocha. + +These changelogs are _not_ included in the website, and are here only for archival purposes. + +_If you're looking for the current changelog, [here is the current changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)._ diff --git a/docs/index.md b/docs/index.md index 415430a3d4..7f44f34acc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,12 +8,12 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in -{% include backers.md %} {% include sponsors.md %} +{% include backers.md %} ## Features @@ -49,39 +49,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in ## Table of Contents - - -- [Installation](#installation) -- [Getting Started](#getting-started) -- [Run Cycle Overview](#run-cycle-overview) -- [Detects Multiple Calls to `done()`](#detects-multiple-calls-to-done) -- [Assertions](#assertions) -- [Asynchronous Code](#asynchronous-code) -- [Synchronous Code](#synchronous-code) -- [Arrow Functions](#arrow-functions) -- [Hooks](#hooks) -- [Pending Tests](#pending-tests) -- [Exclusive Tests](#exclusive-tests) -- [Inclusive Tests](#inclusive-tests) -- [Retry Tests](#retry-tests) -- [Dynamically Generating Tests](#dynamically-generating-tests) -- [Timeouts](#timeouts) -- [Diffs](#diffs) -- [Command-Line Usage](#command-line-usage) -- [Interfaces](#interfaces) -- [Reporters](#reporters) -- [Node.JS native ESM support](#nodejs-native-esm-support) -- [Running Mocha in the Browser](#running-mocha-in-the-browser) -- [Desktop Notification Support](#desktop-notification-support) -- [Configuring Mocha (Node.js)](#configuring-mocha-nodejs) -- [The `test/` Directory](#the-test-directory) -- [Error Codes](#error-codes) -- [Editor Plugins](#editor-plugins) -- [Examples](#examples) -- [Testing Mocha](#testing-mocha) -- [More Information](#more-information) - - +{{ toc }} ## Installation @@ -233,7 +201,7 @@ Mocha allows you to use any assertion library you wish. In the above example, we ## Asynchronous Code -Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named `done`) to `it()`, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). +By adding an argument (usually named `done`) to `it()` to a test callback, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). ```js describe('User', function() { @@ -249,7 +217,7 @@ describe('User', function() { }); ``` -Alternatively, just use the `done()` callback directly (which will handle an error argument, if it exists): +Alternatively, use the `done()` callback directly (which will handle an error argument, if it exists): ```js describe('User', function() { @@ -345,7 +313,7 @@ describe('my suite', () => { }); ``` -_If you do not need to use_ Mocha's context, lambdas should work. However, the result will be more difficult to refactor if the need eventually arises. +_If you do not need to use_ Mocha's context, lambdas should work. Be aware that using lambdas will be more painful to refactor if the need eventually arises! ## Hooks @@ -451,7 +419,7 @@ setTimeout(function() { ## Pending Tests -"Pending"--as in "someone should write these test cases eventually"--test-cases are simply those _without_ a callback: +"Pending"--as in "someone should write these test cases eventually"--test-cases are those _without_ a callback: ```js describe('Array', function() { @@ -565,7 +533,7 @@ _Note_: Hooks, if present, will still be executed. ## Inclusive Tests -This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to simply ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: +This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: ```js describe('Array', function() { @@ -820,92 +788,9 @@ Mocha supports the `err.expected` and `err.actual` properties of any thrown `Ass ## Command-Line Usage - - -```text - -mocha [spec..] - -Run tests with Mocha - -Commands - mocha inspect [spec..] Run tests with Mocha [default] - mocha init create a client-side Mocha setup at - -Rules & Behavior - --allow-uncaught Allow uncaught errors to propagate [boolean] - --async-only, -A Require all tests to use a callback (async) or - return a Promise [boolean] - --bail, -b Abort ("bail") after first test failure [boolean] - --check-leaks Check for global variable leaks [boolean] - --delay Delay initial execution of root suite [boolean] - --exit Force Mocha to quit after tests complete [boolean] - --forbid-only Fail if exclusive test(s) encountered [boolean] - --forbid-pending Fail if pending test(s) encountered [boolean] - --global, --globals List of allowed global variables [array] - --retries Retry failed tests this many times [number] - --slow, -s Specify "slow" test threshold (in milliseconds) - [string] [default: 75] - --timeout, -t, --timeouts Specify test timeout threshold (in milliseconds) - [string] [default: 2000] - --ui, -u Specify user interface [string] [default: "bdd"] - -Reporting & Output - --color, -c, --colors Force-enable color output [boolean] - --diff Show diff on failure - [boolean] [default: true] - --full-trace Display full stack traces [boolean] - --growl, -G Enable Growl notifications [boolean] - --inline-diffs Display actual/expected differences - inline within each string [boolean] - --reporter, -R Specify reporter to use - [string] [default: "spec"] - --reporter-option, --reporter-options, Reporter-specific options - -O () [array] - -Configuration - --config Path to config file [string] [default: (nearest rc file)] - --package Path to package.json for config [string] - -File Handling - --extension File extension(s) to load - [array] [default: ["js","cjs","mjs"]] - --file Specify file(s) to be loaded prior to root suite - execution [array] [default: (none)] - --ignore, --exclude Ignore file(s) or glob pattern(s) - [array] [default: (none)] - --recursive Look for tests in subdirectories [boolean] - --require, -r Require module [array] [default: (none)] - --sort, -S Sort test files [boolean] - --watch, -w Watch files in the current working directory for changes - [boolean] - --watch-files List of paths or globs to watch [array] - --watch-ignore List of paths or globs to exclude from watching - [array] [default: ["node_modules",".git"]] - -Test Filters - --fgrep, -f Only run tests containing this string [string] - --grep, -g Only run tests matching this string or regexp [string] - --invert, -i Inverts --grep and --fgrep matches [boolean] - -Positional Arguments - spec One or more files, directories, or globs to test - [array] [default: ["test"]] - -Other Options - --help, -h Show usage information & exit [boolean] - --version, -V Show version number & exit [boolean] - --list-interfaces List built-in user interfaces & exit [boolean] - --list-reporters List built-in reporters & exit [boolean] - -Mocha Resources - Chat: https://gitter.im/mochajs/mocha - GitHub: https://github.com/mochajs/mocha.git - Docs: https://mochajs.org/ - ``` - - +{{ usage }} +``` ### `--allow-uncaught` @@ -943,7 +828,7 @@ _Prior to_ version v4.0.0, _by default_, Mocha would force its own process to ex The _default behavior_ in v4.0.0 (and newer) is `--no-exit`, where previously it was `--exit`. -**The easiest way to "fix" the issue is to simply pass `--exit` to the Mocha process.** It _can_ be time-consuming to debug — because it's not always obvious where the problem is — but it _is_ recommended to do so. +**The easiest way to "fix" the issue is to pass `--exit` to the Mocha process.** It _can_ be time-consuming to debug — because it's not always obvious where the problem is — but it _is_ recommended to do so. To ensure your tests aren't leaving messes around, here are some ideas to get started: @@ -970,7 +855,7 @@ Enforce a rule that tests may not be skipped (use of e.g., `describe.skip()`, `i Define a global variable name. For example, suppose your app deliberately exposes a global named `app` and `YUI`, you may want to add `--global app --global YUI`. -`--global` accepts wildcards. You could do `--global '*bar'` and it would match `foobar`, `barbar`, etc. You can also simply pass in `'*'` to ignore all globals. +`--global` accepts wildcards. You could do `--global '*bar'` and it would match `foobar`, `barbar`, etc. You can also pass in `'*'` to ignore all globals. `--global` can accept a comma-delimited list; `--global app,YUI` is equivalent to `--global app --global YUI`. @@ -1243,7 +1128,7 @@ Mocha's "interface" system allows developers to choose their style of DSL. Mocha The **BDD** interface provides `describe()`, `context()`, `it()`, `specify()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`. -`context()` is just an alias for `describe()`, and behaves the same way; it just provides a way to keep tests easier to read and organized. Similarly, `specify()` is an alias for `it()`. +`context()` is just an alias for `describe()`, and behaves the same way; it provides a way to keep tests easier to read and organized. Similarly, `specify()` is an alias for `it()`. > All of the previous examples were written using the **BDD** interface. @@ -1313,7 +1198,7 @@ module.exports = { ### QUnit -The [QUnit][]-inspired interface matches the "flat" look of QUnit, where the test suite title is simply defined before the test-cases. Like TDD, it uses `suite()` and `test()`, but resembling BDD, it also contains `before()`, `after()`, `beforeEach()`, and `afterEach()`. +The [QUnit][]-inspired interface matches the "flat" look of QUnit, where the test suite title is defined _before_ the test-cases. Like TDD, it uses `suite()` and `test()`, but resembling BDD, it also contains `before()`, `after()`, `beforeEach()`, and `afterEach()`. ```js function ok(expr, msg) { @@ -1383,7 +1268,7 @@ This is the default reporter. The Spec reporter outputs a hierarchical view nest Alias: `Dot`, `dot` -The Dot Matrix reporter is simply a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. +The Dot Matrix reporter is a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. ![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} @@ -1863,7 +1748,7 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl #### Features - see all tests in VS Code sidebar menu -- run & debug tests for each level hierarchy from all tests to a single test (and each describe of course) +- run & debug tests for each level hierarchy from all tests to a single test (and each suite) - auto run tests on file save - see tests results directly in the code editor @@ -1969,9 +1854,3 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [wallaby.js]: https://wallabyjs.com/ [yargs-configobject-extends]: http://yargs.js.org/docs/#api-configobject-extends-keyword [zsh-globbing]: http://zsh.sourceforge.net/Doc/Release/Expansion.html#Recursive-Globbing - - - -[gitter]: https://gitter.im/mochajs/mocha - - diff --git a/package-lock.json b/package-lock.json index 21ae2b1c3e..d848f8692e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,6 +129,182 @@ } } }, + "@11ty/eleventy-plugin-inclusive-language": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-inclusive-language/-/eleventy-plugin-inclusive-language-1.0.0.tgz", + "integrity": "sha512-YRQl/w1CUc+0+aZGIjN5XiyBb9SWQKJkGtImKWqiW7DaboFld8AQCFeTpLWhdOrifR5yblRW/oPePTT+pjgfZQ==", + "dev": true, + "requires": { + "@11ty/eleventy": "^0.5.4", + "chalk": "^2.4.1" + }, + "dependencies": { + "@11ty/eleventy": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.5.4.tgz", + "integrity": "sha512-fGZzs00HQEIUyuVUWFBstLGswMj8JJwlmEBYgK8uf1Cu2Y/ksveBdHVV1JxCc/fMA4NdZdxDz1vM4Nsa3HPjNg==", + "dev": true, + "requires": { + "browser-sync": "^2.24.4", + "chalk": "^2.4.1", + "debug": "^3.1.0", + "ejs": "^2.6.1", + "fast-glob": "^2.2.2", + "fs-extra": "^6.0.1", + "glob-watcher": "^5.0.1", + "gray-matter": "^4.0.1", + "hamljs": "^0.6.2", + "handlebars": "^4.0.11", + "liquidjs": "^5.1.0", + "lodash.chunk": "^4.2.0", + "lodash.clone": "^4.5.0", + "lodash.get": "^4.4.2", + "lodash.isobject": "^3.0.2", + "lodash.merge": "^4.6.1", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "luxon": "^1.3.0", + "markdown-it": "^8.4.1", + "minimist": "^1.2.0", + "multimatch": "^2.1.0", + "mustache": "^2.3.0", + "normalize-path": "^3.0.0", + "nunjucks": "^3.1.3", + "parse-filepath": "^1.0.2", + "please-upgrade-node": "^3.1.1", + "pretty": "^2.0.0", + "pug": "^2.0.3", + "recursive-copy": "^2.0.9", + "semver": "^5.5.0", + "slugify": "^1.3.0", + "time-require": "^0.1.2", + "valid-url": "^1.0.9" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "liquidjs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-5.2.0.tgz", + "integrity": "sha512-bIDYRWlo8f09dNd8Hz3lHVPOpgw33jtDCebMEDj2D9g54/KhTao7/lVv+3hYtsWTW2PId4hH+1X0iuuYnQHnTg==", + "dev": true, + "requires": { + "resolve-url": "^0.2.1" + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -437,6 +613,16 @@ "taffydb": "^2.7.3" } }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, "@munter/tap-render": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@munter/tap-render/-/tap-render-0.2.0.tgz", @@ -976,6 +1162,12 @@ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -1011,6 +1203,12 @@ "integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8=", "dev": true }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1328,6 +1526,18 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -3380,6 +3590,12 @@ } } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -4820,12 +5036,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true - }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -6773,30 +6983,6 @@ "semver-regex": "^2.0.0" } }, - "findup": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", - "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", - "dev": true, - "requires": { - "colors": "~0.6.0-1", - "commander": "~2.1.0" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "commander": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", - "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", - "dev": true - } - } - }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -6865,6 +7051,15 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -7153,6 +7348,206 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -7666,25 +8061,6 @@ "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, - "http-basic": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz", - "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=", - "dev": true, - "requires": { - "caseless": "~0.11.0", - "concat-stream": "^1.4.6", - "http-response-object": "^1.0.0" - }, - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - } - } - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -7722,12 +8098,6 @@ "requires-port": "1.x.x" } }, - "http-response-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz", - "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -8497,18 +8867,18 @@ "is-path-inside": "^1.0.0" } }, - "is-local-path": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-local-path/-/is-local-path-0.1.6.tgz", - "integrity": "sha1-gV0USxTVac7L6tTVaTCX8Aqb9sU=", - "dev": true - }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", "dev": true }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -9252,6 +9622,12 @@ "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=", "dev": true }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, "just-extend": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", @@ -10064,6 +10440,12 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", + "dev": true + }, "lodash.clone": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", @@ -10106,18 +10488,36 @@ "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", @@ -10465,133 +10865,6 @@ "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", "dev": true }, - "markdown-magic": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/markdown-magic/-/markdown-magic-1.0.0.tgz", - "integrity": "sha512-H2Y8eGA19kF5EPs1vdJp0+21mqEkJylFu134anEtolygwvaHZDyBKQVE5mUXxWkuvWizBp5QQU8O8BA8hradmA==", - "dev": true, - "requires": { - "commander": "^2.9.0", - "deepmerge": "^1.3.0", - "find-up": "^2.1.0", - "fs-extra": "^1.0.0", - "globby": "^6.1.0", - "is-local-path": "^0.1.6", - "markdown-toc": "^1.2.0", - "sync-request": "^3.0.1" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "markdown-magic-package-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/markdown-magic-package-json/-/markdown-magic-package-json-2.0.1.tgz", - "integrity": "sha512-ahEHLW4ovxjGEDkNdirKl01uU6dcZkjtqhc4iJIgwxXwDVq4ThN7cHf1rIA4uaDD4JHAK2hsTHAr7F1TggGt2Q==", - "dev": true, - "requires": { - "findup": "^0.1.5" - } - }, "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -12068,6 +12341,18 @@ "object-keys": "^1.0.11" } }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", @@ -16022,6 +16307,12 @@ "readable-stream": "^2.0.2" } }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, "stream-http": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", @@ -16422,17 +16713,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "sync-request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz", - "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=", - "dev": true, - "requires": { - "concat-stream": "^1.4.7", - "http-response-object": "^1.0.1", - "then-request": "^2.0.1" - } - }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -16734,28 +17014,6 @@ } } }, - "then-request": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz", - "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=", - "dev": true, - "requires": { - "caseless": "~0.11.0", - "concat-stream": "^1.4.7", - "http-basic": "^2.5.1", - "http-response-object": "^1.1.0", - "promise": "^7.1.1", - "qs": "^6.1.0" - }, - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - } - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", diff --git a/package-scripts.js b/package-scripts.js index 7406018366..f3775db177 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -261,7 +261,7 @@ module.exports = { description: 'Build documentation' }, prebuild: { - script: 'rimraf docs/_dist docs/_site && nps docs.preprocess', + script: 'rimraf docs/_dist docs/_site', description: 'Prepare system for doc building', hiddenFromHelp: true }, @@ -275,26 +275,12 @@ module.exports = { description: 'Post-process docs after build', hiddenFromHelp: true }, - preprocess: { - default: { - script: - 'md-magic --config ./scripts/markdown-magic.config.js --path docs/index.md', - description: 'Preprocess documentation', - hiddenFromHelp: true - }, - api: { - script: - 'md-magic --config ./scripts/markdown-magic.config.js --path "docs/api-tutorials/*.md"', - description: 'Preprocess API documentation', - hiddenFromHelp: true - } - }, watch: { - script: 'nps docs.preprocess && eleventy --serve', + script: 'eleventy --serve', description: 'Watch docs for changes & build' }, api: { - script: 'nps docs.preprocess.api && jsdoc -c jsdoc.conf.json', + script: 'jsdoc -c jsdoc.conf.json', description: 'Build API docs' } }, diff --git a/package.json b/package.json index 73b65cfb12..7ceda0d79a 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ }, "devDependencies": { "@11ty/eleventy": "^0.10.0", + "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", "@mocha/docdash": "^2.1.3", "assetgraph-builder": "^8.0.0", "autoprefixer": "^9.7.4", @@ -112,8 +113,6 @@ "markdown-it-attrs": "^3.0.2", "markdown-it-emoji": "^1.4.0", "markdown-it-prism": "^2.0.5", - "markdown-magic": "^1.0.0", - "markdown-magic-package-json": "^2.0.1", "markdown-toc": "^1.2.0", "markdownlint-cli": "^0.22.0", "nps": "^5.9.12", diff --git a/scripts/markdown-magic.config.js b/scripts/markdown-magic.config.js deleted file mode 100644 index f800a5c9f0..0000000000 --- a/scripts/markdown-magic.config.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -/** - * Add autogenerated stuff to our docs (`docs/index.md`) - * @see https://npm.im/markdown-magic - * @private - * @module - */ - -const {execSync} = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const markdownToc = require('markdown-toc'); -const stripAnsi = require('strip-ansi'); - -exports.transforms = { - /** - * Takes STDOUT of some command and injects it into the markdown - */ - usage: (content, options) => { - const {executable} = options; - const flag = options.flag || '--help'; - const header = options.header || '\n```'; - const footer = options.footer || '```\n'; - const output = stripAnsi( - String( - execSync(`"${process.execPath}" ${executable} ${flag}`, { - cwd: path.join(__dirname, '..') - }) - ).trim() - ); - return [header, output, footer].join('\n\n'); - }, - /** - * We can't use the builtin `TOC` plugin in markdown-magic - * because it's simply not flexible enough; we can't pad with newlines, - * nor can we provide a custom filter. the custom filter would be required - * since the `TOC` plugin supplies its own which means we can't use the - * `maxdepth` option, which we need! - */ - toc: (content, options, config) => { - const IGNORED_HEADINGS_REGEXP = /Features|Table of Contents/i; - const toc = markdownToc(config.outputContent, { - slugify: require('uslug'), - bullets: options.bullets, - firsth1: false, - // if filter is supplied, maxdepth is apparently ignored, - // so we have to do it ourselves. - filter: (str, ele) => ele.lvl < 2 && !IGNORED_HEADINGS_REGEXP.test(str) - }).content; - return '\n' + toc + '\n'; - }, - manifest: require('markdown-magic-package-json'), - /** - * Inserts the contents of a file; takes same options as builtin CODE plugin, - * but does not fetch remote URLs, tries to replace relative paths, and - * formats in a way our markdown linter likes. - */ - file: (content, options, config) => { - let output; - if (!options.src) { - return false; - } - const fileDir = path.dirname(config.originalPath); - const filePath = path.join(fileDir, options.src); - const rootDir = path.join(__dirname, '..'); - const relativeDir = path.relative(path.dirname(filePath), rootDir); - - const syntax = options.syntax || path.extname(filePath).replace(/^./, ''); - try { - output = fs.readFileSync(filePath, 'utf8', (err, contents) => { - if (err) { - console.log(`FILE NOT FOUND: ${filePath}`); - throw err; - } - return contents; - }); - } catch (err) { - console.log(`FILE NOT FOUND: ${filePath}`); - throw err; - } - - // replace relative paths in `require()` to root with "mocha". - // might not work in the general case. not gonna parse an AST for this - // e.g. `require('../../lib/foo')` => `require('mocha/lib/foo')` - // also trim any trailing whitespace - output = output - .replace( - new RegExp(`require\\(['"]${relativeDir}(.*?)['"]\\)`, 'g'), - "require('mocha$1')" - ) - .trim(); - - let header = ''; - if (options.header) { - header = `\n${options.header}`; - } - - return ` -\`\`\`${syntax}${header} -${output} -\`\`\` -`; - } -}; From 722ce01268e83ce33f2feef93f25fd65e7b0c2c8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 12:44:24 -0700 Subject: [PATCH 1490/1771] add Root Hook Plugins (documentation will be in another PR) Adds "root hook plugins", a system to define root hooks via files loaded with `--require`. This enables root hooks to work in parallel mode. Because parallel mode runs files in a non-deterministic order, and files do not share a `Mocha` instance, it is not possible to share these hooks with other test files. This change also works well with third-party libraries for Mocha which need the behavior; these can now be trivially consumed by adding `--require` or `require: 'some-library'` in Mocha's config file. The way it works is: 1. When a file is loaded via `--require`, we check to see if that file exports a property named `mochaHooks` (can be multiple files). 1. If it does, we save a reference to the property. 1. After Yargs' validation phase, we use async middleware to execute root hook plugin functions--or if they are objects, just collect them--and we flatten all hooks found into four buckets corresponding to the four hook types. 1. Once `Mocha` is instantiated, if it is given a `rootHooks` option, those hooks are applied to the root suite. This works with parallel tests because we can save a reference to the flattened hooks in each worker process, and a new `Mocha` instance is created with them for each test file. * * * Tangential: - Because a root hook plugin can be defined as an `async` function, I noticed that `utils.type()` does not return `function` for async functions; it returns `asyncfunction`. I've added a (Node-specific, for now) test for this. - `handleRequires` is now `async`, since it will need to be anyway to support ESM and calls to `import()`. - fixed incorrect call to `fs.existsSync()` Ref: #4198 --- lib/cli/run-helpers.js | 60 +++++++-- lib/cli/run.js | 10 +- lib/mocha.js | 49 +++++++ lib/utils.js | 5 +- .../require/root-hook-defs-a.fixture.js | 16 +++ .../require/root-hook-defs-b.fixture.js | 36 +++++ .../require/root-hook-defs-c.fixture.js | 16 +++ .../require/root-hook-defs-d.fixture.js | 36 +++++ .../require/root-hook-test-2.fixture.js | 6 + .../options/require/root-hook-test.fixture.js | 6 + test/integration/options/require.spec.js | 125 ++++++++++++++++++ test/node-unit/cli/run-helpers.spec.js | 67 +++++++++- test/node-unit/utils.spec.js | 10 ++ test/unit/mocha.spec.js | 43 +++++- test/unit/utils.spec.js | 44 ++++-- 15 files changed, 500 insertions(+), 29 deletions(-) create mode 100644 test/integration/fixtures/options/require/root-hook-defs-a.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-defs-b.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-defs-c.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-defs-d.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-test-2.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-test.fixture.js create mode 100644 test/integration/options/require.spec.js diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index ebb0bdd071..172fae654a 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -12,10 +12,9 @@ const path = require('path'); const debug = require('debug')('mocha:cli:run:helpers'); const watchRun = require('./watch-run'); const collectFiles = require('./collect-files'); +const {type} = require('../utils'); const {format} = require('util'); - -const cwd = (exports.cwd = process.cwd()); -const {createInvalidPluginError} = require('../errors'); +const {createInvalidPluginError, createUnsupportedError} = require('../errors'); /** * Exits Mocha when tests + code under test has finished execution (default) @@ -75,20 +74,60 @@ exports.list = str => Array.isArray(str) ? exports.list(str.join(',')) : str.split(/ *, */); /** - * `require()` the modules as required by `--require ` + * `require()` the modules as required by `--require `. + * + * Returns array of `mochaHooks` exports, if any. * @param {string[]} requires - Modules to require + * @returns {Promise} Any root hooks * @private */ -exports.handleRequires = (requires = []) => { - requires.forEach(mod => { +exports.handleRequires = async (requires = []) => + requires.reduce((acc, mod) => { let modpath = mod; - if (fs.existsSync(mod, {cwd}) || fs.existsSync(`${mod}.js`, {cwd})) { + // this is relative to cwd + if (fs.existsSync(mod) || fs.existsSync(`${mod}.js`)) { modpath = path.resolve(mod); - debug('resolved %s to %s', mod, modpath); + debug('resolved required file %s to %s', mod, modpath); + } + const requiredModule = require(modpath); + if (type(requiredModule) === 'object' && requiredModule.mochaHooks) { + const mochaHooksType = type(requiredModule.mochaHooks); + if (/function$/.test(mochaHooksType) || mochaHooksType === 'object') { + debug('found root hooks in required file %s', mod); + acc.push(requiredModule.mochaHooks); + } else { + throw createUnsupportedError( + 'mochaHooks must be an object or a function returning (or fulfilling with) an object' + ); + } } - require(modpath); debug('loaded required module "%s"', mod); - }); + return acc; + }, []); + +/** + * Loads root hooks as exported via `mochaHooks` from required files. + * These can be sync/async functions returning objects, or just objects. + * Flattens to a single object. + * @param {Array} rootHooks - Array of root hooks + * @private + * @returns {MochaRootHookObject} + */ +exports.loadRootHooks = async rootHooks => { + const rootHookObjects = await Promise.all( + rootHooks.map(async hook => (/function$/.test(type(hook)) ? hook() : hook)) + ); + + return rootHookObjects.reduce( + (acc, hook) => { + acc.beforeAll = acc.beforeAll.concat(hook.beforeAll || []); + acc.beforeEach = acc.beforeEach.concat(hook.beforeEach || []); + acc.afterAll = acc.afterAll.concat(hook.afterAll || []); + acc.afterEach = acc.afterEach.concat(hook.afterEach || []); + return acc; + }, + {beforeAll: [], beforeEach: [], afterAll: [], afterEach: []} + ); }; /** @@ -106,6 +145,7 @@ const singleRun = async (mocha, {exit}, fileCollectParams) => { debug('single run with %d file(s)', files.length); mocha.files = files; + // handles ESM modules await mocha.loadFilesAsync(); return mocha.run(exit ? exitMocha : exitMochaLater); }; diff --git a/lib/cli/run.js b/lib/cli/run.js index d024cbb0f2..1bd938b77a 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -18,6 +18,7 @@ const { list, handleRequires, validatePlugin, + loadRootHooks, runMocha } = require('./run-helpers'); const {ONE_AND_DONES, ONE_AND_DONE_ARGS} = require('./one-and-dones'); @@ -285,12 +286,17 @@ exports.builder = yargs => ); } + return true; + }) + .middleware(async argv => { // load requires first, because it can impact "plugin" validation - handleRequires(argv.require); + const rawRootHooks = await handleRequires(argv.require); validatePlugin(argv, 'reporter', Mocha.reporters); validatePlugin(argv, 'ui', Mocha.interfaces); - return true; + if (rawRootHooks.length) { + argv.rootHooks = await loadRootHooks(rawRootHooks); + } }) .array(types.array) .boolean(types.boolean) diff --git a/lib/mocha.js b/lib/mocha.js index 6817ff880b..1ab26958c8 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -118,6 +118,8 @@ exports.Test = require('./test'); * @param {number} [options.slow] - Slow threshold value. * @param {number|string} [options.timeout] - Timeout threshold value. * @param {string} [options.ui] - Interface name. + * @param {MochaRootHookObject} [options.rootHooks] - Hooks to bootstrap the root + * suite with */ function Mocha(options) { options = utils.assign({}, mocharc, options || {}); @@ -165,6 +167,10 @@ function Mocha(options) { this[opt](); } }, this); + + if (options.rootHooks) { + this.rootHooks(options.rootHooks); + } } /** @@ -959,3 +965,46 @@ Mocha.prototype.run = function(fn) { return runner.run(done); }; + +/** + * Assigns hooks to the root suite + * @param {MochaRootHookObject} [hooks] - Hooks to assign to root suite + * @chainable + */ +Mocha.prototype.rootHooks = function rootHooks(hooks) { + if (utils.type(hooks) === 'object') { + var beforeAll = [].concat(hooks.beforeAll || []); + var beforeEach = [].concat(hooks.beforeEach || []); + var afterAll = [].concat(hooks.afterAll || []); + var afterEach = [].concat(hooks.afterEach || []); + var rootSuite = this.suite; + beforeAll.forEach(function(hook) { + rootSuite.beforeAll(hook); + }); + beforeEach.forEach(function(hook) { + rootSuite.beforeEach(hook); + }); + afterAll.forEach(function(hook) { + rootSuite.afterAll(hook); + }); + afterEach.forEach(function(hook) { + rootSuite.afterEach(hook); + }); + } + return this; +}; + +/** + * An alternative way to define root hooks that works with parallel runs. + * @typedef {Object} MochaRootHookObject + * @property {Function|Function[]} [beforeAll] - "Before all" hook(s) + * @property {Function|Function[]} [beforeEach] - "Before each" hook(s) + * @property {Function|Function[]} [afterAll] - "After all" hook(s) + * @property {Function|Function[]} [afterEach] - "After each" hook(s) + */ + +/** + * An function that returns a {@link MochaRootHookObject}, either sync or async. + * @callback MochaRootHookFunction + * @returns {MochaRootHookObject|Promise} + */ diff --git a/lib/utils.js b/lib/utils.js index 4e6b194249..0134247022 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -63,8 +63,9 @@ exports.isString = function(obj) { exports.slug = function(str) { return str .toLowerCase() - .replace(/ +/g, '-') - .replace(/[^-\w]/g, ''); + .replace(/\s+/g, '-') + .replace(/[^-\w]/g, '') + .replace(/-{2,}/g, '-'); }; /** diff --git a/test/integration/fixtures/options/require/root-hook-defs-a.fixture.js b/test/integration/fixtures/options/require/root-hook-defs-a.fixture.js new file mode 100644 index 0000000000..8938816eee --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-a.fixture.js @@ -0,0 +1,16 @@ +'use strict'; + +exports.mochaHooks = { + beforeAll() { + console.log('beforeAll'); + }, + beforeEach() { + console.log('beforeEach'); + }, + afterAll() { + console.log('afterAll'); + }, + afterEach() { + console.log('afterEach'); + } +}; diff --git a/test/integration/fixtures/options/require/root-hook-defs-b.fixture.js b/test/integration/fixtures/options/require/root-hook-defs-b.fixture.js new file mode 100644 index 0000000000..6aa0ed3342 --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-b.fixture.js @@ -0,0 +1,36 @@ +'use strict'; + +exports.mochaHooks = { + beforeAll: [ + function() { + console.log('beforeAll array 1'); + }, + function() { + console.log('beforeAll array 2'); + } + ], + beforeEach: [ + function() { + console.log('beforeEach array 1'); + }, + function() { + console.log('beforeEach array 2'); + } + ], + afterAll: [ + function() { + console.log('afterAll array 1'); + }, + function() { + console.log('afterAll array 2'); + } + ], + afterEach: [ + function() { + console.log('afterEach array 1'); + }, + function() { + console.log('afterEach array 2'); + } + ] +}; diff --git a/test/integration/fixtures/options/require/root-hook-defs-c.fixture.js b/test/integration/fixtures/options/require/root-hook-defs-c.fixture.js new file mode 100644 index 0000000000..624973de75 --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-c.fixture.js @@ -0,0 +1,16 @@ +'use strict'; + +exports.mochaHooks = async () => ({ + beforeAll() { + console.log('beforeAll'); + }, + beforeEach() { + console.log('beforeEach'); + }, + afterAll() { + console.log('afterAll'); + }, + afterEach() { + console.log('afterEach'); + } +}); diff --git a/test/integration/fixtures/options/require/root-hook-defs-d.fixture.js b/test/integration/fixtures/options/require/root-hook-defs-d.fixture.js new file mode 100644 index 0000000000..d073a35fcf --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-d.fixture.js @@ -0,0 +1,36 @@ +'use strict'; + +exports.mochaHooks = async() => ({ + beforeAll: [ + function() { + console.log('beforeAll array 1'); + }, + function() { + console.log('beforeAll array 2'); + } + ], + beforeEach: [ + function() { + console.log('beforeEach array 1'); + }, + function() { + console.log('beforeEach array 2'); + } + ], + afterAll: [ + function() { + console.log('afterAll array 1'); + }, + function() { + console.log('afterAll array 2'); + } + ], + afterEach: [ + function() { + console.log('afterEach array 1'); + }, + function() { + console.log('afterEach array 2'); + } + ] +}); diff --git a/test/integration/fixtures/options/require/root-hook-test-2.fixture.js b/test/integration/fixtures/options/require/root-hook-test-2.fixture.js new file mode 100644 index 0000000000..4d00018d2c --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-test-2.fixture.js @@ -0,0 +1,6 @@ +// run with --require root-hook-defs-a.fixture.js --require +// root-hook-defs-b.fixture.js + +it('should also have some root hooks', function() { + // test +}); \ No newline at end of file diff --git a/test/integration/fixtures/options/require/root-hook-test.fixture.js b/test/integration/fixtures/options/require/root-hook-test.fixture.js new file mode 100644 index 0000000000..412895c87c --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-test.fixture.js @@ -0,0 +1,6 @@ +// run with --require root-hook-defs-a.fixture.js --require +// root-hook-defs-b.fixture.js + +it('should have some root hooks', function() { + // test +}); \ No newline at end of file diff --git a/test/integration/options/require.spec.js b/test/integration/options/require.spec.js new file mode 100644 index 0000000000..ca50af8607 --- /dev/null +++ b/test/integration/options/require.spec.js @@ -0,0 +1,125 @@ +'use strict'; + +var invokeMochaAsync = require('../helpers').invokeMochaAsync; + +describe('--require', function() { + describe('when mocha run in serial mode', function() { + it('should run root hooks when provided via mochaHooks object export', function() { + return expect( + invokeMochaAsync([ + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-a.fixture.js' + ), + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-b.fixture.js' + ), + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ) + ])[1], + 'when fulfilled', + 'to contain output', + /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ); + }); + + it('should run root hooks when provided via mochaHooks function export', function() { + return expect( + invokeMochaAsync([ + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-c.fixture.js' + ), + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-d.fixture.js' + ), + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ) + ])[1], + 'when fulfilled', + 'to contain output', + /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ); + }); + }); + + describe('when mocha in parallel mode', function() { + before(function() { + this.skip(); // TODO: remove when #4245 lands + }); + it('should run root hooks when provided via mochaHooks object exports', function() { + return expect( + invokeMochaAsync([ + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-a.fixture.js' + ), + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-b.fixture.js' + ), + '--parallel', + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ) + ])[1], + 'when fulfilled', + 'to contain output', + /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ); + }); + + it('should run root hooks when provided via mochaHooks function export', function() { + return expect( + invokeMochaAsync([ + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-c.fixture.js' + ), + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-d.fixture.js' + ), + '--parallel', + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ) + ])[1], + 'when fulfilled', + 'to contain output', + /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ); + }); + + describe('when running multiple jobs', function() { + it('should run root hooks when provided via mochaHooks object exports for each job', function() { + return expect( + invokeMochaAsync([ + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-a.fixture.js' + ), + '--require=' + + require.resolve( + '../fixtures/options/require/root-hook-defs-b.fixture.js' + ), + '--parallel', + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ), + require.resolve( + '../fixtures/options/require/root-hook-test-2.fixture.js' + ) + ])[1], + 'when fulfilled', + 'to contain output', + /(?:beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2[\s\S]+?){2}/ + ); + }); + }); + }); +}); diff --git a/test/node-unit/cli/run-helpers.spec.js b/test/node-unit/cli/run-helpers.spec.js index 00357bbcb5..3169bbd0bb 100644 --- a/test/node-unit/cli/run-helpers.spec.js +++ b/test/node-unit/cli/run-helpers.spec.js @@ -1,8 +1,71 @@ 'use strict'; -const {validatePlugin, list} = require('../../../lib/cli/run-helpers'); +const { + validatePlugin, + list, + loadRootHooks +} = require('../../../lib/cli/run-helpers'); + +describe('helpers', function() { + describe('loadRootHooks()', function() { + describe('when passed nothing', function() { + it('should reject', async function() { + return expect(loadRootHooks(), 'to be rejected'); + }); + }); + + describe('when passed empty array of hooks', function() { + it('should return an empty MochaRootHooks object', async function() { + return expect(loadRootHooks([]), 'to be fulfilled with', { + beforeAll: [], + beforeEach: [], + afterAll: [], + afterEach: [] + }); + }); + }); + + describe('when passed an array containing hook objects and sync functions and async functions', function() { + it('should flatten them into a single object', async function() { + function a() {} + function b() {} + function d() {} + function g() {} + async function f() {} + function c() { + return { + beforeAll: d, + beforeEach: g + }; + } + async function e() { + return { + afterEach: f + }; + } + return expect( + loadRootHooks([ + { + beforeEach: a + }, + { + afterAll: b + }, + c, + e + ]), + 'to be fulfilled with', + { + beforeAll: [d], + beforeEach: [a, g], + afterAll: [b], + afterEach: [f] + } + ); + }); + }); + }); -describe('run helper functions', function() { describe('validatePlugin()', function() { describe('when used with "reporter" key', function() { it('should disallow an array of names', function() { diff --git a/test/node-unit/utils.spec.js b/test/node-unit/utils.spec.js index c0b6294450..720e93f6c3 100644 --- a/test/node-unit/utils.spec.js +++ b/test/node-unit/utils.spec.js @@ -16,5 +16,15 @@ describe('utils', function() { expect(utils.cwd(), 'to be', process.cwd()); }); }); + + describe('type()', function() { + it('should return "asyncfunction" if the parameter is an async function', function() { + expect( + utils.type(async () => {}), + 'to be', + 'asyncfunction' + ); + }); + }); }); }); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 96aad6e66c..5fb0263ec1 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -91,9 +91,16 @@ describe('Mocha', function() { }); describe('constructor', function() { + var mocha; + beforeEach(function() { + mocha = sandbox.createStubInstance(Mocha); + mocha.timeout.returnsThis(); + mocha.retries.returnsThis(); sandbox.stub(Mocha.prototype, 'timeout').returnsThis(); sandbox.stub(Mocha.prototype, 'global').returnsThis(); + sandbox.stub(Mocha.prototype, 'retries').returnsThis(); + sandbox.stub(Mocha.prototype, 'rootHooks').returnsThis(); }); it('should set _cleanReferencesAfterRun to true', function() { @@ -108,8 +115,8 @@ describe('Mocha', function() { }); }); - describe('when `timeout` is `false`', function() { - it('should set a timeout of 0', function() { + describe('when `timeout` option is `false`', function() { + it('should attempt to set timeout', function() { // eslint-disable-next-line no-new new Mocha({timeout: false}); expect(Mocha.prototype.timeout, 'to have a call satisfying', [0]).and( @@ -118,8 +125,8 @@ describe('Mocha', function() { }); }); - describe('when `global` option is provided', function() { - it('should configure `global` option', function() { + describe('when `global` option is an `Array`', function() { + it('should attempt to set globals', function() { // eslint-disable-next-line no-new new Mocha({global: ['singular']}); expect(Mocha.prototype.global, 'to have a call satisfying', [ @@ -127,6 +134,34 @@ describe('Mocha', function() { ]).and('was called once'); }); }); + + describe('when `retries` option is present', function() { + it('should attempt to set retries`', function() { + // eslint-disable-next-line no-new + new Mocha({retries: 1}); + expect(Mocha.prototype.retries, 'to have a call satisfying', [1]).and( + 'was called once' + ); + }); + }); + + describe('when `retries` option is not present', function() { + it('should not attempt to set retries', function() { + // eslint-disable-next-line no-new + new Mocha({}); + expect(Mocha.prototype.retries, 'was not called'); + }); + }); + + describe('when `rootHooks` option is truthy', function() { + it('shouid attempt to set root hooks', function() { + // eslint-disable-next-line no-new + new Mocha({rootHooks: ['a root hook']}); + expect(Mocha.prototype.rootHooks, 'to have a call satisfying', [ + ['a root hook'] + ]).and('was called once'); + }); + }); }); describe('instance method', function() { diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 3c68ddd186..a54535b1a5 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -14,7 +14,7 @@ describe('lib/utils', function() { sandbox.restore(); }); - describe('clean', function() { + describe('clean()', function() { it('should remove the wrapping function declaration', function() { expect( utils.clean('function (one, two, three) {\n//code\n}'), @@ -149,7 +149,7 @@ describe('lib/utils', function() { }); }); - describe('stringify', function() { + describe('stringify()', function() { var stringify = utils.stringify; it('should return an object representation of a string created with a String constructor', function() { @@ -525,7 +525,7 @@ describe('lib/utils', function() { }); }); - describe('type', function() { + describe('type()', function() { /* eslint no-extend-native: off */ var type = utils.type; @@ -588,7 +588,7 @@ describe('lib/utils', function() { }); }); - describe('isPromise', function() { + describe('isPromise()', function() { it('should return true if the value is Promise-ish', function() { expect( utils.isPromise({ @@ -612,7 +612,7 @@ describe('lib/utils', function() { }); }); - describe('escape', function() { + describe('escape()', function() { it('replaces the usual xml suspects', function() { expect(utils.escape('a>bc>d>'), 'to be', '>a>bc>d>'); @@ -634,7 +634,7 @@ describe('lib/utils', function() { }); }); - describe('deprecate', function() { + describe('deprecate()', function() { var emitWarning; beforeEach(function() { @@ -674,7 +674,7 @@ describe('lib/utils', function() { }); }); - describe('warn', function() { + describe('warn()', function() { var emitWarning; beforeEach(function() { @@ -710,13 +710,17 @@ describe('lib/utils', function() { }); }); - describe('sQuote/dQuote', function() { + describe('sQuote()', function() { var str = 'xxx'; it('should return its input as string wrapped in single quotes', function() { var expected = "'xxx'"; expect(utils.sQuote(str), 'to be', expected); }); + }); + + describe('dQuote()', function() { + var str = 'xxx'; it('should return its input as string wrapped in double quotes', function() { var expected = '"xxx"'; @@ -724,7 +728,7 @@ describe('lib/utils', function() { }); }); - describe('createMap', function() { + describe('createMap()', function() { it('should return an object with a null prototype', function() { expect(Object.getPrototypeOf(utils.createMap()), 'to be', null); }); @@ -743,4 +747,26 @@ describe('lib/utils', function() { ); }); }); + + describe('slug()', function() { + it('should convert the string to lowercase', function() { + expect(utils.slug('FOO'), 'to be', 'foo'); + }); + + it('should convert whitespace to dashes', function() { + expect( + utils.slug('peanut butter\nand\tjelly'), + 'to be', + 'peanut-butter-and-jelly' + ); + }); + + it('should strip non-alphanumeric and non-dash characters', function() { + expect(utils.slug('murder-hornets!!'), 'to be', 'murder-hornets'); + }); + + it('should disallow consecutive dashes', function() { + expect(utils.slug('poppies & fritz'), 'to be', 'poppies-fritz'); + }); + }); }); From cb5eb8ed42abfd0d63c5013353843f1208ff6582 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 20 May 2020 12:08:37 -0700 Subject: [PATCH 1491/1771] multiple async done() calls result in failure; closes #4151 (#4152) - added a method in `errors` module to create a "multiple done" err - modernize `multiple-done.spec.js` - refactor errors into constants in `errors` module - remove `Runner#started` prop; replace with `Runner#state` prop + constants - add a catchall `createFatalError()` function to `errors` module; this is called when a test fails twice by other means (unsure what those means are yet) - force color in Travis CI b/c my eyes - remove `Runner#uncaughtEnd`; move logic to `Runner#uncaught`, since we can now rely on the value of `Runner#state`. - upgrade `unexpected-eventemitter` - fix potential listener leak in `Runner#run` --- lib/cli/collect-files.js | 3 +- lib/errors.js | 140 +++++++++++++++-- lib/runnable.js | 23 ++- lib/runner.js | 97 ++++++++---- package-lock.json | 6 +- package-scripts.js | 3 + package.json | 2 +- .../fixtures/multiple-done-async.fixture.js | 20 +++ ...s => multiple-done-before-each.fixture.js} | 0 .../fixtures/uncaught/listeners.fixture.js | 6 +- test/integration/multiple-done.spec.js | 148 +++++++++++------- test/unit/runnable.spec.js | 10 +- test/unit/runner.spec.js | 115 +++++++++++++- 13 files changed, 438 insertions(+), 135 deletions(-) create mode 100644 test/integration/fixtures/multiple-done-async.fixture.js rename test/integration/fixtures/{multiple-done-beforeEach.fixture.js => multiple-done-before-each.fixture.js} (100%) diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js index 61d54ac4b3..4145f4333c 100644 --- a/lib/cli/collect-files.js +++ b/lib/cli/collect-files.js @@ -5,6 +5,7 @@ const ansi = require('ansi-colors'); const debug = require('debug')('mocha:cli:run:helpers'); const minimatch = require('minimatch'); const utils = require('../utils'); +const {NO_FILES_MATCH_PATTERN} = require('../errors').constants; /** * Exports a function that collects test files from CLI parameters. @@ -34,7 +35,7 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { try { newFiles = utils.lookupFiles(arg, extension, recursive); } catch (err) { - if (err.code === 'ERR_MOCHA_NO_FILES_MATCH_PATTERN') { + if (err.code === NO_FILES_MATCH_PATTERN) { unmatched.push({message: err.message, pattern: err.pattern}); return; } diff --git a/lib/errors.js b/lib/errors.js index a85c8c24b9..1e665e5fb3 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -1,10 +1,73 @@ 'use strict'; + +var format = require('util').format; + /** + * Factory functions to create throwable error objects * @module Errors */ + /** - * Factory functions to create throwable error objects + * When Mocha throw exceptions (or otherwise errors), it attempts to assign a + * `code` property to the `Error` object, for easier handling. These are the + * potential values of `code`. */ +var constants = { + /** + * An unrecoverable error. + */ + FATAL: 'ERR_MOCHA_FATAL', + + /** + * The type of an argument to a function call is invalid + */ + INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE', + + /** + * The value of an argument to a function call is invalid + */ + INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE', + + /** + * Something was thrown, but it wasn't an `Error` + */ + INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION', + + /** + * An interface (e.g., `Mocha.interfaces`) is unknown or invalid + */ + INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE', + + /** + * A reporter (.e.g, `Mocha.reporters`) is unknown or invalid + */ + INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER', + + /** + * `done()` was called twice in a `Test` or `Hook` callback + */ + MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE', + + /** + * No files matched the pattern provided by the user + */ + NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN', + + /** + * Known, but unsupported behavior of some kind + */ + UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED', + + /** + * Invalid state transition occuring in `Mocha` instance + */ + INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', + + /** + * Invalid state transition occuring in `Mocha` instance + */ + INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED' +}; /** * Creates an error object to be thrown when no files to be tested could be found using specified pattern. @@ -16,7 +79,7 @@ */ function createNoFilesMatchPatternError(message, pattern) { var err = new Error(message); - err.code = 'ERR_MOCHA_NO_FILES_MATCH_PATTERN'; + err.code = constants.NO_FILES_MATCH_PATTERN; err.pattern = pattern; return err; } @@ -31,7 +94,7 @@ function createNoFilesMatchPatternError(message, pattern) { */ function createInvalidReporterError(message, reporter) { var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_REPORTER'; + err.code = constants.INVALID_REPORTER; err.reporter = reporter; return err; } @@ -46,7 +109,7 @@ function createInvalidReporterError(message, reporter) { */ function createInvalidInterfaceError(message, ui) { var err = new Error(message); - err.code = 'ERR_MOCHA_INVALID_INTERFACE'; + err.code = constants.INVALID_INTERFACE; err.interface = ui; return err; } @@ -60,7 +123,7 @@ function createInvalidInterfaceError(message, ui) { */ function createUnsupportedError(message) { var err = new Error(message); - err.code = 'ERR_MOCHA_UNSUPPORTED'; + err.code = constants.UNSUPPORTED; return err; } @@ -88,7 +151,7 @@ function createMissingArgumentError(message, argument, expected) { */ function createInvalidArgumentTypeError(message, argument, expected) { var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_ARG_TYPE'; + err.code = constants.INVALID_ARG_TYPE; err.argument = argument; err.expected = expected; err.actual = typeof argument; @@ -107,7 +170,7 @@ function createInvalidArgumentTypeError(message, argument, expected) { */ function createInvalidArgumentValueError(message, argument, value, reason) { var err = new TypeError(message); - err.code = 'ERR_MOCHA_INVALID_ARG_VALUE'; + err.code = constants.INVALID_ARG_VALUE; err.argument = argument; err.value = value; err.reason = typeof reason !== 'undefined' ? reason : 'is invalid'; @@ -123,7 +186,22 @@ function createInvalidArgumentValueError(message, argument, value, reason) { */ function createInvalidExceptionError(message, value) { var err = new Error(message); - err.code = 'ERR_MOCHA_INVALID_EXCEPTION'; + err.code = constants.INVALID_EXCEPTION; + err.valueType = typeof value; + err.value = value; + return err; +} + +/** + * Creates an error object to be thrown when an unrecoverable error occurs. + * + * @public + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ +function createFatalError(message, value) { + var err = new Error(message); + err.code = constants.FATAL; err.valueType = typeof value; err.value = value; return err; @@ -161,7 +239,7 @@ function createMochaInstanceAlreadyDisposedError( instance ) { var err = new Error(message); - err.code = 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED'; + err.code = constants.INSTANCE_ALREADY_DISPOSED; err.cleanReferencesAfterRun = cleanReferencesAfterRun; err.instance = instance; return err; @@ -173,11 +251,48 @@ function createMochaInstanceAlreadyDisposedError( */ function createMochaInstanceAlreadyRunningError(message, instance) { var err = new Error(message); - err.code = 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING'; + err.code = constants.INSTANCE_ALREADY_RUNNING; err.instance = instance; return err; } +/* + * Creates an error object to be thrown when done() is called multiple times in a test + * + * @public + * @param {Runnable} runnable - Original runnable + * @param {Error} [originalErr] - Original error, if any + * @returns {Error} instance detailing the error condition + */ +function createMultipleDoneError(runnable, originalErr) { + var title; + try { + title = format('<%s>', runnable.fullTitle()); + if (runnable.parent.root) { + title += ' (of root suite)'; + } + } catch (ignored) { + title = format('<%s> (of unknown suite)', runnable.title); + } + var message = format( + 'done() called multiple times in %s %s', + runnable.type ? runnable.type : 'unknown runnable', + title + ); + if (runnable.file) { + message += format(' of file %s', runnable.file); + } + if (originalErr) { + message += format('; in addition, done() received error: %s', originalErr); + } + + var err = new Error(message); + err.code = constants.MULTIPLE_DONE; + err.valueType = typeof originalErr; + err.value = originalErr; + return err; +} + module.exports = { createInvalidArgumentTypeError: createInvalidArgumentTypeError, createInvalidArgumentValueError: createInvalidArgumentValueError, @@ -189,5 +304,8 @@ module.exports = { createUnsupportedError: createUnsupportedError, createInvalidPluginError: createInvalidPluginError, createMochaInstanceAlreadyDisposedError: createMochaInstanceAlreadyDisposedError, - createMochaInstanceAlreadyRunningError: createMochaInstanceAlreadyRunningError + createMochaInstanceAlreadyRunningError: createMochaInstanceAlreadyRunningError, + createFatalError: createFatalError, + createMultipleDoneError: createMultipleDoneError, + constants: constants }; diff --git a/lib/runnable.js b/lib/runnable.js index 4d58070f5d..342152c3c2 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -5,8 +5,9 @@ var Pending = require('./pending'); var debug = require('debug')('mocha:runnable'); var milliseconds = require('ms'); var utils = require('./utils'); -var createInvalidExceptionError = require('./errors') - .createInvalidExceptionError; +var errors = require('./errors'); +var createInvalidExceptionError = errors.createInvalidExceptionError; +var createMultipleDoneError = errors.createMultipleDoneError; /** * Save timer references to avoid Sinon interfering (see GH-237). @@ -262,7 +263,7 @@ Runnable.prototype.run = function(fn) { var start = new Date(); var ctx = this.ctx; var finished; - var emitted; + var errorWasHandled = false; if (this.isPending()) return fn(); @@ -273,17 +274,11 @@ Runnable.prototype.run = function(fn) { // called multiple times function multiple(err) { - if (emitted) { + if (errorWasHandled) { return; } - emitted = true; - var msg = 'done() called multiple times'; - if (err && err.message) { - err.message += " (and Mocha's " + msg + ')'; - self.emit('error', err); - } else { - self.emit('error', new Error(msg)); - } + errorWasHandled = true; + self.emit('error', createMultipleDoneError(self, err)); } // finished @@ -334,7 +329,7 @@ Runnable.prototype.run = function(fn) { callFnAsync(this.fn); } catch (err) { // handles async runnables which actually run synchronously - emitted = true; + errorWasHandled = true; if (err instanceof Pending) { return; // done() is already called in this.skip() } else if (this.allowUncaught) { @@ -349,7 +344,7 @@ Runnable.prototype.run = function(fn) { try { callFn(this.fn); } catch (err) { - emitted = true; + errorWasHandled = true; if (err instanceof Pending) { return done(); } else if (this.allowUncaught) { diff --git a/lib/runner.js b/lib/runner.js index 7eabb5a1cf..3c857294f7 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -27,6 +27,7 @@ var type = utils.type; var errors = require('./errors'); var createInvalidExceptionError = errors.createInvalidExceptionError; var createUnsupportedError = errors.createUnsupportedError; +var createFatalError = errors.createFatalError; /** * Non-enumerable globals. @@ -109,7 +110,19 @@ var constants = utils.defineConstants( /** * Emitted when {@link Test} execution has failed, but will retry */ - EVENT_TEST_RETRY: 'retry' + EVENT_TEST_RETRY: 'retry', + /** + * Initial state of Runner + */ + STATE_IDLE: 'idle', + /** + * State set to this value when the Runner has started running + */ + STATE_RUNNING: 'running', + /** + * State set to this value when the Runner has stopped + */ + STATE_STOPPED: 'stopped' } ); @@ -140,8 +153,8 @@ function Runner(suite, opts) { this._globals = []; this._abort = false; this.suite = suite; - this.started = false; this._opts = opts; + this.state = constants.STATE_IDLE; this.total = suite.total(); this.failures = 0; this._eventListeners = []; @@ -159,6 +172,8 @@ function Runner(suite, opts) { this._defaultGrep = /.*/; this.grep(this._defaultGrep); this.globals(this.globalProps()); + + this.uncaught = this._uncaught.bind(this); } /** @@ -176,9 +191,9 @@ inherits(Runner, EventEmitter); /** * Replacement for `target.on(eventName, listener)` that does bookkeeping to remove them when this runner instance is disposed. - * @param target {EventEmitter} - * @param eventName {string} - * @param fn {function} + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event name + * @param {string} fn - Listener function */ Runner.prototype._addEventListener = function(target, eventName, listener) { target.on(eventName, listener); @@ -187,9 +202,9 @@ Runner.prototype._addEventListener = function(target, eventName, listener) { /** * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping. - * @param target {EventEmitter} - * @param eventName {string} - * @param fn {function} + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event anme + * @param {function} listener - Listener function */ Runner.prototype._removeEventListener = function(target, eventName, listener) { var eventListenerIndex = -1; @@ -351,8 +366,18 @@ Runner.prototype.fail = function(test, err, force) { if (test.isPending() && !force) { return; } + if (this.state === constants.STATE_STOPPED) { + if (err.code === errors.constants.MULTIPLE_DONE) { + throw err; + } + throw createFatalError( + 'Test failed after root suite execution completed!', + err + ); + } ++this.failures; + debug('total number of failures: %d', this.failures); test.state = STATE_FAILED; if (!isError(err)) { @@ -844,10 +869,30 @@ Runner.prototype.runSuite = function(suite, fn) { /** * Handle uncaught exceptions within runner. * - * @param {Error} err + * This function is bound to the instance as `Runner#uncaught` at instantiation + * time. It's intended to be listening on the `Process.uncaughtException` event. + * In order to not leak EE listeners, we need to ensure no more than a single + * `uncaughtException` listener exists per `Runner`. The only way to do + * this--because this function needs the context (and we don't have lambdas)--is + * to use `Function.prototype.bind`. We need strict equality to unregister and + * _only_ unregister the _one_ listener we set from the + * `Process.uncaughtException` event; would be poor form to just remove + * everything. See {@link Runner#run} for where the event listener is registered + * and unregistered. + * @param {Error} err - Some uncaught error * @private */ -Runner.prototype.uncaught = function(err) { +Runner.prototype._uncaught = function(err) { + // this is defensive to prevent future developers from mis-calling this function. + // it's more likely that it'd be called with the incorrect context--say, the global + // `process` object--than it would to be called with a context that is not a "subclass" + // of `Runner`. + if (!(this instanceof Runner)) { + throw createFatalError( + 'Runner#uncaught() called with invalid context', + this + ); + } if (err instanceof Pending) { debug('uncaught(): caught a Pending'); return; @@ -858,6 +903,11 @@ Runner.prototype.uncaught = function(err) { throw err; } + if (this.state === constants.STATE_STOPPED) { + debug('uncaught(): throwing after run has completed!'); + throw err; + } + if (err) { debug('uncaught(): got truthy exception %O', err); } else { @@ -881,7 +931,7 @@ Runner.prototype.uncaught = function(err) { debug('uncaught(): no current Runnable; created a phony one'); runnable.parent = this.suite; - if (this.started) { + if (this.state === constants.STATE_RUNNING) { debug('uncaught(): failing gracefully'); this.fail(runnable, err); } else { @@ -920,17 +970,6 @@ Runner.prototype.uncaught = function(err) { } }; -/** - * Handle uncaught exceptions after runner's end event. - * - * @param {Error} err - * @private - */ -Runner.prototype.uncaughtEnd = function uncaughtEnd(err) { - if (err instanceof Pending) return; - throw err; -}; - /** * Run the root suite and invoke `fn(failures)` * on completion. @@ -946,10 +985,6 @@ Runner.prototype.run = function(fn) { fn = fn || function() {}; - function uncaught(err) { - self.uncaught(err); - } - function start() { debug('run(): starting'); // If there is an `only` filter @@ -957,7 +992,7 @@ Runner.prototype.run = function(fn) { rootSuite.filterOnly(); debug('run(): filtered exclusive Runnables'); } - self.started = true; + self.state = constants.STATE_RUNNING; if (self._delay) { self.emit(constants.EVENT_DELAY_END); debug('run(): "delay" ended'); @@ -985,16 +1020,14 @@ Runner.prototype.run = function(fn) { // callback this.on(constants.EVENT_RUN_END, function() { + self.state = constants.STATE_STOPPED; debug(constants.EVENT_RUN_END); - self._removeEventListener(process, 'uncaughtException', uncaught); - self._addEventListener(process, 'uncaughtException', self.uncaughtEnd); debug('run(): emitted %s', constants.EVENT_RUN_END); fn(self.failures); }); - // uncaught exception - self._removeEventListener(process, 'uncaughtException', self.uncaughtEnd); - self._addEventListener(process, 'uncaughtException', uncaught); + self._removeEventListener(process, 'uncaughtException', self.uncaught); + self._addEventListener(process, 'uncaughtException', self.uncaught); if (this._delay) { // for reporters, I guess. diff --git a/package-lock.json b/package-lock.json index d848f8692e..71777a3890 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17440,9 +17440,9 @@ "dev": true }, "unexpected-eventemitter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unexpected-eventemitter/-/unexpected-eventemitter-1.1.3.tgz", - "integrity": "sha512-30MfVuCOCSEvUzNUErYZ3ZzLiPOgADcJsyxi+0Z5bhwgI/Yv4xHR/2v/YEe2alaEXDdkteCQ4gLBfa5/J2iTPA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unexpected-eventemitter/-/unexpected-eventemitter-2.2.0.tgz", + "integrity": "sha512-ciEWOd9kJ9sgyzP8Sai9VdMDiGeoKjeaovyzIUgGw82o0OW1/LbLD2Cf8Cs6cBrtLQdzElBFOe8veMt/bSC49g==", "dev": true }, "unexpected-sinon": { diff --git a/package-scripts.js b/package-scripts.js index f3775db177..7662053795 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -15,6 +15,9 @@ function test(testName, mochaParams) { if (process.env.CI && !/^only-/.test(testName)) { mochaParams += ' --forbid-only'; } + if (process.env.TRAVIS) { + mochaParams += ' --color'; // force color in travis-ci + } return `${ process.env.COVERAGE ? coverageCommand : '' } ${mochaCommand} ${mochaParams}`.trim(); diff --git a/package.json b/package.json index 7ceda0d79a..42df478855 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "through2": "^3.0.1", "to-vfile": "^6.1.0", "unexpected": "^11.13.0", - "unexpected-eventemitter": "^1.1.3", + "unexpected-eventemitter": "^2.2.0", "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", "watchify": "^3.11.1" diff --git a/test/integration/fixtures/multiple-done-async.fixture.js b/test/integration/fixtures/multiple-done-async.fixture.js new file mode 100644 index 0000000000..36f0dd336d --- /dev/null +++ b/test/integration/fixtures/multiple-done-async.fixture.js @@ -0,0 +1,20 @@ +'use strict'; + +// The suite below should result in an additional error, but does +// not. Uncomment once this bug is resolved. + +// describe('suite', function() { +// beforeEach(function(done) { +// done(); +// done(); +// }); + +// it('test', function() {}); +// }); + +it('should fail in an async test case', function (done) { + process.nextTick(function () { + done(); + setTimeout(done); + }); +}); diff --git a/test/integration/fixtures/multiple-done-beforeEach.fixture.js b/test/integration/fixtures/multiple-done-before-each.fixture.js similarity index 100% rename from test/integration/fixtures/multiple-done-beforeEach.fixture.js rename to test/integration/fixtures/multiple-done-before-each.fixture.js diff --git a/test/integration/fixtures/uncaught/listeners.fixture.js b/test/integration/fixtures/uncaught/listeners.fixture.js index 69c4059294..fa7ba4106d 100644 --- a/test/integration/fixtures/uncaught/listeners.fixture.js +++ b/test/integration/fixtures/uncaught/listeners.fixture.js @@ -1,13 +1,13 @@ 'use strict'; const assert = require('assert'); -const mocha = require("../../../../lib/mocha"); +const mocha = require('../../../../lib/mocha'); // keep this low to avoid warning for (let i = 0; i < 5; i++) { - const r = new mocha.Runner(new mocha.Suite("" + i, undefined)); + const r = new mocha.Runner(new mocha.Suite('' + i, undefined)); r.run(); } assert.equal(process.listenerCount('uncaughtException'), 1); -assert.equal(process.listeners('uncaughtException')[0].name, 'uncaughtEnd'); +assert.equal(process.listeners('uncaughtException')[0].name, 'uncaught'); diff --git a/test/integration/multiple-done.spec.js b/test/integration/multiple-done.spec.js index 5b592c8877..2019df25c5 100644 --- a/test/integration/multiple-done.spec.js +++ b/test/integration/multiple-done.spec.js @@ -1,129 +1,159 @@ 'use strict'; -var assert = require('assert'); -var run = require('./helpers').runMochaJSON; -var args = []; +var runMochaJSON = require('./helpers').runMochaJSON; +var invokeMocha = require('./helpers').invokeMocha; +var MULTIPLE_DONE = require('../../lib/errors').constants.MULTIPLE_DONE; describe('multiple calls to done()', function() { var res; describe('from a spec', function() { before(function(done) { - run('multiple-done.fixture.js', args, function(err, result) { + runMochaJSON('multiple-done', function(err, result) { res = result; done(err); }); }); - it('results in failures', function() { - assert.strictEqual(res.stats.pending, 0, 'wrong "pending" count'); - assert.strictEqual(res.stats.passes, 1, 'wrong "passes" count'); - assert.strictEqual(res.stats.failures, 1, 'wrong "failures" count'); + it('results in failure', function() { + expect(res, 'to have failed test count', 1) + .and('to have passed test count', 1) + .and('to have pending test count', 0) + .and('to have failed'); }); it('throws a descriptive error', function() { - assert.strictEqual( - res.failures[0].err.message, - 'done() called multiple times' - ); + expect(res, 'to have failed with error', { + message: /done\(\) called multiple times in test \(of root suite\) of file.+multiple-done\.fixture\.js/, + code: MULTIPLE_DONE + }); }); }); describe('with error passed on second call', function() { before(function(done) { - run('multiple-done-with-error.fixture.js', args, function(err, result) { + runMochaJSON('multiple-done-with-error', function(err, result) { res = result; done(err); }); }); - it('results in failures', function() { - assert.strictEqual(res.stats.pending, 0, 'wrong "pending" count'); - assert.strictEqual(res.stats.passes, 1, 'wrong "passes" count'); - assert.strictEqual(res.stats.failures, 1, 'wrong "failures" count'); + it('results in failure', function() { + expect(res, 'to have failed test count', 1) + .and('to have passed test count', 1) + .and('to have pending test count', 0) + .and('to have failed'); }); it('should throw a descriptive error', function() { - assert.strictEqual( - res.failures[0].err.message, - "second error (and Mocha's done() called multiple times)" - ); + expect(res, 'to have failed with error', { + message: /done\(\) called multiple times in test \(of root suite\) of file.+multiple-done-with-error\.fixture\.js; in addition, done\(\) received error: Error: second error/, + code: MULTIPLE_DONE + }); }); }); describe('with multiple specs', function() { before(function(done) { - run('multiple-done-specs.fixture.js', args, function(err, result) { + runMochaJSON('multiple-done-specs', function(err, result) { res = result; done(err); }); }); - it('results in a failure', function() { - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 2); - assert.strictEqual(res.stats.failures, 1); - assert.strictEqual(res.code, 1); + it('results in failure', function() { + expect(res, 'to have failed test count', 1) + .and('to have passed test count', 2) + .and('to have pending test count', 0) + .and('to have failed'); }); it('correctly attributes the error', function() { - assert.strictEqual(res.failures[0].fullTitle, 'suite test1'); - assert.strictEqual( - res.failures[0].err.message, - 'done() called multiple times' - ); + expect(res.failures[0], 'to satisfy', { + fullTitle: 'suite test1', + err: { + message: /done\(\) called multiple times in test of file.+multiple-done-specs\.fixture\.js/, + code: MULTIPLE_DONE + } + }); }); }); describe('from a before hook', function() { before(function(done) { - run('multiple-done-before.fixture.js', args, function(err, result) { + runMochaJSON('multiple-done-before', function(err, result) { res = result; done(err); }); }); - it('results in a failure', function() { - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 1); - assert.strictEqual(res.stats.failures, 1); - assert.strictEqual(res.code, 1); + it('results in failure', function() { + expect(res, 'to have failed test count', 1) + .and('to have passed test count', 1) + .and('to have pending test count', 0) + .and('to have failed'); }); it('correctly attributes the error', function() { - assert.strictEqual( - res.failures[0].fullTitle, - 'suite "before all" hook in "suite"' - ); - assert.strictEqual( - res.failures[0].err.message, - 'done() called multiple times' - ); + expect(res.failures[0], 'to satisfy', { + fullTitle: 'suite "before all" hook in "suite"', + err: { + message: /done\(\) called multiple times in hook of file.+multiple-done-before\.fixture\.js/ + } + }); }); }); - describe('from a beforeEach hook', function() { + describe('from a "before each" hook', function() { before(function(done) { - run('multiple-done-beforeEach.fixture.js', args, function(err, result) { + runMochaJSON('multiple-done-before-each', function(err, result) { res = result; done(err); }); }); it('results in a failure', function() { - assert.strictEqual(res.stats.pending, 0); - assert.strictEqual(res.stats.passes, 2); - assert.strictEqual(res.stats.failures, 2); - assert.strictEqual(res.code, 2); + expect(res, 'to have failed test count', 2) + .and('to have passed test count', 2) + .and('to have pending test count', 0) + .and('to have exit code', 2); }); it('correctly attributes the errors', function() { - assert.strictEqual(res.failures.length, 2); - res.failures.forEach(function(failure) { - assert.strictEqual( - failure.fullTitle, - 'suite "before each" hook in "suite"' - ); - assert.strictEqual(failure.err.message, 'done() called multiple times'); + expect(res.failures, 'to satisfy', [ + { + fullTitle: 'suite "before each" hook in "suite"', + err: { + message: /done\(\) called multiple times in hook of file.+multiple-done-before-each\.fixture\.js/ + } + }, + { + fullTitle: 'suite "before each" hook in "suite"', + err: { + message: /done\(\) called multiple times in hook of file.+multiple-done-before-each\.fixture\.js/ + } + } + ]); + }); + }); + + describe('when done() called asynchronously', function() { + before(function(done) { + // we can't be sure that mocha won't fail with an uncaught exception here, which would cause any JSON + // output to be befouled; we need to run "raw" and capture STDERR + invokeMocha( + require.resolve('./fixtures/multiple-done-async.fixture.js'), + function(err, result) { + res = result; + done(err); + }, + 'pipe' + ); + }); + + it('results in error', function() { + expect(res, 'to satisfy', { + code: expect.it('to be greater than', 0), + output: /done\(\) called multiple times in test \(of root suite\) of file.+multiple-done-async\.fixture\.js/ }); }); }); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index bdd2dc145e..4f00dadfd7 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -325,7 +325,11 @@ describe('Runnable(title, fn)', function() { runnable.on('error', errorSpy).on('error', function(err) { process.nextTick(function() { expect(errorSpy, 'was called times', 1); - expect(err.message, 'to be', 'done() called multiple times'); + expect( + err.message, + 'to match', + /done\(\) called multiple times/ + ); expect(callbackSpy, 'was called times', 1); done(); }); @@ -355,8 +359,8 @@ describe('Runnable(title, fn)', function() { expect(errorSpy, 'was called times', 1); expect( err.message, - 'to be', - "fail (and Mocha's done() called multiple times)" + 'to match', + /done\(\) called multiple times.+received error: Error: fail/ ); expect(callbackSpy, 'was called times', 1); done(); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index d36d0f2f1f..1843a4daa9 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -10,6 +10,7 @@ var Test = Mocha.Test; var Runnable = Mocha.Runnable; var Hook = Mocha.Hook; var noop = Mocha.utils.noop; +var errors = require('../../lib/errors'); var EVENT_HOOK_BEGIN = Runner.constants.EVENT_HOOK_BEGIN; var EVENT_TEST_FAIL = Runner.constants.EVENT_TEST_FAIL; var EVENT_TEST_RETRY = Runner.constants.EVENT_TEST_RETRY; @@ -17,6 +18,9 @@ var EVENT_TEST_END = Runner.constants.EVENT_TEST_END; var EVENT_RUN_END = Runner.constants.EVENT_RUN_END; var EVENT_SUITE_END = Runner.constants.EVENT_SUITE_END; var STATE_FAILED = Runnable.constants.STATE_FAILED; +var STATE_IDLE = Runner.constants.STATE_IDLE; +var STATE_RUNNING = Runner.constants.STATE_RUNNING; +var STATE_STOPPED = Runner.constants.STATE_STOPPED; describe('Runner', function() { var sandbox; @@ -252,8 +256,8 @@ describe('Runner', function() { }); }); - describe('.fail(test, err)', function() { - it('should increment .failures', function() { + describe('fail()', function() { + it('should increment `Runner#failures`', function() { expect(runner.failures, 'to be', 0); runner.fail(new Test('one', noop), {}); expect(runner.failures, 'to be', 1); @@ -261,7 +265,7 @@ describe('Runner', function() { expect(runner.failures, 'to be', 2); }); - it('should set test.state to "failed"', function() { + it('should set `Test#state` to "failed"', function() { var test = new Test('some test', noop); runner.fail(test, 'some error'); expect(test.state, 'to be', STATE_FAILED); @@ -373,6 +377,47 @@ describe('Runner', function() { runner.fail(test, new Error()); expect(runner.failures, 'to be', 0); }); + + describe('when Runner has stopped', function() { + beforeEach(function() { + runner.state = STATE_STOPPED; + }); + + describe('when test is not pending', function() { + describe('when error is the "multiple done" variety', function() { + it('should throw the "multiple done" error', function() { + var test = new Test('test', function() {}); + suite.addTest(test); + var err = new Error(); + err.code = errors.constants.MULTIPLE_DONE; + expect( + function() { + runner.fail(test, err); + }, + 'to throw', + err + ); + }); + }); + + describe('when error is not of the "multiple done" variety', function() { + it('should throw a "fatal" error', function() { + var test = new Test('test', function() {}); + suite.addTest(test); + var err = new Error(); + expect( + function() { + runner.fail(test, err); + }, + 'to throw', + { + code: errors.constants.FATAL + } + ); + }); + }); + }); + }); }); describe('.failHook(hook, err)', function() { @@ -482,6 +527,26 @@ describe('Runner', function() { runner.emit(EVENT_SUITE_END, suite); expect(cleanReferencesStub, 'was not called'); }); + + it('should not leak `Process.uncaughtException` listeners', function(done) { + var normalUncaughtExceptionListenerCount = process.listenerCount( + 'uncaughtException' + ); + + runner.run(); + runner.run(); + runner.run(); + expect( + process.listenerCount('uncaughtException'), + 'to be', + normalUncaughtExceptionListenerCount + 1 + ); + done(); + }); + + afterEach(function() { + runner.dispose(); + }); }); describe('.dispose', function() { @@ -505,7 +570,6 @@ describe('Runner', function() { var normalUncaughtExceptionListenerCount = process.listenerCount( 'uncaughtException' ); - sandbox.stub(); runner.run(noop); // sanity check expect( @@ -770,6 +834,16 @@ describe('Runner', function() { }); }); + describe('_uncaught()', function() { + describe('when called with a non-Runner context', function() { + it('should throw', function() { + expect(runner._uncaught.bind({}), 'to throw', { + code: errors.constants.FATAL + }); + }); + }); + }); + describe('uncaught()', function() { beforeEach(function() { sandbox.stub(runner, 'fail'); @@ -849,9 +923,9 @@ describe('Runner', function() { ]).and('was called once'); }); - describe('when Runner has already started', function() { + describe('when Runner is RUNNING', function() { beforeEach(function() { - runner.started = true; + runner.state = STATE_RUNNING; }); it('should not emit start/end events', function() { @@ -866,9 +940,9 @@ describe('Runner', function() { }); }); - describe('when Runner has not already started', function() { + describe('when Runner is IDLE', function() { beforeEach(function() { - runner.started = false; + runner.state = STATE_IDLE; }); it('should emit start/end events for the benefit of reporters', function() { @@ -882,6 +956,31 @@ describe('Runner', function() { ).and('to emit from', runner, 'end'); }); }); + + describe('when Runner is STOPPED', function() { + beforeEach(function() { + runner.state = STATE_STOPPED; + }); + + it('should not emit start/end events, since this presumably would have already happened', function() { + expect( + function() { + try { + runner.uncaught(err); + } catch (ignored) {} + }, + 'not to emit from', + runner, + 'start' + ).and('not to emit from', runner, 'end'); + }); + + it('should throw', function() { + expect(function() { + runner.uncaught(err); + }, 'to throw'); + }); + }); }); describe('when a Runnable is running or has run', function() { From 12b130b10e7ed1ee40e8becec3ca75066314fc43 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 22 May 2020 05:27:13 -0700 Subject: [PATCH 1492/1771] fetch sponsors at build time, show ALL non-skeevy sponsors; closes #4271 (#4272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Show all sponsors on site - change ordering: sponsors, then backers - blacklist bad actors - rename `default.html` to `default.liquid`, because it's a Liquid template. - fiddles with the CSS a bit - do not attempt to display a link if there is no website * use smaller imgs for backers * Fetch all open collective sponsor images to save their dimensions * Reworked avatars. LEss reflows due to image dimensions. Smoother loading animation that doesn't wait for all images. Progressive enhanced * Add standardised lazy loading to all images * Set height on badges to avoid page reflows * Add node version specification in .nvmrc to get netlify up to date * Move avatars javascript to external file for better development experience Co-authored-by: Peter Müller --- .nvmrc | 1 + docs/_data/blacklist.json | 21 ++ docs/_data/supporters.js | 133 +++++++ docs/_includes/backers.md | 7 - .../{default.html => default.liquid} | 15 +- docs/_includes/sponsors.md | 10 - docs/_includes/supporters.md | 37 ++ docs/css/style.css | 55 ++- docs/images/backer-background.svg | 12 - docs/index.md | 51 ++- docs/js/avatars.js | 31 +- package-lock.json | 342 +++++++++--------- package.json | 2 + 13 files changed, 454 insertions(+), 263 deletions(-) create mode 100644 .nvmrc create mode 100644 docs/_data/blacklist.json create mode 100644 docs/_data/supporters.js delete mode 100644 docs/_includes/backers.md rename docs/_includes/{default.html => default.liquid} (92%) delete mode 100644 docs/_includes/sponsors.md create mode 100644 docs/_includes/supporters.md delete mode 100644 docs/images/backer-background.svg diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..48082f72f0 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +12 diff --git a/docs/_data/blacklist.json b/docs/_data/blacklist.json new file mode 100644 index 0000000000..3949526a9b --- /dev/null +++ b/docs/_data/blacklist.json @@ -0,0 +1,21 @@ +[ + "cheap-writing-service", + "emailmarketingservices-io", + "device-tricks1", + "my-true-media", + "yiannakis-ttafounas-ttafounas", + "writerseperhour", + "casinotop-com", + "casino-topp", + "casinoutanreg", + "supercazino-ro", + "igor-noskov", + "blue-link-seo", + "casino-online", + "domywriting", + "writemypaper4me", + "trust-my-paper", + "seowebsitetraffic-net", + "pfannen-test", + "mochajs" +] diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js new file mode 100644 index 0000000000..6ae78a33d7 --- /dev/null +++ b/docs/_data/supporters.js @@ -0,0 +1,133 @@ +#!/usr/bin/env node +'use strict'; + +const debug = require('debug')('mocha:docs:data:supporters'); +const needle = require('needle'); +const imageSize = require('image-size'); +const blacklist = new Set(require('./blacklist.json')); + +const API_ENDPOINT = 'https://api.opencollective.com/graphql/v2'; + +const query = `query account($limit: Int, $offset: Int, $slug: String) { + account(slug: $slug) { + orders(limit: $limit, offset: $offset) { + limit + offset + totalCount + nodes { + fromAccount { + name + slug + website + imgUrlMed: imageUrl(height:64) + imgUrlSmall: imageUrl(height:32) + type + } + totalDonations { + value + } + createdAt + } + } + } +}`; + +const graphqlPageSize = 1000; + +const nodeToSupporter = node => ({ + name: node.fromAccount.name, + slug: node.fromAccount.slug, + website: node.fromAccount.website, + imgUrlMed: node.fromAccount.imgUrlMed, + imgUrlSmall: node.fromAccount.imgUrlSmall, + firstDonation: node.createdAt, + totalDonations: node.totalDonations.value * 100, + type: node.fromAccount.type +}); + +/** + * Retrieves donation data from OC + * + * Handles pagination + * @param {string} slug - Collective slug to get donation data from + * @returns {Promise} Array of raw donation data + */ +const getAllOrders = async (slug = 'mochajs') => { + let allOrders = []; + const variables = {limit: graphqlPageSize, offset: 0, slug}; + + // Handling pagination if necessary (2 pages for ~1400 results in May 2019) + while (true) { + const result = await needle( + 'post', + API_ENDPOINT, + {query, variables}, + {json: true} + ); + const orders = result.body.data.account.orders.nodes; + allOrders = [...allOrders, ...orders]; + variables.offset += graphqlPageSize; + if (orders.length < graphqlPageSize) { + debug('retrieved %d orders', allOrders.length); + return allOrders; + } else { + debug( + 'loading page %d of orders...', + Math.floor(variables.offset / graphqlPageSize) + ); + } + } +}; + +module.exports = async () => { + const orders = await getAllOrders(); + // Deduplicating supporters with multiple orders + const uniqueSupporters = new Map(); + + const supporters = orders + .map(nodeToSupporter) + .filter(supporter => !blacklist.has(supporter.slug)) + .reduce((supporters, supporter) => { + if (uniqueSupporters.has(supporter.slug)) { + // aggregate donation totals + uniqueSupporters.get(supporter.slug).totalDonations += + supporter.totalDonations; + return supporters; + } + uniqueSupporters.set(supporter.slug, supporter); + return [...supporters, supporter]; + }, []) + .sort((a, b) => b.totalDonations - a.totalDonations) + .reduce( + (supporters, supporter) => { + if (supporter.type === 'INDIVIDUAL') { + supporters.backers.push({ + ...supporter, + avatar: supporter.imgUrlSmall + }); + } else { + supporters.sponsors.push({...supporter, avatar: supporter.imgUrlMed}); + } + return supporters; + }, + {sponsors: [], backers: []} + ); + + // Fetch images for sponsors and save their image dimensions + await Promise.all( + supporters.sponsors.map(async sponsor => { + for await (const chunk of needle.get(sponsor.avatar)) { + sponsor.dimensions = imageSize(chunk); + break; + } + }) + ); + + debug( + 'found %d valid backers and %d valid sponsors (%d total)', + supporters.backers.length, + supporters.sponsors.length, + supporters.backers.length + supporters.sponsors.length + ); + return supporters; +}; diff --git a/docs/_includes/backers.md b/docs/_includes/backers.md deleted file mode 100644 index 4481202591..0000000000 --- a/docs/_includes/backers.md +++ /dev/null @@ -1,7 +0,0 @@ -## Backers - -Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support) and support Mocha with a monthly donation. - - -{% for i in (0..29) %}[![](https://opencollective.com/mochajs/backer/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/backer/{{ i }}/website){: target="_blank" rel="noopener"}{% endfor %} -{: .image-list id="_backers" } diff --git a/docs/_includes/default.html b/docs/_includes/default.liquid similarity index 92% rename from docs/_includes/default.html rename to docs/_includes/default.liquid index cdef5c2276..4d79612774 100644 --- a/docs/_includes/default.html +++ b/docs/_includes/default.liquid @@ -4,12 +4,6 @@ {{ title }} - @@ -22,7 +16,7 @@

              - +

              simple, flexible, fun

              @@ -36,7 +30,7 @@

              rel="external noopener" title="Mocha is sponsored by Matomo" > - Matomo logo + Matomo logo > OpenJS Foundation Logo title="Mocha is sponsored by Wallaby" > @@ -153,7 +148,7 @@

              diff --git a/docs/_includes/sponsors.md b/docs/_includes/sponsors.md deleted file mode 100644 index 257f9524b1..0000000000 --- a/docs/_includes/sponsors.md +++ /dev/null @@ -1,10 +0,0 @@ -## Sponsors - -Use Mocha at Work? Ask your manager or marketing team if they'd help [support](https://opencollective.com/mochajs#support) our project. Your company's logo will also be displayed on [npmjs.com](http://npmjs.com/package/mocha) and our [GitHub repository](https://github.com/mochajs/mocha#sponsors). - - - -{% for i in (0..15) %}[![](https://opencollective.com/mochajs/sponsor/{{ i }}/avatar.png)](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="\_blank"} {% endfor %} -{: .image-list .faded-images} - - diff --git a/docs/_includes/supporters.md b/docs/_includes/supporters.md new file mode 100644 index 0000000000..061cff0a5d --- /dev/null +++ b/docs/_includes/supporters.md @@ -0,0 +1,37 @@ +## Sponsors + +Use Mocha at Work? Ask your manager or marketing team if they'd help [support](https://opencollective.com/mochajs#support) our project. Your company's logo will also be displayed on [npmjs.com](http://npmjs.com/package/mocha) and our [GitHub repository](https://github.com/mochajs/mocha#sponsors). + + + +## Backers + +Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support) and support Mocha with a monthly donation. + + + + diff --git a/docs/css/style.css b/docs/css/style.css index 39fefea91e..3104b4f876 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -74,42 +74,57 @@ nav.badges a + a { margin-left: 3px; } -.image-list { +ul.image-list { overflow: hidden; text-align: center; + list-style: none; + column-count: 1; + padding: 0; + margin: 0; } -.image-list a { +ul.image-list li { + border-bottom: none; display: inline-block; - margin: 6px; + margin: 0 4px 0 4px; + max-height: 64px; + padding: 0; + line-height: 0; } -.image-list a img { +ul.image-list li a { + display: inline-block; +} + +ul.image-list li img { + margin: 0; + padding: 0; display: block; - height: 64px; + max-height: 64px; } -.faded-images { - background-color: #ddd; - border: 1px solid; - border-color: #ddd #ddd #ccc; - border-radius: 3px; - padding: 1em; - box-shadow: inset 0 0 10px #ccc; +ul#backers.image-list li img { + width: 32px; + height: 32px; + overflow: hidden; } -.faded-images img { - opacity: 0; - transition: opacity 0.3s; +.faded-image { + background-color: rgba(0, 0, 0, 0.05); } -.faded-images.is-loaded img { - opacity: 1; +.faded-image.is-loaded { + background-color: rgba(0, 0, 0, 0); + transition: background-color 0.3s; } -#_backers a img { - background: url(/images/backer-background.svg?inline) center center no-repeat; - width: 64px; +.faded-image img { + opacity: 0; + transition: opacity 0.1s; +} + +.faded-image.is-loaded img { + opacity: 1; } h2 { diff --git a/docs/images/backer-background.svg b/docs/images/backer-background.svg deleted file mode 100644 index 29bd61663b..0000000000 --- a/docs/images/backer-background.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/docs/index.md b/docs/index.md index 7f44f34acc..cd2ed9c328 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,13 +7,12 @@ description: 'Mocha is a feature-rich JavaScript test framework running on Node. Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in the browser, making asynchronous testing _simple_ and _fun_. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on [GitHub][github-mocha]. -{% include sponsors.md %} -{% include backers.md %} +{% include supporters.md %} ## Features @@ -708,7 +707,7 @@ $ mocha Many reporters will display test duration and flag tests that are slow (default: 75ms), as shown here with the SPEC reporter: -![test duration](images/reporter-spec-duration.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![test duration](images/reporter-spec-duration.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} There are three levels of test duration (depicted in the following image): @@ -716,7 +715,7 @@ There are three levels of test duration (depicted in the following image): 2. NORMAL: Tests that run exceeding half of the threshold (but still within it) will show the duration in yellow. 3. SLOW: Tests that run exceeding the threshold will show the duration in red. -![test duration range](images/test-duration-range.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![test duration range](images/test-duration-range.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} To tweak what's considered "slow", you can use the `slow()` method: @@ -784,7 +783,7 @@ Again, use `this.timeout(0)` to disable the timeout for a hook. Mocha supports the `err.expected` and `err.actual` properties of any thrown `AssertionError`s from an assertion library. Mocha will attempt to display the difference between what was expected, and what the assertion actually saw. Here's an example of a "string" diff using `--inline-diffs`: -![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ## Command-Line Usage @@ -1261,8 +1260,8 @@ Alias: `Spec`, `spec` This is the default reporter. The Spec reporter outputs a hierarchical view nested just as the test cases are. -![spec reporter](images/reporter-spec.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} -![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![spec reporter](images/reporter-spec.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} +![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Dot Matrix @@ -1270,7 +1269,7 @@ Alias: `Dot`, `dot` The Dot Matrix reporter is a series of characters which represent test cases. Failures highlight in red exclamation marks (`!`), pending tests with a blue comma (`,`), and slow tests as yellow. Good if you prefer minimal output. -![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Nyan @@ -1278,7 +1277,7 @@ Alias: `Nyan`, `nyan` The Nyan reporter is exactly what you might expect: -![js nyan cat reporter](images/reporter-nyan.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![js nyan cat reporter](images/reporter-nyan.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### TAP @@ -1286,7 +1285,7 @@ Alias: `TAP`, `tap` The TAP reporter emits lines for a [Test-Anything-Protocol][] consumer. -![test anything protocol](images/reporter-tap.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![test anything protocol](images/reporter-tap.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Landing Strip @@ -1294,8 +1293,8 @@ Alias: `Landing`, `landing` The Landing Strip reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw -![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} -![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} +![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### List @@ -1303,7 +1302,7 @@ Alias: `List`, `list` The List reporter outputs a simple specifications list as test cases pass or fail, outputting the failure details at the bottom of the output. -![list reporter](images/reporter-list.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![list reporter](images/reporter-list.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Progress @@ -1311,7 +1310,7 @@ Alias: `Progress`, `progress` The Progress reporter implements a simple progress-bar: -![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### JSON @@ -1319,7 +1318,7 @@ Alias: `JSON`, `json` The JSON reporter outputs a single large JSON object when the tests have completed (failures or not). -![json reporter](images/reporter-json.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![json reporter](images/reporter-json.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### JSON Stream @@ -1327,7 +1326,7 @@ Alias: `JSONStream`, `json-stream` The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event. -![json stream reporter](images/reporter-json-stream.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![json stream reporter](images/reporter-json-stream.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Min @@ -1335,7 +1334,7 @@ Alias: `Min`, `min` The Min reporter displays the summary only, while still outputting errors on failure. This reporter works great with `--watch` as it clears the terminal in order to keep your test summary at the top. -![min reporter](images/reporter-min.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![min reporter](images/reporter-min.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} ### Doc @@ -1343,7 +1342,7 @@ Alias: `Doc`, `doc` The Doc reporter outputs a hierarchical HTML body representation of your tests. Wrap it with a header, footer, and some styling, then you have some fantastic documentation! -![doc reporter](images/reporter-doc.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![doc reporter](images/reporter-doc.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} For example, suppose you have the following JavaScript: @@ -1544,7 +1543,7 @@ If set to `true`, do not attempt to use syntax highlighting on output test code. The HTML reporter is the default reporter when running Mocha in the browser. It looks like this: -![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999){:class="screenshot" lazyload="on"} +![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999){:class="screenshot" loading="lazy"} [Mochawesome][npm-mochawesome] is a great alternative to the default HTML reporter. @@ -1725,7 +1724,7 @@ The [Mocha TextMate bundle][textmate-mocha] includes snippets to make writing te [JetBrains][] provides a [NodeJS plugin][jetbrains-plugin] for its suite of IDEs (IntelliJ IDEA, WebStorm, etc.), which contains a Mocha test runner, among other things. -![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" lazyload="on"} +![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" loading="lazy"} The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Plugins**, assuming your license allows it. @@ -1733,13 +1732,13 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl [Wallaby.js][] is a continuous testing tool that enables real-time code coverage for Mocha with any assertion library in VS Code, Atom, JetBrains IDEs (IntelliJ IDEA, WebStorm, etc.), Sublime Text and Visual Studio for both browser and node.js projects. -![Wallaby.js in Action](images/wallaby.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" lazyload="on"} +![Wallaby.js in Action](images/wallaby.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" loading="lazy"} ### Emacs [Emacs][] support for running Mocha tests is available via a 3rd party package [mocha.el][emacs-mocha.el]. The package is available on MELPA, and can be installed via `M-x package-install mocha`. -![Emacs Mocha Runner in Action](images/emacs.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" lazyload="on"} +![Emacs Mocha Runner in Action](images/emacs.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" loading="lazy"} ### Mocha Sidebar (VS Code) @@ -1752,7 +1751,7 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl - auto run tests on file save - see tests results directly in the code editor -![mocha side bar in Action](images/mocha_side_bar.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" lazyload="on"} +![mocha side bar in Action](images/mocha_side_bar.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot" loading="lazy"} ## Examples diff --git a/docs/js/avatars.js b/docs/js/avatars.js index b64294e858..a03b2858a7 100644 --- a/docs/js/avatars.js +++ b/docs/js/avatars.js @@ -3,26 +3,25 @@ var imageLists = document.querySelectorAll('.image-list'); - Array.prototype.forEach.call(imageLists, function(imageList) { - var images = imageList.querySelectorAll('img'); - var counter = images.length; + function getListItem(img) { + var parent = img.parentNode; + while (parent && parent.nodeName !== 'LI') { + parent = parent.parentNode; + } - function onloadHandler() { - counter -= 1; + return parent; + } - if (counter === 0) { - imageList.classList.add('is-loaded'); - } - } + function onloadHandler() { + getListItem(this).classList.add('is-loaded'); + } - for (var i = 0; i < images.length; i += 1) { - if (images[i].complete) { - counter -= 1; + Array.prototype.forEach.call(imageLists, function(imageList) { + var images = imageList.querySelectorAll('img'); - if (counter === 0) { - imageList.classList.add('is-loaded'); - } - } else { + for (var i = 0; i < images.length; i += 1) { + if (!images[i].complete) { + getListItem(images[i]).classList.add('faded-image'); images[i].onload = onloadHandler; images[i].onerror = onloadHandler; } diff --git a/package-lock.json b/package-lock.json index 71777a3890..13728b7a0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2071,7 +2071,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -2430,28 +2430,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -2462,14 +2462,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -2480,42 +2480,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -2525,28 +2525,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -2556,14 +2556,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -2580,7 +2580,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -2595,14 +2595,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -2612,7 +2612,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -2622,7 +2622,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -2633,21 +2633,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -2657,14 +2657,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -2674,14 +2674,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -2692,7 +2692,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -2702,7 +2702,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -2712,14 +2712,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -2731,7 +2731,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -2750,7 +2750,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -2761,7 +2761,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -2771,14 +2771,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -2790,7 +2790,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -2803,21 +2803,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -2827,21 +2827,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -2852,21 +2852,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -2879,7 +2879,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -2895,7 +2895,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -2905,49 +2905,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -2959,7 +2959,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -2969,7 +2969,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -2979,14 +2979,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -3002,14 +3002,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -3019,14 +3019,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -3173,7 +3173,7 @@ }, "yargs": { "version": "6.4.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", "dev": true, "requires": { @@ -3195,7 +3195,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -3846,7 +3846,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4565,7 +4565,7 @@ "createerror": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/createerror/-/createerror-1.3.0.tgz", - "integrity": "sha1-xma9TNa5TjVBU5ZWnUZJ3QzbMxM=", + "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, "cross-env": { @@ -6424,7 +6424,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -7241,7 +7241,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7654,7 +7654,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -8028,7 +8028,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -8331,6 +8331,15 @@ "minimatch": "^3.0.4" } }, + "image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "dev": true, + "requires": { + "queue": "6.0.1" + } + }, "imageinfo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/imageinfo/-/imageinfo-1.0.4.tgz", @@ -8961,7 +8970,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -10191,7 +10200,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -10385,7 +10394,7 @@ }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -10406,7 +10415,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -10874,7 +10883,7 @@ "markdown-toc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha1-RKFWBoREkDFK/ARESD+eexEiwzk=", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", "dev": true, "requires": { "concat-stream": "^1.5.2", @@ -11268,7 +11277,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11556,7 +11565,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11663,7 +11672,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -12424,7 +12433,7 @@ }, "opn": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { @@ -12833,7 +12842,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -12997,7 +13006,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13844,7 +13853,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -14005,13 +14014,13 @@ }, "pretty-bytes": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-ms": { "version": "0.2.2", - "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { @@ -14216,7 +14225,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -14347,6 +14356,15 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "dev": true, + "requires": { + "inherits": "~2.0.3" + } + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -14945,7 +14963,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -15085,7 +15103,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { @@ -16571,7 +16589,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -17060,7 +17078,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -17097,7 +17115,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18021,28 +18039,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -18053,14 +18071,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -18071,42 +18089,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -18116,28 +18134,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -18147,14 +18165,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -18171,7 +18189,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -18186,14 +18204,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -18203,7 +18221,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -18213,7 +18231,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -18224,21 +18242,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -18248,14 +18266,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -18265,14 +18283,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -18283,7 +18301,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -18293,7 +18311,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -18303,14 +18321,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -18322,7 +18340,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -18341,7 +18359,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -18352,7 +18370,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -18362,14 +18380,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -18381,7 +18399,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -18394,21 +18412,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -18418,21 +18436,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -18443,21 +18461,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -18470,7 +18488,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -18486,7 +18504,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -18496,49 +18514,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -18550,7 +18568,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -18560,7 +18578,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -18570,14 +18588,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -18593,14 +18611,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -18610,14 +18628,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -18723,7 +18741,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-encoding": { diff --git a/package.json b/package.json index 42df478855..f59ddc8d4c 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ "fs-extra": "^9.0.0", "husky": "^4.2.3", "hyperlink": "^4.4.3", + "image-size": "^0.8.3", "jsdoc": "^3.6.3", "karma": "^4.4.1", "karma-browserify": "^7.0.0", @@ -115,6 +116,7 @@ "markdown-it-prism": "^2.0.5", "markdown-toc": "^1.2.0", "markdownlint-cli": "^0.22.0", + "needle": "^2.4.1", "nps": "^5.9.12", "nyc": "^15.0.0", "prettier": "^1.19.1", From 1a2e693333621713b980708ee492639ff1e3b106 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Sat, 23 May 2020 12:00:36 +0100 Subject: [PATCH 1493/1771] update CHANGELOG for v7.2.0 [ci skip] --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3792a6edbc..e5eac39f93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,34 @@ +# 7.2.0 / 2020-05-22 + +## :tada: Enhancements + +- #4234: Add ability to run tests in a mocha instance multiple times (@nicojs) +- #4219: Exposing filename in JSON, doc, and json-stream reporters (@Daniel0113) +- #4244: Add Root Hook Plugins (@boneskull) + +## :bug: Fixes + +- #4258: Fix missing dot in name of configuration file (@sonicdoe) +- #4194: Check if module.paths really exists (@ematipico) +- #4256: `--forbid-only` does not recognize `it.only` when `before` crashes (@arvidOtt) +- #4152: Bug with multiple async done() calls (@boneskull) +- #4275: Improper warnings for invalid reporters (@boneskull) +- #4288: Broken hook.spec.js test for IE11 (@boneskull) + +## :book: Documentation + +- #4081: Insufficient white space for API docs in view on mobile (@HyunSangHan) +- #4255: Update mocha-docdash for UI fixes on API docs (@craigtaub) +- #4235: Enable emoji on website; enable normal ul elements (@boneskull) +- #4272: Fetch sponsors at build time, show ALL non-skeevy sponsors (@boneskull) + +## :nut_and_bolt: Other + +- #4249: Refactoring improving encapsulation (@arvidOtt) +- #4242: CI add job names, add Node.js v14 to matrix (@boneskull) +- #4237: Refactor validatePlugins to throw coded errors (@boneskull) +- #4236: Better debug output (@boneskull) + # 7.1.2 / 2020-04-26 ## :nut_and_bolt: Other From 283b11ea1fef1344aea2a0ad01fe882efcf5e3d8 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Sat, 23 May 2020 12:01:45 +0100 Subject: [PATCH 1494/1771] Release v7.2.0 --- AUTHORS | 3 +++ CHANGELOG.md | 38 +++++++++++++++++++------------------- package-lock.json | 2 +- package.json | 2 +- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/AUTHORS b/AUTHORS index 326283089b..88abaa8b33 100644 --- a/AUTHORS +++ b/AUTHORS @@ -488,5 +488,8 @@ Zirak Christian Holm Kai Cataldo Gil Tayar +Arvid Ottenberg +Daniel0113 +Nico Jansen # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index e5eac39f93..44c1a3e278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,32 +2,32 @@ ## :tada: Enhancements -- #4234: Add ability to run tests in a mocha instance multiple times (@nicojs) -- #4219: Exposing filename in JSON, doc, and json-stream reporters (@Daniel0113) -- #4244: Add Root Hook Plugins (@boneskull) +- [#4234](https://github.com/mochajs/mocha/issues/4234): Add ability to run tests in a mocha instance multiple times ([**@nicojs**](https://github.com/nicojs)) +- [#4219](https://github.com/mochajs/mocha/issues/4219): Exposing filename in JSON, doc, and json-stream reporters ([**@Daniel0113**](https://github.com/Daniel0113)) +- [#4244](https://github.com/mochajs/mocha/issues/4244): Add Root Hook Plugins ([**@boneskull**](https://github.com/boneskull)) ## :bug: Fixes -- #4258: Fix missing dot in name of configuration file (@sonicdoe) -- #4194: Check if module.paths really exists (@ematipico) -- #4256: `--forbid-only` does not recognize `it.only` when `before` crashes (@arvidOtt) -- #4152: Bug with multiple async done() calls (@boneskull) -- #4275: Improper warnings for invalid reporters (@boneskull) -- #4288: Broken hook.spec.js test for IE11 (@boneskull) +- [#4258](https://github.com/mochajs/mocha/issues/4258): Fix missing dot in name of configuration file ([**@sonicdoe**](https://github.com/sonicdoe)) +- [#4194](https://github.com/mochajs/mocha/issues/4194): Check if module.paths really exists ([**@ematipico**](https://github.com/ematipico)) +- [#4256](https://github.com/mochajs/mocha/issues/4256): `--forbid-only` does not recognize `it.only` when `before` crashes ([**@arvidOtt**](https://github.com/arvidOtt)) +- [#4152](https://github.com/mochajs/mocha/issues/4152): Bug with multiple async done() calls ([**@boneskull**](https://github.com/boneskull)) +- [#4275](https://github.com/mochajs/mocha/issues/4275): Improper warnings for invalid reporters ([**@boneskull**](https://github.com/boneskull)) +- [#4288](https://github.com/mochajs/mocha/issues/4288): Broken hook.spec.js test for IE11 ([**@boneskull**](https://github.com/boneskull)) ## :book: Documentation -- #4081: Insufficient white space for API docs in view on mobile (@HyunSangHan) -- #4255: Update mocha-docdash for UI fixes on API docs (@craigtaub) -- #4235: Enable emoji on website; enable normal ul elements (@boneskull) -- #4272: Fetch sponsors at build time, show ALL non-skeevy sponsors (@boneskull) +- [#4081](https://github.com/mochajs/mocha/issues/4081): Insufficient white space for API docs in view on mobile ([**@HyunSangHan**](https://github.com/HyunSangHan)) +- [#4255](https://github.com/mochajs/mocha/issues/4255): Update mocha-docdash for UI fixes on API docs ([**@craigtaub**](https://github.com/craigtaub)) +- [#4235](https://github.com/mochajs/mocha/issues/4235): Enable emoji on website; enable normal ul elements ([**@boneskull**](https://github.com/boneskull)) +- [#4272](https://github.com/mochajs/mocha/issues/4272): Fetch sponsors at build time, show ALL non-skeevy sponsors ([**@boneskull**](https://github.com/boneskull)) ## :nut_and_bolt: Other -- #4249: Refactoring improving encapsulation (@arvidOtt) -- #4242: CI add job names, add Node.js v14 to matrix (@boneskull) -- #4237: Refactor validatePlugins to throw coded errors (@boneskull) -- #4236: Better debug output (@boneskull) +- [#4249](https://github.com/mochajs/mocha/issues/4249): Refactoring improving encapsulation ([**@arvidOtt**](https://github.com/arvidOtt)) +- [#4242](https://github.com/mochajs/mocha/issues/4242): CI add job names, add Node.js v14 to matrix ([**@boneskull**](https://github.com/boneskull)) +- [#4237](https://github.com/mochajs/mocha/issues/4237): Refactor validatePlugins to throw coded errors ([**@boneskull**](https://github.com/boneskull)) +- [#4236](https://github.com/mochajs/mocha/issues/4236): Better debug output ([**@boneskull**](https://github.com/boneskull)) # 7.1.2 / 2020-04-26 @@ -583,7 +583,7 @@ This release fixes a class of tests which report as _false positives_. **Certain - [#3226](https://github.com/mochajs/mocha/issues/3226): Do not swallow errors that are thrown asynchronously from passing tests ([@boneskull](https://github.com/boneskull)). Example: - \```js + \`\`\`js it('should actually fail, sorry!', function (done) { // passing assertion assert(true === true); @@ -596,7 +596,7 @@ This release fixes a class of tests which report as _false positives_. **Certain throw new Error('chaos!'); }, 100); }); - \``` + \`\`\` Previously to this version, Mocha would have _silently swallowed_ the `chaos!` exception, and you wouldn't know. Well, _now you know_. Mocha cannot recover from this gracefully, so it will exit with a nonzero code. diff --git a/package-lock.json b/package-lock.json index 13728b7a0d..78be92c17b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.1.0", + "version": "7.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f59ddc8d4c..63d6f02c90 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.1.0", + "version": "7.2.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 6d60eb01dae2b609bcf7976dc5975670201b7f46 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 22 May 2020 10:44:55 -0700 Subject: [PATCH 1495/1771] renamed smoke test - add notes about what it is intended to do, and what it cannot do Signed-off-by: Christopher Hiller --- .travis.yml | 2 +- test/sanity/sanity.spec.js | 9 --------- test/smoke/smoke.spec.js | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 test/sanity/sanity.spec.js create mode 100644 test/smoke/smoke.spec.js diff --git a/.travis.yml b/.travis.yml index 6d7a36ebe1..4a0c82771a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -77,7 +77,7 @@ jobs: before_install: true install: npm install --production name: 'Latest Node.js' - script: ./bin/mocha --no-config --reporter spec test/sanity/sanity.spec.js + script: ./bin/mocha --no-config --reporter spec test/smoke/smoke.spec.js cache: directories: - ~/.npm diff --git a/test/sanity/sanity.spec.js b/test/sanity/sanity.spec.js deleted file mode 100644 index 59d5896515..0000000000 --- a/test/sanity/sanity.spec.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -var assert = require('assert'); - -describe('a production installation of Mocha', function() { - it('should be able to execute a test', function() { - assert.ok(true); - }); -}); diff --git a/test/smoke/smoke.spec.js b/test/smoke/smoke.spec.js new file mode 100644 index 0000000000..7f1365f33e --- /dev/null +++ b/test/smoke/smoke.spec.js @@ -0,0 +1,15 @@ +'use strict'; + +// This test ensures Mocha's dependencies are properly in place, +// and is intended to be run after an `npm install --production` in a clean +// working copy. It helps avoid publishing Mocha with `dependencies` +// in `devDependencies` or otherwise in the wrong place. +// It does not ensure that all files are present in the published package! + +var assert = require('assert'); + +describe('a production installation of Mocha', function() { + it('should be able to execute a test', function() { + assert.ok(true); + }); +}); From 2078c3203f55ee0e1783dc2fc9e20ac51dcb6896 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 27 May 2020 11:20:06 -0700 Subject: [PATCH 1496/1771] add support for running tests in parallel mode * add support for running tests in parallel mode > (this PR depends on most other PRs linked to #4198, so they should be merged first; documentation will be in another PR) This PR adds support for running test files in parallel via `--parallel`. For many cases, this should "just work." When the `--parallel` flag is supplied, Mocha will swap out the default `Runner` (`lib/nodejs/runner.js`) for `ParallelBufferedRunner` (`lib/nodejs/parallel-buffered-runner.js`). `ParallelBufferedRunner` _extends_ `Runner`. `ParallelBufferedRunner#run()` is the main point of extension. Instead of executing the tests in serial, it will create a pool of worker processes (not worker _threads_) based on the maximum job count (`--jobs`; defaults to ` - 1`). Both `ParallelBufferedRunner` and the `worker` module consume the abstraction layer, [workerpool](https://npm.im/workerpool). `ParallelBufferedRunner#run()` does _not_ load the test files, unlike `Runner#run()`. Instead, it has a list of test files, and puts these into an async queue. The `EVENT_RUN_BEGIN` event is then emitted. As files enter the queue, `ParallelBufferedRunner#run()` tells `workerpool` to execute the `run()` function of the pool. `workerpool` then launches as many worker processes are needed--up to the maximum--and executes the `run()` function with a single filepath and any options for a `Mocha` instance. The first time `lib/nodejs/worker.js` is invoked, it will "bootstrap" itself, by handling `--require`'d modules and validating the UI. Note that _reporter validation_ does not occur. Once bootstrapped, it instantiate `Mocha`, add the single file, swap any reporter out for the `ParallelBuffered` reporter (`lib/nodejs/reporters/parallel-buffered.js`) then execute `Mocha#run()`, which invokes `Runner#run()`. The `ParallelBuffered` reporter listens for events emitting from the `Runner` instance, like a reporter usually does. But instead of outputting to the console, it buffers the events in a queue. Once the file has completed running, the queue is drained: the events collected are (trivially) serialized for transmission back to the main process. `ParallelBufferedRunner#run()` receives the list of events, trivially _deserializes_ them, and re-emits the events to whatever the chosen reporter is (e.g., the `spec` reporter). In this way, the reporters don't know that the tests were run in parallel. Practically, the user will see reporter output in "chunks" instead of the "stream" of results they usually expect. This method ensures that while the test files run in a nondeterministic order, the reporter output will be deterministic for any given test file. Once the result (the queue of events) has been returned to the main process, the worker process stays open, but waits for further instruction. If there are more files in `ParallelBufferedRunner#run()`'s queue, `workerpool` will instruct the worker to take the next file from the list, and so on, and so forth. When all files have executed, the pool terminates, the `EVENT_RUN_END` event is emitted, and the reporter handles it. Note that exclusive tests ("only") cannot work in parallel mode, because we do not load all files up-front. > (this section is pasted from the documentation with minimal edits) ### Caveats: Reporters Due to the nature of the following reporters, they cannot work when running tests in parallel: - `markdown` - `progress` - `json-stream` These reporters expect Mocha to know _how many tests it plans to run_ before execution. This information is unavailable in parallel mode, as test files are loaded only when they are about to be run. ### Caveats: Buffered Output In serial mode, tests results will "stream" as they occur. In parallel mode, reporter output is _buffered_; reporting will occur after each file is completed. In practice, the reporter output will appear in "chunks" (but will otherwise be identical). ### Caveats: Nondeterminism In parallel mode, we have no guarantees about the order in which test files will be run--or what process runs them--as it depends on the execution times of the test files. Because of this, the following options _cannot be used_ in parallel mode: - `--file` - `--sort` - `--delay` Because running tests in parallel mode uses more system resources at once, the OS may take extra time to schedule and complete some operations. For this reason, test timeouts may need to be increased either globally or otherwise. ### Caveats: Other Impacted Options When used with `--bail` (or `this.bail()`) to exit after the first failure, it's likely other tests will be running at the same time. Mocha must shut down its worker processes before exiting. Likewise, subprocesses may throw uncaught exceptions. When used with `--allow-uncaught`, Mocha will "bubble" this exception to the main process, but still must shut down its processes. `--forbid-only` does not work in parallel mode, for a similar reason to the unsupported reporters. > _NOTE: This only applies to test files run parallel mode_. ### Caveats: Root Hooks A _root hook_ is a hook in a test file which is _not defined_ within a suite. An example using the `bdd` interface: ```js // test/setup.js beforeEach(function() { doMySetup(); }); afterEach(function() { doMyTeardown(); }); ``` When run (in the default "serial" mode) via `mocha --file "./test/setup.js" "./test/**/*.spec.js"`, `setup.js` will be executed _first_, and install the two hooks shown above for every test found in `./test/**/*.spec.js`. **When Mocha runs in parallel mode, test files do not share the same process.** Consequently, a root hook defined in test file _A_ won't be present in test file _B_. There are a (minimum of) two workarounds for this: 1. `require('./setup.js')` or `import './setup.js'` at the top of every test file. Best avoided for those averse to boilerplate. 1. _Recommended_: Define root-level hooks in a required file, using the new (also as of VERSION) Root Hook Plugin system. ### Caveats: Node.js Only, For Now Parallel mode is only available in Node.js. ### Migration Checklist If you find your tests don't work properly when run with `--parallel`, either shrug and move on, or use this handy-dandy checklist to get things working: - :white_check_mark: Ensure you are using a supported reporter. - :white_check_mark: Ensure you are not using other unsupported flags. - :white_check_mark: Double-check your config file; options set in config files will be merged with any command-line option. - :white_check_mark: Look for root-level hooks in your tests. Move them into a root hook plugin. - :white_check_mark: Do any assertion, mock, or other test libraries you're consuming use root hooks? They may need to be migrated for compatibility with parallel mode. - :white_check_mark: If tests are unexpectedly timing out, you may need to increase the default test timeout (via `--timeout`) - :white_check_mark: Ensure your tests do not depend on being run in a specific order. - :white_check_mark: Ensure your tests clean up after themselves; remove temp files, handles, sockets, etc. Don't try to share state or resources between test files. ### About Parallelism Some types of tests are _not_ so well-suited to run in parallel. For example, extremely timing-sensitive tests, or tests which make I/O requests to a limited pool of resources (such as opening ports, or automating browser windows, hitting a test DB, or remote server, etc.). Free-tier cloud CI services may not provide a suitable multi-core container or VM for their build agents. Regarding expected performance gains in CI: your mileage may vary. It may help to use a conditional in a `.mocharc.js` to check for `process.env.CI`, and adjust the job count as appropriate. It's unlikely (but not impossible) to see a performance gain from a job count _greater than_ the number of available CPU cores. That said, _play around with the job count_--there's no one-size-fits all, and the unique characteristics of your tests will determine the optimal number of jobs; it may even be that fewer is faster! ### Change Details - updated signal handling in `bin/mocha` to a) better work with Windows, and b) work properly with `--parallel` to avoid leaving zombie workers - docstrings in `lib/nodejs/cli/collect-files.js` - refactors in `lib/nodejs/cli/run-helpers.js` and `lib/nodejs/cli/watch-run.js`. We now have four methods: - `watchRun()` - serial + watch - `singleRun()` - serial - `parallelWatchRun()` - parallel + watch - `parallelRun()` - parallel - `lib/nodejs/cli/run.js` and `lib/nodejs/cli/run-option-metadata.js`: additions for new options and checks for incompatibility - add `lib/nodejs/reporters/buffered.js` (`ParallelBuffered`); this reporter is _not_ re-exported in `Mocha.reporters`, since it should only be invoked internally. - tweak `landing` reporter to avoid referencing `Runner#total`, which is incompatible with parallel mode. It didn't need to do so in the first place! - the `tap` reporter now outputs the plan at the _end_ instead of at the beginning (avoiding a call to `Runner#grepTotal()`, which is incompatible with parallel mode). This is within spec, so should not be a breaking change. - add `lib/nodejs/parallel-buffered-runner.js` (`ParallelBufferedRunner`); subclass of `Runner` which overrides the `run()` method. - There's a little custom finite state machine in here. didn't want to pull in a third-party module, but we should consider doing so if we use FSM's elsewhere. - when `DEBUG=mocha:parallel*` is in the env, this module will output statistics about the worker pool every 5s - the `run()` method looks a little weird because I wanted to use `async/await`, but the method it is overriding (`Runner#run`) is _not_ `async` - traps `SIGINT` to gracefully terminate the pool - pulls in [promise.allsettled](https://npm.im/promise.allsettled) polyfill to handle workers that may have rejected with uncaught exceptions - "bail" support is best-effort. - the `ABORTING` state is only for interruption via `SIGINT` or if `allowUncaught` is true and we get an uncaught exception - `Hook`, `Suite`, `Test`: add a `serialize()` method. This pulls out the most relevant information about the object for transmission over IPC. It's called by worker processes for each event received by its `Runner`; event arguments (e.g., `test` or `suite`) are serialized in this manner. Note that this _limits what reporters have access to_, which may break compatibility with third-party reporters that may use information that is missing from the serialized object. As those cases arise, we can add more information to the serialized objects (in some cases). The `$$` convention tells the _deserializer_ to turn the property into a function which returns the passed value, e.g., `test.fullTitle()`. - `lib/nodejs/mocha.js`: - refactor `Mocha#reporter` for nicer parameter & variable names - rename `loadAsync` to `lazyLoadFiles`, which is more descriptive, IMO. It's a private property, so should not be a breaking change. - Constructor will dynamically choose the appropriate `Runner` - `lib/nodejs/runner.js`: `ParallelBufferedRunner` needs the options from `Mocha#options`, so I updated the parent method to define the parameter. It is unused here. - add `lib/nodejs/serializer.js`: on the worker process side, manages event queue serialization; manages deserialization of the event queue in the main process. - I spent a long time trying to get this working. We need to account for things like `Error` instances, with their stack traces, since those can be event arguments (e.g., `EVENT_TEST_FAIL` sends both a `Test` and the `Error`). It's impossible to serialize circular (self-referential) objects, so we need to account for those as well. - Not super happy with the deserialization algorithm, since it's recursive, but it shouldn't be too much of an issue because the serializer won't output circular structures. - Attempted to avoid prototype pollution issues - Much of this works by mutating objects, mostly because it can be more performant. The code can be changed to be "more immutable", as that's likely to be easier to understand, if it doesn't impact performance too much. We're serializing potentially very large arrays of stuff. - The `__type` prop is a hint for the deserializer. This convention allows us to re-expand plain objects back into `Error` instances, for example. You can't send an `Error` instance over IPC! - add `lib/nodejs/worker.js`: - registers its `run()` function with `workerpool` to be called by main process - if `DEBUG=mocha:parallel*` is set, will output information (on an interval) about long-running test files - afaik the only way `run()` can reject is if `allowUncaught` is true or serialization fails - any user-supplied `reporter` value is replaced with the `ParallelBuffered` reporter. thus, reporters are not validated. - the worker uses `Runner`, like usual. - tests: - see `test/integration/options/parallel.spec.js` for the interesting stuff - upgrade `unexpected` for "to have readonly property" assertion - upgrade `unexpected-eventemitter` for support async function support - integration test helpers allow Mocha's developers to use `--bail` and `--parallel`, but will default to `--no-bail` and `--no-parallel`. - split some node-specific tests out of `test/unit/mocha.spec.js` into `test/node-unit/mocha.spec.js` - add some missing coverage in `test/node-unit/worker.spec.js` - etc: - update `.eslintrc.yml` for new Node-only files - increase default timeout to `1000` (also seen in another PR) and use `parallel` mode by default in `.mocharc.yml` - run node unit tests _in serial_ as sort of a smoke test, as otherwise all our tests would be run in parallel - karma, browserify: ignore files for parallel support - force color output in CI. this is nice on travis, but ugly on appveyor. either way, it's easier to read than having no color - move non-CLI-related node-specific files into `lib/nodejs/nodejs/` - correct some issues with APIs not marked `@private` - add some istanbul directives to ignore some debug statements - add `utils.isBrowser()` for easier mocking of a `process.browser === true` situation - add `createForbiddenExclusivityError()` Ref: #4198 Signed-off-by: Christopher Hiller --- .eslintrc.yml | 26 +- .mocharc.yml | 1 + .travis.yml | 6 +- bin/mocha | 19 +- karma.conf.js | 11 +- lib/browser/growl.js | 3 +- lib/cli/collect-files.js | 19 +- lib/cli/run-helpers.js | 51 +- lib/cli/run-option-metadata.js | 5 +- lib/cli/run.js | 45 ++ lib/cli/watch-run.js | 230 ++++++-- lib/errors.js | 25 +- lib/hook.js | 24 + lib/interfaces/common.js | 9 +- lib/mocha.js | 151 ++++- lib/nodejs/buffered-worker-pool.js | 174 ++++++ lib/{ => nodejs}/growl.js | 5 +- lib/nodejs/parallel-buffered-runner.js | 293 +++++++++ lib/nodejs/reporters/parallel-buffered.js | 133 +++++ lib/nodejs/serializer.js | 402 +++++++++++++ lib/nodejs/worker.js | 154 +++++ lib/reporters/base.js | 4 +- lib/reporters/landing.js | 6 +- lib/reporters/tap.js | 3 +- lib/runner.js | 9 +- lib/suite.js | 16 + lib/test.js | 28 + lib/utils.js | 13 +- package-lock.json | 142 ++++- package-scripts.js | 48 +- package.json | 14 +- .../options/jobs/fail-in-parallel.fixture.js | 7 + .../fixtures/options/parallel/bail.fixture.js | 9 + .../parallel/exclusive-test-a.fixture.js | 3 + .../parallel/exclusive-test-b.fixture.js | 3 + .../options/parallel/retries-a.fixture.js | 5 + .../options/parallel/retries-b.fixture.js | 8 + .../options/parallel/syntax-err.fixture.js | 1 + .../options/parallel/test-a.fixture.js | 3 + .../options/parallel/test-b.fixture.js | 3 + .../options/parallel/test-c.fixture.js | 5 + .../options/parallel/test-d.fixture.js | 7 + .../options/parallel/uncaught.fixture.js | 7 + test/integration/helpers.js | 24 +- test/integration/options/jobs.spec.js | 34 ++ test/integration/options/parallel.spec.js | 489 +++++++++++++++ test/node-unit/buffered-runner.spec.js | 553 +++++++++++++++++ test/node-unit/buffered-worker-pool.spec.js | 186 ++++++ test/node-unit/mocha.spec.js | 172 +++++- .../reporters/parallel-buffered.spec.js | 230 ++++++++ test/node-unit/serializer.spec.js | 555 ++++++++++++++++++ test/node-unit/worker.spec.js | 223 +++++++ test/reporters/tap.spec.js | 48 +- test/unit/errors.spec.js | 71 ++- test/unit/hook-timeout.spec.js | 12 +- test/unit/mocha.spec.js | 78 ++- 56 files changed, 4527 insertions(+), 278 deletions(-) create mode 100644 lib/nodejs/buffered-worker-pool.js rename lib/{ => nodejs}/growl.js (96%) create mode 100644 lib/nodejs/parallel-buffered-runner.js create mode 100644 lib/nodejs/reporters/parallel-buffered.js create mode 100644 lib/nodejs/serializer.js create mode 100644 lib/nodejs/worker.js create mode 100644 test/integration/fixtures/options/jobs/fail-in-parallel.fixture.js create mode 100644 test/integration/fixtures/options/parallel/bail.fixture.js create mode 100644 test/integration/fixtures/options/parallel/exclusive-test-a.fixture.js create mode 100644 test/integration/fixtures/options/parallel/exclusive-test-b.fixture.js create mode 100644 test/integration/fixtures/options/parallel/retries-a.fixture.js create mode 100644 test/integration/fixtures/options/parallel/retries-b.fixture.js create mode 100644 test/integration/fixtures/options/parallel/syntax-err.fixture.js create mode 100644 test/integration/fixtures/options/parallel/test-a.fixture.js create mode 100644 test/integration/fixtures/options/parallel/test-b.fixture.js create mode 100644 test/integration/fixtures/options/parallel/test-c.fixture.js create mode 100644 test/integration/fixtures/options/parallel/test-d.fixture.js create mode 100644 test/integration/fixtures/options/parallel/uncaught.fixture.js create mode 100644 test/integration/options/jobs.spec.js create mode 100644 test/integration/options/parallel.spec.js create mode 100644 test/node-unit/buffered-runner.spec.js create mode 100644 test/node-unit/buffered-worker-pool.spec.js create mode 100644 test/node-unit/reporters/parallel-buffered.spec.js create mode 100644 test/node-unit/serializer.spec.js create mode 100644 test/node-unit/worker.spec.js diff --git a/.eslintrc.yml b/.eslintrc.yml index 2a3fa281df..e185b97711 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -21,22 +21,22 @@ rules: property: 'assign' overrides: - files: - - docs/js/**/*.js + - 'docs/js/**/*.js' env: node: false - files: - - scripts/**/*.js - - package-scripts.js - - karma.conf.js - - .wallaby.js - - .eleventy.js - - bin/* - - lib/cli/**/*.js - - test/node-unit/**/*.js - - test/integration/options/watch.spec.js - - test/integration/helpers.js - - lib/growl.js - - docs/_data/**/*.js + - '.eleventy.js' + - '.wallaby.js' + - 'package-scripts.js' + - 'karma.conf.js' + - 'bin/*' + - 'docs/_data/**/*.js' + - 'lib/cli/**/*.js' + - 'lib/nodejs/**/*.js' + - 'scripts/**/*.js' + - 'test/integration/helpers.js' + - 'test/integration/options/watch.spec.js' + - 'test/node-unit/**/*.js' parserOptions: ecmaVersion: 2018 env: diff --git a/.mocharc.yml b/.mocharc.yml index dfb82e07f6..b458eb5423 100644 --- a/.mocharc.yml +++ b/.mocharc.yml @@ -5,6 +5,7 @@ global: - 'okGlobalC' - 'callback*' timeout: 1000 +parallel: true watch-ignore: - '.*' - 'docs/_dist/**' diff --git a/.travis.yml b/.travis.yml index 4a0c82771a..cbc2ce6722 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,8 @@ jobs: - script: COVERAGE=1 npm start test.node after_success: npm start coveralls name: 'Latest Node.js (with coverage)' - + - script: MOCHA_PARALLEL=0 npm start test.node.unit + name: 'Latest Node.js (unit tests in serial mode)' - &node script: npm start test.node node_js: '13' @@ -95,6 +96,9 @@ jobs: script: true name: 'Prime cache' +env: + - 'NODE_OPTIONS="--trace-warnings"' + notifications: email: false webhooks: diff --git a/bin/mocha b/bin/mocha index bc9aa81a0f..d19d71ffcc 100755 --- a/bin/mocha +++ b/bin/mocha @@ -130,8 +130,23 @@ if (Object.keys(nodeArgs).length) { // terminate children. process.on('SIGINT', () => { - proc.kill('SIGINT'); // calls runner.abort() - proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die. + // XXX: a previous comment said this would abort the runner, but I can't see that it does + // anything with the default runner. + debug('main process caught SIGINT'); + proc.kill('SIGINT'); + // if running in parallel mode, we will have a proper SIGINT handler, so the below won't + // be needed. + if (!args.parallel || args.jobs < 2) { + // win32 does not support SIGTERM, so use next best thing. + if (require('os').platform() === 'win32') { + proc.kill('SIGKILL'); + } else { + // using SIGKILL won't cleanly close the output streams, which can result + // in cut-off text or a befouled terminal. + debug('sending SIGTERM to child process'); + proc.kill('SIGTERM'); + } + } }); } else { debug('running Mocha in-process'); diff --git a/karma.conf.js b/karma.conf.js index 9337e3d3b8..a414236e3d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -30,13 +30,18 @@ module.exports = config => { browserify: { debug: true, configure: function configure(b) { - b.ignore('./lib/cli/*.js') - .ignore('chokidar') + b.ignore('chokidar') .ignore('fs') .ignore('glob') - .ignore('./lib/esm-utils.js') .ignore('path') .ignore('supports-color') + .ignore('./lib/esm-utils.js') + .ignore('./lib/cli/*.js') + .ignore('./lib/nodejs/serializer.js') + .ignore('./lib/nodejs/worker.js') + .ignore('./lib/nodejs/buffered-worker-pool.js') + .ignore('./lib/nodejs/parallel-buffered-runner.js') + .ignore('./lib/nodejs/reporters/parallel-buffered.js') .on('bundled', (err, content) => { if (err) { throw err; diff --git a/lib/browser/growl.js b/lib/browser/growl.js index 016798501a..20e32c6f33 100644 --- a/lib/browser/growl.js +++ b/lib/browser/growl.js @@ -11,6 +11,7 @@ var Date = global.Date; var setTimeout = global.setTimeout; var EVENT_RUN_END = require('../runner').constants.EVENT_RUN_END; +var isBrowser = require('../utils').isBrowser; /** * Checks if browser notification support exists. @@ -25,7 +26,7 @@ var EVENT_RUN_END = require('../runner').constants.EVENT_RUN_END; exports.isCapable = function() { var hasNotificationSupport = 'Notification' in window; var hasPromiseSupport = typeof Promise === 'function'; - return process.browser && hasNotificationSupport && hasPromiseSupport; + return isBrowser() && hasNotificationSupport && hasPromiseSupport; }; /** diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js index 4145f4333c..5dc5e1fc99 100644 --- a/lib/cli/collect-files.js +++ b/lib/cli/collect-files.js @@ -17,13 +17,7 @@ const {NO_FILES_MATCH_PATTERN} = require('../errors').constants; /** * Smash together an array of test files in the correct order - * @param {Object} opts - Options - * @param {string[]} opts.extension - File extensions to use - * @param {string[]} opts.spec - Files, dirs, globs to run - * @param {string[]} opts.ignore - Files, dirs, globs to ignore - * @param {string[]} opts.file - List of additional files to include - * @param {boolean} opts.recursive - Find files recursively - * @param {boolean} opts.sort - Sort test files + * @param {FileCollectionOptions} [opts] - Options * @returns {string[]} List of files to test * @private */ @@ -84,3 +78,14 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { return files; }; + +/** + * An object to configure how Mocha gathers test files + * @typedef {Object} FileCollectionOptions + * @property {string[]} extension - File extensions to use + * @property {string[]} spec - Files, dirs, globs to run + * @property {string[]} ignore - Files, dirs, globs to ignore + * @property {string[]} file - List of additional files to include + * @property {boolean} recursive - Find files recursively + * @property {boolean} sort - Sort test files + */ diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index 172fae654a..e09338f2c6 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -10,7 +10,7 @@ const fs = require('fs'); const path = require('path'); const debug = require('debug')('mocha:cli:run:helpers'); -const watchRun = require('./watch-run'); +const {watchRun, watchParallelRun} = require('./watch-run'); const collectFiles = require('./collect-files'); const {type} = require('../utils'); const {format} = require('util'); @@ -151,24 +151,52 @@ const singleRun = async (mocha, {exit}, fileCollectParams) => { }; /** - * Actually run tests + * Collect files and run tests (using `BufferedRunner`). + * + * This is `async` for consistency. + * * @param {Mocha} mocha - Mocha instance - * @param {Object} opts - Command line options + * @param {Options} options - Command line options + * @param {Object} fileCollectParams - Parameters that control test + * file collection. See `lib/cli/collect-files.js`. + * @returns {Promise} + * @ignore * @private - * @returns {Promise} + */ +const parallelRun = async (mocha, options, fileCollectParams) => { + const files = collectFiles(fileCollectParams); + debug( + 'executing %d test file(s) across %d concurrent jobs', + files.length, + options.jobs + ); + mocha.files = files; + + // note that we DO NOT load any files here; this is handled by the worker + return mocha.run(options.exit ? exitMocha : exitMochaLater); +}; + +/** + * Actually run tests. Delegates to one of four different functions: + * - `singleRun`: run tests in serial & exit + * - `watchRun`: run tests in serial, rerunning as files change + * - `parallelRun`: run tests in parallel & exit + * - `watchParallelRun`: run tests in parallel, rerunning as files change + * @param {Mocha} mocha - Mocha instance + * @param {Options} opts - Command line options + * @private + * @returns {Promise} */ exports.runMocha = async (mocha, options) => { const { watch = false, extension = [], - exit = false, ignore = [], file = [], + parallel = false, recursive = false, sort = false, - spec = [], - watchFiles, - watchIgnore + spec = [] } = options; const fileCollectParams = { @@ -180,11 +208,14 @@ exports.runMocha = async (mocha, options) => { spec }; + let run; if (watch) { - watchRun(mocha, {watchFiles, watchIgnore}, fileCollectParams); + run = parallel ? watchParallelRun : watchRun; } else { - await singleRun(mocha, {exit}, fileCollectParams); + run = parallel ? parallelRun : singleRun; } + + return run(mocha, options, fileCollectParams); }; /** diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index 4648d9fbfe..da3b7d995d 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -42,11 +42,12 @@ exports.types = { 'list-interfaces', 'list-reporters', 'no-colors', + 'parallel', 'recursive', 'sort', 'watch' ], - number: ['retries'], + number: ['retries', 'jobs'], string: [ 'config', 'fgrep', @@ -75,7 +76,9 @@ exports.aliases = { growl: ['G'], ignore: ['exclude'], invert: ['i'], + jobs: ['j'], 'no-colors': ['C'], + parallel: ['p'], reporter: ['R'], 'reporter-option': ['reporter-options', 'O'], require: ['r'], diff --git a/lib/cli/run.js b/lib/cli/run.js index 1bd938b77a..f2c970fb26 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -151,6 +151,13 @@ exports.builder = yargs => description: 'Inverts --grep and --fgrep matches', group: GROUPS.FILTERS }, + jobs: { + description: + 'Number of concurrent jobs for --parallel; use 1 to run in serial', + defaultDescription: '(number of CPU cores - 1)', + requiresArg: true, + group: GROUPS.RULES + }, 'list-interfaces': { conflicts: Array.from(ONE_AND_DONE_ARGS), description: 'List built-in user interfaces & exit' @@ -170,6 +177,10 @@ exports.builder = yargs => normalize: true, requiresArg: true }, + parallel: { + description: 'Run tests in parallel', + group: GROUPS.RULES + }, recursive: { description: 'Look for tests in subdirectories', group: GROUPS.FILES @@ -272,6 +283,40 @@ exports.builder = yargs => ); } + if (argv.parallel) { + // yargs.conflicts() can't deal with `--file foo.js --no-parallel`, either + if (argv.file) { + throw createUnsupportedError( + '--parallel runs test files in a non-deterministic order, and is mutually exclusive with --file' + ); + } + + // or this + if (argv.sort) { + throw createUnsupportedError( + '--parallel runs test files in a non-deterministic order, and is mutually exclusive with --sort' + ); + } + + if (argv.reporter === 'progress') { + throw createUnsupportedError( + '--reporter=progress is mutually exclusive with --parallel' + ); + } + + if (argv.reporter === 'markdown') { + throw createUnsupportedError( + '--reporter=markdown is mutually exclusive with --parallel' + ); + } + + if (argv.reporter === 'json-stream') { + throw createUnsupportedError( + '--reporter=json-stream is mutually exclusive with --parallel' + ); + } + } + if (argv.compilers) { throw createUnsupportedError( `--compilers is DEPRECATED and no longer supported. diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index b35a906959..2c59490a81 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -1,5 +1,6 @@ 'use strict'; +const debug = require('debug')('mocha:cli:watch'); const path = require('path'); const chokidar = require('chokidar'); const Context = require('../context'); @@ -12,6 +13,42 @@ const collectFiles = require('./collect-files'); * @private */ +/** + * Run Mocha in parallel "watch" mode + * @param {Mocha} mocha - Mocha instance + * @param {Object} opts - Options + * @param {string[]} [opts.watchFiles] - List of paths and patterns to + * watch. If not provided all files with an extension included in + * `fileColletionParams.extension` are watched. See first argument of + * `chokidar.watch`. + * @param {string[]} opts.watchIgnore - List of paths and patterns to + * exclude from watching. See `ignored` option of `chokidar`. + * @param {FileCollectionOptions} fileCollectParams - Parameters that control test + * @private + */ +exports.watchParallelRun = ( + mocha, + {watchFiles, watchIgnore}, + fileCollectParams +) => { + debug('creating parallel watcher'); + return createWatcher(mocha, { + watchFiles, + watchIgnore, + beforeRun({mocha}) { + mocha.files = collectFiles(fileCollectParams); + // in parallel mode, the main Mocha process doesn't actually load the + // files. this flag prevents `mocha.run()` from autoloading. + mocha.lazyLoadFiles(true); + return mocha; + }, + afterRun({watcher}) { + blastCache(watcher); + }, + fileCollectParams + }); +}; + /** * Run Mocha in "watch" mode * @param {Mocha} mocha - Mocha instance @@ -22,27 +59,88 @@ const collectFiles = require('./collect-files'); * `chokidar.watch`. * @param {string[]} opts.watchIgnore - List of paths and patterns to * exclude from watching. See `ignored` option of `chokidar`. - * @param {Object} fileCollectParams - Parameters that control test + * @param {FileCollectionOptions} fileCollectParams - Parameters that control test * file collection. See `lib/cli/collect-files.js`. - * @param {string[]} fileCollectParams.extension - List of extensions - * to watch if `opts.watchFiles` is not given. * @private */ -module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { +exports.watchRun = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { + debug('creating serial watcher'); + // list of all test files + + return createWatcher(mocha, { + watchFiles, + watchIgnore, + beforeRun({mocha}) { + mocha.unloadFiles(); + + // I don't know why we're cloning the root suite. + const rootSuite = mocha.suite.clone(); + + // this `require` is needed because the require cache has been cleared. the dynamic + // exports set via the below call to `mocha.ui()` won't work properly if a + // test depends on this module (see `required-tokens.spec.js`). + const Mocha = require('../mocha'); + + // ... and now that we've gotten a new module, we need to use it again due + // to `mocha.ui()` call + const newMocha = new Mocha(mocha.options); + // don't know why this is needed + newMocha.suite = rootSuite; + // nor this + newMocha.suite.ctx = new Context(); + + // reset the list of files + newMocha.files = collectFiles(fileCollectParams); + + // because we've swapped out the root suite (see the `run` inner function + // in `createRerunner`), we need to call `mocha.ui()` again to set up the context/globals. + newMocha.ui(newMocha.options.ui); + + return newMocha; + }, + afterRun({watcher}) { + blastCache(watcher); + }, + fileCollectParams + }); +}; + +/** + * Bootstraps a chokidar watcher. Handles keyboard input & signals + * @param {Mocha} mocha - Mocha instance + * @param {Object} opts + * @param {BeforeWatchRun} [opts.beforeRun] - Function to call before + * `mocha.run()` + * @param {AfterWatchRun} [opts.afterRun] - Function to call after `mocha.run()` + * @param {string[]} [opts.watchFiles] - List of paths and patterns to watch. If + * not provided all files with an extension included in + * `fileColletionParams.extension` are watched. See first argument of + * `chokidar.watch`. + * @param {string[]} [opts.watchIgnore] - List of paths and patterns to exclude + * from watching. See `ignored` option of `chokidar`. + * @param {FileCollectionOptions} opts.fileCollectParams - List of extensions to watch if `opts.watchFiles` is not given. + * @returns {FSWatcher} + * @ignore + * @private + */ +const createWatcher = ( + mocha, + {watchFiles, watchIgnore, beforeRun, afterRun, fileCollectParams} +) => { if (!watchFiles) { watchFiles = fileCollectParams.extension.map(ext => `**/*.${ext}`); } + debug('ignoring files matching: %s', watchIgnore); + const watcher = chokidar.watch(watchFiles, { ignored: watchIgnore, ignoreInitial: true }); - const rerunner = createRerunner(mocha, () => { - getWatchedFiles(watcher).forEach(file => { - delete require.cache[file]; - }); - mocha.files = collectFiles(fileCollectParams); + const rerunner = createRerunner(mocha, watcher, { + beforeRun, + afterRun }); watcher.on('ready', () => { @@ -53,7 +151,6 @@ module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { rerunner.scheduleRun(); }); - console.log(); hideCursor(); process.on('exit', () => { showCursor(); @@ -74,36 +171,43 @@ module.exports = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { .toLowerCase(); if (str === 'rs') rerunner.scheduleRun(); }); + + return watcher; }; /** - * Create an object that allows you to rerun tests on the mocha - * instance. `beforeRun` is called everytime before `mocha.run()` is - * called. + * Create an object that allows you to rerun tests on the mocha instance. * * @param {Mocha} mocha - Mocha instance - * @param {function} beforeRun - Called just before `mocha.run()` + * @param {FSWatcher} watcher - chokidar `FSWatcher` instance + * @param {Object} [opts] - Options! + * @param {BeforeWatchRun} [opts.beforeRun] - Function to call before `mocha.run()` + * @param {AfterWatchRun} [opts.afterRun] - Function to call after `mocha.run()` + * @returns {Rerunner} + * @ignore + * @private */ -const createRerunner = (mocha, beforeRun) => { +const createRerunner = (mocha, watcher, {beforeRun, afterRun} = {}) => { // Set to a `Runner` when mocha is running. Set to `null` when mocha is not // running. let runner = null; + // true if a file has changed during a test run let rerunScheduled = false; const run = () => { - try { - beforeRun(); - resetMocha(mocha); - runner = mocha.run(() => { - runner = null; - if (rerunScheduled) { - rerun(); - } - }); - } catch (e) { - console.log(e.stack); - } + mocha = beforeRun ? beforeRun({mocha, watcher}) : mocha; + + runner = mocha.run(() => { + debug('finished watch run'); + runner = null; + afterRun && afterRun({mocha, watcher}); + if (rerunScheduled) { + rerun(); + } else { + debug('waiting for changes...'); + } + }); }; const scheduleRun = () => { @@ -136,32 +240,18 @@ const createRerunner = (mocha, beforeRun) => { * * @param watcher - Instance of a chokidar watcher * @return {string[]} - List of absolute paths + * @ignore + * @private */ const getWatchedFiles = watcher => { const watchedDirs = watcher.getWatched(); - let watchedFiles = []; - Object.keys(watchedDirs).forEach(dir => { - watchedFiles = watchedFiles.concat( - watchedDirs[dir].map(file => path.join(dir, file)) - ); - }); - return watchedFiles; -}; - -/** - * Reset the internal state of the mocha instance so that tests can be rerun. - * - * @param {Mocha} mocha - Mocha instance - * @private - */ -const resetMocha = mocha => { - mocha.unloadFiles(); - mocha.suite = mocha.suite.clone(); - mocha.suite.ctx = new Context(); - // Registers a callback on `mocha.suite` that wires new context to the DSL - // (e.g. `describe`) that is exposed as globals when the test files are - // reloaded. - mocha.ui(mocha.options.ui); + return Object.keys(watchedDirs).reduce( + (acc, dir) => [ + ...acc, + ...watchedDirs[dir].map(file => path.join(dir, file)) + ], + [] + ); }; /** @@ -189,3 +279,43 @@ const showCursor = () => { const eraseLine = () => { process.stdout.write('\u001b[2K'); }; + +/** + * Blast all of the watched files out of `require.cache` + * @param {FSWatcher} watcher - chokidar FSWatcher + * @ignore + * @private + */ +const blastCache = watcher => { + const files = getWatchedFiles(watcher); + files.forEach(file => { + delete require.cache[file]; + }); + debug('deleted %d file(s) from the require cache', files.length); +}; + +/** + * Callback to be run before `mocha.run()` is called. + * Optionally, it can return a new `Mocha` instance. + * @callback BeforeWatchRun + * @private + * @param {{mocha: Mocha, watcher: FSWatcher}} options + * @returns {Mocha} + */ + +/** + * Callback to be run after `mocha.run()` completes. Typically used to clear + * require cache. + * @callback AfterWatchRun + * @private + * @param {{mocha: Mocha, watcher: FSWatcher}} options + * @returns {void} + */ + +/** + * Object containing run control methods + * @typedef {Object} Rerunner + * @private + * @property {Function} run - Calls `mocha.run()` + * @property {Function} scheduleRun - Schedules another call to `run` + */ diff --git a/lib/errors.js b/lib/errors.js index 1e665e5fb3..929f56399c 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -66,7 +66,12 @@ var constants = { /** * Invalid state transition occuring in `Mocha` instance */ - INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED' + INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + + /** + * Use of `only()` w/ `--forbid-only` results in this error. + */ + FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY' }; /** @@ -293,6 +298,23 @@ function createMultipleDoneError(runnable, originalErr) { return err; } +/** + * Creates an error object to be thrown when `.only()` is used with + * `--forbid-only`. + * @public + * @param {Mocha} mocha - Mocha instance + * @returns {Error} Error with code {@link constants.FORBIDDEN_EXCLUSIVITY} + */ +function createForbiddenExclusivityError(mocha) { + var err = new Error( + mocha.isWorker + ? '`.only` is not supported in parallel mode' + : '`.only` forbidden by --forbid-only' + ); + err.code = constants.FORBIDDEN_EXCLUSIVITY; + return err; +} + module.exports = { createInvalidArgumentTypeError: createInvalidArgumentTypeError, createInvalidArgumentValueError: createInvalidArgumentValueError, @@ -307,5 +329,6 @@ module.exports = { createMochaInstanceAlreadyRunningError: createMochaInstanceAlreadyRunningError, createFatalError: createFatalError, createMultipleDoneError: createMultipleDoneError, + createForbiddenExclusivityError: createForbiddenExclusivityError, constants: constants }; diff --git a/lib/hook.js b/lib/hook.js index 6560715fc5..6c12c02bb8 100644 --- a/lib/hook.js +++ b/lib/hook.js @@ -52,3 +52,27 @@ Hook.prototype.error = function(err) { this._error = err; }; + +/** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ +Hook.prototype.serialize = function serialize() { + return { + $$isPending: this.isPending(), + $$titlePath: this.titlePath(), + ctx: { + currentTest: { + title: this.ctx && this.ctx.currentTest && this.ctx.currentTest.title + } + }, + parent: { + root: this.parent.root, + title: this.parent.title + }, + title: this.title, + type: this.type + }; +}; diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index e7e84b2511..5fa87e4537 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -4,6 +4,7 @@ var Suite = require('../suite'); var errors = require('../errors'); var createMissingArgumentError = errors.createMissingArgumentError; var createUnsupportedError = errors.createUnsupportedError; +var createForbiddenExclusivityError = errors.createForbiddenExclusivityError; /** * Functions common to more than one interface. @@ -127,9 +128,8 @@ module.exports = function(suites, context, mocha) { suites.unshift(suite); if (opts.isOnly) { if (mocha.options.forbidOnly && shouldBeTested(suite)) { - throw createUnsupportedError('`.only` forbidden'); + throw createForbiddenExclusivityError(mocha); } - suite.parent.appendOnlySuite(suite); } if (suite.pending) { @@ -166,8 +166,9 @@ module.exports = function(suites, context, mocha) { * @returns {*} */ only: function(mocha, test) { - if (mocha.options.forbidOnly) - throw createUnsupportedError('`.only` forbidden'); + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } test.markOnly(); return test; }, diff --git a/lib/mocha.js b/lib/mocha.js index 1ab26958c8..5c39d62cac 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -9,7 +9,7 @@ var escapeRe = require('escape-string-regexp'); var path = require('path'); var builtinReporters = require('./reporters'); -var growl = require('./growl'); +var growl = require('./nodejs/growl'); var utils = require('./utils'); var mocharc = require('./mocharc.json'); var errors = require('./errors'); @@ -26,6 +26,7 @@ var EVENT_FILE_PRE_REQUIRE = Suite.constants.EVENT_FILE_PRE_REQUIRE; var EVENT_FILE_POST_REQUIRE = Suite.constants.EVENT_FILE_POST_REQUIRE; var EVENT_FILE_REQUIRE = Suite.constants.EVENT_FILE_REQUIRE; var sQuote = utils.sQuote; +var debug = require('debug')('mocha:mocha'); exports = module.exports = Mocha; @@ -57,7 +58,7 @@ var mochaStates = utils.defineConstants({ * To require local UIs and reporters when running in node. */ -if (!process.browser && typeof module.paths !== 'undefined') { +if (!utils.isBrowser() && typeof module.paths !== 'undefined') { var cwd = utils.cwd(); module.paths.push(cwd, path.join(cwd, 'node_modules')); } @@ -66,11 +67,6 @@ if (!process.browser && typeof module.paths !== 'undefined') { * Expose internals. */ -/** - * @public - * @class utils - * @memberof Mocha - */ exports.utils = utils; exports.interfaces = require('./interfaces'); /** @@ -118,8 +114,11 @@ exports.Test = require('./test'); * @param {number} [options.slow] - Slow threshold value. * @param {number|string} [options.timeout] - Timeout threshold value. * @param {string} [options.ui] - Interface name. + * @param {boolean} [options.parallel] - Run jobs in parallel + * @param {number} [options.jobs] - Max number of worker processes for parallel runs * @param {MochaRootHookObject} [options.rootHooks] - Hooks to bootstrap the root * suite with + * @param {boolean} [options.isWorker] - Should be `true` if `Mocha` process is running in a worker process. */ function Mocha(options) { options = utils.assign({}, mocharc, options || {}); @@ -128,6 +127,7 @@ function Mocha(options) { // root suite this.suite = new exports.Suite('', new exports.Context(), true); this._cleanReferencesAfterRun = true; + this._state = mochaStates.INIT; this.grep(options.grep) .fgrep(options.fgrep) @@ -171,6 +171,39 @@ function Mocha(options) { if (options.rootHooks) { this.rootHooks(options.rootHooks); } + + /** + * The class which we'll instantiate in {@link Mocha#run}. Defaults to + * {@link Runner} in serial mode; changes in parallel mode. + * @memberof Mocha + * @private + */ + this._runnerClass = exports.Runner; + + /** + * Whether or not to call {@link Mocha#loadFiles} implicitly when calling + * {@link Mocha#run}. If this is `true`, then it's up to the consumer to call + * {@link Mocha#loadFiles} _or_ {@link Mocha#loadFilesAsync}. + * @private + * @memberof Mocha + */ + this._lazyLoadFiles = false; + + /** + * It's useful for a Mocha instance to know if it's running in a worker process. + * We could derive this via other means, but it's helpful to have a flag to refer to. + * @memberof Mocha + * @private + */ + this.isWorker = Boolean(options.isWorker); + + if ( + options.parallel && + (typeof options.jobs === 'undefined' || options.jobs > 1) + ) { + debug('attempting to enable parallel mode'); + this.parallelMode(true); + } } /** @@ -221,20 +254,20 @@ Mocha.prototype.addFile = function(file) { * // Use XUnit reporter and direct its output to file * mocha.reporter('xunit', { output: '/path/to/testspec.xunit.xml' }); */ -Mocha.prototype.reporter = function(reporter, reporterOptions) { - if (typeof reporter === 'function') { - this._reporter = reporter; +Mocha.prototype.reporter = function(reporterName, reporterOptions) { + if (typeof reporterName === 'function') { + this._reporter = reporterName; } else { - reporter = reporter || 'spec'; - var _reporter; + reporterName = reporterName || 'spec'; + var reporter; // Try to load a built-in reporter. - if (builtinReporters[reporter]) { - _reporter = builtinReporters[reporter]; + if (builtinReporters[reporterName]) { + reporter = builtinReporters[reporterName]; } // Try to load reporters from process.cwd() and node_modules - if (!_reporter) { + if (!reporter) { try { - _reporter = require(reporter); + reporter = require(reporterName); } catch (err) { if ( err.code === 'MODULE_NOT_FOUND' || @@ -242,31 +275,31 @@ Mocha.prototype.reporter = function(reporter, reporterOptions) { ) { // Try to load reporters from a path (absolute or relative) try { - _reporter = require(path.resolve(utils.cwd(), reporter)); + reporter = require(path.resolve(utils.cwd(), reporterName)); } catch (_err) { _err.code === 'MODULE_NOT_FOUND' || _err.message.indexOf('Cannot find module') >= 0 - ? utils.warn(sQuote(reporter) + ' reporter not found') + ? utils.warn(sQuote(reporterName) + ' reporter not found') : utils.warn( - sQuote(reporter) + + sQuote(reporterName) + ' reporter blew up with error:\n' + err.stack ); } } else { utils.warn( - sQuote(reporter) + ' reporter blew up with error:\n' + err.stack + sQuote(reporterName) + ' reporter blew up with error:\n' + err.stack ); } } } - if (!_reporter) { + if (!reporter) { throw createInvalidReporterError( - 'invalid reporter ' + sQuote(reporter), - reporter + 'invalid reporter ' + sQuote(reporterName), + reporterName ); } - this._reporter = _reporter; + this._reporter = reporter; } this.options.reporterOption = reporterOptions; // alias option name is used in public reporters xunit/tap/progress @@ -375,7 +408,7 @@ Mocha.prototype.loadFiles = function(fn) { Mocha.prototype.loadFilesAsync = function() { var self = this; var suite = this.suite; - this.loadAsync = true; + this.lazyLoadFiles(true); if (!esmUtils) { return new Promise(function(resolve) { @@ -591,7 +624,7 @@ Mocha.prototype.fullTrace = function(fullTrace) { Mocha.prototype.growl = function() { this.options.growl = this.isGrowlCapable(); if (!this.options.growl) { - var detail = process.browser + var detail = utils.isBrowser() ? 'notification support not available in this browser...' : 'notification support prerequisites not installed...'; console.error(detail + ' cannot enable!'); @@ -848,6 +881,7 @@ Mocha.prototype.forbidPending = function(forbidPending) { /** * Throws an error if mocha is in the wrong state to be able to transition to a "running" state. + * @private */ Mocha.prototype._guardRunningStateTransition = function() { if (this._state === mochaStates.RUNNING) { @@ -914,14 +948,14 @@ Mocha.prototype.run = function(fn) { this._previousRunner.dispose(); this.suite.reset(); } - if (this.files.length && !this.loadAsync) { + if (this.files.length && !this._lazyLoadFiles) { this.loadFiles(); } var self = this; var suite = this.suite; var options = this.options; options.files = this.files; - var runner = new exports.Runner(suite, { + var runner = new this._runnerClass(suite, { delay: options.delay, cleanReferencesAfterRun: this._cleanReferencesAfterRun }); @@ -963,7 +997,7 @@ Mocha.prototype.run = function(fn) { } } - return runner.run(done); + return runner.run(done, {files: this.files, options: options}); }; /** @@ -994,6 +1028,65 @@ Mocha.prototype.rootHooks = function rootHooks(hooks) { return this; }; +/** + * Toggles parallel mode. + * + * Must be run before calling {@link Mocha#run}. Changes the `Runner` class to + * use; also enables lazy file loading if not already done so. + * @param {boolean} [enable] - If `true`, enable; otherwise disable. + * @throws If run in browser + * @throws If Mocha not in "INIT" state + * @returns {Mocha} + * @chainable + * @public + */ +Mocha.prototype.parallelMode = function parallelMode(enable) { + if (utils.isBrowser()) { + throw errors.createUnsupportedError( + 'parallel mode is only supported in Node.js' + ); + } + var parallel = enable === true; + if ( + parallel === this.options.parallel && + this._lazyLoadFiles && + this._runnerClass !== exports.Runner + ) { + return this; + } + if (this._state !== mochaStates.INIT) { + throw errors.createUnsupportedError( + 'cannot change parallel mode after having called run()' + ); + } + this.options.parallel = parallel; + + // swap Runner class + this._runnerClass = parallel + ? require('./nodejs/parallel-buffered-runner') + : exports.Runner; + + // lazyLoadFiles may have been set `true` otherwise (for ESM loading), + // so keep `true` if so. + return this.lazyLoadFiles(this._lazyLoadFiles || parallel); +}; + +/** + * Disables implicit call to {@link Mocha#loadFiles} in {@link Mocha#run}. This + * setting is used by watch mode, parallel mode, and for loading ESM files. + * @todo This should throw if we've already loaded files; such behavior + * necessitates adding a new state. + * @param {boolean} [enable] - If `true`, disable eager loading of files in + * {@link Mocha#run} + * @chainable + * @public + */ +Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { + this._lazyLoadFiles = enable === true; + debug('set lazy load to %s', enable); + return this; +}; + /** * An alternative way to define root hooks that works with parallel runs. * @typedef {Object} MochaRootHookObject diff --git a/lib/nodejs/buffered-worker-pool.js b/lib/nodejs/buffered-worker-pool.js new file mode 100644 index 0000000000..144333ef1a --- /dev/null +++ b/lib/nodejs/buffered-worker-pool.js @@ -0,0 +1,174 @@ +/** + * A wrapper around a third-party child process worker pool implementation. + * Used by {@link module:buffered-runner}. + * @private + * @module buffered-worker-pool + */ + +'use strict'; + +const serializeJavascript = require('serialize-javascript'); +const workerpool = require('workerpool'); +const {deserialize} = require('./serializer'); +const debug = require('debug')('mocha:parallel:buffered-worker-pool'); +const {createInvalidArgumentTypeError} = require('../errors'); + +const WORKER_PATH = require.resolve('./worker.js'); + +/** + * A mapping of Mocha `Options` objects to serialized values. + * + * This is helpful because we tend to same the same options over and over + * over IPC. + * @type {WeakMap} + */ +let optionsCache = new WeakMap(); + +/** + * These options are passed into the [workerpool](https://npm.im/workerpool) module. + * @type {Partial} + */ +const WORKER_POOL_DEFAULT_OPTS = { + // use child processes, not worker threads! + workerType: 'process', + // ensure the same flags sent to `node` for this `mocha` invocation are passed + // along to children + forkOpts: {execArgv: process.execArgv}, + maxWorkers: workerpool.cpus - 1 +}; + +/** + * A wrapper around a third-party worker pool implementation. + * @private + */ +class BufferedWorkerPool { + /** + * Creates an underlying worker pool instance; determines max worker count + * @param {Partial} [opts] - Options + */ + constructor(opts = {}) { + const maxWorkers = Math.max( + 1, + typeof opts.maxWorkers === 'undefined' + ? WORKER_POOL_DEFAULT_OPTS.maxWorkers + : opts.maxWorkers + ); + + /* istanbul ignore next */ + if (workerpool.cpus < 2) { + // TODO: decide whether we should warn + debug( + 'not enough CPU cores available to run multiple jobs; avoid --parallel on this machine' + ); + } else if (maxWorkers >= workerpool.cpus) { + // TODO: decide whether we should warn + debug( + '%d concurrent job(s) requested, but only %d core(s) available', + maxWorkers, + workerpool.cpus + ); + } + /* istanbul ignore next */ + debug( + 'run(): starting worker pool of max size %d, using node args: %s', + maxWorkers, + process.execArgv.join(' ') + ); + + this.options = Object.assign({}, WORKER_POOL_DEFAULT_OPTS, opts, { + maxWorkers + }); + this._pool = workerpool.pool(WORKER_PATH, this.options); + } + + /** + * Terminates all workers in the pool. + * @param {boolean} [force] - Whether to force-kill workers. By default, lets workers finish their current task before termination. + * @private + * @returns {Promise} + */ + async terminate(force = false) { + /* istanbul ignore next */ + debug('terminate(): terminating with force = %s', force); + return this._pool.terminate(force); + } + + /** + * Adds a test file run to the worker pool queue for execution by a worker process. + * + * Handles serialization/deserialization. + * + * @param {string} filepath - Filepath of test + * @param {Options} [options] - Options for Mocha instance + * @private + * @returns {Promise} + */ + async run(filepath, options = {}) { + if (!filepath || typeof filepath !== 'string') { + throw createInvalidArgumentTypeError( + 'Expected a non-empty filepath', + 'filepath', + 'string' + ); + } + const serializedOptions = BufferedWorkerPool.serializeOptions(options); + const result = await this._pool.exec('run', [filepath, serializedOptions]); + return deserialize(result); + } + + /** + * Returns stats about the state of the worker processes in the pool. + * + * Used for debugging. + * + * @private + */ + stats() { + return this._pool.stats(); + } + + /** + * Instantiates a {@link WorkerPool}. + * @private + */ + static create(...args) { + return new BufferedWorkerPool(...args); + } + + /** + * Given Mocha options object `opts`, serialize into a format suitable for + * transmission over IPC. + * + * @param {Options} [opts] - Mocha options + * @private + * @returns {string} Serialized options + */ + static serializeOptions(opts = {}) { + if (!optionsCache.has(opts)) { + const serialized = serializeJavascript(opts, { + unsafe: true, // this means we don't care about XSS + ignoreFunction: true // do not serialize functions + }); + optionsCache.set(opts, serialized); + /* istanbul ignore next */ + debug( + 'serializeOptions(): serialized options %O to: %s', + opts, + serialized + ); + } + return optionsCache.get(opts); + } + + /** + * Resets internal cache of serialized options objects. + * + * For testing/debugging + * @private + */ + static resetOptionsCache() { + optionsCache = new WeakMap(); + } +} + +exports.BufferedWorkerPool = BufferedWorkerPool; diff --git a/lib/growl.js b/lib/nodejs/growl.js similarity index 96% rename from lib/growl.js rename to lib/nodejs/growl.js index 53164563bb..6664d67c67 100644 --- a/lib/growl.js +++ b/lib/nodejs/growl.js @@ -8,7 +8,8 @@ const os = require('os'); const path = require('path'); const {sync: which} = require('which'); -const {EVENT_RUN_END} = require('./runner').constants; +const {EVENT_RUN_END} = require('../runner').constants; +const {isBrowser} = require('../utils'); /** * @summary @@ -25,7 +26,7 @@ const {EVENT_RUN_END} = require('./runner').constants; * @return {boolean} whether Growl notification support can be expected */ exports.isCapable = () => { - if (!process.browser) { + if (!isBrowser()) { return getSupportBinaries().reduce( (acc, binary) => acc || Boolean(which(binary, {nothrow: true})), false diff --git a/lib/nodejs/parallel-buffered-runner.js b/lib/nodejs/parallel-buffered-runner.js new file mode 100644 index 0000000000..d31929804a --- /dev/null +++ b/lib/nodejs/parallel-buffered-runner.js @@ -0,0 +1,293 @@ +/** + * A test Runner that uses a {@link module:buffered-worker-pool}. + * @module parallel-buffered-runner + * @private + */ + +'use strict'; + +const allSettled = require('promise.allsettled'); +const Runner = require('../runner'); +const {EVENT_RUN_BEGIN, EVENT_RUN_END} = Runner.constants; +const debug = require('debug')('mocha:parallel:parallel-buffered-runner'); +const {BufferedWorkerPool} = require('./buffered-worker-pool'); +const {setInterval, clearInterval} = global; +const {createMap} = require('../utils'); + +/** + * Outputs a debug statement with worker stats + * @param {BufferedWorkerPool} pool - Worker pool + */ +/* istanbul ignore next */ +const debugStats = pool => { + const {totalWorkers, busyWorkers, idleWorkers, pendingTasks} = pool.stats(); + debug( + '%d/%d busy workers; %d idle; %d tasks queued', + busyWorkers, + totalWorkers, + idleWorkers, + pendingTasks + ); +}; + +/** + * The interval at which we will display stats for worker processes in debug mode + */ +const DEBUG_STATS_INTERVAL = 5000; + +const ABORTED = 'ABORTED'; +const IDLE = 'IDLE'; +const ABORTING = 'ABORTING'; +const RUNNING = 'RUNNING'; +const BAILING = 'BAILING'; +const BAILED = 'BAILED'; +const COMPLETE = 'COMPLETE'; + +const states = createMap({ + [IDLE]: new Set([RUNNING, ABORTING]), + [RUNNING]: new Set([COMPLETE, BAILING, ABORTING]), + [COMPLETE]: new Set(), + [ABORTED]: new Set(), + [ABORTING]: new Set([ABORTED]), + [BAILING]: new Set([BAILED, ABORTING]), + [BAILED]: new Set([COMPLETE, ABORTING]) +}); + +/** + * This `Runner` delegates tests runs to worker threads. Does not execute any + * {@link Runnable}s by itself! + * @private + */ +class ParallelBufferedRunner extends Runner { + constructor(...args) { + super(...args); + + let state = IDLE; + Object.defineProperty(this, '_state', { + get() { + return state; + }, + set(newState) { + if (states[state].has(newState)) { + state = newState; + } else { + throw new Error(`invalid state transition: ${state} => ${newState}`); + } + } + }); + + this.once(Runner.constants.EVENT_RUN_END, () => { + this._state = COMPLETE; + }); + } + + /** + * Returns a mapping function to enqueue a file in the worker pool and return results of its execution. + * @param {BufferedWorkerPool} pool - Worker pool + * @param {Options} options - Mocha options + * @returns {FileRunner} Mapping function + */ + _createFileRunner(pool, options) { + return async file => { + debug('run(): enqueueing test file %s', file); + try { + const {failureCount, events} = await pool.run(file, options); + if (this._state === BAILED) { + // short-circuit after a graceful bail. if this happens, + // some other worker has bailed. + // TODO: determine if this is the desired behavior, or if we + // should report the events of this run anyway. + return; + } + debug( + 'run(): completed run of file %s; %d failures / %d events', + file, + failureCount, + events.length + ); + this.failures += failureCount; // can this ever be non-numeric? + let event = events.shift(); + while (event) { + this.emit(event.eventName, event.data, event.error); + if ( + this._state !== BAILING && + event.data && + event.data._bail && + (failureCount || event.error) + ) { + debug('run(): nonzero failure count & found bail flag'); + // we need to let the events complete for this file, as the worker + // should run any cleanup hooks + this._state = BAILING; + } + event = events.shift(); + } + if (this._state === BAILING) { + debug('run(): terminating pool due to "bail" flag'); + this._state = BAILED; + await pool.terminate(); + } + } catch (err) { + if (this._state === BAILED || this._state === ABORTING) { + debug( + 'run(): worker pool terminated with intent; skipping file %s', + file + ); + } else { + // this is an uncaught exception + debug('run(): encountered uncaught exception: %O', err); + if (this.allowUncaught) { + // still have to clean up + this._state = ABORTING; + await pool.terminate(true); + } + throw err; + } + } finally { + debug('run(): done running file %s', file); + } + }; + } + + /** + * Listen on `Process.SIGINT`; terminate pool if caught. + * Returns the listener for later call to `process.removeListener()`. + * @param {BufferedWorkerPool} pool - Worker pool + * @returns {SigIntListener} Listener + */ + _bindSigIntListener(pool) { + const sigIntListener = async () => { + debug('run(): caught a SIGINT'); + this._state = ABORTING; + + try { + debug('run(): force-terminating worker pool'); + await pool.terminate(true); + } catch (err) { + console.error( + `Error while attempting to force-terminate worker pool: ${err}` + ); + process.exitCode = 1; + } finally { + process.nextTick(() => { + debug('run(): imminent death'); + this._state = ABORTED; + process.kill(process.pid, 'SIGINT'); + }); + } + }; + + process.once('SIGINT', sigIntListener); + + return sigIntListener; + } + + /** + * Runs Mocha tests by creating a thread pool, then delegating work to the + * worker threads. + * + * Each worker receives one file, and as workers become available, they take a + * file from the queue and run it. The worker thread execution is treated like + * an RPC--it returns a `Promise` containing serialized information about the + * run. The information is processed as it's received, and emitted to a + * {@link Reporter}, which is likely listening for these events. + * + * @param {Function} callback - Called with an exit code corresponding to + * number of test failures. + * @param {{files: string[], options: Options}} opts - Files to run and + * command-line options, respectively. + */ + run(callback, {files, options} = {}) { + /** + * Listener on `Process.SIGINT` which tries to cleanly terminate the worker pool. + */ + let sigIntListener; + // This function should _not_ return a `Promise`; its parent (`Runner#run`) + // returns this instance, so this should do the same. However, we want to make + // use of `async`/`await`, so we use this IIFE. + + (async () => { + /** + * This is an interval that outputs stats about the worker pool every so often + */ + let debugInterval; + + /** + * @type {BufferedWorkerPool} + */ + let pool; + + try { + pool = BufferedWorkerPool.create({maxWorkers: options.jobs}); + + sigIntListener = this._bindSigIntListener(pool); + + /* istanbul ignore next */ + debugInterval = setInterval( + () => debugStats(pool), + DEBUG_STATS_INTERVAL + ).unref(); + + // this is set for uncaught exception handling in `Runner#uncaught` + // TODO: `Runner` should be using a state machine instead. + this.started = true; + this._state = RUNNING; + + this.emit(EVENT_RUN_BEGIN); + + const results = await allSettled( + files.map(this._createFileRunner(pool, options)) + ); + + // note that pool may already be terminated due to --bail + await pool.terminate(); + + results + .filter(({status}) => status === 'rejected') + .forEach(({reason}) => { + if (this.allowUncaught) { + // yep, just the first one. + throw reason; + } + // "rejected" will correspond to uncaught exceptions. + // unlike the serial runner, the parallel runner can always recover. + this.uncaught(reason); + }); + + if (this._state === ABORTING) { + return; + } + this.emit(EVENT_RUN_END); + debug('run(): completing with failure count %d', this.failures); + callback(this.failures); + } catch (err) { + // this `nextTick` takes us out of the `Promise` scope, so the + // exception will not be caught and returned as a rejected `Promise`, + // which would lead to an `unhandledRejection` event. + process.nextTick(() => { + debug('run(): re-throwing uncaught exception'); + throw err; + }); + } finally { + clearInterval(debugInterval); + process.removeListener('SIGINT', sigIntListener); + } + })(); + return this; + } +} + +module.exports = ParallelBufferedRunner; + +/** + * Listener function intended to be bound to `Process.SIGINT` event + * @callback SigIntListener + * @returns {Promise} + */ + +/** + * A function accepting a test file path and returning the results of a test run + * @callback FileRunner + * @param {string} filename - File to run + * @returns {Promise} + */ diff --git a/lib/nodejs/reporters/parallel-buffered.js b/lib/nodejs/reporters/parallel-buffered.js new file mode 100644 index 0000000000..3fc8b15491 --- /dev/null +++ b/lib/nodejs/reporters/parallel-buffered.js @@ -0,0 +1,133 @@ +/** + * "Buffered" reporter used internally by a worker process when running in parallel mode. + * @module reporters/parallel-buffered + * @private + */ + +'use strict'; + +/** + * Module dependencies. + */ + +const { + EVENT_SUITE_BEGIN, + EVENT_SUITE_END, + EVENT_TEST_FAIL, + EVENT_TEST_PASS, + EVENT_TEST_PENDING, + EVENT_TEST_BEGIN, + EVENT_TEST_END, + EVENT_TEST_RETRY, + EVENT_DELAY_BEGIN, + EVENT_DELAY_END, + EVENT_HOOK_BEGIN, + EVENT_HOOK_END, + EVENT_RUN_END +} = require('../../runner').constants; +const {SerializableEvent, SerializableWorkerResult} = require('../serializer'); +const debug = require('debug')('mocha:reporters:buffered'); +const Base = require('../../reporters/base'); + +/** + * List of events to listen to; these will be buffered and sent + * when `Mocha#run` is complete (via {@link ParallelBuffered#done}). + */ +const EVENT_NAMES = [ + EVENT_SUITE_BEGIN, + EVENT_SUITE_END, + EVENT_TEST_BEGIN, + EVENT_TEST_PENDING, + EVENT_TEST_FAIL, + EVENT_TEST_PASS, + EVENT_TEST_RETRY, + EVENT_TEST_END, + EVENT_HOOK_BEGIN, + EVENT_HOOK_END +]; + +/** + * Like {@link EVENT_NAMES}, except we expect these events to only be emitted + * by the `Runner` once. + */ +const ONCE_EVENT_NAMES = [EVENT_DELAY_BEGIN, EVENT_DELAY_END]; + +/** + * The `ParallelBuffered` reporter is for use by concurrent runs. Instead of outputting + * to `STDOUT`, etc., it retains a list of events it receives and hands these + * off to the callback passed into {@link Mocha#run}. That callback will then + * return the data to the main process. + * @private + */ +class ParallelBuffered extends Base { + /** + * Listens for {@link Runner} events and retains them in an `events` instance prop. + * @param {Runner} runner + */ + constructor(runner, opts) { + super(runner, opts); + + /** + * Retained list of events emitted from the {@link Runner} instance. + * @type {BufferedEvent[]} + * @memberOf Buffered + */ + const events = (this.events = []); + + /** + * mapping of event names to listener functions we've created, + * so we can cleanly _remove_ them from the runner once it's completed. + */ + const listeners = new Map(); + + /** + * Creates a listener for event `eventName` and adds it to the `listeners` + * map. This is a defensive measure, so that we don't a) leak memory or b) + * remove _other_ listeners that may not be associated with this reporter. + * @param {string} eventName - Event name + */ + const createListener = eventName => + listeners + .set(eventName, (runnable, err) => { + events.push(SerializableEvent.create(eventName, runnable, err)); + }) + .get(eventName); + + EVENT_NAMES.forEach(evt => { + runner.on(evt, createListener(evt)); + }); + ONCE_EVENT_NAMES.forEach(evt => { + runner.once(evt, createListener(evt)); + }); + + runner.once(EVENT_RUN_END, () => { + debug('received EVENT_RUN_END'); + listeners.forEach((listener, evt) => { + runner.removeListener(evt, listener); + listeners.delete(evt); + }); + }); + } + + /** + * Calls the {@link Mocha#run} callback (`callback`) with the test failure + * count and the array of {@link BufferedEvent} objects. Resets the array. + * @param {number} failures - Number of failed tests + * @param {Function} callback - The callback passed to {@link Mocha#run}. + */ + done(failures, callback) { + callback(SerializableWorkerResult.create(this.events, failures)); + this.events = []; // defensive + } +} + +/** + * Serializable event data from a `Runner`. Keys of the `data` property + * beginning with `__` will be converted into a function which returns the value + * upon deserialization. + * @typedef {Object} BufferedEvent + * @property {string} name - Event name + * @property {object} data - Event parameters + */ + +module.exports = ParallelBuffered; diff --git a/lib/nodejs/serializer.js b/lib/nodejs/serializer.js new file mode 100644 index 0000000000..dae366ce79 --- /dev/null +++ b/lib/nodejs/serializer.js @@ -0,0 +1,402 @@ +/** + * Serialization/deserialization classes and functions for communication between a main Mocha process and worker processes. + * @module serializer + * @private + */ + +'use strict'; + +const {type} = require('../utils'); +const {createInvalidArgumentTypeError} = require('../errors'); +// this is not named `mocha:parallel:serializer` because it's noisy and it's +// helpful to be able to write `DEBUG=mocha:parallel*` and get everything else. +const debug = require('debug')('mocha:serializer'); + +const SERIALIZABLE_RESULT_NAME = 'SerializableWorkerResult'; +const SERIALIZABLE_TYPES = new Set(['object', 'array', 'function', 'error']); + +/** + * The serializable result of a test file run from a worker. + * @private + */ +class SerializableWorkerResult { + /** + * Creates instance props; of note, the `__type` prop. + * + * Note that the failure count is _redundant_ and could be derived from the + * list of events; but since we're already doing the work, might as well use + * it. + * @param {SerializableEvent[]} [events=[]] - Events to eventually serialize + * @param {number} [failureCount=0] - Failure count + */ + constructor(events = [], failureCount = 0) { + /** + * The number of failures in this run + * @type {number} + */ + this.failureCount = failureCount; + /** + * All relevant events emitted from the {@link Runner}. + * @type {SerializableEvent[]} + */ + this.events = events; + + /** + * Symbol-like value needed to distinguish when attempting to deserialize + * this object (once it's been received over IPC). + * @type {Readonly<"SerializableWorkerResult">} + */ + Object.defineProperty(this, '__type', { + value: SERIALIZABLE_RESULT_NAME, + enumerable: true, + writable: false + }); + } + + /** + * Instantiates a new {@link SerializableWorkerResult}. + * @param {...any} args - Args to constructor + * @returns {SerilizableWorkerResult} + */ + static create(...args) { + return new SerializableWorkerResult(...args); + } + + /** + * Serializes each {@link SerializableEvent} in our `events` prop; + * makes this object read-only. + * @returns {Readonly} + */ + serialize() { + this.events.forEach(event => { + event.serialize(); + }); + return Object.freeze(this); + } + + /** + * Deserializes a {@link SerializedWorkerResult} into something reporters can + * use; calls {@link SerializableEvent.deserialize} on each item in its + * `events` prop. + * @param {SerializedWorkerResult} obj + * @returns {SerializedWorkerResult} + */ + static deserialize(obj) { + obj.events.forEach(event => { + SerializableEvent.deserialize(event); + }); + return obj; + } + + /** + * Returns `true` if this is a {@link SerializedWorkerResult} or a + * {@link SerializableWorkerResult}. + * @param {*} value - A value to check + * @returns {boolean} If true, it's deserializable + */ + static isSerializedWorkerResult(value) { + return ( + value instanceof SerializableWorkerResult || + (type(value) === 'object' && value.__type === SERIALIZABLE_RESULT_NAME) + ); + } +} + +/** + * Represents an event, emitted by a {@link Runner}, which is to be transmitted + * over IPC. + * + * Due to the contents of the event data, it's not possible to send them + * verbatim. When received by the main process--and handled by reporters--these + * objects are expected to contain {@link Runnable} instances. This class + * provides facilities to perform the translation via serialization and + * deserialization. + * @private + */ +class SerializableEvent { + /** + * Constructs a `SerializableEvent`, throwing if we receive unexpected data. + * + * Practically, events emitted from `Runner` have a minumum of zero (0) + * arguments-- (for example, {@link Runnable.constants.EVENT_RUN_BEGIN}) and a + * maximum of two (2) (for example, + * {@link Runnable.constants.EVENT_TEST_FAIL}, where the second argument is an + * `Error`). The first argument, if present, is a {@link Runnable}. This + * constructor's arguments adhere to this convention. + * @param {string} eventName - A non-empty event name. + * @param {any} [originalValue] - Some data. Corresponds to extra arguments + * passed to `EventEmitter#emit`. + * @param {Error} [originalError] - An error, if there's an error. + * @throws If `eventName` is empty, or `originalValue` is a non-object. + */ + constructor(eventName, originalValue, originalError) { + if (!eventName) { + throw new Error('expected a non-empty `eventName` string argument'); + } + /** + * The event name. + * @memberof SerializableEvent + */ + this.eventName = eventName; + const originalValueType = type(originalValue); + if (originalValueType !== 'object' && originalValueType !== 'undefined') { + throw new Error( + `expected object, received [${originalValueType}]: ${originalValue}` + ); + } + /** + * An error, if present. + * @memberof SerializableEvent + */ + Object.defineProperty(this, 'originalError', { + value: originalError, + enumerable: false + }); + + /** + * The raw value. + * + * We don't want this value sent via IPC; making it non-enumerable will do that. + * + * @memberof SerializableEvent + */ + Object.defineProperty(this, 'originalValue', { + value: originalValue, + enumerable: false + }); + } + + /** + * In case you hated using `new` (I do). + * + * @param {...any} args - Args for {@link SerializableEvent#constructor}. + * @returns {SerializableEvent} A new `SerializableEvent` + */ + static create(...args) { + return new SerializableEvent(...args); + } + + /** + * Used internally by {@link SerializableEvent#serialize}. + * @ignore + * @param {Array} pairs - List of parent/key tuples to process; modified in-place. This JSDoc type is an approximation + * @param {object} parent - Some parent object + * @param {string} key - Key to inspect + * @param {WeakSet} seenObjects - For avoiding circular references + */ + static _serialize(pairs, parent, key, seenObjects) { + let value = parent[key]; + if (seenObjects.has(value)) { + parent[key] = Object.create(null); + return; + } + if (type(value) === 'error' || value instanceof Error) { + // we need to reference the stack prop b/c it's lazily-loaded. + // `__type` is necessary for deserialization to create an `Error` later. + // `message` is apparently not enumerable, so we must handle it specifically. + value = Object.assign(Object.create(null), value, { + stack: value.stack, + message: value.message, + __type: 'Error' + }); + parent[key] = value; + // after this, the result of type(value) will be `object`, and we'll throw + // whatever other junk is in the original error into the new `value`. + } + switch (type(value)) { + case 'object': + if (type(value.serialize) === 'function') { + parent[key] = value.serialize(); + } else { + // by adding props to the `pairs` array, we will process it further + pairs.push( + ...Object.keys(value) + .filter(key => SERIALIZABLE_TYPES.has(type(value[key]))) + .map(key => [value, key]) + ); + } + break; + case 'function': + // we _may_ want to dig in to functions for some assertion libraries + // that might put a usable property on a function. + // for now, just zap it. + delete parent[key]; + break; + case 'array': + pairs.push( + ...value + .filter(value => SERIALIZABLE_TYPES.has(type(value))) + .map((value, index) => [value, index]) + ); + break; + } + } + + /** + * Modifies this object *in place* (for theoretical memory consumption & + * performance reasons); serializes `SerializableEvent#originalValue` (placing + * the result in `SerializableEvent#data`) and `SerializableEvent#error`. + * Freezes this object. The result is an object that can be transmitted over + * IPC. + * If this quickly becomes unmaintainable, we will want to move towards immutable + * objects post-haste. + */ + serialize() { + // given a parent object and a key, inspect the value and decide whether + // to replace it, remove it, or add it to our `pairs` array to further process. + // this is recursion in loop form. + const originalValue = this.originalValue; + const result = Object.assign(Object.create(null), { + data: + type(originalValue) === 'object' && + type(originalValue.serialize) === 'function' + ? originalValue.serialize() + : originalValue, + error: this.originalError + }); + + const pairs = Object.keys(result).map(key => [result, key]); + const seenObjects = new WeakSet(); + + let pair; + while ((pair = pairs.shift())) { + SerializableEvent._serialize(pairs, ...pair, seenObjects); + seenObjects.add(pair[0]); + } + + this.data = result.data; + this.error = result.error; + + return Object.freeze(this); + } + + /** + * Used internally by {@link SerializableEvent.deserialize}; creates an `Error` + * from an `Error`-like (serialized) object + * @ignore + * @param {Object} value - An Error-like value + * @returns {Error} Real error + */ + static _deserializeError(value) { + const error = new Error(value.message); + error.stack = value.stack; + Object.assign(error, value); + delete error.__type; + return error; + } + + /** + * Used internally by {@link SerializableEvent.deserialize}; recursively + * deserializes an object in-place. + * @param {object|Array} parent - Some object or array + * @param {string|number} key - Some prop name or array index within `parent` + */ + static _deserializeObject(parent, key) { + if (key === '__proto__') { + delete parent[key]; + return; + } + const value = parent[key]; + // keys beginning with `$$` are converted into functions returning the value + // and renamed, stripping the `$$` prefix. + // functions defined this way cannot be array members! + if (type(key) === 'string' && key.startsWith('$$')) { + const newKey = key.slice(2); + parent[newKey] = () => value; + delete parent[key]; + key = newKey; + } + if (type(value) === 'array') { + value.forEach((_, idx) => { + SerializableEvent._deserializeObject(value, idx); + }); + } else if (type(value) === 'object') { + if (value.__type === 'Error') { + parent[key] = SerializableEvent._deserializeError(value); + } else { + Object.keys(value).forEach(key => { + SerializableEvent._deserializeObject(value, key); + }); + } + } + } + + /** + * Deserialize value returned from a worker into something more useful. + * Does not return the same object. + * @todo do this in a loop instead of with recursion (if necessary) + * @param {SerializedEvent} obj - Object returned from worker + * @returns {SerializedEvent} Deserialized result + */ + static deserialize(obj) { + if (!obj) { + throw createInvalidArgumentTypeError('Expected value', obj); + } + + obj = Object.assign(Object.create(null), obj); + + if (obj.data) { + Object.keys(obj.data).forEach(key => { + SerializableEvent._deserializeObject(obj.data, key); + }); + } + + if (obj.error) { + obj.error = SerializableEvent._deserializeError(obj.error); + } + + return obj; + } +} + +/** + * "Serializes" a value for transmission over IPC as a message. + * + * If value is an object and has a `serialize()` method, call that method; otherwise return the object and hope for the best. + * + * @param {*} [value] - A value to serialize + */ +exports.serialize = function serialize(value) { + const result = + type(value) === 'object' && type(value.serialize) === 'function' + ? value.serialize() + : value; + debug('serialized: %O', result); + return result; +}; + +/** + * "Deserializes" a "message" received over IPC. + * + * This could be expanded with other objects that need deserialization, + * but at present time we only care about {@link SerializableWorkerResult} objects. + * + * @param {*} [value] - A "message" to deserialize + */ +exports.deserialize = function deserialize(value) { + const result = SerializableWorkerResult.isSerializedWorkerResult(value) + ? SerializableWorkerResult.deserialize(value) + : value; + debug('deserialized: %O', result); + return result; +}; + +exports.SerializableEvent = SerializableEvent; +exports.SerializableWorkerResult = SerializableWorkerResult; + +/** + * The result of calling `SerializableEvent.serialize`, as received + * by the deserializer. + * @typedef {Object} SerializedEvent + * @property {object?} data - Optional serialized data + * @property {object?} error - Optional serialized `Error` + */ + +/** + * The result of calling `SerializableWorkerResult.serialize` as received + * by the deserializer. + * @typedef {Object} SerializedWorkerResult + * @property {number} failureCount - Number of failures + * @property {SerializedEvent[]} events - Serialized events + * @property {"SerializedWorkerResult"} __type - Symbol-like to denote the type of object this is + */ diff --git a/lib/nodejs/worker.js b/lib/nodejs/worker.js new file mode 100644 index 0000000000..81abb6bb15 --- /dev/null +++ b/lib/nodejs/worker.js @@ -0,0 +1,154 @@ +/** + * A worker process. Consumes {@link module:reporters/parallel-buffered} reporter. + * @module worker + * @private + */ + +'use strict'; + +const { + createInvalidArgumentTypeError, + createInvalidArgumentValueError +} = require('../errors'); +const workerpool = require('workerpool'); +const Mocha = require('../mocha'); +const { + handleRequires, + validatePlugin, + loadRootHooks +} = require('../cli/run-helpers'); +const d = require('debug'); +const debug = d.debug(`mocha:parallel:worker:${process.pid}`); +const isDebugEnabled = d.enabled(`mocha:parallel:worker:${process.pid}`); +const {serialize} = require('./serializer'); +const {setInterval, clearInterval} = global; + +const BUFFERED_REPORTER_PATH = require.resolve('./reporters/parallel-buffered'); + +let rootHooks; + +if (workerpool.isMainThread) { + throw new Error( + 'This script is intended to be run as a worker (by the `workerpool` package).' + ); +} + +/** + * Initializes some stuff on the first call to {@link run}. + * + * Handles `--require` and `--ui`. Does _not_ handle `--reporter`, + * as only the `Buffered` reporter is used. + * + * **This function only runs once per worker**; it overwrites itself with a no-op + * before returning. + * + * @param {Options} argv - Command-line options + */ +let bootstrap = async argv => { + const rawRootHooks = await handleRequires(argv.require); + rootHooks = await loadRootHooks(rawRootHooks); + validatePlugin(argv, 'ui', Mocha.interfaces); + bootstrap = () => {}; + debug('bootstrap(): finished with args: %O', argv); +}; + +/** + * Runs a single test file in a worker thread. + * @param {string} filepath - Filepath of test file + * @param {string} [serializedOptions] - **Serialized** options. This string will be eval'd! + * @see https://npm.im/serialize-javascript + * @returns {Promise<{failures: number, events: BufferedEvent[]}>} - Test + * failure count and list of events. + */ +async function run(filepath, serializedOptions = '{}') { + if (!filepath) { + throw createInvalidArgumentTypeError( + 'Expected a non-empty "filepath" argument', + 'file', + 'string' + ); + } + + debug('run(): running test file %s', filepath); + + if (typeof serializedOptions !== 'string') { + throw createInvalidArgumentTypeError( + 'run() expects second parameter to be a string which was serialized by the `serialize-javascript` module', + 'serializedOptions', + 'string' + ); + } + let argv; + try { + // eslint-disable-next-line no-eval + argv = eval('(' + serializedOptions + ')'); + } catch (err) { + throw createInvalidArgumentValueError( + 'run() was unable to deserialize the options', + 'serializedOptions', + serializedOptions + ); + } + + const opts = Object.assign({ui: 'bdd'}, argv, { + // workers only use the `Buffered` reporter. + reporter: BUFFERED_REPORTER_PATH, + // if this was true, it would cause infinite recursion. + parallel: false, + // this doesn't work in parallel mode + forbidOnly: true, + // it's useful for a Mocha instance to know if it's running in a worker process. + isWorker: true + }); + + await bootstrap(opts); + + opts.rootHooks = rootHooks; + + const mocha = new Mocha(opts).addFile(filepath); + + try { + await mocha.loadFilesAsync(); + } catch (err) { + debug('run(): could not load file %s: %s', filepath, err); + throw err; + } + + return new Promise((resolve, reject) => { + let debugInterval; + /* istanbul ignore next */ + if (isDebugEnabled) { + debugInterval = setInterval(() => { + debug('run(): still running %s...', filepath); + }, 5000).unref(); + } + mocha.run(result => { + // Runner adds these; if we don't remove them, we'll get a leak. + process.removeAllListeners('uncaughtException'); + + try { + const serialized = serialize(result); + debug( + 'run(): completed run with %d test failures; returning to main process', + typeof result.failures === 'number' ? result.failures : 0 + ); + resolve(serialized); + } catch (err) { + // TODO: figure out exactly what the sad path looks like here. + // rejection should only happen if an error is "unrecoverable" + debug('run(): serialization failed; rejecting: %O', err); + reject(err); + } finally { + clearInterval(debugInterval); + } + }); + }); +} + +// this registers the `run` function. +workerpool.worker({run}); + +debug('started worker process'); + +// for testing +exports.run = run; diff --git a/lib/reporters/base.js b/lib/reporters/base.js index ea259445e3..cdf77a2847 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -10,7 +10,7 @@ var tty = require('tty'); var diff = require('diff'); var milliseconds = require('ms'); var utils = require('../utils'); -var supportsColor = process.browser ? null : require('supports-color'); +var supportsColor = utils.isBrowser() ? null : require('supports-color'); var constants = require('../runner').constants; var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; @@ -37,7 +37,7 @@ var consoleLog = console.log; */ exports.useColors = - !process.browser && + !utils.isBrowser() && (supportsColor.stdout || process.env.MOCHA_COLORS !== undefined); /** diff --git a/lib/reporters/landing.js b/lib/reporters/landing.js index 0be3837d7b..03c9acb1af 100644 --- a/lib/reporters/landing.js +++ b/lib/reporters/landing.js @@ -56,11 +56,12 @@ function Landing(runner, options) { var self = this; var width = (Base.window.width * 0.75) | 0; - var total = runner.total; var stream = process.stdout; + var plane = color('plane', '✈'); var crashed = -1; var n = 0; + var total = 0; function runway() { var buf = Array(width).join('-'); @@ -74,8 +75,7 @@ function Landing(runner, options) { runner.on(EVENT_TEST_END, function(test) { // check if the plane crashed - var col = crashed === -1 ? ((width * ++n) / total) | 0 : crashed; - + var col = crashed === -1 ? ((width * ++n) / ++total) | 0 : crashed; // show the crash if (test.state === STATE_FAILED) { plane = color('plane crash', '✈'); diff --git a/lib/reporters/tap.js b/lib/reporters/tap.js index 12257a745f..aa79fb19f1 100644 --- a/lib/reporters/tap.js +++ b/lib/reporters/tap.js @@ -50,9 +50,7 @@ function TAP(runner, options) { this._producer = createProducer(tapVersion); runner.once(EVENT_RUN_BEGIN, function() { - var ntests = runner.grepTotal(runner.suite); self._producer.writeVersion(); - self._producer.writePlan(ntests); }); runner.on(EVENT_TEST_END, function() { @@ -204,6 +202,7 @@ TAPProducer.prototype.writeEpilogue = function(stats) { println('# pass ' + stats.passes); // :TBD: Why are we not showing pending results? println('# fail ' + stats.failures); + this.writePlan(stats.passes + stats.failures + stats.pending); }; /** diff --git a/lib/runner.js b/lib/runner.js index 3c857294f7..22e7bb91d6 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -194,6 +194,7 @@ inherits(Runner, EventEmitter); * @param {EventEmitter} target - The `EventEmitter` * @param {string} eventName - The event name * @param {string} fn - Listener function + * @private */ Runner.prototype._addEventListener = function(target, eventName, listener) { target.on(eventName, listener); @@ -205,6 +206,7 @@ Runner.prototype._addEventListener = function(target, eventName, listener) { * @param {EventEmitter} target - The `EventEmitter` * @param {string} eventName - The event anme * @param {function} listener - Listener function + * @private */ Runner.prototype._removeEventListener = function(target, eventName, listener) { var eventListenerIndex = -1; @@ -898,7 +900,7 @@ Runner.prototype._uncaught = function(err) { return; } // browser does not exit script when throwing in global.onerror() - if (this.allowUncaught && !process.browser) { + if (this.allowUncaught && !utils.isBrowser()) { debug('uncaught(): bubbling exception due to --allow-uncaught'); throw err; } @@ -976,10 +978,11 @@ Runner.prototype._uncaught = function(err) { * * @public * @memberof Runner - * @param {Function} fn + * @param {Function} fn - Callback when finished + * @param {{files: string[], options: Options}} [opts] - For subclasses * @return {Runner} Runner instance. */ -Runner.prototype.run = function(fn) { +Runner.prototype.run = function(fn, opts) { var self = this; var rootSuite = this.suite; diff --git a/lib/suite.js b/lib/suite.js index dc42fd74fd..f3c8b104af 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -557,6 +557,22 @@ Suite.prototype.cleanReferences = function cleanReferences() { } }; +/** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ +Suite.prototype.serialize = function serialize() { + return { + _bail: this._bail, + $$fullTitle: this.fullTitle(), + $$isPending: this.isPending(), + root: this.root, + title: this.title + }; +}; + var constants = utils.defineConstants( /** * {@link Suite}-related constants. diff --git a/lib/test.js b/lib/test.js index 187fe49767..3fb3e57a4e 100644 --- a/lib/test.js +++ b/lib/test.js @@ -79,3 +79,31 @@ Test.prototype.clone = function() { test.ctx = this.ctx; return test; }; + +/** + * Returns an minimal object suitable for transmission over IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ +Test.prototype.serialize = function serialize() { + return { + $$currentRetry: this._currentRetry, + $$fullTitle: this.fullTitle(), + $$isPending: this.pending, + $$retriedTest: this._retriedTest || null, + $$slow: this._slow, + $$titlePath: this.titlePath(), + body: this.body, + duration: this.duration, + err: this.err, + parent: { + $$fullTitle: this.parent.fullTitle() + }, + speed: this.speed, + state: this.state, + title: this.title, + type: this.type, + file: this.file + }; +}; diff --git a/lib/utils.js b/lib/utils.js index 0134247022..b338bc094c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -488,7 +488,6 @@ function isHiddenOnUnix(pathname) { * **Make no assumption that the names will be sorted in any fashion.** * * @public - * @memberof Mocha.utils * @param {string} filepath - Base path to start searching from. * @param {string[]} [extensions=[]] - File extensions to look for. * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. @@ -812,7 +811,7 @@ exports.defineConstants = function(obj) { * @returns {Boolean} whether the current version of Node.JS supports ES Modules in a way that is compatible with Mocha */ exports.supportsEsModules = function() { - if (!process.browser && process.versions && process.versions.node) { + if (!exports.isBrowser() && process.versions && process.versions.node) { var versionFields = process.versions.node.split('.'); var major = +versionFields[0]; var minor = +versionFields[1]; @@ -832,3 +831,13 @@ exports.supportsEsModules = function() { exports.cwd = function cwd() { return process.cwd(); }; + +/** + * Returns `true` if Mocha is running in a browser. + * Checks for `process.browser`. + * @returns {boolean} + * @private + */ +exports.isBrowser = function isBrowser() { + return Boolean(process.browser); +}; diff --git a/package-lock.json b/package-lock.json index 78be92c17b..6902e1240a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1237,6 +1237,17 @@ "es-abstract": "^1.17.0-next.1" } }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -2384,6 +2395,12 @@ "wrap-ansi": "^2.0.0" } }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -3060,6 +3077,16 @@ } } }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -5743,7 +5770,6 @@ "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -5758,11 +5784,36 @@ "string.prototype.trimright": "^2.1.1" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -6410,9 +6461,9 @@ } }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "events": { @@ -7776,7 +7827,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -8089,13 +8139,14 @@ } }, "http-proxy": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", - "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-signature": { @@ -8701,6 +8752,11 @@ "is-decimal": "^1.0.0" } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8723,8 +8779,7 @@ "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "1.2.1", @@ -8778,8 +8833,7 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-decimal": { "version": "1.0.4", @@ -8876,6 +8930,11 @@ "is-path-inside": "^1.0.0" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" + }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -8992,7 +9051,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -9024,6 +9082,11 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==" + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -9033,8 +9096,7 @@ "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "is-svg": { "version": "3.0.0", @@ -9049,7 +9111,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -9283,6 +9344,20 @@ "is-object": "^1.0.1" } }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, "javascript-stringify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", @@ -12316,8 +12391,7 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-keys": { "version": "1.1.1", @@ -14072,6 +14146,18 @@ "asap": "~2.0.3" } }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -15323,6 +15409,11 @@ } } }, + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==" + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -16461,7 +16552,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -16471,7 +16561,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -16482,7 +16571,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -16493,7 +16581,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -18849,6 +18936,11 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==" + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", diff --git a/package-scripts.js b/package-scripts.js index 7662053795..94b0469994 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -10,10 +10,18 @@ const path = require('path'); * @returns {string} Command string to be executed by nps. */ function test(testName, mochaParams) { - const coverageCommand = `nyc --no-clean --report-dir coverage/reports/${testName}`; + let coverageCommand = `nyc --no-clean --report-dir="coverage/reports/${testName}"`; const mochaCommand = `node ${path.join('bin', 'mocha')}`; // Include 'node' and path.join for Windows compatibility - if (process.env.CI && !/^only-/.test(testName)) { - mochaParams += ' --forbid-only'; + if (process.env.CI) { + // suppress coverage summaries in CI to reduce noise + coverageCommand += ' --reporter=json'; + if (!/^only-/.test(testName)) { + mochaParams += ' --forbid-only'; + } + } + // this may _actually_ be supported in the future + if (process.env.MOCHA_PARALLEL === '0') { + mochaParams += ' --no-parallel'; } if (process.env.TRAVIS) { mochaParams += ' --color'; // force color in travis-ci @@ -26,7 +34,21 @@ function test(testName, mochaParams) { module.exports = { scripts: { build: { - script: `browserify -e browser-entry.js --plugin ./scripts/dedefine --ignore './lib/cli/*.js' --ignore "./lib/esm-utils.js" --ignore 'chokidar' --ignore 'fs' --ignore 'glob' --ignore 'path' --ignore 'supports-color' -o mocha.js`, + script: `browserify -e browser-entry.js \ + --plugin ./scripts/dedefine \ + --ignore 'chokidar' \ + --ignore 'fs' \ + --ignore 'glob' \ + --ignore 'path' \ + --ignore 'supports-color' \ + --ignore './lib/cli/*.js' \ + --ignore './lib/esm-utils.js' \ + --ignore './lib/nodejs/serializer.js' \ + --ignore './lib/nodejs/parallel-buffered-runner.js' \ + --ignore './lib/nodejs/reporters/parallel-buffered.js' \ + --ignore './lib/nodejs/worker.js' \ + --ignore './lib/nodejs/buffered-worker-pool.js' \ + -o mocha.js`, description: 'Build browser bundle' }, lint: { @@ -161,19 +183,25 @@ module.exports = { hiddenFromHelp: true }, bdd: { - script: test('only-bdd', '--ui bdd test/only/bdd.spec'), + script: test( + 'only-bdd', + '--ui bdd test/only/bdd.spec --no-parallel' + ), description: 'Run Node.js "only" w/ BDD interface tests', hiddenFromHelp: true }, tdd: { - script: test('only-tdd', '--ui tdd test/only/tdd.spec'), + script: test( + 'only-tdd', + '--ui tdd test/only/tdd.spec --no-parallel' + ), description: 'Run Node.js "only" w/ TDD interface tests', hiddenFromHelp: true }, bddRequire: { script: test( 'only-bdd-require', - '--ui qunit test/only/bdd-require.spec' + '--ui qunit test/only/bdd-require.spec --no-parallel' ), description: 'Run Node.js "only" w/ QUnit interface tests', hiddenFromHelp: true @@ -181,7 +209,7 @@ module.exports = { globalBdd: { script: test( 'only-global-bdd', - '--ui bdd test/only/global/bdd.spec' + '--ui bdd test/only/global/bdd.spec --no-parallel' ), description: 'Run Node.js "global only" w/ BDD interface tests', hiddenFromHelp: true @@ -189,7 +217,7 @@ module.exports = { globalTdd: { script: test( 'only-global-tdd', - '--ui tdd test/only/global/tdd.spec' + '--ui tdd test/only/global/tdd.spec --no-parallel' ), description: 'Run Node.js "global only" w/ TDD interface tests', hiddenFromHelp: true @@ -197,7 +225,7 @@ module.exports = { globalQunit: { script: test( 'only-global-qunit', - '--ui qunit test/only/global/qunit.spec' + '--ui qunit test/only/global/qunit.spec --no-parallel' ), description: 'Run Node.js "global only" w/ QUnit interface tests', hiddenFromHelp: true diff --git a/package.json b/package.json index 63d6f02c90..5234befd34 100644 --- a/package.json +++ b/package.json @@ -66,10 +66,13 @@ "minimatch": "3.0.4", "ms": "2.1.2", "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "3.0.0", "strip-json-comments": "3.0.1", "supports-color": "7.1.0", "which": "2.0.2", "wide-align": "1.1.3", + "workerpool": "6.0.0", "yargs": "13.3.2", "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" @@ -130,7 +133,7 @@ "svgo": "^1.3.2", "through2": "^3.0.1", "to-vfile": "^6.1.0", - "unexpected": "^11.13.0", + "unexpected": "^11.14.0", "unexpected-eventemitter": "^2.2.0", "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", @@ -152,14 +155,19 @@ }, "browser": { "./index.js": "./browser-entry.js", - "./lib/growl.js": "./lib/browser/growl.js", + "./lib/nodejs/growl.js": "./lib/browser/growl.js", "tty": "./lib/browser/tty.js", "./lib/cli/*.js": false, "chokidar": false, "fs": false, "glob": false, "path": false, - "supports-color": false + "supports-color": false, + "./lib/nodejs/serializer.js": false, + "./lib/nodejs/worker.js": false, + "./lib/nodejs/buffered-worker-pool.js": false, + "./lib/nodejs/parallel-buffered-runner.js": false, + "./lib/nodejs/reporters/parallel-buffered.js": false }, "prettier": { "singleQuote": true, diff --git a/test/integration/fixtures/options/jobs/fail-in-parallel.fixture.js b/test/integration/fixtures/options/jobs/fail-in-parallel.fixture.js new file mode 100644 index 0000000000..18eb7421bd --- /dev/null +++ b/test/integration/fixtures/options/jobs/fail-in-parallel.fixture.js @@ -0,0 +1,7 @@ +'use strict'; + +it('should fail if in a worker', function() { + if (!require('workerpool').isMainThread) { + throw new Error('in worker!'); + } +}); diff --git a/test/integration/fixtures/options/parallel/bail.fixture.js b/test/integration/fixtures/options/parallel/bail.fixture.js new file mode 100644 index 0000000000..77692d56d1 --- /dev/null +++ b/test/integration/fixtures/options/parallel/bail.fixture.js @@ -0,0 +1,9 @@ +describe('some suite', function() { + this.bail(true); + + it('should bail', function() { + throw new Error(); + }); + + it('will not get run', function() {}); +}); diff --git a/test/integration/fixtures/options/parallel/exclusive-test-a.fixture.js b/test/integration/fixtures/options/parallel/exclusive-test-a.fixture.js new file mode 100644 index 0000000000..93bf8853ce --- /dev/null +++ b/test/integration/fixtures/options/parallel/exclusive-test-a.fixture.js @@ -0,0 +1,3 @@ +describe.only('it should only run this, but it does not', function() { + it('should do a thing', function() {}); +}); diff --git a/test/integration/fixtures/options/parallel/exclusive-test-b.fixture.js b/test/integration/fixtures/options/parallel/exclusive-test-b.fixture.js new file mode 100644 index 0000000000..bb05dd496e --- /dev/null +++ b/test/integration/fixtures/options/parallel/exclusive-test-b.fixture.js @@ -0,0 +1,3 @@ +describe('it should run this anyway', function() { + it('should do a different thing', function() {}); +}); diff --git a/test/integration/fixtures/options/parallel/retries-a.fixture.js b/test/integration/fixtures/options/parallel/retries-a.fixture.js new file mode 100644 index 0000000000..e5d37ca561 --- /dev/null +++ b/test/integration/fixtures/options/parallel/retries-a.fixture.js @@ -0,0 +1,5 @@ +describe('retry suite A', function() { + it('should pass', function() { + + }); +}); \ No newline at end of file diff --git a/test/integration/fixtures/options/parallel/retries-b.fixture.js b/test/integration/fixtures/options/parallel/retries-b.fixture.js new file mode 100644 index 0000000000..c1f1d3f7ba --- /dev/null +++ b/test/integration/fixtures/options/parallel/retries-b.fixture.js @@ -0,0 +1,8 @@ +describe('retry suite B', function() { + let count = 0; + it('should retry', function() { + this.retries(3); + console.log(`count: ${++count}`); + throw new Error('failure'); + }); +}); \ No newline at end of file diff --git a/test/integration/fixtures/options/parallel/syntax-err.fixture.js b/test/integration/fixtures/options/parallel/syntax-err.fixture.js new file mode 100644 index 0000000000..8dd2b0f93b --- /dev/null +++ b/test/integration/fixtures/options/parallel/syntax-err.fixture.js @@ -0,0 +1 @@ +var foo = \ No newline at end of file diff --git a/test/integration/fixtures/options/parallel/test-a.fixture.js b/test/integration/fixtures/options/parallel/test-a.fixture.js new file mode 100644 index 0000000000..43f53bbda8 --- /dev/null +++ b/test/integration/fixtures/options/parallel/test-a.fixture.js @@ -0,0 +1,3 @@ +describe('a', function() { + it('should pass', function() {}); +}); diff --git a/test/integration/fixtures/options/parallel/test-b.fixture.js b/test/integration/fixtures/options/parallel/test-b.fixture.js new file mode 100644 index 0000000000..8e6437a56a --- /dev/null +++ b/test/integration/fixtures/options/parallel/test-b.fixture.js @@ -0,0 +1,3 @@ +describe('b', function() { + it('should be pending'); +}); diff --git a/test/integration/fixtures/options/parallel/test-c.fixture.js b/test/integration/fixtures/options/parallel/test-c.fixture.js new file mode 100644 index 0000000000..d06b6a3ee6 --- /dev/null +++ b/test/integration/fixtures/options/parallel/test-c.fixture.js @@ -0,0 +1,5 @@ +describe('c', function() { + it('should fail', function() { + throw new Error('failure'); + }); +}); diff --git a/test/integration/fixtures/options/parallel/test-d.fixture.js b/test/integration/fixtures/options/parallel/test-d.fixture.js new file mode 100644 index 0000000000..ee19d54594 --- /dev/null +++ b/test/integration/fixtures/options/parallel/test-d.fixture.js @@ -0,0 +1,7 @@ +describe('d', function() { + it('should pass, then fail', function() { + process.nextTick(function() { + throw new Error('uncaught!!'); + }); + }); +}); diff --git a/test/integration/fixtures/options/parallel/uncaught.fixture.js b/test/integration/fixtures/options/parallel/uncaught.fixture.js new file mode 100644 index 0000000000..bca1610ab7 --- /dev/null +++ b/test/integration/fixtures/options/parallel/uncaught.fixture.js @@ -0,0 +1,7 @@ +'use strict'; + +it('throws an uncaught exception', function (done) { + process.nextTick(function () { + throw new Error('existential isolation!!'); + }); +}); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 17a1acfea1..6475262443 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -241,11 +241,29 @@ function toJSONRunResult(result) { /** * Creates arguments loading a default fixture if none provided * + * - The `--no-color` arg is always used (color output complicates testing `STDOUT`) + * - Unless `--bail` or `--no-bail` is set, use `--no-bail`. This enables using + * `--bail` (if desired) from the command-line when running our integration + * test suites without stepping on the toes of subprocesses. + * - Unless `--parallel` or `--no-parallel` is set, use `--no-parallel`. We + * assume the test suite is _already_ running in parallel--and there's no point + * in trying to run a single test fixture in parallel. + * - The {@link DEFAULT_FIXTURE} file is used if no arguments are provided. + * * @param {string[]|*} [args] - Arguments to `spawn` * @returns string[] */ function defaultArgs(args) { - return !args || !args.length ? ['--file', DEFAULT_FIXTURE] : args; + var newArgs = (!args || !args.length ? [DEFAULT_FIXTURE] : args).concat([ + '--no-color' + ]); + if (!newArgs.some(arg => /--(no-)?bail/.test(arg))) { + newArgs.push('--no-bail'); + } + if (!newArgs.some(arg => /--(no-)?parallel/.test(arg))) { + newArgs.push('--no-parallel'); + } + return newArgs; } function invokeMocha(args, fn, opts) { @@ -374,7 +392,9 @@ function resolveFixturePath(fixture) { if (path.extname(fixture) !== '.js' && path.extname(fixture) !== '.mjs') { fixture += '.fixture.js'; } - return path.join('test', 'integration', 'fixtures', fixture); + return path.isAbsolute(fixture) + ? fixture + : path.join('test', 'integration', 'fixtures', fixture); } /** diff --git a/test/integration/options/jobs.spec.js b/test/integration/options/jobs.spec.js new file mode 100644 index 0000000000..832d825298 --- /dev/null +++ b/test/integration/options/jobs.spec.js @@ -0,0 +1,34 @@ +'use strict'; + +var helpers = require('../helpers'); +var runMochaAsync = helpers.runMochaAsync; + +describe('--jobs', function() { + describe('when set to a number less than 2', function() { + it('should run tests in serial', function() { + return expect( + runMochaAsync( + 'options/jobs/fail-in-parallel', + ['--parallel', '--jobs', '1'], + 'pipe' + ), + 'when fulfilled', + 'to have passed' + ); + }); + }); + + describe('when set to a number greater than 1', function() { + it('should run tests in parallel', function() { + return expect( + runMochaAsync( + 'options/jobs/fail-in-parallel', + ['--parallel', '--jobs', '2'], + 'pipe' + ), + 'when fulfilled', + 'to have failed' + ); + }); + }); +}); diff --git a/test/integration/options/parallel.spec.js b/test/integration/options/parallel.spec.js new file mode 100644 index 0000000000..8fc5389943 --- /dev/null +++ b/test/integration/options/parallel.spec.js @@ -0,0 +1,489 @@ +'use strict'; +var Mocha = require('../../../lib/mocha'); +var path = require('path'); +var helpers = require('../helpers'); +var runMochaAsync = helpers.runMochaAsync; +var invokeMochaAsync = helpers.invokeMochaAsync; +var getSummary = helpers.getSummary; +var utils = require('../../../lib/utils'); + +function compareReporters(reporter) { + return runMochaAsync(path.join('options', 'parallel', 'test-a.fixture.js'), [ + '--reporter', + reporter, + '--no-parallel' + ]).then(function(expected) { + expected.output = expected.output.replace(/\d+m?s/g, '100ms'); + return runMochaAsync( + path.join('options', 'parallel', 'test-a.fixture.js'), + ['--reporter', reporter, '--parallel'] + ).then(function(actual) { + actual.output = actual.output.replace(/\d+m?s/g, '100ms'); + return [actual, expected]; + }); + }); +} + +function runGenericReporterTest(reporter) { + return compareReporters.call(this, reporter).then(function(result) { + var expected = result.shift(); + var actual = result.shift(); + return expect(actual, 'to satisfy', { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code, + output: expected.output + }); + }); +} + +describe('--parallel', function() { + describe('when a test has a syntax error', function() { + describe('when there is only a single test file', function() { + it('should fail gracefully', function() { + return expect( + runMochaAsync('options/parallel/syntax-err', ['--parallel']), + 'when fulfilled', + 'to have failed with output', + /SyntaxError/ + ); + }); + }); + + describe('when there are multiple test files', function() { + it('should fail gracefully', function() { + return expect( + invokeMochaAsync( + [ + require.resolve( + '../fixtures/options/parallel/syntax-err.fixture.js' + ), + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to have failed' + ); + }); + }); + }); + + describe('when used with CJS tests', function() { + it('should have the same result as with --no-parallel', function() { + return runMochaAsync( + path.join('options', 'parallel', 'test-*.fixture.js'), + ['--no-parallel'] + ).then(function(expected) { + return expect( + runMochaAsync(path.join('options', 'parallel', 'test-*.fixture.js'), [ + '--parallel' + ]), + 'to be fulfilled with value satisfying', + { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code + } + ); + }); + }); + }); + + describe('when used with ESM tests', function() { + var esmArgs = + Number(process.versions.node.split('.')[0]) >= 13 + ? [] + : ['--experimental-modules']; + + before(function() { + if (!utils.supportsEsModules()) this.skip(); + }); + + it('should have the same result as with --no-parallel', function() { + var glob = path.join(__dirname, '..', 'fixtures', 'esm', '*.fixture.mjs'); + return invokeMochaAsync(esmArgs.concat('--no-parallel', glob))[1].then( + function(expected) { + expected = getSummary(expected); + return invokeMochaAsync(esmArgs.concat('--parallel', glob))[1].then( + function(actual) { + actual = getSummary(actual); + expect(actual, 'to satisfy', { + pending: expected.pending, + passing: expected.passing, + failing: expected.failing + }); + } + ); + } + ); + }); + }); + + describe('when used with --retries', function() { + it('should retry tests appropriately', function() { + return expect( + runMochaAsync( + path.join('options', 'parallel', 'retries-*.fixture.js'), + ['--parallel'] + ), + 'when fulfilled', + 'to have failed' + ) + .and('when fulfilled', 'to have passed test count', 1) + .and('when fulfilled', 'to have pending test count', 0) + .and('when fulfilled', 'to have failed test count', 1) + .and('when fulfilled', 'to contain output', /count: 3/); + }); + }); + + describe('when used with --allow-uncaught', function() { + it('should bubble up an exception', function() { + return expect( + invokeMochaAsync( + [ + require.resolve('../fixtures/options/parallel/uncaught.fixture.js'), + '--parallel', + '--allow-uncaught' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to contain output', + /Error: existential isolation/i + ).and('when fulfilled', 'to have exit code', 1); + }); + }); + + describe('when used with --file', function() { + it('should error out', function() { + return expect( + invokeMochaAsync( + [ + '--file', + path.join('options', 'parallel', 'test-a.fixture.js'), + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to contain output', + /mutually exclusive with --file/ + ); + }); + }); + + describe('when used with --sort', function() { + it('should error out', function() { + return expect( + invokeMochaAsync( + [ + '--sort', + path.join( + __dirname, + '..', + 'fixtures', + 'options', + 'parallel', + 'test-*.fixture.js' + ), + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to contain output', + /mutually exclusive with --sort/ + ); + }); + }); + + describe('when used with exclusive tests', function() { + it('should error out', function() { + return expect( + invokeMochaAsync( + [ + path.join( + __dirname, + '..', + 'fixtures', + 'options', + 'parallel', + 'exclusive-test-*.fixture.js' + ), + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to contain output', + /`\.only` is not supported in parallel mode/ + ); + }); + }); + + describe('when used with --bail', function() { + it('should skip some tests', function() { + return runMochaAsync( + path.join('options', 'parallel', 'test-*.fixture.js'), + ['--parallel', '--bail'] + ).then(function(result) { + // we don't know _exactly_ how many tests will be skipped here + // due to the --bail, but the number of tests completed should be + // less than the total, which is 5. + return expect( + result.passing + result.pending + result.failing, + 'to be less than', + 5 + ); + }); + }); + + it('should fail', function() { + return expect( + runMochaAsync(path.join('options', 'parallel', 'test-*.fixture.js'), [ + '--parallel', + '--bail' + ]), + 'when fulfilled', + 'to have failed' + ); + }); + }); + + describe('when encountering a "bail" in context', function() { + it('should skip some tests', function() { + return runMochaAsync('options/parallel/bail', ['--parallel']).then( + function(result) { + return expect( + result.passing + result.pending + result.failing, + 'to be less than', + 2 + ); + } + ); + }); + + it('should fail', function() { + return expect( + runMochaAsync('options/parallel/bail', ['--parallel', '--bail']), + 'when fulfilled', + 'to have failed' + ); + }); + }); + + describe('when used with "grep"', function() { + it('should be equivalent to running in serial', function() { + return runMochaAsync( + path.join('options', 'parallel', 'test-*.fixture.js'), + ['--no-parallel', '--grep="suite d"'] + ).then(function(expected) { + return expect( + runMochaAsync(path.join('options', 'parallel', 'test-*.fixture.js'), [ + '--parallel', + '--grep="suite d"' + ]), + 'to be fulfilled with value satisfying', + { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code + } + ); + }); + }); + }); + + describe('reporter equivalence', function() { + // each reporter name is duplicated; one is in all lower-case + // 'base' is abstract, 'html' is browser-only, others are incompatible + var DENY = ['progress', 'base', 'html', 'markdown', 'json-stream']; + Object.keys(Mocha.reporters) + .filter(function(name) { + return /^[a-z]/.test(name) && DENY.indexOf(name) === -1; + }) + .forEach(function(reporter) { + describe( + 'when multiple test files run with --reporter=' + reporter, + function() { + it('should have the same result as when run with --no-parallel', function() { + // note that the output may not be in the same order, as running file + // order is non-deterministic in parallel mode + return runMochaAsync( + path.join('options', 'parallel', 'test-*.fixture.js'), + ['--reporter', reporter, '--no-parallel'] + ).then(function(expected) { + return expect( + runMochaAsync( + path.join('options', 'parallel', 'test-*.fixture.js'), + ['--reporter', reporter, '--parallel'] + ), + 'to be fulfilled with value satisfying', + { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code + } + ); + }); + }); + } + ); + }); + }); + + describe('when a single test file is run with --reporter=dot', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'dot'); + }); + }); + + describe('when a single test file is run with --reporter=doc', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'doc'); + }); + }); + + describe('when a single test file is run with --reporter=tap', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'tap'); + }); + }); + + describe('when a single test file is run with --reporter=list', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'list'); + }); + }); + + describe('when a single test file is run with --reporter=min', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'min'); + }); + }); + + describe('when a single test file is run with --reporter=spec', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'spec'); + }); + }); + + describe('when a single test file is run with --reporter=nyan', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'nyan'); + }); + }); + + describe('when a single test file is run with --reporter=landing', function() { + it('should have the same output as when run with --no-parallel', function() { + return runGenericReporterTest.call(this, 'landing'); + }); + }); + + describe('when a single test file is run with --reporter=progress', function() { + it('should fail due to incompatibility', function() { + return expect( + invokeMochaAsync( + [ + require.resolve('../fixtures/options/parallel/test-a.fixture.js'), + '--reporter=progress', + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to have failed' + ).and('when fulfilled', 'to contain output', /mutually exclusive/); + }); + }); + + describe('when a single test file is run with --reporter=markdown', function() { + it('should fail due to incompatibility', function() { + return expect( + invokeMochaAsync( + [ + require.resolve('../fixtures/options/parallel/test-a.fixture.js'), + '--reporter=markdown', + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to have failed' + ).and('when fulfilled', 'to contain output', /mutually exclusive/); + }); + }); + + describe('when a single test file is run with --reporter=json-stream', function() { + it('should fail due to incompatibility', function() { + return expect( + invokeMochaAsync( + [ + require.resolve('../fixtures/options/parallel/test-a.fixture.js'), + '--reporter=json-stream', + '--parallel' + ], + 'pipe' + )[1], + 'when fulfilled', + 'to have failed' + ).and('when fulfilled', 'to contain output', /mutually exclusive/); + }); + }); + + describe('when a single test file is run with --reporter=json', function() { + it('should have the same output as when run with --no-parallel', function() { + // this one has some timings/durations that we can safely ignore + return compareReporters.call(this, 'json').then(function(result) { + var expected = result.shift(); + expected.output = JSON.parse(expected.output); + var actual = result.shift(); + actual.output = JSON.parse(actual.output); + return expect(actual, 'to satisfy', { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code, + output: { + stats: { + suites: expected.output.stats.suites, + tests: expected.output.stats.tests, + passes: expected.output.stats.passes, + pending: expected.output.stats.pending, + failures: expected.output.stats.failures + }, + tests: expected.tests + } + }); + }); + }); + }); + + describe('when a single test file is run with --reporter=xunit', function() { + it('should have the same output as when run with --no-parallel', function() { + // durations need replacing + return compareReporters.call(this, 'xunit').then(function(result) { + var expected = result.shift(); + expected.output = expected.output + .replace(/time=".+?"/g, 'time="0.5"') + .replace(/timestamp=".+?"/g, 'timestamp="some-timestamp'); + var actual = result.shift(); + actual.output = actual.output + .replace(/time=".+?"/g, 'time="0.5"') + .replace(/timestamp=".+?"/g, 'timestamp="some-timestamp'); + return expect(actual, 'to satisfy', { + passing: expected.passing, + failing: expected.failing, + pending: expected.pending, + code: expected.code, + output: expected.output + }); + }); + }); + }); +}); diff --git a/test/node-unit/buffered-runner.spec.js b/test/node-unit/buffered-runner.spec.js new file mode 100644 index 0000000000..1fe935ddc2 --- /dev/null +++ b/test/node-unit/buffered-runner.spec.js @@ -0,0 +1,553 @@ +'use strict'; + +const { + EVENT_RUN_BEGIN, + EVENT_TEST_PASS, + EVENT_TEST_FAIL, + EVENT_SUITE_END, + EVENT_SUITE_BEGIN +} = require('../../lib/runner').constants; +const rewiremock = require('rewiremock/node'); +const BUFFERED_RUNNER_PATH = require.resolve( + '../../lib/nodejs/parallel-buffered-runner.js' +); +const Suite = require('../../lib/suite'); +const Runner = require('../../lib/runner'); +const {createSandbox} = require('sinon'); + +describe('buffered-runner', function() { + describe('BufferedRunner', function() { + let sandbox; + let run; + let BufferedWorkerPool; + let terminate; + let BufferedRunner; + let suite; + let warn; + let cpuCount; + + beforeEach(function() { + sandbox = createSandbox(); + cpuCount = 1; + suite = new Suite('a root suite', {}, true); + warn = sandbox.stub(); + + // tests will want to further define the behavior of these. + run = sandbox.stub(); + terminate = sandbox.stub(); + BufferedWorkerPool = { + create: sandbox.stub().returns({ + run, + terminate, + stats: sandbox.stub().returns({}) + }) + }; + BufferedRunner = rewiremock.proxy(BUFFERED_RUNNER_PATH, r => ({ + '../../lib/nodejs/buffered-worker-pool': { + BufferedWorkerPool + }, + os: { + cpus: sandbox.stub().callsFake(() => new Array(cpuCount)) + }, + '../../lib/utils': r.with({warn}).callThrough() + })); + }); + + describe('constructor', function() { + it('should start in "IDLE" state', function() { + expect(new BufferedRunner(suite), 'to have property', '_state', 'IDLE'); + }); + }); + + describe('instance property', function() { + let runner; + + beforeEach(function() { + runner = new BufferedRunner(suite); + }); + + describe('_state', function() { + it('should disallow an invalid state transition', function() { + expect( + () => { + runner._state = 'BAILED'; + }, + 'to throw', + /invalid state transition/ + ); + }); + }); + }); + + describe('event', function() { + let runner; + + beforeEach(function() { + runner = new BufferedRunner(suite); + }); + + describe('EVENT_RUN_END', function() { + it('should change the state to COMPLETE', function() { + runner._state = 'RUNNING'; + runner.emit(Runner.constants.EVENT_RUN_END); + expect(runner._state, 'to be', 'COMPLETE'); + }); + }); + }); + + describe('instance method', function() { + describe('run', function() { + let runner; + + beforeEach(function() { + runner = new BufferedRunner(suite); + }); + + // the purpose of this is to ensure that--despite using `Promise`s + // internally--`BufferedRunner#run` does not return a `Promise`. + it('should be chainable', function(done) { + expect(runner.run(done, {files: [], options: {}}), 'to be', runner); + }); + + it('should emit `EVENT_RUN_BEGIN`', async function() { + return expect( + () => + new Promise(resolve => { + runner.run(resolve, {files: [], options: {}}); + }), + 'to emit from', + runner, + EVENT_RUN_BEGIN + ); + }); + + describe('when a worker fails', function() { + it('should recover', function(done) { + const options = {}; + run.withArgs('some-file.js', options).rejects(new Error('whoops')); + run.withArgs('some-other-file.js', options).resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite' + } + } + ] + }); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [{args: []}]); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + + it('should delegate to Runner#uncaught', function(done) { + const options = {}; + sandbox.spy(runner, 'uncaught'); + const err = new Error('whoops'); + run.withArgs('some-file.js', options).rejects(new Error('whoops')); + run.withArgs('some-other-file.js', options).resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite' + } + } + ] + }); + + runner.run( + () => { + expect(runner.uncaught, 'to have a call satisfying', [err]); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + + describe('when suite should bail', function() { + describe('when no event contains an error', function() { + it('should not force-terminate', function(done) { + run.resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_SUITE_BEGIN, + data: { + title: 'some suite', + _bail: true + } + }, + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + + runner.run( + () => { + expect(terminate, 'to have a call satisfying', { + args: [] + }).and('was called once'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options: {} + } + ); + }); + }); + + describe('when an event contains an error and has positive failures', function() { + describe('when subsequent files have not yet been run', function() { + it('should cleanly terminate the thread pool', function(done) { + const options = {}; + const err = { + __type: 'Error', + message: 'oh no' + }; + run.withArgs('some-file.js', options).resolves({ + failureCount: 1, + events: [ + { + eventName: EVENT_SUITE_BEGIN, + data: { + title: 'some suite', + _bail: true + } + }, + { + eventName: EVENT_TEST_FAIL, + data: { + title: 'some test' + }, + error: err + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + run.withArgs('some-other-file.js', options).rejects(); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [ + {args: []}, // this is the pool force-terminating + {args: []} // this will always be called, and will do nothing due to the previous call + ]).and('was called twice'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + describe('when subsequent files already started running', function() { + it('should cleanly terminate the thread pool', function(done) { + const options = {}; + const err = { + __type: 'Error', + message: 'oh no' + }; + run.withArgs('some-file.js', options).resolves({ + failureCount: 1, + events: [ + { + eventName: EVENT_SUITE_BEGIN, + data: { + title: 'some suite', + _bail: true + } + }, + { + eventName: EVENT_TEST_FAIL, + data: { + title: 'some test' + }, + error: err + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + run.withArgs('some-other-file.js', options).resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_SUITE_BEGIN, + data: { + title: 'some suite' + } + }, + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite' + } + } + ] + }); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [ + {args: []}, // this is the pool force-terminating + {args: []} // this will always be called, and will do nothing due to the previous call + ]).and('was called twice'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + }); + }); + + describe('when a suite has a bail flag', function() { + describe('when no event contains an error', function() { + it('should not force-terminate', function(done) { + run.resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + + runner.run( + () => { + expect(terminate, 'to have a call satisfying', { + args: [] + }).and('was called once'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options: {} + } + ); + }); + }); + describe('when an event contains an error and has positive failures', function() { + describe('when subsequent files have not yet been run', function() { + it('should cleanly terminate the thread pool', function(done) { + const options = {}; + const err = { + __type: 'Error', + message: 'oh no' + }; + run.withArgs('some-file.js', options).resolves({ + failureCount: 1, + events: [ + { + eventName: EVENT_TEST_FAIL, + data: { + title: 'some test' + }, + error: err + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + run.withArgs('some-other-file.js', options).rejects(); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [ + {args: []}, // this is the pool force-terminating + {args: []} // this will always be called, and will do nothing due to the previous call + ]).and('was called twice'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + + describe('when subsequent files already started running', function() { + it('should cleanly terminate the thread pool', function(done) { + const options = {}; + const err = { + __type: 'Error', + message: 'oh no' + }; + run.withArgs('some-file.js', options).resolves({ + failureCount: 1, + events: [ + { + eventName: EVENT_TEST_FAIL, + data: { + title: 'some test' + }, + error: err + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + run.withArgs('some-other-file.js', options).resolves({ + failureCount: 0, + events: [ + { + eventName: EVENT_TEST_PASS, + data: { + title: 'some test' + } + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite' + } + } + ] + }); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [ + {args: []}, // this is the pool force-terminating + {args: []} // this will always be called, and will do nothing due to the previous call + ]).and('was called twice'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + + describe('when subsequent files have not yet been run', function() { + it('should cleanly terminate the thread pool', function(done) { + const options = {}; + const err = { + __type: 'Error', + message: 'oh no' + }; + run.withArgs('some-file.js', options).resolves({ + failureCount: 1, + events: [ + { + eventName: EVENT_TEST_FAIL, + data: { + title: 'some test' + }, + error: err + }, + { + eventName: EVENT_SUITE_END, + data: { + title: 'some suite', + _bail: true + } + } + ] + }); + run.withArgs('some-other-file.js', options).rejects(); + + runner.run( + () => { + expect(terminate, 'to have calls satisfying', [ + {args: []}, // this is the pool force-terminating + {args: []} // this will always be called, and will do nothing due to the previous call + ]).and('was called twice'); + done(); + }, + { + files: ['some-file.js', 'some-other-file.js'], + options + } + ); + }); + }); + }); + }); + }); + }); + }); +}); diff --git a/test/node-unit/buffered-worker-pool.spec.js b/test/node-unit/buffered-worker-pool.spec.js new file mode 100644 index 0000000000..1c0b7a9083 --- /dev/null +++ b/test/node-unit/buffered-worker-pool.spec.js @@ -0,0 +1,186 @@ +'use strict'; + +const rewiremock = require('rewiremock/node'); +const {createSandbox} = require('sinon'); + +describe('class BufferedWorkerPool', function() { + let BufferedWorkerPool; + let sandbox; + let pool; + let stats; + let serializeJavascript; + let serializer; + let result; + + beforeEach(function() { + sandbox = createSandbox(); + stats = {totalWorkers: 10, busyWorkers: 8, idleWorkers: 2, pendingTasks: 3}; + result = {failures: 0, events: []}; + pool = { + terminate: sandbox.stub().resolves(), + exec: sandbox.stub().resolves(result), + stats: sandbox.stub().returns(stats) + }; + serializer = { + deserialize: sandbox.stub() + }; + + serializeJavascript = sandbox.spy(require('serialize-javascript')); + BufferedWorkerPool = rewiremock.proxy( + require.resolve('../../lib/nodejs/buffered-worker-pool'), + { + workerpool: { + pool: sandbox.stub().returns(pool), + cpus: 8 + }, + '../../lib/nodejs/serializer': serializer, + 'serialize-javascript': serializeJavascript + } + ).BufferedWorkerPool; + + // reset cache + BufferedWorkerPool.resetOptionsCache(); + }); + + afterEach(function() { + sandbox.restore(); + }); + + describe('static method', function() { + describe('create()', function() { + it('should return a BufferedWorkerPool instance', function() { + expect( + BufferedWorkerPool.create({foo: 'bar'}), + 'to be a', + BufferedWorkerPool + ); + }); + + describe('when passed no arguments', function() { + it('should not throw', function() { + expect(BufferedWorkerPool.create, 'not to throw'); + }); + }); + }); + + describe('serializeOptions()', function() { + describe('when passed no arguments', function() { + it('should not throw', function() { + expect(BufferedWorkerPool.serializeOptions, 'not to throw'); + }); + }); + + it('should return a serialized string', function() { + expect( + BufferedWorkerPool.serializeOptions({foo: 'bar'}), + 'to be a', + 'string' + ); + }); + + describe('when called multiple times with the same object', function() { + it('should not perform serialization twice', function() { + const obj = {foo: 'bar'}; + BufferedWorkerPool.serializeOptions(obj); + BufferedWorkerPool.serializeOptions(obj); + expect(serializeJavascript, 'was called once'); + }); + + it('should return the same value', function() { + const obj = {foo: 'bar'}; + expect( + BufferedWorkerPool.serializeOptions(obj), + 'to be', + BufferedWorkerPool.serializeOptions(obj) + ); + }); + }); + }); + }); + + describe('constructor', function() { + it('should apply defaults', function() { + expect(new BufferedWorkerPool(), 'to satisfy', { + options: { + workerType: 'process', + forkOpts: {execArgv: process.execArgv}, + maxWorkers: expect.it('to be greater than or equal to', 1) + } + }); + }); + }); + + describe('instance method', function() { + let workerPool; + + beforeEach(function() { + workerPool = BufferedWorkerPool.create(); + }); + + describe('stats()', function() { + it('should return the object returned by `workerpool.Pool#stats`', function() { + expect(workerPool.stats(), 'to be', stats); + }); + }); + + describe('run()', function() { + describe('when passed no arguments', function() { + it('should reject', async function() { + return expect(workerPool.run(), 'to be rejected with', { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + }); + }); + }); + + describe('when passed a non-string filepath', function() { + it('should reject', async function() { + return expect(workerPool.run(123), 'to be rejected with', { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + }); + }); + }); + + it('should serialize the options object', async function() { + await workerPool.run('file.js', {foo: 'bar'}); + + expect(pool.exec, 'to have a call satisfying', [ + 'run', + ['file.js', '{"foo":"bar"}'] + ]).and('was called once'); + }); + + it('should deserialize the result', async function() { + await workerPool.run('file.js', {foo: 'bar'}); + expect(serializer.deserialize, 'to have a call satisfying', [ + result + ]).and('was called once'); + }); + }); + + describe('terminate()', function() { + describe('when called with `force`', function() { + beforeEach(async function() { + await workerPool.terminate(true); + }); + + it('should delegate to the underlying pool w/ "force" behavior', async function() { + expect(pool.terminate, 'to have a call satisfying', [true]).and( + 'was called once' + ); + }); + }); + + describe('when called without `force`', function() { + beforeEach(async function() { + await workerPool.terminate(); + }); + + it('should delegate to the underlying pool w/o "force" behavior', async function() { + expect(pool.terminate, 'to have a call satisfying', [false]).and( + 'was called once' + ); + }); + }); + }); + }); +}); diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index 2b9c99a59a..fc701aadc6 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -27,19 +27,38 @@ describe('Mocha', function() { warn: sandbox.stub(), isString: sandbox.stub(), noop: sandbox.stub(), - cwd: sandbox.stub().returns(process.cwd()) + cwd: sandbox.stub().returns(process.cwd()), + isBrowser: sandbox.stub().returns(false) }; stubs.suite = Object.assign(sandbox.createStubInstance(EventEmitter), { slow: sandbox.stub(), timeout: sandbox.stub(), - bail: sandbox.stub() + bail: sandbox.stub(), + reset: sandbox.stub(), + dispose: sandbox.stub() }); stubs.Suite = sandbox.stub().returns(stubs.suite); stubs.Suite.constants = {}; + stubs.BufferedRunner = sandbox.stub().returns({}); + const runner = Object.assign(sandbox.createStubInstance(EventEmitter), { + run: sandbox + .stub() + .callsArgAsync(0) + .returnsThis(), + globals: sandbox.stub(), + grep: sandbox.stub(), + dispose: sandbox.stub() + }); + stubs.Runner = sandbox.stub().returns(runner); + // the Runner constructor is the main export, and constants is a static prop. + // we don't need the constants themselves, but the object cannot be undefined + stubs.Runner.constants = {}; Mocha = rewiremock.proxy(MODULE_PATH, r => ({ - '../../lib/utils': r.with(stubs.utils).callThrough(), - '../../lib/suite': stubs.Suite + '../../lib/utils.js': r.with(stubs.utils).callThrough(), + '../../lib/suite.js': stubs.Suite, + '../../lib/nodejs/parallel-buffered-runner.js': stubs.BufferedRunner, + '../../lib/runner.js': stubs.Runner })); delete require.cache[DUMB_FIXTURE_PATH]; delete require.cache[DUMBER_FIXTURE_PATH]; @@ -58,6 +77,108 @@ describe('Mocha', function() { mocha = new Mocha(opts); }); + describe('parallelMode()', function() { + describe('when `Mocha` is running in Node.js', function() { + it('should return the Mocha instance', function() { + expect(mocha.parallelMode(), 'to be', mocha); + }); + + describe('when parallel mode is already enabled', function() { + beforeEach(function() { + mocha.options.parallel = true; + mocha._runnerClass = stubs.BufferedRunner; + mocha._lazyLoadFiles = true; + }); + + it('should not swap the Runner, nor change lazy loading setting', function() { + expect(mocha.parallelMode(true), 'to satisfy', { + options: {parallel: true}, + _runnerClass: stubs.BufferedRunner, + _lazyLoadFiles: true + }); + }); + }); + + describe('when parallel mode is already disabled', function() { + beforeEach(function() { + mocha.options.parallel = false; + mocha._runnerClass = Mocha.Runner; + mocha._lazyLoadFiles = false; + }); + + it('should not swap the Runner, nor change lazy loading setting', function() { + expect(mocha.parallelMode(false), 'to satisfy', { + options: {parallel: false}, + _runnerClass: Mocha.Runner, + _lazyLoadFiles: false + }); + }); + }); + + describe('when `Mocha` instance in serial mode', function() { + beforeEach(function() { + mocha.options.parallel = false; + }); + + describe('when passed `true` value', function() { + describe('when `Mocha` instance is in `INIT` state', function() { + beforeEach(function() { + mocha._state = 'init'; + // this is broken + this.skip(); + }); + + it('should enable parallel mode', function() { + expect(mocha.parallelMode(true), 'to satisfy', { + _runnerClass: stubs.BufferedRunner, + options: { + parallel: true + }, + _lazyLoadFiles: true + }); + }); + }); + + describe('when `Mocha` instance is not in `INIT` state', function() { + beforeEach(function() { + mocha._state = 'disposed'; + }); + + it('should throw', function() { + expect( + function() { + mocha.parallelMode(true); + }, + 'to throw', + { + code: 'ERR_MOCHA_UNSUPPORTED' + } + ); + }); + }); + }); + + describe('when passed non-`true` value', function() { + describe('when `Mocha` instance is in `INIT` state', function() { + beforeEach(function() { + mocha._state = 'init'; + }); + + it('should enable serial mode', function() { + expect(mocha.parallelMode(0), 'to satisfy', { + _runnerClass: Mocha.Runner, + options: { + parallel: false + }, + _lazyLoadFiles: false + }); + }); + }); + }); + }); + }); + }); + describe('addFile()', function() { it('should add the given file to the files array', function() { mocha.addFile('some-file.js'); @@ -160,7 +281,7 @@ describe('Mocha', function() { expect( function() { mocha.reporter( - '../../test/node-nit/fixtures/wonky-reporter.fixture.js' + './test/node-unit/fixtures/wonky-reporter.fixture.js' ); }, 'to throw', @@ -173,7 +294,7 @@ describe('Mocha', function() { it('should warn about the error before throwing', function() { try { mocha.reporter( - require.resolve('./fixtures/wonky-reporter.fixture.js') + './test/node-unit/fixtures/wonky-reporter.fixture.js' ); } catch (ignored) { } finally { @@ -185,6 +306,45 @@ describe('Mocha', function() { }); }); }); + + describe('unloadFiles()', function() { + it('should reset referencesCleaned and allow for next run', function(done) { + mocha.run(function() { + mocha.unloadFiles(); + mocha.run(done); + }); + }); + + it('should not be allowed when the current instance is already disposed', function() { + mocha.dispose(); + expect( + function() { + mocha.unloadFiles(); + }, + 'to throw', + 'Mocha instance is already disposed, it cannot be used again.' + ); + }); + }); + + describe('lazyLoadFiles()', function() { + it('should return the `Mocha` instance', function() { + expect(mocha.lazyLoadFiles(), 'to be', mocha); + }); + describe('when passed a non-`true` value', function() { + it('should enable eager loading', function() { + mocha.lazyLoadFiles(0); + expect(mocha._lazyLoadFiles, 'to be false'); + }); + }); + + describe('when passed `true`', function() { + it('should enable lazy loading', function() { + mocha.lazyLoadFiles(true); + expect(mocha._lazyLoadFiles, 'to be true'); + }); + }); + }); }); describe('static method', function() { diff --git a/test/node-unit/reporters/parallel-buffered.spec.js b/test/node-unit/reporters/parallel-buffered.spec.js new file mode 100644 index 0000000000..65a74a72b8 --- /dev/null +++ b/test/node-unit/reporters/parallel-buffered.spec.js @@ -0,0 +1,230 @@ +'use strict'; + +// this reporter does not actually output anything to the terminal, so we +// need to test it differently. + +const { + EVENT_SUITE_BEGIN, + EVENT_SUITE_END, + EVENT_TEST_FAIL, + EVENT_TEST_PASS, + EVENT_TEST_PENDING, + EVENT_TEST_BEGIN, + EVENT_TEST_END, + EVENT_TEST_RETRY, + EVENT_DELAY_BEGIN, + EVENT_DELAY_END, + EVENT_HOOK_BEGIN, + EVENT_HOOK_END, + EVENT_RUN_END +} = require('../../../lib/runner').constants; +const {EventEmitter} = require('events'); +const {createSandbox} = require('sinon'); +const rewiremock = require('rewiremock/node'); + +describe('ParallelBuffered', function() { + let sandbox; + let runner; + let ParallelBuffered; + + beforeEach(function() { + sandbox = createSandbox(); + runner = new EventEmitter(); + ParallelBuffered = rewiremock.proxy( + require.resolve('../../../lib/nodejs/reporters/parallel-buffered'), + { + '../../../lib/nodejs/serializer': { + SerializableEvent: { + create: (eventName, runnable, err) => ({ + eventName, + data: runnable, + error: err, + __type: 'MockSerializableEvent' + }) + }, + SerializableWorkerResult: { + create: (events, failures) => ({ + events, + failures, + __type: 'MockSerializableWorkerResult' + }) + } + }, + '../../../lib/reporters/base': class MockBase {} + } + ); + }); + + afterEach(function() { + sandbox.restore(); + }); + + describe('constructor', function() { + it('should listen for Runner events', function() { + // EventEmitter#once calls thru to EventEmitter#on, which + // befouls our assertion below. + sandbox.stub(runner, 'once'); + sandbox.stub(runner, 'on'); + // eslint-disable-next-line no-new + new ParallelBuffered(runner); + expect(runner.on, 'to have calls satisfying', [ + // via Buffered + [EVENT_SUITE_BEGIN, expect.it('to be a function')], + [EVENT_SUITE_END, expect.it('to be a function')], + [EVENT_TEST_BEGIN, expect.it('to be a function')], + [EVENT_TEST_PENDING, expect.it('to be a function')], + [EVENT_TEST_FAIL, expect.it('to be a function')], + [EVENT_TEST_PASS, expect.it('to be a function')], + [EVENT_TEST_RETRY, expect.it('to be a function')], + [EVENT_TEST_END, expect.it('to be a function')], + [EVENT_HOOK_BEGIN, expect.it('to be a function')], + [EVENT_HOOK_END, expect.it('to be a function')] + ]); + }); + + it('should listen for Runner events expecting to occur once', function() { + sandbox.stub(runner, 'once'); + // eslint-disable-next-line no-new + new ParallelBuffered(runner); + expect(runner.once, 'to have calls satisfying', [ + [EVENT_DELAY_BEGIN, expect.it('to be a function')], + [EVENT_DELAY_END, expect.it('to be a function')], + [EVENT_RUN_END, expect.it('to be a function')] + ]); + }); + }); + + describe('event', function() { + let reporter; + + beforeEach(function() { + reporter = new ParallelBuffered(runner); + }); + + describe('on EVENT_RUN_END', function() { + it('should remove all listeners', function() { + runner.emit(EVENT_RUN_END); + expect(runner.listeners(), 'to be empty'); + }); + }); + + describe('on any other event listened for', function() { + it('should populate its `events` array with SerializableEvents', function() { + const suite = { + title: 'some suite' + }; + const test = { + title: 'some test' + }; + runner.emit(EVENT_SUITE_BEGIN, suite); + runner.emit(EVENT_TEST_BEGIN, test); + runner.emit(EVENT_TEST_PASS, test); + runner.emit(EVENT_TEST_END, test); + runner.emit(EVENT_SUITE_END, suite); + expect(reporter.events, 'to equal', [ + { + eventName: EVENT_SUITE_BEGIN, + data: suite, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_BEGIN, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_PASS, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_END, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_SUITE_END, + data: suite, + __type: 'MockSerializableEvent' + } + ]); + }); + }); + }); + + describe('instance method', function() { + let reporter; + + beforeEach(function() { + reporter = new ParallelBuffered(runner); + }); + + describe('done', function() { + it('should execute its callback with a SerializableWorkerResult', function() { + const suite = { + title: 'some suite' + }; + const test = { + title: 'some test' + }; + runner.emit(EVENT_SUITE_BEGIN, suite); + runner.emit(EVENT_TEST_BEGIN, test); + runner.emit(EVENT_TEST_PASS, test); + runner.emit(EVENT_TEST_END, test); + runner.emit(EVENT_SUITE_END, suite); + const cb = sandbox.stub(); + reporter.done(0, cb); + expect(cb, 'to have a call satisfying', [ + { + events: [ + { + eventName: EVENT_SUITE_BEGIN, + data: suite, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_BEGIN, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_PASS, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_TEST_END, + data: test, + __type: 'MockSerializableEvent' + }, + { + eventName: EVENT_SUITE_END, + data: suite, + __type: 'MockSerializableEvent' + } + ], + failures: 0, + __type: 'MockSerializableWorkerResult' + } + ]); + }); + + it('should reset its `events` prop', function() { + const suite = { + title: 'some suite' + }; + const test = { + title: 'some test' + }; + runner.emit(EVENT_SUITE_BEGIN, suite); + runner.emit(EVENT_TEST_BEGIN, test); + runner.emit(EVENT_TEST_PASS, test); + runner.emit(EVENT_TEST_END, test); + runner.emit(EVENT_SUITE_END, suite); + const cb = sandbox.stub(); + reporter.done(0, cb); + expect(reporter.events, 'to be empty'); + }); + }); + }); +}); diff --git a/test/node-unit/serializer.spec.js b/test/node-unit/serializer.spec.js new file mode 100644 index 0000000000..79f0093d11 --- /dev/null +++ b/test/node-unit/serializer.spec.js @@ -0,0 +1,555 @@ +'use strict'; + +const {createSandbox} = require('sinon'); +const { + serialize, + deserialize, + SerializableEvent, + SerializableWorkerResult +} = require('../../lib/nodejs/serializer'); + +describe('serializer', function() { + let sandbox; + + beforeEach(function() { + sandbox = createSandbox(); + }); + + afterEach(function() { + sandbox.restore(); + }); + + describe('function', function() { + describe('serialize', function() { + describe('when passed a non-object value', function() { + it('should return the value', function() { + expect(serialize('knees & toes'), 'to be', 'knees & toes'); + }); + }); + + describe('when passed an object value', function() { + describe('w/o a `serialize` method', function() { + it('should return the value', function() { + const obj = {}; + expect(serialize(obj), 'to be', obj); + }); + }); + + describe('having a `serialize` method', function() { + it('should return the result of the `serialize` method', function() { + const serializedObj = {foo: 'bar'}; + const obj = {serialize: sandbox.stub().returns(serializedObj)}; + expect(serialize(obj), 'to be', serializedObj); + }); + }); + }); + + describe('when not passed anything', function() { + it('should return `undefined`', function() { + expect(serialize(), 'to be undefined'); + }); + }); + }); + + describe('deserialize', function() { + describe('when passed nothing', function() { + it('should return `undefined`', function() { + expect(deserialize(), 'to be undefined'); + }); + }); + + describe('when passed a non-object value', function() { + it('should return the value', function() { + expect(deserialize(500), 'to be', 500); + }); + }); + + describe('when passed an object value which is not a SerializedWorkerResult', function() { + it('should return the value', function() { + const obj = {}; + expect(deserialize(obj), 'to be', obj); + }); + }); + + describe('when passed a SerializedWorkerResult object', function() { + // note that SerializedWorkerResult is an interface (typedef), not a class. + + it('should return the result of `SerializableWorkerResult.deserialize` called on the value', function() { + const obj = Object.assign({}, SerializableWorkerResult.create()); + sandbox + .stub(SerializableWorkerResult, 'deserialize') + .returns('butts'); + deserialize(obj); + expect( + SerializableWorkerResult.deserialize, + 'to have a call satisfying', + { + args: [obj], + returned: 'butts' + } + ); + }); + }); + }); + }); + + describe('SerializableEvent', function() { + describe('constructor', function() { + describe('when called without `eventName`', function() { + it('should throw', function() { + expect( + () => new SerializableEvent(), + 'to throw', + /expected a non-empty `eventName`/ + ); + }); + }); + + describe('when called with a non-object `rawObject`', function() { + it('should throw', function() { + expect( + () => new SerializableEvent('blub', 'glug'), + 'to throw', + /expected object, received \[string\]/ + ); + }); + }); + }); + + describe('instance method', function() { + describe('serialize', function() { + it('should mutate the instance in-place', function() { + const evt = SerializableEvent.create('foo'); + expect(evt.serialize(), 'to be', evt); + }); + + it('should freeze the instance', function() { + expect( + Object.isFrozen(SerializableEvent.create('foo').serialize()), + 'to be true' + ); + }); + + describe('when passed an object with a `serialize` method', function() { + it('should call the `serialize` method', function() { + const obj = { + serialize: sandbox.stub() + }; + SerializableEvent.create('some-event', obj).serialize(); + expect(obj.serialize, 'was called once'); + }); + }); + + describe('when passed an object containing an object with a `serialize` method', function() { + it('should call the `serialize` method', function() { + const stub = sandbox.stub(); + const obj = { + nested: { + serialize: stub + } + }; + SerializableEvent.create('some-event', obj).serialize(); + expect(stub, 'was called once'); + }); + }); + + describe('when passed an object containing a non-`serialize` method', function() { + it('should remove the method', function() { + const obj = { + func: () => {} + }; + + expect( + SerializableEvent.create('some-event', obj).serialize(), + 'to satisfy', + { + data: expect.it('not to have property', 'func') + } + ); + }); + }); + + describe('when passed an object containing an array', function() { + it('should serialize the array', function() { + const obj = { + list: [{herp: 'derp'}, {bing: 'bong'}] + }; + expect( + SerializableEvent.create('some-event', obj).serialize(), + 'to satisfy', + {data: {list: [{herp: 'derp'}, {bing: 'bong'}]}} + ); + }); + }); + + describe('when passed an error', function() { + it('should serialize the error', function() { + const obj = {}; + const err = new Error('monkeypants'); + expect( + SerializableEvent.create('some-event', obj, err).serialize(), + 'to satisfy', + { + eventName: 'some-event', + error: { + message: 'monkeypants', + stack: /^Error: monkeypants/, + __type: 'Error' + }, + data: obj + } + ); + }); + + it('should retain own props', function() { + const obj = {}; + const err = new Error('monkeypants'); + err.code = 'MONKEY'; + expect( + SerializableEvent.create('some-event', obj, err).serialize(), + 'to satisfy', + { + eventName: 'some-event', + error: { + code: 'MONKEY', + message: 'monkeypants', + stack: /^Error: monkeypants/, + __type: 'Error' + }, + data: obj + } + ); + }); + + it('should not retain not-own props', function() { + const obj = {}; + const err = new Error('monkeypants'); + // eslint-disable-next-line no-proto + err.__proto__.code = 'MONKEY'; + expect( + SerializableEvent.create('some-event', obj, err).serialize(), + 'to satisfy', + { + eventName: 'some-event', + error: { + message: 'monkeypants', + stack: /^Error: monkeypants/, + __type: 'Error' + }, + data: obj + } + ); + }); + }); + + describe('when passed an object containing a top-level prop with an Error value', function() { + it('should serialize the Error', function() { + const obj = { + monkeyError: new Error('pantsmonkey') + }; + const evt = SerializableEvent.create('some-event', obj); + expect(evt.serialize(), 'to satisfy', { + eventName: 'some-event', + data: { + monkeyError: { + message: 'pantsmonkey', + stack: /^Error: pantsmonkey/, + __type: 'Error' + } + } + }); + }); + }); + describe('when passed an object containing a nested prop with an Error value', function() { + it('should serialize the Error', function() { + const obj = { + nestedObj: { + monkeyError: new Error('pantsmonkey') + } + }; + const evt = SerializableEvent.create('some-event', obj); + expect(evt.serialize(), 'to satisfy', { + eventName: 'some-event', + data: { + nestedObj: { + monkeyError: { + message: 'pantsmonkey', + stack: /^Error: pantsmonkey/, + __type: 'Error' + } + } + } + }); + }); + }); + }); + }); + + describe('static method', function() { + describe('deserialize', function() { + describe('when passed a falsy parameter', function() { + it('should throw "invalid arg type" error', function() { + expect(SerializableEvent.deserialize, 'to throw', { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + }); + }); + }); + + it('should return a new object w/ null prototype', function() { + const obj = {bob: 'bob'}; + expect(SerializableEvent.deserialize(obj), 'to satisfy', obj) + .and('not to equal', obj) + .and('not to have property', 'constructor'); + }); + + describe('when passed value contains `data` prop', function() { + it('should ignore __proto__', function() { + const obj = { + data: Object.create(null) + }; + // eslint-disable-next-line no-proto + obj.data.__proto__ = {peaches: 'prunes'}; + + const expected = Object.assign(Object.create(null), { + data: Object.create(null) + }); + expect(SerializableEvent.deserialize(obj), 'to equal', expected); + }); + + describe('when `data` prop contains a nested serialized Error prop', function() { + it('should create an Error instance from the nested serialized Error prop', function() { + const message = 'problems!'; + const stack = 'problem instructions'; + const code = 'EIEIO'; + const expected = Object.assign(Object.create(null), { + data: { + whoops: Object.assign(new Error(message), { + stack, + code + }) + } + }); + + expect( + SerializableEvent.deserialize({ + data: { + whoops: { + message, + stack, + code, + __type: 'Error' + } + } + }), + 'to equal', + expected + ); + }); + }); + }); + + describe('when passed value contains an `error` prop', function() { + it('should create an Error instance from the prop', function() { + const message = 'problems!'; + const stack = 'problem instructions'; + const code = 'EIEIO'; + const expected = Object.assign(Object.create(null), { + error: Object.assign(new Error(message), { + stack, + code + }) + }); + + expect( + SerializableEvent.deserialize({ + error: { + message, + stack, + code, + __type: 'Error' + } + }), + 'to equal', + expected + ); + }); + }); + + describe('when passed value data contains a prop beginning with "$$"', function() { + let result; + + beforeEach(function() { + result = SerializableEvent.deserialize({data: {$$foo: 'bar'}}); + }); + it('should create a new prop having a function value', function() { + expect(result, 'to satisfy', { + data: { + foo: expect.it('to be a function') + } + }); + }); + + it('should create a new prop returning the original value', function() { + expect(result.data.foo(), 'to equal', 'bar'); + }); + + it('should remove the prop with the "$$" prefix', function() { + expect(result, 'not to have property', '$$foo'); + }); + }); + + describe('when the value data contains a prop with an array value', function() { + beforeEach(function() { + sandbox.spy(SerializableEvent, '_deserializeObject'); + }); + + it('should deserialize each prop', function() { + const obj = {data: {foo: [{bar: 'baz'}]}}; + SerializableEvent.deserialize(obj); + expect( + SerializableEvent._deserializeObject, + 'to have a call satisfying', + { + args: [obj.data.foo, 0] + } + ); + }); + }); + }); + + describe('create', function() { + it('should instantiate a SerializableEvent', function() { + expect( + SerializableEvent.create('some-event'), + 'to be a', + SerializableEvent + ); + }); + }); + }); + }); + + describe('SerializableWorkerResult', function() { + describe('static method', function() { + describe('create', function() { + it('should return a new SerializableWorkerResult instance', function() { + expect( + SerializableWorkerResult.create(), + 'to be a', + SerializableWorkerResult + ); + }); + }); + + describe('isSerializedWorkerResult', function() { + describe('when passed an instance', function() { + it('should return `true`', function() { + expect( + SerializableWorkerResult.isSerializedWorkerResult( + new SerializableWorkerResult() + ), + 'to be true' + ); + }); + }); + + describe('when passed an object with an appropriate `__type` prop', function() { + it('should return `true`', function() { + // this is the most likely use-case, as the object is transmitted over IPC + // and loses its prototype + const original = new SerializableWorkerResult(); + const clone = Object.assign({}, original); + expect( + SerializableWorkerResult.isSerializedWorkerResult(clone), + 'to be true' + ); + }); + }); + + describe('when passed an object without an appropriate `__type` prop', function() { + it('should return `false`', function() { + expect( + SerializableWorkerResult.isSerializedWorkerResult({ + mister: 'mister' + }), + 'to be false' + ); + }); + }); + }); + + describe('deserialize', function() { + beforeEach(function() { + sandbox.stub(SerializableEvent, 'deserialize'); + }); + + it('should call SerializableEvent#deserialize on each item in its `events` prop', function() { + const result = Object.assign( + {}, + SerializableWorkerResult.create([ + {eventName: 'foo'}, + {eventName: 'bar'} + ]) + ); + SerializableWorkerResult.deserialize(result); + expect(SerializableEvent.deserialize, 'to have calls satisfying', [ + {args: [{eventName: 'foo'}]}, + {args: [{eventName: 'bar'}]} + ]); + }); + + it('should return the deserialized value', function() { + const result = Object.assign( + {}, + SerializableWorkerResult.create([ + {eventName: 'foo'}, + {eventName: 'bar'} + ]) + ); + expect( + SerializableWorkerResult.deserialize(result), + 'to equal', + result + ); + }); + }); + }); + + describe('instance method', function() { + describe('serialize', function() { + it('should return a read-only value', function() { + expect( + Object.isFrozen(SerializableWorkerResult.create().serialize()), + 'to be true' + ); + }); + + it('should call `SerializableEvent#serialize` of each of its events', function() { + sandbox.spy(SerializableEvent.prototype, 'serialize'); + const events = [ + SerializableEvent.create('foo'), + SerializableEvent.create('bar') + ]; + SerializableWorkerResult.create(events).serialize(); + expect( + SerializableEvent.prototype.serialize, + 'to have calls satisfying', + [{thisValue: events[0]}, {thisValue: events[1]}] + ); + }); + }); + }); + describe('constructor', function() { + // the following two tests should be combined into one, but not sure how to express + // as a single assertion + + it('should add a readonly `__type` prop', function() { + expect( + new SerializableWorkerResult(), + 'to have readonly property', + '__type' + ); + }); + }); + }); +}); diff --git a/test/node-unit/worker.spec.js b/test/node-unit/worker.spec.js new file mode 100644 index 0000000000..78dfa1ac86 --- /dev/null +++ b/test/node-unit/worker.spec.js @@ -0,0 +1,223 @@ +'use strict'; + +const serializeJavascript = require('serialize-javascript'); +const rewiremock = require('rewiremock/node'); +const {SerializableWorkerResult} = require('../../lib/nodejs/serializer'); +const {createSandbox} = require('sinon'); + +const WORKER_PATH = require.resolve('../../lib/nodejs/worker.js'); + +describe('worker', function() { + let worker; + let sandbox; + let stubs; + + beforeEach(function() { + sandbox = createSandbox(); + stubs = { + workerpool: { + isMainThread: false, + worker: sandbox.stub() + } + }; + sandbox.spy(process, 'removeAllListeners'); + }); + + describe('when run as main process', function() { + it('should throw', function() { + expect(() => { + rewiremock.proxy(WORKER_PATH, { + workerpool: { + isMainThread: true, + worker: stubs.workerpool.worker + } + }); + }, 'to throw'); + }); + }); + + describe('when run as worker process', function() { + let mocha; + + beforeEach(function() { + mocha = { + addFile: sandbox.stub().returnsThis(), + loadFilesAsync: sandbox.stub().resolves(), + run: sandbox.stub().callsArgAsync(0), + unloadFiles: sandbox.stub().returnsThis() + }; + stubs.Mocha = Object.assign(sandbox.stub().returns(mocha), { + bdd: sandbox.stub(), + interfaces: {} + }); + + stubs.serializer = { + serialize: sandbox.stub() + }; + + stubs.runHelpers = { + handleRequires: sandbox.stub(), + validatePlugin: sandbox.stub(), + loadRootHooks: sandbox.stub().resolves() + }; + + worker = rewiremock.proxy(WORKER_PATH, { + workerpool: stubs.workerpool, + '../../lib/mocha': stubs.Mocha, + '../../lib/nodejs/serializer': stubs.serializer, + '../../lib/cli/run-helpers': stubs.runHelpers + }); + }); + + it('should register itself with workerpool', function() { + expect(stubs.workerpool.worker, 'to have a call satisfying', [ + {run: worker.run} + ]); + }); + + describe('function', function() { + describe('run()', function() { + describe('when called without arguments', function() { + it('should reject', async function() { + return expect(worker.run, 'to be rejected with error satisfying', { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + }); + }); + }); + + describe('when passed a non-string `options` value', function() { + it('should reject', async function() { + return expect( + () => worker.run('foo.js', 42), + 'to be rejected with error satisfying', + { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + } + ); + }); + }); + + describe('when passed an invalid string `options` value', function() { + it('should reject', async function() { + return expect( + () => worker.run('foo.js', 'tomfoolery'), + 'to be rejected with error satisfying', + { + code: 'ERR_MOCHA_INVALID_ARG_VALUE' + } + ); + }); + }); + + describe('when called with empty "filepath" argument', function() { + it('should reject', async function() { + return expect( + () => worker.run(''), + 'to be rejected with error satisfying', + { + code: 'ERR_MOCHA_INVALID_ARG_TYPE' + } + ); + }); + }); + + describe('when the file at "filepath" argument is unloadable', function() { + it('should reject', async function() { + mocha.loadFilesAsync.rejects(); + return expect( + () => worker.run('some-non-existent-file.js'), + 'to be rejected' + ); + }); + }); + + describe('when the file at "filepath" is loadable', function() { + let result; + beforeEach(function() { + result = SerializableWorkerResult.create(); + + mocha.loadFilesAsync.resolves(); + mocha.run.yields(result); + }); + + it('should handle "--require"', async function() { + await worker.run( + 'some-file.js', + serializeJavascript({require: 'foo'}) + ); + expect( + stubs.runHelpers.handleRequires, + 'to have a call satisfying', + ['foo'] + ).and('was called once'); + }); + + it('should handle "--ui"', async function() { + const argv = {foo: 'bar'}; + await worker.run('some-file.js', serializeJavascript(argv)); + + expect( + stubs.runHelpers.validatePlugin, + 'to have a call satisfying', + [argv, 'ui', stubs.Mocha.interfaces] + ).and('was called once'); + }); + + it('should call Mocha#run', async function() { + await worker.run('some-file.js'); + expect(mocha.run, 'was called once'); + }); + + it('should remove all uncaughtException listeners', async function() { + await worker.run('some-file.js'); + expect(process.removeAllListeners, 'to have a call satisfying', [ + 'uncaughtException' + ]); + }); + + describe('when serialization succeeds', function() { + beforeEach(function() { + stubs.serializer.serialize.returnsArg(0); + }); + + it('should resolve with a SerializedWorkerResult', async function() { + return expect( + worker.run('some-file.js'), + 'to be fulfilled with', + result + ); + }); + }); + + describe('when serialization fails', function() { + beforeEach(function() { + stubs.serializer.serialize.throws(); + }); + + it('should reject', async function() { + return expect(worker.run('some-file.js'), 'to be rejected'); + }); + }); + + describe('when run twice', function() { + it('should initialize only once', async function() { + await worker.run('some-file.js'); + await worker.run('some-other-file.js'); + + expect(stubs.runHelpers, 'to satisfy', { + handleRequires: expect.it('was called once'), + validatePlugin: expect.it('was called once') + }); + }); + }); + }); + }); + }); + }); + + afterEach(function() { + sandbox.restore(); + // this is needed due to `require.cache` getting dumped in watch mode + process.removeAllListeners('beforeExit'); + }); +}); diff --git a/test/reporters/tap.spec.js b/test/reporters/tap.spec.js index f3bfe8d473..01294e0430 100644 --- a/test/reporters/tap.spec.js +++ b/test/reporters/tap.spec.js @@ -40,29 +40,17 @@ describe('TAP reporter', function() { describe('event handlers', function() { describe("on 'start' event", function() { var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; var stdout = []; before(function() { var runner = createMockRunner('start', EVENT_RUN_BEGIN); runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; stdout = runReporter({}, runner, options); }); it('should not write a TAP specification version', function() { expect(stdout, 'not to contain', 'TAP version'); }); - - it('should write the number of tests that it plans to run', function() { - var expectedArray = ['1..' + expectedTotal + '\n']; - expect(stdout, 'to equal', expectedArray); - expect(expectedString, 'to be', expectedSuite); - }); }); describe("on 'pending' event", function() { @@ -78,7 +66,6 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -102,7 +89,6 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -141,7 +127,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -171,7 +156,6 @@ describe('TAP reporter', function() { error ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -209,7 +193,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -245,7 +228,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -271,11 +253,10 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); - it('should write total tests, passes, and failures', function() { + it('should write total tests, passes, failures, & plan', function() { var numberOfPasses = 1; var numberOfFails = 1; var totalTests = numberOfPasses + numberOfFails; @@ -284,7 +265,8 @@ describe('TAP reporter', function() { 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', '# tests ' + totalTests + '\n', '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' + '# fail ' + numberOfFails + '\n', + '1..' + totalTests + '\n' ]; expect(stdout, 'to equal', expectedArray); }); @@ -302,17 +284,11 @@ describe('TAP reporter', function() { describe('event handlers', function() { describe("on 'start' event", function() { var expectedSuite = 'some suite'; - var expectedTotal = 10; - var expectedString; var stdout; before(function() { var runner = createMockRunner('start', EVENT_RUN_BEGIN); runner.suite = expectedSuite; - runner.grepTotal = function(string) { - expectedString = string; - return expectedTotal; - }; stdout = runReporter({}, runner, options); }); @@ -321,12 +297,6 @@ describe('TAP reporter', function() { var expectedFirstLine = 'TAP version ' + tapVersion + '\n'; expect(stdout[0], 'to equal', expectedFirstLine); }); - - it('should write the number of tests that it plans to run', function() { - var expectedSecondLine = '1..' + expectedTotal + '\n'; - expect(stdout[1], 'to equal', expectedSecondLine); - expect(expectedString, 'to be', expectedSuite); - }); }); describe("on 'pending' event", function() { @@ -342,7 +312,6 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -366,7 +335,6 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -405,7 +373,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -438,7 +405,6 @@ describe('TAP reporter', function() { error ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -479,7 +445,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -519,7 +484,6 @@ describe('TAP reporter', function() { } }; runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); @@ -545,11 +509,10 @@ describe('TAP reporter', function() { test ); runner.suite = ''; - runner.grepTotal = noop; stdout = runReporter({}, runner, options); }); - it('should write total tests, passes, and failures', function() { + it('should write total tests, passes, failures & plan', function() { var numberOfPasses = 1; var numberOfFails = 1; var totalTests = numberOfPasses + numberOfFails; @@ -558,7 +521,8 @@ describe('TAP reporter', function() { 'not ok ' + numberOfFails + ' ' + expectedTitle + '\n', '# tests ' + totalTests + '\n', '# pass ' + numberOfPasses + '\n', - '# fail ' + numberOfFails + '\n' + '# fail ' + numberOfFails + '\n', + '1..' + totalTests + '\n' ]; expect(stdout, 'to equal', expectedArray); }); diff --git a/test/unit/errors.spec.js b/test/unit/errors.spec.js index 51d066ef98..3c1adee505 100644 --- a/test/unit/errors.spec.js +++ b/test/unit/errors.spec.js @@ -3,26 +3,63 @@ var errors = require('../../lib/errors'); describe('Errors', function() { - var expectedMessage = 'some message'; - it('should include expected code in thrown reporter errors', function() { - var throwError = function() { - throw errors.createInvalidReporterError(expectedMessage, 'badReporter'); - }; - expect(throwError, 'to throw', { - message: expectedMessage, - code: 'ERR_MOCHA_INVALID_REPORTER', - reporter: 'badReporter' + var message = 'some message'; + + describe('createInvalidReporterError()', function() { + it('should include expected code in thrown reporter errors', function() { + expect( + errors.createInvalidReporterError(message, 'badReporter'), + 'to satisfy', + { + message: message, + code: 'ERR_MOCHA_INVALID_REPORTER', + reporter: 'badReporter' + } + ); + }); + }); + + describe('createInvalidInterfaceError()', function() { + it('should include expected code in thrown interface errors', function() { + expect( + errors.createInvalidInterfaceError(message, 'badUi'), + 'to satisfy', + { + message: message, + code: 'ERR_MOCHA_INVALID_INTERFACE', + interface: 'badUi' + } + ); }); }); - it('should include expected code in thrown interface errors', function() { - var throwError = function() { - throw errors.createInvalidInterfaceError(expectedMessage, 'badUi'); - }; - expect(throwError, 'to throw', { - message: expectedMessage, - code: 'ERR_MOCHA_INVALID_INTERFACE', - interface: 'badUi' + describe('createForbiddenExclusivityError()', function() { + describe('when Mocha instance is running in a worker process', function() { + it('should output a message regarding incompatibility', function() { + var mocha = {isWorker: true}; + expect( + errors.createForbiddenExclusivityError(mocha, {}), + 'to satisfy', + { + message: /parallel/, + code: errors.constants.FORBIDDEN_EXCLUSIVITY + } + ); + }); + }); + + describe('when Mocha instance is not running in a worker process', function() { + it('should output a message regarding --forbid-only', function() { + var mocha = {}; + expect( + errors.createForbiddenExclusivityError(mocha, {}), + 'to satisfy', + { + message: /--forbid-only/, + code: errors.constants.FORBIDDEN_EXCLUSIVITY + } + ); + }); }); }); }); diff --git a/test/unit/hook-timeout.spec.js b/test/unit/hook-timeout.spec.js index 8c1b1f4735..12d9bdc1a3 100644 --- a/test/unit/hook-timeout.spec.js +++ b/test/unit/hook-timeout.spec.js @@ -1,9 +1,11 @@ 'use strict'; -before(function(done) { - setTimeout(done, 100); -}); +describe('hook timeout', function() { + before(function(done) { + setTimeout(done, 100); + }); -it('should work', function(done) { - done(); + it('should work', function(done) { + done(); + }); }); diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 5fb0263ec1..64cb7e9b07 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -51,7 +51,13 @@ describe('Mocha', function() { sandbox = sinon.createSandbox(); reporterInstance = {}; opts = {reporter: sandbox.stub().returns(reporterInstance)}; - Base = sandbox.stub().returns({}); + + // NOTE: calling `stub(someObject, someFunction)` where `someFunction` has + // its own static properties WILL NOT blast those static properties! + Base = sandbox.stub(Mocha.reporters, 'Base').returns({}); + sandbox.stub(Mocha.reporters, 'base').returns({}); + sandbox.stub(Mocha.reporters, 'spec').returns({}); + runner = utils.assign(sandbox.createStubInstance(EventEmitter), { run: sandbox .stub() @@ -61,7 +67,7 @@ describe('Mocha', function() { grep: sandbox.stub(), dispose: sandbox.stub() }); - Runner = sandbox.stub().returns(runner); + Runner = sandbox.stub(Mocha, 'Runner').returns(runner); // the Runner constructor is the main export, and constants is a static prop. // we don't need the constants themselves, but the object cannot be undefined Runner.constants = {}; @@ -72,18 +78,13 @@ describe('Mocha', function() { dispose: sandbox.stub(), reset: sandbox.stub() }); - Suite = sandbox.stub().returns(suite); + Suite = sandbox.stub(Mocha, 'Suite').returns(suite); Suite.constants = {}; sandbox.stub(utils, 'supportsEsModules').returns(false); sandbox.stub(utils, 'warn'); sandbox.stub(utils, 'isString'); sandbox.stub(utils, 'noop'); - - Mocha.Runner = Runner; - Mocha.reporters.Base = Mocha.reporters.base = Base; - sandbox.stub(Mocha.reporters, 'spec'); - Mocha.Suite = Suite; }); afterEach(function() { @@ -101,6 +102,7 @@ describe('Mocha', function() { sandbox.stub(Mocha.prototype, 'global').returnsThis(); sandbox.stub(Mocha.prototype, 'retries').returnsThis(); sandbox.stub(Mocha.prototype, 'rootHooks').returnsThis(); + sandbox.stub(Mocha.prototype, 'parallelMode').returnsThis(); }); it('should set _cleanReferencesAfterRun to true', function() { @@ -162,6 +164,26 @@ describe('Mocha', function() { ]).and('was called once'); }); }); + + describe('when `parallel` option is true', function() { + describe('and `jobs` option > 1', function() { + it('should enable parallel mode', function() { + // eslint-disable-next-line no-new + new Mocha({parallel: true, jobs: 2}); + expect(Mocha.prototype.parallelMode, 'to have a call satisfying', [ + true + ]).and('was called once'); + }); + }); + + describe('and `jobs` option <= 1', function() { + it('should not enable parallel mode', function() { + // eslint-disable-next-line no-new + new Mocha({parallel: true, jobs: 1}); + expect(Mocha.prototype.parallelMode, 'was not called'); + }); + }); + }); }); describe('instance method', function() { @@ -546,7 +568,7 @@ describe('Mocha', function() { describe('when Mocha is set to lazily load files', function() { beforeEach(function() { - mocha.loadAsync = true; + mocha.lazyLoadFiles(true); }); it('should not eagerly load files', function(done) { @@ -635,7 +657,7 @@ describe('Mocha', function() { it('should configure the Base reporter', function(done) { mocha.run(function() { - expect(Base, 'to exhaustively satisfy', { + expect(Base, 'to satisfy', { inlineDiffs: 'some value', hideDiff: true, useColors: 'truthy' @@ -647,7 +669,7 @@ describe('Mocha', function() { it('should configure the Base reporter', function(done) { mocha.run(function() { - expect(Base, 'to exhaustively satisfy', { + expect(Base, 'to satisfy', { inlineDiffs: 'some value', hideDiff: true }); @@ -695,8 +717,6 @@ describe('Mocha', function() { }, 'to throw', { - message: - 'Mocha instance is currently running tests, cannot start a next test run until this one is done', code: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', instance: mocha } @@ -726,8 +746,6 @@ describe('Mocha', function() { }, 'to throw', { - message: - 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', cleanReferencesAfterRun: true, instance: mocha @@ -760,8 +778,6 @@ describe('Mocha', function() { }, 'to throw', { - message: - 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', code: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', instance: mocha } @@ -818,23 +834,21 @@ describe('Mocha', function() { }); }); - describe('unloadFiles()', function() { - it('should reset referencesCleaned and allow for next run', function(done) { - mocha.run(function() { - mocha.unloadFiles(); - mocha.run(done); + describe('parallelMode()', function() { + describe('when `Mocha` is running in a browser', function() { + beforeEach(function() { + sandbox.stub(utils, 'isBrowser').returns(true); }); - }); - it('should not be allowed when the current instance is already disposed', function() { - mocha.dispose(); - expect( - function() { - mocha.unloadFiles(); - }, - 'to throw', - 'Mocha instance is already disposed, it cannot be used again.' - ); + it('should throw', function() { + expect( + function() { + mocha.parallelMode(); + }, + 'to throw', + {code: 'ERR_MOCHA_UNSUPPORTED'} + ); + }); }); }); }); From 273dbbbf4c21debded604c2094591bdbcbed7705 Mon Sep 17 00:00:00 2001 From: JacobLey <37151850+JacobLey@users.noreply.github.com> Date: Mon, 1 Jun 2020 18:53:24 -0400 Subject: [PATCH 1497/1771] Support --require of ESM; closes #4281 (#4304) * Support --require of ESM; closes #4281 Allow files/modules specified in `--require` to be ESM. CommonJS loading is still supported and the default. * Conditionally generate url for import Windows compatible * Add tests for --require ESM As both .mjs and type=module (combined with cjs for good measure). Updated linter to allow tests to use spread operator (ecmaVersion 2018) Allow --require'd module to be an object, or "module" * Revert change to eslintrc, use mocha to pass experimental flag * Replace type() -> typeof Add truthy check to handle null edge case type(ES Module) => "module", but we treat it the same as an object * Remove doc limitation for --require ESM * Add note to --require docs about ESM support --- docs/index.md | 3 +- lib/cli/run-helpers.js | 19 ++++++--- lib/esm-utils.js | 17 +++++--- .../fixtures/options/require/esm/package.json | 1 + .../require/esm/root-hook-defs-esm.fixture.js | 8 ++++ .../require/root-hook-defs-esm.fixture.mjs | 8 ++++ test/integration/options/require.spec.js | 41 +++++++++++++++++++ 7 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 test/integration/fixtures/options/require/esm/package.json create mode 100644 test/integration/fixtures/options/require/esm/root-hook-defs-esm.fixture.js create mode 100644 test/integration/fixtures/options/require/root-hook-defs-esm.fixture.mjs diff --git a/docs/index.md b/docs/index.md index cd2ed9c328..ad26db226b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1007,6 +1007,8 @@ Modules required in this manner are expected to do work synchronously; Mocha won Note you cannot use `--require` to set a global `beforeEach()` hook, for example — use `--file` instead, which allows you to specify an explicit order in which test files are loaded. +> As of v7.3.0, Mocha supports `--require` for [NodeJS native ESM](#nodejs-native-esm-support). There is no separate `--import` flag. + ### `--sort, -S` Sort test files (by absolute path) using [Array.prototype.sort][mdn-array-sort]. @@ -1450,7 +1452,6 @@ Node.JS native ESM support still has status: **Stability: 1 - Experimental** - [Watch mode](#-watch-w) does not support ES Module test files - [Custom reporters](#third-party-reporters) and [custom interfaces](#interfaces) can only be CommonJS files -- [Required modules](#-require-module-r-module) can only be CommonJS files - [Configuration file](#configuring-mocha-nodejs) can only be a CommonJS file (`.mocharc.js` or `.mocharc.cjs`) - When using module-level mocks via libs like `proxyquire`, `rewiremock` or `rewire`, hold off on using ES modules for your test files - Node.JS native ESM support does not work with [esm][npm-esm] module diff --git a/lib/cli/run-helpers.js b/lib/cli/run-helpers.js index e09338f2c6..017d914f4d 100644 --- a/lib/cli/run-helpers.js +++ b/lib/cli/run-helpers.js @@ -15,6 +15,7 @@ const collectFiles = require('./collect-files'); const {type} = require('../utils'); const {format} = require('util'); const {createInvalidPluginError, createUnsupportedError} = require('../errors'); +const {requireOrImport} = require('../esm-utils'); /** * Exits Mocha when tests + code under test has finished execution (default) @@ -81,16 +82,21 @@ exports.list = str => * @returns {Promise} Any root hooks * @private */ -exports.handleRequires = async (requires = []) => - requires.reduce((acc, mod) => { +exports.handleRequires = async (requires = []) => { + const acc = []; + for (const mod of requires) { let modpath = mod; // this is relative to cwd if (fs.existsSync(mod) || fs.existsSync(`${mod}.js`)) { modpath = path.resolve(mod); debug('resolved required file %s to %s', mod, modpath); } - const requiredModule = require(modpath); - if (type(requiredModule) === 'object' && requiredModule.mochaHooks) { + const requiredModule = await requireOrImport(modpath); + if ( + requiredModule && + typeof requiredModule === 'object' && + requiredModule.mochaHooks + ) { const mochaHooksType = type(requiredModule.mochaHooks); if (/function$/.test(mochaHooksType) || mochaHooksType === 'object') { debug('found root hooks in required file %s', mod); @@ -102,8 +108,9 @@ exports.handleRequires = async (requires = []) => } } debug('loaded required module "%s"', mod); - return acc; - }, []); + } + return acc; +}; /** * Loads root hooks as exported via `mochaHooks` from required files. diff --git a/lib/esm-utils.js b/lib/esm-utils.js index df2b5fed0e..604f883d9a 100644 --- a/lib/esm-utils.js +++ b/lib/esm-utils.js @@ -1,11 +1,16 @@ -const url = require('url'); const path = require('path'); +const url = require('url'); -const requireOrImport = async file => { - file = path.resolve(file); +const formattedImport = async file => { + if (path.isAbsolute(file)) { + return import(url.pathToFileURL(file)); + } + return import(file); +}; +exports.requireOrImport = async file => { if (path.extname(file) === '.mjs') { - return import(url.pathToFileURL(file)); + return formattedImport(file); } // This is currently the only known way of figuring out whether a file is CJS or ESM. // If Node.js or the community establish a better procedure for that, we can fix this code. @@ -15,7 +20,7 @@ const requireOrImport = async file => { return require(file); } catch (err) { if (err.code === 'ERR_REQUIRE_ESM') { - return import(url.pathToFileURL(file)); + return formattedImport(file); } else { throw err; } @@ -25,7 +30,7 @@ const requireOrImport = async file => { exports.loadFilesAsync = async (files, preLoadFunc, postLoadFunc) => { for (const file of files) { preLoadFunc(file); - const result = await requireOrImport(file); + const result = await exports.requireOrImport(path.resolve(file)); postLoadFunc(file, result); } }; diff --git a/test/integration/fixtures/options/require/esm/package.json b/test/integration/fixtures/options/require/esm/package.json new file mode 100644 index 0000000000..5ffd9800b9 --- /dev/null +++ b/test/integration/fixtures/options/require/esm/package.json @@ -0,0 +1 @@ +{ "type": "module" } diff --git a/test/integration/fixtures/options/require/esm/root-hook-defs-esm.fixture.js b/test/integration/fixtures/options/require/esm/root-hook-defs-esm.fixture.js new file mode 100644 index 0000000000..3e0a2f775c --- /dev/null +++ b/test/integration/fixtures/options/require/esm/root-hook-defs-esm.fixture.js @@ -0,0 +1,8 @@ +export const mochaHooks = () => ({ + beforeEach() { + console.log('esm beforeEach'); + }, + afterEach() { + console.log('esm afterEach'); + }, +}); diff --git a/test/integration/fixtures/options/require/root-hook-defs-esm.fixture.mjs b/test/integration/fixtures/options/require/root-hook-defs-esm.fixture.mjs new file mode 100644 index 0000000000..6597d65be0 --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-esm.fixture.mjs @@ -0,0 +1,8 @@ +export const mochaHooks = { + beforeAll() { + console.log('mjs beforeAll'); + }, + afterAll() { + console.log('mjs afterAll'); + }, +}; diff --git a/test/integration/options/require.spec.js b/test/integration/options/require.spec.js index ca50af8607..11b869a5f0 100644 --- a/test/integration/options/require.spec.js +++ b/test/integration/options/require.spec.js @@ -1,6 +1,7 @@ 'use strict'; var invokeMochaAsync = require('../helpers').invokeMochaAsync; +var utils = require('../../../lib/utils'); describe('--require', function() { describe('when mocha run in serial mode', function() { @@ -45,6 +46,46 @@ describe('--require', function() { /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ ); }); + + describe('support ESM when style=module or .mjs extension', function() { + before(function() { + if (!utils.supportsEsModules()) this.skip(); + }); + + it('should run root hooks when provided via mochaHooks', function() { + return expect( + invokeMochaAsync( + [ + '--require=' + + require.resolve( + // as object + '../fixtures/options/require/root-hook-defs-esm.fixture.mjs' + ), + '--require=' + + require.resolve( + // as function + '../fixtures/options/require/esm/root-hook-defs-esm.fixture.js' + ), + '--require=' + + require.resolve( + // mixed with commonjs + '../fixtures/options/require/root-hook-defs-a.fixture.js' + ), + require.resolve( + '../fixtures/options/require/root-hook-test.fixture.js' + ) + ].concat( + +process.versions.node.split('.')[0] >= 13 + ? [] + : '--experimental-modules' + ) + )[1], + 'when fulfilled', + 'to contain output', + /mjs beforeAll[\s\S]+?beforeAll[\s\S]+?esm beforeEach[\s\S]+?beforeEach[\s\S]+?esm afterEach[\s\S]+?afterEach[\s\S]+?mjs afterAll[\s\S]+?afterAll/ + ); + }); + }); }); describe('when mocha in parallel mode', function() { From 63eb80bd4907ac87b5cbde054ad8e6112fdcb939 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 21 Apr 2020 14:10:07 -0700 Subject: [PATCH 1498/1771] add docs for parallel and root hooks > this PR needs the changes from the `boneskull/issue/2839-11ty-changes` branch --- docs/index.md | 367 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 354 insertions(+), 13 deletions(-) diff --git a/docs/index.md b/docs/index.md index ad26db226b..3a053505ff 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,11 +18,11 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [browser support](#running-mocha-in-the-browser) - [simple async support, including promises](#asynchronous-code) +- [run Node.js tests in parallel](#parallel-tests) - [test coverage reporting](#wallabyjs) - [string diff support](#diffs) -- [javascript API for running tests](#more-information) -- proper exit status for CI support etc -- [auto-detects and disables coloring for non-ttys](#reporters) +- [JavaScript API for running tests](#more-information) +- [auto-detects and disables coloring for non-TTYs](#reporters) - [async test timeout support](#delayed-root-suite) - [test retry support](#retry-tests) - [test-specific timeouts](#test-level) @@ -35,7 +35,6 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [auto-exit to prevent "hanging" with an active loop](#-exit) - [easily meta-generate suites](#markdown) & [test-cases](#list) - [config file support](#-config-path) -- clickable suite titles to filter test execution - [node debugger support](#-inspect-inspect-brk-inspect) - [node native ES modules support](#nodejs-native-esm-support) - [detects multiple calls to `done()`](#detects-multiple-calls-to-done) @@ -119,7 +118,7 @@ $ npm test A brief outline on the order Mocha's components are executed. Worth noting that all hooks, `describe` and `it` callbacks are run in the order they are defined (i.e. found in the file). -```js +``` run 'mocha spec.js' | spawn child process @@ -392,16 +391,14 @@ describe('Connection', function() { ### Root-Level Hooks -You may also pick any file and add "root"-level hooks. For example, add `beforeEach()` outside of all `describe()` blocks. This will cause the callback to `beforeEach()` to run before any test case, regardless of the file it lives in (this is because Mocha has an _implied_ `describe()` block, called the "root suite"). +A hook defined at the top scope of a test file (outside of a suite) is a _root hook_. -```js -beforeEach(function() { - console.log('before every test in every file'); -}); -``` +As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanism for setting root-level hooks. ### Delayed Root Suite +> _WARNING: Delayed root suites are incompatible with [parallel mode](#parallel-tests)._ + If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: ```js @@ -431,8 +428,12 @@ describe('Array', function() { Pending tests will be included in the test results, and marked as pending. A pending test is not considered a failed test. +Read the [inclusive tests section](#inclusive-tests) for an example of conditionally marking a test as pending via `this.skip()`. + ## Exclusive Tests +> _WARNING: Exclusive tests are incompatible with [parallel mode](#parallel-tests)._ + The exclusivity feature allows you to run _only_ the specified suite or test-case by appending `.only()` to the function. Here's an example of executing only a particular suite: @@ -972,6 +973,8 @@ The option can be given multiple times. The option accepts a comma-delimited lis ### `--file ` +> _WARNING: `--file` is incompatible with [parallel mode](#parallel-tests)._ + Explicitly _include_ a test file to be loaded before other test files. Multiple uses of `--file` are allowed, and will be loaded in order given. Useful if you want to declare, for example, hooks to be run before every test across all other test files. @@ -1005,12 +1008,14 @@ Require a module before loading the user interface or test files. This is useful Modules required in this manner are expected to do work synchronously; Mocha won't wait for async tasks in a required module to finish. -Note you cannot use `--require` to set a global `beforeEach()` hook, for example — use `--file` instead, which allows you to specify an explicit order in which test files are loaded. +**You cannot use `--require` to set hooks**. If you want to set hooks to run, e.g., before each test, use a [Root Hook Plugin](#root-hook-plugins). -> As of v7.3.0, Mocha supports `--require` for [NodeJS native ESM](#nodejs-native-esm-support). There is no separate `--import` flag. +> As of v8.0.0, Mocha supports `--require` for [NodeJS native ESM](#nodejs-native-esm-support). There is no separate `--import` flag. ### `--sort, -S` +> _WARNING: `--sort` is incompatible with [parallel mode](#parallel-tests)._ + Sort test files (by absolute path) using [Array.prototype.sort][mdn-array-sort]. ### `--watch, -w` @@ -1099,6 +1104,28 @@ All of these options are mutually exclusive. Implies `--no-timeout`. +### `--parallel, -p` + +> _New in v.8.0.0._ + +Use the `--parallel` flag to run tests in a worker pool. + +Each test file will be put into a queue and executed as workers become available. + +**NOTICE**: `--parallel` has certain implications for Mocha's behavior which you must be aware of. Read more about [running tests in parallel](#parallel-tests). + +### `--jobs , -j ` + +> _New in v.8.0.0._ + +Use `--jobs ` to specify the _maximum_ number of processes in the worker pool. + +The default value is the _number of CPU cores_ less 1. + +Hint: Use `--jobs 0` or `--jobs 1` to temporarily disable `--parallel`. + +Has no effect unless used with [`--parallel`](#-parallel-p). + ### About Option Types > _Updated in v6.0.0._ @@ -1121,6 +1148,320 @@ Prepend `--v8-` to any flag listed in the output of `node --v8-options` (excludi V8 flags can be defined in Mocha's [configuration](#configuring-mocha-nodejs). +## Parallel Tests + +> _New in v.8.0.0._ + +Depending on the number and nature of your tests, you may find a significant performance benefit when running tests in parallel (using the [`--parallel`](#-parallel-p) flag). + +Parallel tests should work out-of-the box for many use cases. However, you must be aware of some important implications of the behavior. + +> _Note: Authors of third-party libraries built on Mocha should read this!_ + +### Reporter Limitations + +Due to the nature of the following reporters, they cannot work when running tests in parallel: + +- [`markdown`](#markdown) +- [`progress`](#progress) +- [`json-stream`](#json-stream) + {:.single-column} + +These reporters expect Mocha to know _how many tests it plans to run_ before execution. This information is unavailable in parallel mode, as test files are loaded only when they are about to be run. + +In serial mode, tests results will "stream" as they occur. In parallel mode, reporter output is _buffered_; reporting will occur after each file is completed. In practice, the reporter output will appear in "chunks" (but will otherwise be identical). If a test file is particularly slow, there may be a significant pause while it's running. + +### Exclusive Tests are Disallowed + +**You cannot use `it.only`, `describe.only`, `this.only()`, etc., in parallel mode.** This is for the same reason as the incompatible reporters noted above: in parallel mode, Mocha does not load all files and suites into memory before running tests. + +Suggested workarounds: + +1. Use [`--grep`](#-grep-regexp-g-regexp) or [`--fgrep`](http://localhost:8080/#-fgrep-string-f-string) instead; it's not particularly efficient, but it will work. +1. Don't use parallel mode. Likely, you won't be running very many exclusive tests, so you won't see a great benefit from parallel mode anyhow. + +> _TIP: If parallel mode is defined in your config file, you can temporarily disable it on the command-line by using either the `--no-parallel` flag or reducing the job count, e.g., `--jobs=0`._ + +### File Order is Non-Deterministic + +In parallel mode, Mocha does not guarantee the order in which test files will run, nor which worker process runs them. + +Because of this, the following options, which depend on order, _cannot be used_ in parallel mode: + +- [`--file`](#-file-filedirectoryglob) +- [`--sort`](#-sort-s) +- [`--delay`](#delayed-root-suite) + {:.single-column} + +### Test Duration Variability + +Running tests in parallel mode will naturally use more system resources. The OS may take extra time to schedule and complete some operations, depending on system load. For this reason, the timeouts of _individual tests_ may need to be increased either [globally](#-timeout-ms-t-ms) or [otherwise](#timeouts). + +### "Bail" is "Best Effort" + +When used with `--bail` (or `this.bail()`) to exit after the first failure, it's likely other tests will be running at the same time. Mocha must shut down its worker processes before exiting. + +Likewise, subprocesses may throw uncaught exceptions. When used with `--allow-uncaught`, Mocha will "bubble" this exception to the main process, but still must shut down its processes. + +Either way, Mocha will abort the test run "very soon." + +### Root Hooks Are Not Global + +> _NOTE: This only applies when running in parallel mode._ + +A _root hook_ is a hook in a test file which is _not defined_ within a suite. An example using the `bdd` interface: + +```js +// test/setup.js + +// root hook to run before every test (even in other files) +beforeEach(function() { + doMySetup(); +}); + +// root hook to run after every test (even in other files) +afterEach(function() { + doMyTeardown(); +}); +``` + +When run (in the default "serial" mode) via this command: + +```bash +mocha --file "./test/setup.js" "./test/**/*.spec.js" +``` + +`setup.js` will be executed _first_, and install the two hooks shown above for every test found in `./test/**/*.spec.js`. + +**The above example does not work in parallel mode.** + +When Mocha runs in parallel mode, **test files do not share the same process,** nor do they share the same instance of Mocha. Consequently, a hypothetical root hook defined in test file _A_ **will not be present** in test file _B_. + +Here are a couple suggested workarounds: + +1. `require('./setup.js')` or `import './setup.js'` at the top of every test file. Best avoided for those averse to boilerplate. +1. _Recommended_: Define root hooks in a "required" file, using the new (also as of v8.0.0) [Root Hook Plugin](#root-hook-plugins) system. + +### No Browser Support + +Parallel mode is only available in Node.js, for now. + +### Migration Checklist + +If you find your tests don't work properly when run with [`--parallel`](#-parallel-p), either shrug and move on, or use this handy-dandy checklist to get things working: + +- :white_check_mark: Ensure you are using a [supported reporter](#reporter-limitations). +- :white_check_mark: Ensure you are not using [other unsupported flags](#file-order-is-non-deterministic). +- :white_check_mark: Double-check your [config file](#configuring-mocha-nodejs); options set in config files will be merged with any command-line option. +- :white_check_mark: Look for root-level hooks (they look like [this](#root-hooks-are-not-global)) in your tests. Move them into a [root-level hook plugin](#root-hook-plugins). +- :white_check_mark: Do any assertion, mock, or other test libraries you're consuming use root-level hooks? They may need to be [migrated](#migrating-a-library-to-use-root-hook-plugins) for compatibility with parallel mode. +- :white_check_mark: If tests are unexpectedly timing out, you may need to increase the default test timeout (via [`--timeout`](#-timeout-ms-t-ms)) +- :white_check_mark: Ensure your tests do not depend on being run in a specific order. +- :white_check_mark: Ensure your tests clean up after themselves; remove temp files, handles, sockets, etc. Don't try to share state or resources between test files. + +### Caveats About Testing in Parallel + +Some types of tests are _not_ so well-suited to run in parallel. For example, extremely timing-sensitive tests, or tests which make I/O requests to a limited pool of resources (such as opening ports, or automating browser windows, hitting a test DB, or remote server, etc.). + +Free-tier cloud CI services may not provide a suitable multi-core container or VM for their build agents. Regarding expected performance gains in CI: your mileage may vary. It may help to use a conditional in a `.mocharc.js` to check for `process.env.CI`, and adjust the job count as appropriate. + +It's unlikely (but not impossible) to see a performance gain from a [job count](#-jobs-count-j-count) _greater than_ the number of available CPU cores. That said, _play around with the job count_--there's no one-size-fits all, and the unique characteristics of your tests will determine the optimal number of jobs; it may even be that fewer is faster! + +## Root Hook Plugins + +> _New in v8.0.0._ + +In some cases, you may want a [hook](#hooks) before (or after) every test in every file. These are called _root hooks_. Previous to v8.0.0, the way to accomplish this was to use `--file` combined with root hooks (see [example above](#root-hooks-are-not-global)). This still works in v8.0.0, but _not_ when running tests in parallel mode! For that reason, running root hooks using this method is _strongly discouraged_, and may be deprecated in the future. + +A _Root Hook Plugin_ is a JavaScript file loaded via [`--require`](#-require-module-r-module) which "registers" one or more root hooks to be used across all test files. + +### Defining a Root Hook Plugin + +A Root Hook Plugin file is a script which exports (via `module.exports`) a `mochaHooks` property. + +Here's a simple example, which defines a root hook. Use it via `--require test/hooks.js`: + +```js +// test/hooks.js + +exports.mochaHooks = { + beforeEach(done) { + // do something before every test + done(); + } +}; +``` + +`beforeEach`--as you may have guessed--corresponds to a `beforeEach` in the default [`bdd`](#bdd) interface. + +### Available Root Hooks + +Root hooks work with any interface, but _the property names do not change_. In other words, if you are using the `tdd` interface, `suiteSetup` maps to `beforeAll`, and `setup` maps to `beforeEach`. + +Available root hooks and their behavior: + +- `beforeAll`: + - In **serial** mode (Mocha's default), _before all tests begin, once only_ + - In **parallel** mode, run _before all tests begin, for each file_ +- `beforeEach`: + - In **both** modes, run _before each test_ +- `afterAll`: + - In **serial** mode, run _after all tests end, once only_ + - In **parallel** mode, run _after all tests end, for each file_ +- `afterEach`: + - In **both** modes, run _after every test_ + +{:.single-column} + +The root hook callbacks run in the usual context, so `this` is available: + +```js +exports.mochaHooks = { + beforeAll() { + // skip all tests for bob + if (require('os').userInfo().username === 'bob') { + return this.skip(); + } + } +}; +``` + +### Multiple Root Hooks in a Single Plugin + +Multiple root hooks can be defined in a single plugin, for organizational purposes. For example: + +```js +exports.mochaHooks = { + beforeEach: [ + function(done) { + // do something before every test, + // then run the next hook in this array + }, + async function() { + // async or Promise-returning functions allowed + } + ] +}; +``` + +### Root Hook Plugins Can Export a Function + +If you need to perform some logic--such as choosing a root hook conditionally, based on the environment--`mochaHooks` can be a _function_ which returns the expected object. + +```js +exports.mochaHooks = () => { + if (process.env.CI) { + // root hooks object + return { + beforeEach: [ + function() { + // CI-specific beforeEach + }, + function() { + // some other CI-specific beforeEach + } + ] + }; + } + // root hooks object + return { + beforeEach() { + // regular beforeEach + } + }; +}; +``` + +If you need to perform an async operation, `mochaHooks` can be `Promise`-returning: + +```js +exports.mochaHooks = async () => { + const result = await checkSomething(); + // only use a root hook if `result` is truthy + if (result) { + // root hooks object + return { + beforeEach() { + // something + } + }; + } +}; +``` + +### Multiple Root Hook Plugins + +Multiple root hook plugins can be registered by using `--require` multiple times. For example, to register the root hooks in `hooks-a.js` and `hooks-b.js`, use `--require hooks-a.js --require hooks-b.js`. These will be registered (and run) _in order_. + +### Migrating Tests to use Root Hook Plugins + +To migrate your tests using root hooks to a root hook plugin: + +1. Find your root hooks (hooks defined _outside_ of a suite--usually `describe()` callback). +1. Create a new file, e.g., `test/hooks.js`. +1. _Move_ your root hooks into `test/hooks.js`. +1. In `test/hooks.js`, make your hooks a member of an exported `mochaHooks` property. +1. Use `--require test/hooks.js` (even better: use a [config file](#configuring-mocha-nodejs) with `{"require": "test/hooks.js"}`) when running your tests. + +For example, given the following file, `test/test.spec.js`, containing root hooks: + +```js +// test/test.spec.js + +beforeEach(function() { + // global setup for all tests +}); + +after(function() { + // one-time final cleanup +}); + +describe('my test suite', function() { + it('should have run my global setup', function() { + // make assertion + }); +}); +``` + +Your `test/hooks.js` should contain: + +```js +// test/hooks.js + +exports.mochaHooks = { + beforeEach(function() { + // global setup for all tests + }), + afterAll(function() { + // one-time final cleanup + }) +}; +``` + +> _NOTE: Careful! `after` becomes `afterAll` and `before` becomes `beforeAll`._ + +Your original `test/test.spec.js` should now contain: + +```js +// test/test.spec.js + +describe('my test suite', function() { + it('should have run my global setup', function() { + // make assertion + }); +}); +``` + +Running `mocha --require test/hooks.js test/test.spec.js` will run as before (and is now ready to be used with [`--parallel`](#-parallel-p)). + +### Migrating a Library to use Root Hook PLugins + +If you're a library maintainer, and your library uses root hooks, you can migrate by refactoring your entry point: + +- Your library should _always_ export a [`mochaHooks` object](#defining-a-root-hook-plugin). +- To maintain backwards compatibility, run your root hooks _if and only if_ `global.beforeEach` (or other relevant hook) exists. +- Instruct your users to `--require ` when running `mocha`. + ## Interfaces Mocha's "interface" system allows developers to choose their style of DSL. Mocha has **BDD**, **TDD**, **Exports**, **QUnit** and **Require**-style interfaces. From 9881ace56715c51ce04762aa55de388f77a08809 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 3 Jun 2020 17:10:42 -0700 Subject: [PATCH 1499/1771] fix bad error message when incorrectly using ESM - re-enable parallel-mode root hook plugin tests - refactor root hook plugin tests to avoid flake Signed-off-by: Christopher Hiller --- lib/cli/cli.js | 4 +- lib/cli/run.js | 23 ++- .../root-hook-defs-esm-broken.fixture.js | 8 + test/integration/options/require.spec.js | 194 +++++++++++++++--- 4 files changed, 189 insertions(+), 40 deletions(-) create mode 100644 test/integration/fixtures/options/require/root-hook-defs-esm-broken.fixture.js diff --git a/lib/cli/cli.js b/lib/cli/cli.js index 59fd2f4af4..2e004ba4a3 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -49,10 +49,10 @@ exports.main = (argv = process.argv.slice(2)) => { 'Commands:': 'Commands' }) .fail((msg, err, yargs) => { - debug(err); + debug('caught error sometime before command handler: %O', err); yargs.showHelp(); console.error(`\n${symbols.error} ${ansi.red('ERROR:')} ${msg}`); - process.exit(1); + yargs.exit(1); }) .help('help', 'Show usage information & exit') .alias('help', 'h') diff --git a/lib/cli/run.js b/lib/cli/run.js index f2c970fb26..6582a4e2c5 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -7,6 +7,8 @@ * @private */ +const symbols = require('log-symbols'); +const ansi = require('ansi-colors'); const Mocha = require('../mocha'); const { createUnsupportedError, @@ -333,14 +335,21 @@ exports.builder = yargs => return true; }) - .middleware(async argv => { - // load requires first, because it can impact "plugin" validation - const rawRootHooks = await handleRequires(argv.require); - validatePlugin(argv, 'reporter', Mocha.reporters); - validatePlugin(argv, 'ui', Mocha.interfaces); + .middleware(async (argv, yargs) => { + // currently a failing middleware does not work nicely with yargs' `fail()`. + try { + // load requires first, because it can impact "plugin" validation + const rawRootHooks = await handleRequires(argv.require); + validatePlugin(argv, 'reporter', Mocha.reporters); + validatePlugin(argv, 'ui', Mocha.interfaces); - if (rawRootHooks.length) { - argv.rootHooks = await loadRootHooks(rawRootHooks); + if (rawRootHooks && rawRootHooks.length) { + argv.rootHooks = await loadRootHooks(rawRootHooks); + } + } catch (err) { + // this could be a bad --require, bad reporter, ui, etc. + console.error(`\n${symbols.error} ${ansi.red('ERROR:')}`, err); + yargs.exit(1); } }) .array(types.array) diff --git a/test/integration/fixtures/options/require/root-hook-defs-esm-broken.fixture.js b/test/integration/fixtures/options/require/root-hook-defs-esm-broken.fixture.js new file mode 100644 index 0000000000..6597d65be0 --- /dev/null +++ b/test/integration/fixtures/options/require/root-hook-defs-esm-broken.fixture.js @@ -0,0 +1,8 @@ +export const mochaHooks = { + beforeAll() { + console.log('mjs beforeAll'); + }, + afterAll() { + console.log('mjs afterAll'); + }, +}; diff --git a/test/integration/options/require.spec.js b/test/integration/options/require.spec.js index 11b869a5f0..21da366b2e 100644 --- a/test/integration/options/require.spec.js +++ b/test/integration/options/require.spec.js @@ -3,11 +3,38 @@ var invokeMochaAsync = require('../helpers').invokeMochaAsync; var utils = require('../../../lib/utils'); +/** + * Extracts root hook log messages from run results + * `root-hook-defs-*` fixtures are root hook plugins which call `console.log()` + * for verification that they have been run. + * @param {RawResult} res - result of invokeMochaAsync() + */ +function extractHookOutputFromResult(res) { + return res.output + .trim() + .split('\n') + .filter(function(line) { + // every line that begins with whitespace (e.g., the test name) should be ignored; + // we just want the console.log messages + return /^\S/.test(line); + }) + .sort(); +} + +/** + * Helper to call Mocha and pipe the result through `extractHookOutputFromResult` + * @param {*} args - args for invokeMochaAsync + * @param {*} opts - opts for invokeMochaAsync + */ +function runMochaForHookOutput(args, opts) { + return invokeMochaAsync(args, opts)[1].then(extractHookOutputFromResult); +} + describe('--require', function() { describe('when mocha run in serial mode', function() { it('should run root hooks when provided via mochaHooks object export', function() { return expect( - invokeMochaAsync([ + runMochaForHookOutput([ '--require=' + require.resolve( '../fixtures/options/require/root-hook-defs-a.fixture.js' @@ -19,16 +46,28 @@ describe('--require', function() { require.resolve( '../fixtures/options/require/root-hook-test.fixture.js' ) - ])[1], - 'when fulfilled', - 'to contain output', - /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ]), + 'to be fulfilled with', + [ + 'afterAll', + 'afterAll array 1', + 'afterAll array 2', + 'afterEach', + 'afterEach array 1', + 'afterEach array 2', + 'beforeAll', + 'beforeAll array 1', + 'beforeAll array 2', + 'beforeEach', + 'beforeEach array 1', + 'beforeEach array 2' + ] ); }); it('should run root hooks when provided via mochaHooks function export', function() { return expect( - invokeMochaAsync([ + runMochaForHookOutput([ '--require=' + require.resolve( '../fixtures/options/require/root-hook-defs-c.fixture.js' @@ -40,21 +79,33 @@ describe('--require', function() { require.resolve( '../fixtures/options/require/root-hook-test.fixture.js' ) - ])[1], - 'when fulfilled', - 'to contain output', - /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ]), + 'to be fulfilled with', + [ + 'afterAll', + 'afterAll array 1', + 'afterAll array 2', + 'afterEach', + 'afterEach array 1', + 'afterEach array 2', + 'beforeAll', + 'beforeAll array 1', + 'beforeAll array 2', + 'beforeEach', + 'beforeEach array 1', + 'beforeEach array 2' + ] ); }); - describe('support ESM when style=module or .mjs extension', function() { + describe('support ESM when type=module or .mjs extension', function() { before(function() { if (!utils.supportsEsModules()) this.skip(); }); it('should run root hooks when provided via mochaHooks', function() { return expect( - invokeMochaAsync( + runMochaForHookOutput( [ '--require=' + require.resolve( @@ -79,22 +130,55 @@ describe('--require', function() { ? [] : '--experimental-modules' ) + ), + 'to be fulfilled with', + [ + 'afterAll', + 'afterEach', + 'beforeAll', + 'beforeEach', + 'esm afterEach', + 'esm beforeEach', + 'mjs afterAll', + 'mjs beforeAll' + ] + ); + }); + }); + + describe('support ESM via .js extension w/o type=module', function() { + before(function() { + if (!utils.supportsEsModules()) this.skip(); + }); + + it('should fail due to ambiguous file type', function() { + return expect( + invokeMochaAsync( + [ + '--require=' + + require.resolve( + // as object + '../fixtures/options/require/root-hook-defs-esm-broken.fixture.js' + ) + ].concat( + +process.versions.node.split('.')[0] >= 13 + ? [] + : '--experimental-modules' + ), + 'pipe' )[1], 'when fulfilled', 'to contain output', - /mjs beforeAll[\s\S]+?beforeAll[\s\S]+?esm beforeEach[\s\S]+?beforeEach[\s\S]+?esm afterEach[\s\S]+?afterEach[\s\S]+?mjs afterAll[\s\S]+?afterAll/ + /SyntaxError: Unexpected token/ ); }); }); }); describe('when mocha in parallel mode', function() { - before(function() { - this.skip(); // TODO: remove when #4245 lands - }); it('should run root hooks when provided via mochaHooks object exports', function() { return expect( - invokeMochaAsync([ + runMochaForHookOutput([ '--require=' + require.resolve( '../fixtures/options/require/root-hook-defs-a.fixture.js' @@ -107,16 +191,28 @@ describe('--require', function() { require.resolve( '../fixtures/options/require/root-hook-test.fixture.js' ) - ])[1], - 'when fulfilled', - 'to contain output', - /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ]), + 'to be fulfilled with', + [ + 'afterAll', + 'afterAll array 1', + 'afterAll array 2', + 'afterEach', + 'afterEach array 1', + 'afterEach array 2', + 'beforeAll', + 'beforeAll array 1', + 'beforeAll array 2', + 'beforeEach', + 'beforeEach array 1', + 'beforeEach array 2' + ] ); }); it('should run root hooks when provided via mochaHooks function export', function() { return expect( - invokeMochaAsync([ + runMochaForHookOutput([ '--require=' + require.resolve( '../fixtures/options/require/root-hook-defs-c.fixture.js' @@ -129,17 +225,29 @@ describe('--require', function() { require.resolve( '../fixtures/options/require/root-hook-test.fixture.js' ) - ])[1], - 'when fulfilled', - 'to contain output', - /beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2/ + ]), + 'to be fulfilled with', + [ + 'afterAll', + 'afterAll array 1', + 'afterAll array 2', + 'afterEach', + 'afterEach array 1', + 'afterEach array 2', + 'beforeAll', + 'beforeAll array 1', + 'beforeAll array 2', + 'beforeEach', + 'beforeEach array 1', + 'beforeEach array 2' + ] ); }); describe('when running multiple jobs', function() { it('should run root hooks when provided via mochaHooks object exports for each job', function() { return expect( - invokeMochaAsync([ + runMochaForHookOutput([ '--require=' + require.resolve( '../fixtures/options/require/root-hook-defs-a.fixture.js' @@ -155,10 +263,34 @@ describe('--require', function() { require.resolve( '../fixtures/options/require/root-hook-test-2.fixture.js' ) - ])[1], - 'when fulfilled', - 'to contain output', - /(?:beforeAll[\s\S]+?beforeAll array 1[\s\S]+?beforeAll array 2[\s\S]+?beforeEach[\s\S]+?beforeEach array 1[\s\S]+?beforeEach array 2[\s\S]+?afterEach[\s\S]+?afterEach array 1[\s\S]+?afterEach array 2[\s\S]+?afterAll[\s\S]+?afterAll array 1[\s\S]+?afterAll array 2[\s\S]+?){2}/ + ]), + 'to be fulfilled with', + [ + 'afterAll', + 'afterAll', + 'afterAll array 1', + 'afterAll array 1', + 'afterAll array 2', + 'afterAll array 2', + 'afterEach', + 'afterEach', + 'afterEach array 1', + 'afterEach array 1', + 'afterEach array 2', + 'afterEach array 2', + 'beforeAll', + 'beforeAll', + 'beforeAll array 1', + 'beforeAll array 1', + 'beforeAll array 2', + 'beforeAll array 2', + 'beforeEach', + 'beforeEach', + 'beforeEach array 1', + 'beforeEach array 1', + 'beforeEach array 2', + 'beforeEach array 2' + ] ); }); }); From 0a66259da0de490c002cb70ab2183556a88c7699 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 3 Jun 2020 17:20:16 -0700 Subject: [PATCH 1500/1771] update docs regarding ESM and root hook plugins Signed-off-by: Christopher Hiller --- docs/index.md | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/docs/index.md b/docs/index.md index 3a053505ff..1fa8ada2ec 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1277,9 +1277,11 @@ A _Root Hook Plugin_ is a JavaScript file loaded via [`--require`](#-require-mod ### Defining a Root Hook Plugin -A Root Hook Plugin file is a script which exports (via `module.exports`) a `mochaHooks` property. +A Root Hook Plugin file is a script which exports (via `module.exports`) a `mochaHooks` property. It is loaded via `--require `. -Here's a simple example, which defines a root hook. Use it via `--require test/hooks.js`: +Here's a simple example which defines a root hook, written using CJS and ESM syntax. + +#### With CommonJS ```js // test/hooks.js @@ -1292,7 +1294,24 @@ exports.mochaHooks = { }; ``` -`beforeEach`--as you may have guessed--corresponds to a `beforeEach` in the default [`bdd`](#bdd) interface. +#### With ES Modules + +We're using the `.mjs` extension in these examples. + +> _Tip: If you're having trouble getting ES modules to work, refer to [the Node.js documentation](https://nodejs.org/api/esm.html)._ + +```js +// test/hooks.mjs + +export const mochaHooks = { + beforeEach(done) { + // do something before every test + done(); + } +}; +``` + +> _Note: Further examples will use ESM syntax._ ### Available Root Hooks @@ -1313,10 +1332,12 @@ Available root hooks and their behavior: {:.single-column} -The root hook callbacks run in the usual context, so `this` is available: +As with other hooks, `this` refers to to the current context object: ```js -exports.mochaHooks = { +// test/hooks.mjs + +export const mochaHooks = { beforeAll() { // skip all tests for bob if (require('os').userInfo().username === 'bob') { @@ -1331,7 +1352,9 @@ exports.mochaHooks = { Multiple root hooks can be defined in a single plugin, for organizational purposes. For example: ```js -exports.mochaHooks = { +// test/hooks.mjs + +export const mochaHooks = { beforeEach: [ function(done) { // do something before every test, @@ -1349,7 +1372,9 @@ exports.mochaHooks = { If you need to perform some logic--such as choosing a root hook conditionally, based on the environment--`mochaHooks` can be a _function_ which returns the expected object. ```js -exports.mochaHooks = () => { +// test/hooks.mjs + +export const mochaHooks = () => { if (process.env.CI) { // root hooks object return { @@ -1375,7 +1400,9 @@ exports.mochaHooks = () => { If you need to perform an async operation, `mochaHooks` can be `Promise`-returning: ```js -exports.mochaHooks = async () => { +// test/hooks.mjs + +export const mochaHooks = async () => { const result = await checkSomething(); // only use a root hook if `result` is truthy if (result) { @@ -1423,7 +1450,7 @@ describe('my test suite', function() { }); ``` -Your `test/hooks.js` should contain: +Your `test/hooks.js` (for this example, a CJS module) should contain: ```js // test/hooks.js From ca1cfc4caa6bcb94aa2d99c7dbab5ced06fb91dd Mon Sep 17 00:00:00 2001 From: Arvid Ottenberg Date: Fri, 5 Jun 2020 23:24:19 +0200 Subject: [PATCH 1501/1771] Consistent handling of --forbid-only for suites and tests (#4282) * implement markOnly method for suite class * add test cases to cover suites markOnly method * make forbidOnly option throw exception even if suite is excluded by grep * adapt test cases to changed forbidOnly logic * reuse existing sandbox variable * remove unnecessary check for forbid only option * remove duplicate beforeEach afterEach defined for markOnly test suite --- lib/interfaces/common.js | 18 ++++++----- lib/suite.js | 9 ++++++ test/integration/options/forbidOnly.spec.js | 35 ++++++++++++--------- test/unit/suite.spec.js | 15 +++++++++ 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 5fa87e4537..3c171ef8d7 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -94,6 +94,9 @@ module.exports = function(suites, context, mocha) { * @returns {Suite} */ only: function only(opts) { + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } opts.isOnly = true; return this.create(opts); }, @@ -127,15 +130,14 @@ module.exports = function(suites, context, mocha) { suite.file = opts.file; suites.unshift(suite); if (opts.isOnly) { - if (mocha.options.forbidOnly && shouldBeTested(suite)) { - throw createForbiddenExclusivityError(mocha); - } - suite.parent.appendOnlySuite(suite); + suite.markOnly(); } - if (suite.pending) { - if (mocha.options.forbidPending && shouldBeTested(suite)) { - throw createUnsupportedError('Pending test forbidden'); - } + if ( + suite.pending && + mocha.options.forbidPending && + shouldBeTested(suite) + ) { + throw createUnsupportedError('Pending test forbidden'); } if (typeof opts.fn === 'function') { opts.fn.call(suite); diff --git a/lib/suite.js b/lib/suite.js index f3c8b104af..24e6dd344e 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -491,6 +491,15 @@ Suite.prototype.appendOnlySuite = function(suite) { this._onlySuites.push(suite); }; +/** + * Marks a suite to be `only`. + * + * @private + */ +Suite.prototype.markOnly = function() { + this.parent && this.parent.appendOnlySuite(this); +}; + /** * Adds a test to the list of tests marked `only`. * diff --git a/test/integration/options/forbidOnly.spec.js b/test/integration/options/forbidOnly.spec.js index 1886becb7d..252c5b99b9 100644 --- a/test/integration/options/forbidOnly.spec.js +++ b/test/integration/options/forbidOnly.spec.js @@ -92,32 +92,37 @@ describe('--forbid-only', function() { ); }); - it('should succeed if suite marked only does not match grep', function(done) { + it('should fail if suite marked only does not match grep', function(done) { var fixture = path.join('options', 'forbid-only', 'only-suite'); - runMochaJSON(fixture, args.concat('--fgrep', 'bumble bees'), function( - err, - res - ) { - if (err) { - return done(err); - } - expect(res, 'to have passed'); - done(); - }); + var spawnOpts = {stdio: 'pipe'}; + runMocha( + fixture, + args.concat('--fgrep', 'bumble bees'), + function(err, res) { + if (err) { + return done(err); + } + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); + done(); + }, + spawnOpts + ); }); - it('should succeed if suite marked only does not match inverted grep', function(done) { + it('should fail if suite marked only does not match inverted grep', function(done) { var fixture = path.join('options', 'forbid-only', 'only-suite'); - runMochaJSON( + var spawnOpts = {stdio: 'pipe'}; + runMocha( fixture, args.concat('--fgrep', 'suite marked with only', '--invert'), function(err, res) { if (err) { return done(err); } - expect(res, 'to have passed'); + expect(res, 'to have failed with output', new RegExp(onlyErrorMessage)); done(); - } + }, + spawnOpts ); }); diff --git a/test/unit/suite.spec.js b/test/unit/suite.spec.js index a5063b7f91..6166496ee5 100644 --- a/test/unit/suite.spec.js +++ b/test/unit/suite.spec.js @@ -680,6 +680,21 @@ describe('Suite', function() { }); }); }); + + describe('.markOnly()', function() { + it('should call appendOnlySuite on parent', function() { + var suite = new Suite('foo'); + var spy = sandbox.spy(); + suite.parent = { + appendOnlySuite: spy + }; + suite.markOnly(); + + expect(spy, 'to have a call exhaustively satisfying', [suite]).and( + 'was called once' + ); + }); + }); }); describe('Test', function() { From a2f2e087a27ee39eec729e9b4c1f5f27a8b69b9e Mon Sep 17 00:00:00 2001 From: Gil Tayar Date: Sat, 6 Jun 2020 00:25:14 +0300 Subject: [PATCH 1502/1771] enable esm support in Node v10 (#4299) * enable esm support in Node v10 * also test Node v10 esm support * supportsEsModule default is now to check support for full (>=v12) specification * restoring package-lock.json to the version with https --- docs/index.md | 1 + lib/mocha.js | 4 +++- lib/utils.js | 10 +++++++--- test/integration/esm.spec.js | 4 +++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 1fa8ada2ec..29c02b4061 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1812,6 +1812,7 @@ More information can be found in the [Node.js documentation](https://nodejs.org/ > Mocha supports ES modules only from Node.js v12.11.0 and above. To enable this in versions smaller than 13.2.0, you need to add `--experimental-modules` when running > Mocha. From version 13.2.0 of Node.js, you can use ES modules without any flags. +> (Mocha _will_ load ESM even in Node v10, but this is not officially supported. Use at your own risk.) ### Current Limitations diff --git a/lib/mocha.js b/lib/mocha.js index 5c39d62cac..8aabcb8762 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -14,7 +14,9 @@ var utils = require('./utils'); var mocharc = require('./mocharc.json'); var errors = require('./errors'); var Suite = require('./suite'); -var esmUtils = utils.supportsEsModules() ? require('./esm-utils') : undefined; +var esmUtils = utils.supportsEsModules(true) + ? require('./esm-utils') + : undefined; var createStatsCollector = require('./stats-collector'); var createInvalidReporterError = errors.createInvalidReporterError; var createInvalidInterfaceError = errors.createInvalidInterfaceError; diff --git a/lib/utils.js b/lib/utils.js index b338bc094c..e09322b9ee 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -808,16 +808,20 @@ exports.defineConstants = function(obj) { * This function returns whether Node.JS has ES Module supports that is compatible with Mocha's needs, * which is version >=12.11. * + * @param {partialSupport} whether the full Node.js ESM support is available (>= 12) or just something that supports the runtime (>= 10) + * * @returns {Boolean} whether the current version of Node.JS supports ES Modules in a way that is compatible with Mocha */ -exports.supportsEsModules = function() { +exports.supportsEsModules = function(partialSupport) { if (!exports.isBrowser() && process.versions && process.versions.node) { var versionFields = process.versions.node.split('.'); var major = +versionFields[0]; var minor = +versionFields[1]; - if (major >= 13 || (major === 12 && minor >= 11)) { - return true; + if (!partialSupport) { + return major >= 13 || (major === 12 && minor >= 11); + } else { + return major >= 10; } } }; diff --git a/test/integration/esm.spec.js b/test/integration/esm.spec.js index b4cf761f2a..20b3a27248 100644 --- a/test/integration/esm.spec.js +++ b/test/integration/esm.spec.js @@ -6,7 +6,7 @@ var args = describe('esm', function() { before(function() { - if (!utils.supportsEsModules()) this.skip(); + if (!utils.supportsEsModules(true)) this.skip(); }); it('should pass a passing esm test that uses esm', function(done) { @@ -39,6 +39,8 @@ describe('esm', function() { }); it('should recognize esm files ending with .js due to package.json type flag', function(done) { + if (!utils.supportsEsModules(false)) return this.skip(); + var fixture = 'esm/js-folder/esm-in-js.fixture.js'; run(fixture, args, function(err, result) { if (err) { From 5cd8893c8e0fcd192fd4d931a2792cd5e38d4fc7 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 5 Jun 2020 11:46:09 -0700 Subject: [PATCH 1503/1771] remove .nvmrc; use NODE_VERSION env for netlify Signed-off-by: Christopher Hiller --- .nvmrc | 1 - netlify.toml | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 48082f72f0..0000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/netlify.toml b/netlify.toml index 990a6dc6aa..521973cbaf 100644 --- a/netlify.toml +++ b/netlify.toml @@ -11,3 +11,6 @@ [build] publish = "docs/_dist/" command = "npm start docs" + +[build.environment] + NODE_VERSION = "12" From 53ada74918cc9f7e378f2ceae77bf41c7992b056 Mon Sep 17 00:00:00 2001 From: juergba Date: Wed, 3 Jun 2020 17:23:23 +0200 Subject: [PATCH 1504/1771] remove Node v13 from CI test matrix --- .travis.yml | 4 ---- appveyor.yml | 1 - 2 files changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index cbc2ce6722..166bb054ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,10 +41,6 @@ jobs: name: 'Latest Node.js (with coverage)' - script: MOCHA_PARALLEL=0 npm start test.node.unit name: 'Latest Node.js (unit tests in serial mode)' - - &node - script: npm start test.node - node_js: '13' - name: 'Node.js v13' - &node script: npm start test.node diff --git a/appveyor.yml b/appveyor.yml index 56d8a541ef..5cda1af03c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,6 @@ clone_depth: 1 environment: matrix: - nodejs_version: '14' - - nodejs_version: '13' - nodejs_version: '12' - nodejs_version: '10' matrix: From dc26e903cc1630c08b349dbf7853527c27f5f2ed Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Jun 2020 15:46:51 -0700 Subject: [PATCH 1505/1771] disable parallel mode by default Having run benchmarks against our unit tests and integration tests, I've found that the unit tests do not benefit from parallel mode--and in fact, they run more slowly. Integration tests still see a 50% performance boost, so we will use parallel tests for those only. --- .mocharc.yml | 1 - package-scripts.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.mocharc.yml b/.mocharc.yml index b458eb5423..dfb82e07f6 100644 --- a/.mocharc.yml +++ b/.mocharc.yml @@ -5,7 +5,6 @@ global: - 'okGlobalC' - 'callback*' timeout: 1000 -parallel: true watch-ignore: - '.*' - 'docs/_dist/**' diff --git a/package-scripts.js b/package-scripts.js index 94b0469994..f62540ba17 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -139,7 +139,7 @@ module.exports = { integration: { script: test( 'integration', - '--timeout 10000 --slow 3750 "test/integration/**/*.spec.js"' + '--parallel --timeout 10000 --slow 3750 "test/integration/**/*.spec.js"' ), description: 'Run Node.js integration tests', hiddenFromHelp: true From 2da50aa53d76cb111dbb5fe952bd0beb49f2e278 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 8 Jun 2020 15:48:40 -0700 Subject: [PATCH 1506/1771] add a section regarding 3p reporters & parallel mode also rename "Migration Checklist" to "Troubleshooting Parallel Mode" --- docs/index.md | 310 +++++++++++++++++++++++++------------------------- 1 file changed, 157 insertions(+), 153 deletions(-) diff --git a/docs/index.md b/docs/index.md index 29c02b4061..5d4cbdc87d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,9 +77,9 @@ In your editor: ```js var assert = require('assert'); -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -159,7 +159,7 @@ spawn child process If you use callback-based async tests, Mocha will throw an error if `done()` is called multiple times. This is handy for catching accidental double callbacks. ```javascript -it('double done', function(done) { +it('double done', function (done) { // Calling `done()` twice is an error setImmediate(done); setImmediate(done); @@ -202,11 +202,11 @@ Mocha allows you to use any assertion library you wish. In the above example, we By adding an argument (usually named `done`) to `it()` to a test callback, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). ```js -describe('User', function() { - describe('#save()', function() { - it('should save without error', function(done) { +describe('User', function () { + describe('#save()', function () { + it('should save without error', function (done) { var user = new User('Luna'); - user.save(function(err) { + user.save(function (err) { if (err) done(err); else done(); }); @@ -218,9 +218,9 @@ describe('User', function() { Alternatively, use the `done()` callback directly (which will handle an error argument, if it exists): ```js -describe('User', function() { - describe('#save()', function() { - it('should save without error', function(done) { +describe('User', function () { + describe('#save()', function () { + it('should save without error', function (done) { var user = new User('Luna'); user.save(done); }); @@ -233,14 +233,14 @@ describe('User', function() { Alternately, instead of using the `done()` callback, you may return a [Promise][mdn-promise]. This is useful if the APIs you are testing return promises instead of taking callbacks: ```js -beforeEach(function() { - return db.clear().then(function() { +beforeEach(function () { + return db.clear().then(function () { return db.save([tobi, loki, jane]); }); }); -describe('#find()', function() { - it('respond with matching records', function() { +describe('#find()', function () { + it('respond with matching records', function () { return db.find({type: 'User'}).should.eventually.have.length(3); }); }); @@ -254,8 +254,8 @@ In Mocha v3.0.0 and newer, returning a `Promise` _and_ calling `done()` will res const assert = require('assert'); // antipattern -it('should complete this test', function(done) { - return new Promise(function(resolve) { +it('should complete this test', function (done) { + return new Promise(function (resolve) { assert.ok(true); resolve(); }).then(done); @@ -269,13 +269,13 @@ The above test will fail with `Error: Resolution method is overspecified. Specif If your JS environment supports [async / await][mdn-async], you can also write asynchronous tests like this: ```js -beforeEach(async function() { +beforeEach(async function () { await db.clear(); await db.save([tobi, loki, jane]); }); -describe('#find()', function() { - it('responds with matching records', async function() { +describe('#find()', function () { + it('responds with matching records', async function () { const users = await db.find({type: 'User'}); users.should.have.length(3); }); @@ -287,9 +287,9 @@ describe('#find()', function() { When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. ```js -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -318,20 +318,20 @@ _If you do not need to use_ Mocha's context, lambdas should work. Be aware that With its default "BDD"-style interface, Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`. These should be used to set up preconditions and clean up after your tests. ```js -describe('hooks', function() { - before(function() { +describe('hooks', function () { + before(function () { // runs once before the first test in this block }); - after(function() { + after(function () { // runs once after the last test in this block }); - beforeEach(function() { + beforeEach(function () { // runs before each test in this block }); - afterEach(function() { + afterEach(function () { // runs after each test in this block }); @@ -346,7 +346,7 @@ describe('hooks', function() { Any hook can be invoked with an optional description, making it easier to pinpoint errors in your tests. If a hook is given a named function, that name will be used if no description is supplied. ```js -beforeEach(function() { +beforeEach(function () { // beforeEach hook }); @@ -354,7 +354,7 @@ beforeEach(function namedFun() { // beforeEach:namedFun }); -beforeEach('some description', function() { +beforeEach('some description', function () { // beforeEach:some description }); ``` @@ -364,22 +364,22 @@ beforeEach('some description', function() { All hooks (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: ```js -describe('Connection', function() { +describe('Connection', function () { var db = new Connection(), tobi = new User('tobi'), loki = new User('loki'), jane = new User('jane'); - beforeEach(function(done) { - db.clear(function(err) { + beforeEach(function (done) { + db.clear(function (err) { if (err) return done(err); db.save([tobi, loki, jane], done); }); }); - describe('#find()', function() { - it('respond with matching records', function(done) { - db.find({type: 'User'}, function(err, res) { + describe('#find()', function () { + it('respond with matching records', function (done) { + db.find({type: 'User'}, function (err, res) { if (err) return done(err); res.should.have.length(3); done(); @@ -393,7 +393,7 @@ describe('Connection', function() { A hook defined at the top scope of a test file (outside of a suite) is a _root hook_. -As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanism for setting root-level hooks. +As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanism for setting root hooks. ### Delayed Root Suite @@ -402,10 +402,10 @@ As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanis If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: ```js -setTimeout(function() { +setTimeout(function () { // do some setup - describe('my suite', function() { + describe('my suite', function () { // ... }); @@ -418,8 +418,8 @@ setTimeout(function() { "Pending"--as in "someone should write these test cases eventually"--test-cases are those _without_ a callback: ```js -describe('Array', function() { - describe('#indexOf()', function() { +describe('Array', function () { + describe('#indexOf()', function () { // pending test below it('should return -1 when the value is not present'); }); @@ -438,8 +438,8 @@ The exclusivity feature allows you to run _only_ the specified suite or test-cas by appending `.only()` to the function. Here's an example of executing only a particular suite: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { // ... }); }); @@ -450,13 +450,13 @@ _Note_: All nested suites will still be executed. Here's an example of executing an individual test case: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.only('should return -1 unless present', function () { // ... }); - it('should return the index when present', function() { + it('should return the index when present', function () { // ... }); }); @@ -466,17 +466,17 @@ describe('Array', function() { Previous to v3.0.0, `.only()` used string matching to decide which tests to execute; this is no longer the case. In v3.0.0 or newer, `.only()` can be used multiple times to define a subset of tests to run: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.only('should return -1 unless present', function () { // this test will be run }); - it.only('should return the index when present', function() { + it.only('should return the index when present', function () { // this test will also be run }); - it('should return -1 if called with a non-Array context', function() { + it('should return -1 if called with a non-Array context', function () { // this test will not be run }); }); @@ -486,25 +486,25 @@ describe('Array', function() { You may also choose multiple suites: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { - it('should return -1 unless present', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { + it('should return -1 unless present', function () { // this test will be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will also be run }); }); - describe.only('#concat()', function() { - it('should return a new Array', function() { + describe.only('#concat()', function () { + it('should return a new Array', function () { // this test will also be run }); }); - describe('#slice()', function() { - it('should return a new Array', function() { + describe('#slice()', function () { + it('should return a new Array', function () { // this test will not be run }); }); @@ -514,13 +514,13 @@ describe('Array', function() { But _tests will have precedence_: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { + it.only('should return -1 unless present', function () { // this test will be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will not be run }); }); @@ -536,13 +536,13 @@ _Note_: Hooks, if present, will still be executed. This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.skip('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.skip('should return -1 unless present', function () { // this test will not be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will be run }); }); @@ -552,9 +552,9 @@ describe('Array', function() { You can also put `.skip()` on an entire suite. This is equivalent to appending `.skip()` onto all tests in the suite. Hooks in the suite are also skipped. ```js -describe('Array', function() { - describe.skip('#indexOf()', function() { - it('should return -1 unless present', function() { +describe('Array', function () { + describe.skip('#indexOf()', function () { + it('should return -1 unless present', function () { // this test will not be run }); }); @@ -612,21 +612,21 @@ before(function() { This will skip all `it`, `beforeEach/afterEach`, and `describe` blocks within the suite. `before/after` hooks are skipped unless they are defined at the same level as the hook containing `this.skip()`. ```js -describe('outer', function() { - before(function() { +describe('outer', function () { + before(function () { this.skip(); }); - after(function() { + after(function () { // will be executed }); - describe('inner', function() { - before(function() { + describe('inner', function () { + before(function () { // will be skipped }); - after(function() { + after(function () { // will be skipped }); }); @@ -646,15 +646,15 @@ This feature does re-run a failed test and its corresponding `beforeEach/afterEa **NOTE**: Example below was written using Selenium webdriver (which [overwrites global Mocha hooks][selenium-webdriver-testing] for `Promise` chain). ```js -describe('retries', function() { +describe('retries', function () { // Retry all tests in this suite up to 4 times this.retries(4); - beforeEach(function() { + beforeEach(function () { browser.get('http://www.yahoo.com'); }); - it('should succeed on the 3rd try', function() { + it('should succeed on the 3rd try', function () { // Specify this test to only retry up to 2 times this.retries(2); expect($('.foo').isDisplayed()).to.eventually.be.true; @@ -672,20 +672,20 @@ Take the following example: var assert = require('chai').assert; function add() { - return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { + return Array.prototype.slice.call(arguments).reduce(function (prev, curr) { return prev + curr; }, 0); } -describe('add()', function() { +describe('add()', function () { var tests = [ {args: [1, 2], expected: 3}, {args: [1, 2, 3], expected: 6}, - {args: [1, 2, 3, 4], expected: 10} + {args: [1, 2, 3, 4], expected: 10}, ]; - tests.forEach(function(test) { - it('correctly adds ' + test.args.length + ' args', function() { + tests.forEach(function (test) { + it('correctly adds ' + test.args.length + ' args', function () { var res = add.apply(null, test.args); assert.equal(res, test.expected); }); @@ -721,10 +721,10 @@ There are three levels of test duration (depicted in the following image): To tweak what's considered "slow", you can use the `slow()` method: ```js -describe('something slow', function() { +describe('something slow', function () { this.slow(300000); // five minutes - it('should take long enough for me to go make a sandwich', function() { + it('should take long enough for me to go make a sandwich', function () { // ... }); }); @@ -737,14 +737,14 @@ describe('something slow', function() { Suite-level timeouts may be applied to entire test "suites", or disabled via `this.timeout(0)`. This will be inherited by all nested suites and test-cases that do not override the value. ```js -describe('a suite of tests', function() { +describe('a suite of tests', function () { this.timeout(500); - it('should take less than 500ms', function(done) { + it('should take less than 500ms', function (done) { setTimeout(done, 300); }); - it('should take less than 500ms as well', function(done) { + it('should take less than 500ms as well', function (done) { setTimeout(done, 250); }); }); @@ -755,7 +755,7 @@ describe('a suite of tests', function() { Test-specific timeouts may also be applied, or the use of `this.timeout(0)` to disable timeouts all together: ```js -it('should take less than 500ms', function(done) { +it('should take less than 500ms', function (done) { this.timeout(500); setTimeout(done, 300); }); @@ -766,8 +766,8 @@ it('should take less than 500ms', function(done) { Hook-level timeouts may also be applied: ```js -describe('a suite of tests', function() { - beforeEach(function(done) { +describe('a suite of tests', function () { + beforeEach(function (done) { this.timeout(3000); // A very long environment setup. setTimeout(done, 2500); }); @@ -1065,17 +1065,17 @@ Cause Mocha to only run tests matching the given `regexp`, which is internally c Suppose, for example, you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. ```js -describe('api', function() { - describe('GET /api/users', function() { - it('respond with an array of users', function() { +describe('api', function () { + describe('GET /api/users', function () { + it('respond with an array of users', function () { // ... }); }); }); -describe('app', function() { - describe('GET /users', function() { - it('respond with an array of users', function() { +describe('app', function () { + describe('GET /users', function () { + it('respond with an array of users', function () { // ... }); }); @@ -1215,12 +1215,12 @@ A _root hook_ is a hook in a test file which is _not defined_ within a suite. An // test/setup.js // root hook to run before every test (even in other files) -beforeEach(function() { +beforeEach(function () { doMySetup(); }); // root hook to run after every test (even in other files) -afterEach(function() { +afterEach(function () { doMyTeardown(); }); ``` @@ -1246,15 +1246,19 @@ Here are a couple suggested workarounds: Parallel mode is only available in Node.js, for now. -### Migration Checklist +### Limited Reporter API for Third-Party Reporters + +Third-party reporters may encounter issues when attempting to access non-existent properties within `Test`, `Suite`, and `Hook` objects. If a third-party reporter does not work in parallel mode (but otherwise works in serial mode), please [file an issue](https://github.com/mochajs/mocha/issues/new). + +### Troubleshooting Parallel Mode If you find your tests don't work properly when run with [`--parallel`](#-parallel-p), either shrug and move on, or use this handy-dandy checklist to get things working: - :white_check_mark: Ensure you are using a [supported reporter](#reporter-limitations). - :white_check_mark: Ensure you are not using [other unsupported flags](#file-order-is-non-deterministic). - :white_check_mark: Double-check your [config file](#configuring-mocha-nodejs); options set in config files will be merged with any command-line option. -- :white_check_mark: Look for root-level hooks (they look like [this](#root-hooks-are-not-global)) in your tests. Move them into a [root-level hook plugin](#root-hook-plugins). -- :white_check_mark: Do any assertion, mock, or other test libraries you're consuming use root-level hooks? They may need to be [migrated](#migrating-a-library-to-use-root-hook-plugins) for compatibility with parallel mode. +- :white_check_mark: Look for root hooks (they look like [this](#root-hooks-are-not-global)) in your tests. Move them into a [Root Hook Plugin](#root-hook-plugins). +- :white_check_mark: Do any assertion, mock, or other test libraries you're consuming use root hooks? They may need to be [migrated](#migrating-a-library-to-use-root-hook-plugins) for compatibility with parallel mode. - :white_check_mark: If tests are unexpectedly timing out, you may need to increase the default test timeout (via [`--timeout`](#-timeout-ms-t-ms)) - :white_check_mark: Ensure your tests do not depend on being run in a specific order. - :white_check_mark: Ensure your tests clean up after themselves; remove temp files, handles, sockets, etc. Don't try to share state or resources between test files. @@ -1290,7 +1294,7 @@ exports.mochaHooks = { beforeEach(done) { // do something before every test done(); - } + }, }; ``` @@ -1307,7 +1311,7 @@ export const mochaHooks = { beforeEach(done) { // do something before every test done(); - } + }, }; ``` @@ -1343,7 +1347,7 @@ export const mochaHooks = { if (require('os').userInfo().username === 'bob') { return this.skip(); } - } + }, }; ``` @@ -1356,14 +1360,14 @@ Multiple root hooks can be defined in a single plugin, for organizational purpos export const mochaHooks = { beforeEach: [ - function(done) { + function (done) { // do something before every test, // then run the next hook in this array }, - async function() { + async function () { // async or Promise-returning functions allowed - } - ] + }, + ], }; ``` @@ -1379,20 +1383,20 @@ export const mochaHooks = () => { // root hooks object return { beforeEach: [ - function() { + function () { // CI-specific beforeEach }, - function() { + function () { // some other CI-specific beforeEach - } - ] + }, + ], }; } // root hooks object return { beforeEach() { // regular beforeEach - } + }, }; }; ``` @@ -1410,7 +1414,7 @@ export const mochaHooks = async () => { return { beforeEach() { // something - } + }, }; } }; @@ -1435,16 +1439,16 @@ For example, given the following file, `test/test.spec.js`, containing root hook ```js // test/test.spec.js -beforeEach(function() { +beforeEach(function () { // global setup for all tests }); -after(function() { +after(function () { // one-time final cleanup }); -describe('my test suite', function() { - it('should have run my global setup', function() { +describe('my test suite', function () { + it('should have run my global setup', function () { // make assertion }); }); @@ -1472,8 +1476,8 @@ Your original `test/test.spec.js` should now contain: ```js // test/test.spec.js -describe('my test suite', function() { - it('should have run my global setup', function() { +describe('my test suite', function () { + it('should have run my global setup', function () { // make assertion }); }); @@ -1502,24 +1506,24 @@ The **BDD** interface provides `describe()`, `context()`, `it()`, `specify()`, ` > All of the previous examples were written using the **BDD** interface. ```js -describe('Array', function() { - before(function() { +describe('Array', function () { + before(function () { // ... }); - describe('#indexOf()', function() { - context('when not present', function() { - it('should not throw an error', function() { - (function() { + describe('#indexOf()', function () { + context('when not present', function () { + it('should not throw an error', function () { + (function () { [1, 2, 3].indexOf(4); }.should.not.throw()); }); - it('should return -1', function() { + it('should return -1', function () { [1, 2, 3].indexOf(4).should.equal(-1); }); }); - context('when present', function() { - it('should return the index where the element first appears in the array', function() { + context('when present', function () { + it('should return the index where the element first appears in the array', function () { [1, 2, 3].indexOf(3).should.equal(2); }); }); @@ -1532,13 +1536,13 @@ describe('Array', function() { The **TDD** interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`: ```js -suite('Array', function() { - setup(function() { +suite('Array', function () { + setup(function () { // ... }); - suite('#indexOf()', function() { - test('should return -1 when not present', function() { + suite('#indexOf()', function () { + test('should return -1 when not present', function () { assert.equal(-1, [1, 2, 3].indexOf(4)); }); }); @@ -1551,17 +1555,17 @@ The **Exports** interface is much like Mocha's predecessor [expresso][]. The key ```js module.exports = { - before: function() { + before: function () { // ... }, Array: { '#indexOf()': { - 'should return -1 when not present': function() { + 'should return -1 when not present': function () { [1, 2, 3].indexOf(4).should.equal(-1); - } - } - } + }, + }, + }, }; ``` @@ -1576,12 +1580,12 @@ function ok(expr, msg) { suite('Array'); -test('#length', function() { +test('#length', function () { var arr = [1, 2, 3]; ok(arr.length == 3); }); -test('#indexOf()', function() { +test('#indexOf()', function () { var arr = [1, 2, 3]; ok(arr.indexOf(1) == 0); ok(arr.indexOf(2) == 1); @@ -1590,7 +1594,7 @@ test('#indexOf()', function() { suite('String'); -test('#length', function() { +test('#length', function () { ok('foo'.length == 3); }); ``` @@ -1607,13 +1611,13 @@ var pre = require('mocha').before; var assertions = require('mocha').it; var assert = require('chai').assert; -testCase('Array', function() { - pre(function() { +testCase('Array', function () { + pre(function () { // ... }); - testCase('#indexOf()', function() { - assertions('should return -1 when not present', function() { + testCase('#indexOf()', function () { + assertions('should return -1 when not present', function () { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -1717,9 +1721,9 @@ The Doc reporter outputs a hierarchical HTML body representation of your tests. For example, suppose you have the following JavaScript: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -1875,7 +1879,7 @@ mocha.setup('tdd'); // This is equivalent to the above. mocha.setup({ - ui: 'tdd' + ui: 'tdd', }); // Examples of options: @@ -1890,7 +1894,7 @@ mocha.setup({ retries: 3, slow: '100', timeout: '2000', - ui: 'bdd' + ui: 'bdd', }); ``` From 26c6cae67045f090dab68c3bbe97b7ffc5e1b6b2 Mon Sep 17 00:00:00 2001 From: juergba Date: Sat, 6 Jun 2020 08:56:20 +0200 Subject: [PATCH 1507/1771] options 'spec' and 'ignore': no splitting by comma --- lib/cli/options.js | 9 ++++--- test/node-unit/cli/options.spec.js | 39 +++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/lib/cli/options.js b/lib/cli/options.js index 554a294b90..c51865916d 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -54,16 +54,19 @@ const configuration = Object.assign({}, YARGS_PARSER_CONFIG, { /** * This is a really fancy way to: - * - ensure unique values for `array`-type options - * - use its array's last element for `boolean`/`number`/`string`- options given multiple times + * - `array`-type options: ensure unique values and evtl. split comma-delimited lists + * - `boolean`/`number`/`string`- options: use last element when given multiple times * This is passed as the `coerce` option to `yargs-parser` * @private * @ignore */ +const globOptions = ['spec', 'ignore']; const coerceOpts = Object.assign( types.array.reduce( (acc, arg) => - Object.assign(acc, {[arg]: v => Array.from(new Set(list(v)))}), + Object.assign(acc, { + [arg]: v => Array.from(new Set(globOptions.includes(arg) ? v : list(v))) + }), {} ), types.boolean diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 085ba5fc71..9c112d7df7 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -562,7 +562,9 @@ describe('options', function() { readFileSync = sandbox.stub(); readFileSync.onFirstCall().throws(); findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({spec: '*.spec.js'}); + loadConfig = sandbox + .stub() + .returns({spec: '{dirA,dirB}/**/*.spec.js'}); findupSync = sandbox.stub(); loadOptions = proxyLoadOptions({ readFileSync, @@ -573,10 +575,41 @@ describe('options', function() { result = loadOptions(['*.test.js']); }); - it('should place both into the positional arguments array', function() { - expect(result, 'to have property', '_', ['*.test.js', '*.spec.js']); + it('should place both - unsplitted - into the positional arguments array', function() { + expect(result, 'to have property', '_', [ + '*.test.js', + '{dirA,dirB}/**/*.spec.js' + ]); }); }); }); + + describe('"ignore" handling', function() { + let result; + + beforeEach(function() { + readFileSync = sandbox.stub(); + readFileSync.onFirstCall().throws(); + findConfig = sandbox.stub().returns('/some/.mocharc.json'); + loadConfig = sandbox + .stub() + .returns({ignore: '{dirA,dirB}/**/*.spec.js'}); + findupSync = sandbox.stub(); + loadOptions = proxyLoadOptions({ + readFileSync, + findConfig, + loadConfig, + findupSync + }); + result = loadOptions(['--ignore', '*.test.js']); + }); + + it('should not split option values by comma', function() { + expect(result, 'to have property', 'ignore', [ + '*.test.js', + '{dirA,dirB}/**/*.spec.js' + ]); + }); + }); }); }); From 57fbbeed30e3300c52728744e246ece9f9920253 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 11:12:50 -0700 Subject: [PATCH 1508/1771] update changelog for v8.0.0 Signed-off-by: Christopher Hiller --- CHANGELOG.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44c1a3e278..09f41619db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,55 @@ +# 8.0.0 / 2020-06-10 + +In this major release, Mocha adds the ability to _run tests in parallel_. Better late than never! Please note the **breaking changes** detailed below. + +Let's welcome [**@giltayar**](https://github.com/giltayar) and [**@nicojs**](https://github.com/nicojs) to the maintenance team! + +## :boom: Breaking Changes + +- [#4164](https://github.com/mochajs/mocha/issues/4164): **Mocha v8.0.0 now requires Node.js v10.0.0 or newer.** Mocha no longer supports the Node.js v8.x line ("Carbon"), which entered End-of-Life at the end of 2019 ([**@UlisesGascon**](https://github.com/UlisesGascon)) + +- [#4175](https://github.com/mochajs/mocha/issues/4175): Having been deprecated with a warning since v7.0.0, **`mocha.opts` is no longer supported** ([**@juergba**](https://github.com/juergba)) + + :sparkles: **WORKAROUND:** Replace `mocha.opts` with a [configuration file](https://mochajs.org/#configuring-mocha-nodejs). + +- [#4260](https://github.com/mochajs/mocha/issues/4260): Remove `enableTimeout()` (`this.enableTimeout()`) from the context object ([**@craigtaub**](https://github.com/craigtaub)) + + :sparkles: **WORKAROUND:** Replace usage of `this.enableTimeout(false)` in your tests with `this.timeout(0)`. + +- [#4315](https://github.com/mochajs/mocha/issues/4315): The `spec` option no longer supports a comma-delimited list of files ([**@juergba**](https://github.com/juergba)) + + :sparkles: **WORKAROUND**: Use an array instead (e.g., `"spec": "foo.js,bar.js"` becomes `"spec": ["foo.js", "bar.js"]`). + +- [#4309](https://github.com/mochajs/mocha/issues/4309): Drop support for Node.js v13.x line, which is now End-of-Life ([**@juergba**](https://github.com/juergba)) + +- [#4282](https://github.com/mochajs/mocha/issues/4282): `--forbid-only` will throw an error even if exclusive tests are avoided via `--grep` or other means ([**@arvidOtt**](https://github.com/arvidOtt)) + +- [#4223](https://github.com/mochajs/mocha/issues/4223): The context object's `skip()` (`this.skip()`) in a "before all" (`before()`) hook will no longer execute subsequent sibling hooks, in addition to hooks in child suites ([**@juergba**](https://github.com/juergba)) + +- [#4178](https://github.com/mochajs/mocha/issues/4178): Remove previously soft-deprecated APIs ([**@wnghdcjfe**](https://github.com/wnghdcjfe)): + - `Mocha.prototype.ignoreLeaks()` + - `Mocha.prototype.useColors()` + - `Mocha.prototype.useInlineDiffs()` + - `Mocha.prototype.hideDiff()` + +## :tada: Enhancements + +- [#4245](https://github.com/mochajs/mocha/issues/4245): Add ability to run tests in parallel for Node.js (see [docs](https://mochajs.org/#parallel-tests)) ([**@boneskull**](https://github.com/boneskull)) + + :exclamation: See also [#4244](https://github.com/mochajs/mocha/issues/4244); [Root Hook Plugins (docs)](https://mochajs.org/#root-hook-plugins) -- _root hooks must be defined via Root Hook Plugins to work in parallel mode_ + +- [#4304](https://github.com/mochajs/mocha/issues/4304): `--require` now works with ES modules ([**@JacobLey**](https://github.com/JacobLey)) + +- [#4299](https://github.com/mochajs/mocha/issues/4299): In some circumstances, Mocha can run ES modules under Node.js v10 -- _use at your own risk!_ ([**@giltayar**](https://github.com/giltayar)) + +## :book: Documentation + +- [#4246](https://github.com/mochajs/mocha/issues/4246): Add documentation for parallel mode and Root Hook plugins ([**@boneskull**](https://github.com/boneskull)) + +## :bug: Fixes + +(All bug fixes in Mocha v8.0.0 are also breaking changes, and are listed above) + # 7.2.0 / 2020-05-22 ## :tada: Enhancements From 612fa31228c695f16173ac675f40ccdf26b4cfb5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 11:48:18 -0700 Subject: [PATCH 1509/1771] Release v8.0.0 --- AUTHORS | 4 ++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 88abaa8b33..17a05b7217 100644 --- a/AUTHORS +++ b/AUTHORS @@ -488,8 +488,12 @@ Zirak Christian Holm Kai Cataldo Gil Tayar +Ulises Gascón +kundol Arvid Ottenberg Daniel0113 Nico Jansen +JacobLey <37151850+JacobLey@users.noreply.github.com> +Gil Tayar # Generated by scripts/update-authors.js diff --git a/package-lock.json b/package-lock.json index 6902e1240a..09721ddbbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.2.0", + "version": "8.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5234befd34..bfd0cfd392 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "7.2.0", + "version": "8.0.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From fc618a1d51cfa6d38ad31662d4ad90ba0c65cfcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Wed, 10 Jun 2020 21:03:39 +0200 Subject: [PATCH 1510/1771] Switch opencollective images to self-hosted spritesheet (#4318) * Generate sprite sheets from opencollective avatars to serve them quicker * Update assetgraph-builder to 8.0.1 * Filter out anonymous donors * Remove sprite padding * Move all supporter names to a title attribute that always exists * Root relative CSS hrefs * Update package-lock.json * Get rid of avatars.js since the sprites don't work that way * Always https protocol on opencollective badges * Add local netlify folder to gitignore * Avoid supporter spritesheet ending up as external stylesheet in body. Caused render flush that resulted in confusing layout shift on reload * Add missing newline in .gitignore --- .gitignore | 4 + docs/_data/supporters.js | 36 +++- docs/_includes/default.liquid | 7 +- docs/_includes/supporters.md | 10 +- docs/css/supporters.css | 13 ++ docs/index.md | 4 +- docs/js/avatars.js | 30 ---- package-lock.json | 326 ++++++++++++++++++++++------------ package.json | 2 +- 9 files changed, 273 insertions(+), 159 deletions(-) create mode 100644 docs/css/supporters.css delete mode 100644 docs/js/avatars.js diff --git a/.gitignore b/.gitignore index 02634697bf..41f8d36d3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Mocha-specific docs/_site docs/_dist +docs/images/supporters mocha.js .karma/ !lib/mocha.js @@ -141,3 +142,6 @@ Temporary Items # SauceConnect *.sock + +# Local Netlify folder +.netlify diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js index 6ae78a33d7..15ff9c0a36 100644 --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -1,6 +1,9 @@ #!/usr/bin/env node 'use strict'; +const {mkdirSync} = require('fs'); +const {writeFile} = require('fs').promises; +const {resolve} = require('path'); const debug = require('debug')('mocha:docs:data:supporters'); const needle = require('needle'); const imageSize = require('image-size'); @@ -16,6 +19,7 @@ const query = `query account($limit: Int, $offset: Int, $slug: String) { totalCount nodes { fromAccount { + id name slug website @@ -35,6 +39,7 @@ const query = `query account($limit: Int, $offset: Int, $slug: String) { const graphqlPageSize = 1000; const nodeToSupporter = node => ({ + id: node.fromAccount.id, name: node.fromAccount.name, slug: node.fromAccount.slug, website: node.fromAccount.website, @@ -101,10 +106,12 @@ module.exports = async () => { .reduce( (supporters, supporter) => { if (supporter.type === 'INDIVIDUAL') { - supporters.backers.push({ - ...supporter, - avatar: supporter.imgUrlSmall - }); + if (supporter.name !== 'anonymous') { + supporters.backers.push({ + ...supporter, + avatar: supporter.imgUrlSmall + }); + } } else { supporters.sponsors.push({...supporter, avatar: supporter.imgUrlMed}); } @@ -113,13 +120,26 @@ module.exports = async () => { {sponsors: [], backers: []} ); + const supporterImagePath = resolve(__dirname, '../images/supporters'); + + mkdirSync(supporterImagePath, {recursive: true}); + // Fetch images for sponsors and save their image dimensions await Promise.all( supporters.sponsors.map(async sponsor => { - for await (const chunk of needle.get(sponsor.avatar)) { - sponsor.dimensions = imageSize(chunk); - break; - } + const filePath = resolve(supporterImagePath, sponsor.id + '.png'); + const {body} = await needle('get', sponsor.avatar); + sponsor.dimensions = imageSize(body); + await writeFile(filePath, body); + }) + ); + + // Fetch images for backers and save their image dimensions + await Promise.all( + supporters.backers.map(async backer => { + const filePath = resolve(supporterImagePath, backer.id + '.png'); + const {body} = await needle('get', backer.avatar); + await writeFile(filePath, body); }) ); diff --git a/docs/_includes/default.liquid b/docs/_includes/default.liquid index 4d79612774..1b146cd001 100644 --- a/docs/_includes/default.liquid +++ b/docs/_includes/default.liquid @@ -4,9 +4,10 @@ {{ title }} - - - + + + + diff --git a/docs/_includes/supporters.md b/docs/_includes/supporters.md index 061cff0a5d..9ee2b520fe 100644 --- a/docs/_includes/supporters.md +++ b/docs/_includes/supporters.md @@ -6,9 +6,9 @@ Use Mocha at Work? Ask your manager or marketing team if they'd help [support](h {%- for supporter in supporters.sponsors -%}
            • {%- if supporter.website -%} - + {%- endif -%} - {{ supporter.name }} + {%- if supporter.website -%} {%- endif -%} @@ -24,14 +24,12 @@ Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support {%- for supporter in supporters.backers -%}
            • {%- if supporter.website -%} - + {%- endif -%} - {{ supporter.name }} +
              {%- if supporter.website -%}
              {%- endif -%}
            • {%- endfor -%} - - diff --git a/docs/css/supporters.css b/docs/css/supporters.css new file mode 100644 index 0000000000..2d69cbcc6d --- /dev/null +++ b/docs/css/supporters.css @@ -0,0 +1,13 @@ +.sponsor { + -sprite-selector-for-group: sponsors; + -sprite-location: url(/images/sprite-sponsors.png?pngquant); + -sprite-image-format: png; + height: 64px; +} +.backer { + -sprite-selector-for-group: backers; + -sprite-location: url(/images/sprite-backers.png?pngquant); + -sprite-image-format: png; + width: 32px; + height: 32px; +} diff --git a/docs/index.md b/docs/index.md index 5d4cbdc87d..9ae1048b9d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,8 +8,8 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in {% include supporters.md %} diff --git a/docs/js/avatars.js b/docs/js/avatars.js deleted file mode 100644 index a03b2858a7..0000000000 --- a/docs/js/avatars.js +++ /dev/null @@ -1,30 +0,0 @@ -(function() { - 'use strict'; - - var imageLists = document.querySelectorAll('.image-list'); - - function getListItem(img) { - var parent = img.parentNode; - while (parent && parent.nodeName !== 'LI') { - parent = parent.parentNode; - } - - return parent; - } - - function onloadHandler() { - getListItem(this).classList.add('is-loaded'); - } - - Array.prototype.forEach.call(imageLists, function(imageList) { - var images = imageList.querySelectorAll('img'); - - for (var i = 0; i < images.length; i += 1) { - if (!images[i].complete) { - getListItem(images[i]).classList.add('faded-image'); - images[i].onload = onloadHandler; - images[i].onerror = onloadHandler; - } - } - }); -})(); diff --git a/package-lock.json b/package-lock.json index 09721ddbbc..294b7aaa7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -975,15 +975,6 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "animated-gif-detector": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/animated-gif-detector/-/animated-gif-detector-1.2.0.tgz", - "integrity": "sha1-yy+ZEcqAJPKzTGk7f9ZFQu5BYYk=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", @@ -1074,9 +1065,9 @@ "dev": true }, "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", "dev": true }, "archive-type": { @@ -1446,51 +1437,139 @@ } }, "assetgraph-builder": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-8.0.0.tgz", - "integrity": "sha512-hOSgIhWtWLOVeKTWkvjpF1IUBKBnAz6bECX/8K1yEA+NvTkZFdlgf07z5SHpdCzCy4f7U7coDJiXu8TrFBdevA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-8.0.1.tgz", + "integrity": "sha512-4ssOaw3brKEBVsA3ORoRT4rwGYxGxwPkhUW7j6Gst6EgdS6QnRNtW9tIq5CSjdyJCxfkrwloRJXd2scA5yq5Wg==", "dev": true, "requires": { - "assetgraph": "6.0.5", - "assetgraph-sprite": "^3.0.1", + "assetgraph": "6.0.7", + "assetgraph-sprite": "^3.2.0", "browserslist": "^4.4.2", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "esanimate": "^1.1.0", - "estraverse": "^4.2.0", - "express-processimage": "^9.0.2", + "estraverse": "^5.0.0", "extend": "^3.0.0", - "histogram": "^3.0.1", - "impro": "~0.6.1", + "gm-papandreou": "^1.23.0-patch1", + "impro": "~0.7.0", + "inkscape": "^2.0.0", "jpegtran": "^1.0.6", "lodash": "^4.14.1", "memoizesync": "^1.1.1", "optimist": "^0.6.1", "optipng": "^2.0.0", - "p-map": "^3.0.0", + "p-map": "^4.0.0", "passerror": "^1.1.1", "pngcrush": "^2.0.1", "pngquant": "^3.0.0", + "sharp": "^0.23.4", "urltools": "^0.4.1" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + }, + "assetgraph": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.7.tgz", + "integrity": "sha512-6e8xWY0LuTt128CBo9G7H8l/XUJ0cBMldIdqj9zGTDfg9pkw2bP4aBElss8W0Ftn8jwJ3atb0Mbe9WJsD7ypYA==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.1", + "bluebird": "^3.5.1", + "chalk": "^2.0.1", + "common-path-prefix": "^1.0.0", + "createerror": "^1.3.0", + "cssnano": "^4.1.10", + "data-urls": "^1.0.0", + "domspace": "^1.2.1", + "esanimate": "^1.1.0", + "escodegen": "^1.12.0", + "espurify": "^2.0.1", + "estraverse": "^4.3.0", + "estraverse-fb": "^1.3.2", + "gettemporaryfilepath": "^1.0.0", + "glob": "^7.0.5", + "html-minifier": "^4.0.0", + "imageinfo": "^1.0.4", + "jsdom": "^15.0.0", + "lines-and-columns": "^1.1.6", + "lodash": "4.17.15", + "memoizesync": "1.1.1", + "mkdirp": "^0.5.1", + "normalizeurl": "^1.0.0", + "perfectionist": "^2.4.0", + "postcss": "^7.0.14", + "read-pkg-up": "^6.0.0", + "repeat-string": "^1.5.4", + "schemes": "^1.0.1", + "semver": "^6.0.0", + "sift": "^7.0.1", + "source-map": "~0.6.1", + "specificity": "^0.4.0", + "sw-precache": "^5.2.0", + "teepee": "^2.31.1", + "terser": "^4.0.0", + "urltools": "^0.4.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "color-convert": { @@ -1507,13 +1586,92 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", + "dev": true, + "requires": { + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "assetgraph-sprite": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-3.1.0.tgz", - "integrity": "sha512-heagKqj1ii247Wpg86U2+2rohzzq5lmqDSHCSVkCDvs2qyB51Grzd7A3owlVaeHcuNNM5BG5OJdAMLcq9gVSMQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-3.2.0.tgz", + "integrity": "sha512-qp2DBV+Tn27jU6AtPx3zUZGheRbT9Jv6L0FFB6n7EB8mwgxTGul10HacyyzMJ3c7imOAPINgsPHSMJp/zBxw5A==", "dev": true, "requires": { "canvas": "^2.3.1" @@ -3443,9 +3601,9 @@ "dev": true }, "buffer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", - "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -6653,41 +6811,6 @@ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true }, - "express-processimage": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-9.0.2.tgz", - "integrity": "sha512-PODsr6rL5JCB5uppytmwHDerK3QW41qMPk1DmlZOkKRYB7wgrXX3FwA2UqG13ENzGHGY1fApXtw5VZA7HA2Few==", - "dev": true, - "requires": { - "accepts": "^1.3.3", - "animated-gif-detector": "^1.2.0", - "bluebird": "^3.3.4", - "createerror": "^1.1.0", - "exif-reader": "^1.0.2", - "gm-papandreou": "^1.23.0-patch1", - "hijackresponse": "^4.0.0", - "httperrors": "^2.0.1", - "icc": "^1.0.0", - "impro": "~0.6.0", - "inkscape": "^2.0.0", - "jpegtran": "^1.0.6", - "mime": "^2.3.1", - "optimist": "^0.6.1", - "optipng": "^2.0.0", - "passerror": "^1.1.1", - "pngcrush": "^2.0.1", - "pngquant": "^3.0.0", - "sharp": "^0.23.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -8019,21 +8142,6 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, - "hijackresponse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hijackresponse/-/hijackresponse-4.0.0.tgz", - "integrity": "sha512-ilL2k2/k9NXk4QCx7dz7pV+ZRL8aOX9ZiaVD+5nql1fF5WdKNhXbPh4shyfICpgHoHiD4FKZ1jLgNKYDYhy0Yw==", - "dev": true - }, - "histogram": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/histogram/-/histogram-3.0.3.tgz", - "integrity": "sha512-KXpWZm99kwSoY5ocS4tx5FVLsbOJFZIiyr1rXruNERxeznCwZY1JC7fPRKEyZ+HSwMaqwThMWYp2iM2WoEfsDw==", - "dev": true, - "requires": { - "canvas": "^2.3.1" - } - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -8426,9 +8534,9 @@ "dev": true }, "impro": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/impro/-/impro-0.6.1.tgz", - "integrity": "sha512-465dG4MvakvKzPoGyPZvThTOXsHZwETURJM4RrZu4p/trcKETFn+7Smna8MoJ6E1eRdBjmmIFVcJXs0maC+d8A==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/impro/-/impro-0.7.1.tgz", + "integrity": "sha512-1I6XpbGpp48KALFONBsIBrBcP/Oh4uHnyXlacm3otVEvR/ZRnRVyK/GKkniicQI8WAAabO/3MCglwIcoURkEVg==", "dev": true, "requires": { "combine-stream": "0.0.4", @@ -11647,9 +11755,9 @@ } }, "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", + "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", "dev": true, "requires": { "semver": "^5.4.1" @@ -14005,15 +14113,15 @@ "dev": true }, "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.4.tgz", + "integrity": "sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA==", "dev": true, "requires": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", - "minimist": "^1.2.0", + "minimist": "^1.2.3", "mkdirp": "^0.5.1", "napi-build-utils": "^1.0.1", "node-abi": "^2.7.0", @@ -15592,9 +15700,9 @@ } }, "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -16897,9 +17005,9 @@ } }, "tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", "dev": true, "requires": { "chownr": "^1.1.1", @@ -17488,9 +17596,9 @@ "dev": true }, "unbzip2-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.0.tgz", - "integrity": "sha512-kVx7CDAsdBSWVf404Mw7oI9i09w5/mTT/Ruk+RWa64PLYKvsAucLLFHvQtnvjeADM4ZizxrvG5SHnF4Te4T2Cg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "requires": { "buffer": "^5.2.1", diff --git a/package.json b/package.json index bfd0cfd392..d7cc304033 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@11ty/eleventy": "^0.10.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", "@mocha/docdash": "^2.1.3", - "assetgraph-builder": "^8.0.0", + "assetgraph-builder": "^8.0.1", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", "browserify": "^16.5.0", From e0e6568af45c326c9243612e0d28e3cb2b89c4b3 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 12:32:26 -0700 Subject: [PATCH 1511/1771] update release process in MAINTAINERS.md We want to fast-forward the `mochajs.org` branch _before_ running `npm publish` or people might look at out-of-date docs Signed-off-by: Christopher Hiller --- MAINTAINERS.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index f155418edd..b1f8058d01 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -347,16 +347,14 @@ _It's easier to release often._ 1. Push `master` to `origin` with your new tag; e.g. `git push origin master --tags` 1. Copy & paste the `CHANGELOG.md` lines to a new GitHub "release". Save release as draft. 1. Meanwhile, you can check [the build](https://travis-ci.org/mochajs/mocha) on Travis-CI and [AppVeyor](https://ci.appveyor.com/project/boneskull/mocha). -1. Once the build is green, and you're satisfied with the release notes, open your draft release on GitHub, then click "publish." + 1. Once the build is green, you'll want to trigger an update of `mochajs.org`: + 1. _If you're doing a prerelease_, fast-forward the `next` branch to `master`, and push it. This updates [https://next.mochajs.org](https://next.mochajs.org). That's all. + 1. _If this is NOT a prerelease_, fast-forward the `mochajs.org` branch to `master` and push it. This updates [https://mochajs.org](https://mochajs.org). + 1. _If this is a "final" release_ (the first release of a major _after_ one or more prereleases) then remove the `next` tag from npm via `npm dist-tag rm next`. +1. Finally, you're satisfied with the release notes, open your draft release on GitHub, then click "publish." 1. Back in your working copy, run `npm publish`. _If you're doing a prerelease, ensure that you use `--tag=next`._ 1. Announce the update on Twitter or just tell your dog or something. New releases will be automatically tweeted by [@b0neskull](https://twitter.com/b0neskull) via a feed subscription to Mocha's "releases" page on GitHub. -In addition to above, you'll need to ensure the docs at [https://mochajs.org](https://mochajs.org) are updated: - -1. _If you're doing a prerelease_, fast-forward the `next` branch to `master`, and push it. This updates [https://next.mochajs.org](https://next.mochajs.org). That's all. -1. _If this is NOT a prerelease_, fast-forward the `mochajs.org` branch to `master` and push it. This updates [https://mochajs.org](https://mochajs.org). -1. _If this is a "final" release_ (the first release of a major _after_ one or more prereleases) then remove the `next` tag from npm via `npm dist-tag rm next`. - _Note: there are too many steps above._ ## About The JS Foundation From 66ce143efab9b3dafabbbd223114422a3e38ae7d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 14:20:20 -0700 Subject: [PATCH 1512/1771] fix --parallel --watch; closes #4327 --- lib/cli/watch-run.js | 28 +++++++++++++++++++++++--- test/integration/options/watch.spec.js | 13 ++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index 2c59490a81..a3135c791a 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -36,11 +36,33 @@ exports.watchParallelRun = ( watchFiles, watchIgnore, beforeRun({mocha}) { - mocha.files = collectFiles(fileCollectParams); + // I don't know why we're cloning the root suite. + const rootSuite = mocha.suite.clone(); + + // this `require` is needed because the require cache has been cleared. the dynamic + // exports set via the below call to `mocha.ui()` won't work properly if a + // test depends on this module (see `required-tokens.spec.js`). + const Mocha = require('../mocha'); + + // ... and now that we've gotten a new module, we need to use it again due + // to `mocha.ui()` call + const newMocha = new Mocha(mocha.options); + // don't know why this is needed + newMocha.suite = rootSuite; + // nor this + newMocha.suite.ctx = new Context(); + + // reset the list of files + newMocha.files = collectFiles(fileCollectParams); + + // because we've swapped out the root suite (see the `run` inner function + // in `createRerunner`), we need to call `mocha.ui()` again to set up the context/globals. + newMocha.ui(newMocha.options.ui); + // in parallel mode, the main Mocha process doesn't actually load the // files. this flag prevents `mocha.run()` from autoloading. - mocha.lazyLoadFiles(true); - return mocha; + newMocha.lazyLoadFiles(true); + return newMocha; }, afterRun({watcher}) { blastCache(watcher); diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 259a9416d4..55ea345ab7 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -31,6 +31,19 @@ describe('--watch', function() { }); }); + describe('when in parallel mode', function() { + it('reruns test when watched test file is touched', function() { + const testFile = path.join(tempDir, 'test.js'); + copyFixture('__default__', testFile); + + return runMochaWatch(['--parallel', testFile], tempDir, () => { + touchFile(testFile); + }).then(results => { + expect(results, 'to have length', 2); + }); + }); + }); + it('reruns test when file matching --watch-files changes', function() { const testFile = path.join(tempDir, 'test.js'); copyFixture('__default__', testFile); From ad8d83dfeb01c98e04b10743a7b5e85a763641d5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 14:34:19 -0700 Subject: [PATCH 1513/1771] update CHANGELOG for v8.0.1 [ci skip] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09f41619db..a37e7f0414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 8.0.1 / 2020-06-10 + +The obligatory patch after a major. + +## :bug: Fixes + +- [#4328]: Fix `--parallel` when combined with `--watch` (@boneskull) + # 8.0.0 / 2020-06-10 In this major release, Mocha adds the ability to _run tests in parallel_. Better late than never! Please note the **breaking changes** detailed below. From 9b203fa67c4f6a4e66f62d6962939981cb38e6f5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 14:36:06 -0700 Subject: [PATCH 1514/1771] Release v8.0.1 --- CHANGELOG.md | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a37e7f0414..e0d3866737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ The obligatory patch after a major. ## :bug: Fixes -- [#4328]: Fix `--parallel` when combined with `--watch` (@boneskull) +- [#4328]: Fix `--parallel` when combined with `--watch` ([**@boneskull**](https://github.com/boneskull)) # 8.0.0 / 2020-06-10 diff --git a/package-lock.json b/package-lock.json index 294b7aaa7d..16a988c36b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.0.0", + "version": "8.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d7cc304033..c47992da0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.0.0", + "version": "8.0.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 8f741661974526698796bfc3d5e9c94d9bbb69f5 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 10 Jun 2020 14:41:02 -0700 Subject: [PATCH 1515/1771] fix misformatted CHANGELOG [ci skip] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0d3866737..013a74e343 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ The obligatory patch after a major. ## :bug: Fixes -- [#4328]: Fix `--parallel` when combined with `--watch` ([**@boneskull**](https://github.com/boneskull)) +- [#4328](https://github.com/mochajs/mocha/issues/4328): Fix `--parallel` when combined with `--watch` ([**@boneskull**](https://github.com/boneskull)) # 8.0.0 / 2020-06-10 From f0736891eb6c903f141c6df779c6481a5edf337e Mon Sep 17 00:00:00 2001 From: Martin Oppitz Date: Fri, 12 Jun 2020 05:26:24 +0200 Subject: [PATCH 1516/1771] fix(vulnerabilty): update to serialize-javascript@3.1 --- package-lock.json | 13 +++++++------ package.json | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16a988c36b..c499a50fd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14582,7 +14582,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -15222,8 +15221,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -15518,9 +15516,12 @@ } }, "serialize-javascript": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", - "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", diff --git a/package.json b/package.json index c47992da0a..174cd13fde 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "ms": "2.1.2", "object.assign": "4.1.0", "promise.allsettled": "1.0.2", - "serialize-javascript": "3.0.0", + "serialize-javascript": "3.1.0", "strip-json-comments": "3.0.1", "supports-color": "7.1.0", "which": "2.0.2", From 9d4a8ec2d22ee154aecb1f8eeb25af8e6309faa8 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Sun, 14 Jun 2020 16:56:10 +0900 Subject: [PATCH 1517/1771] fix wrong sponsors images from OC (#4334) Signed-off-by: Outsider --- docs/_data/supporters.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js index 15ff9c0a36..589dfa73a9 100644 --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -128,7 +128,7 @@ module.exports = async () => { await Promise.all( supporters.sponsors.map(async sponsor => { const filePath = resolve(supporterImagePath, sponsor.id + '.png'); - const {body} = await needle('get', sponsor.avatar); + const {body} = await needle('get', encodeURI(sponsor.avatar)); sponsor.dimensions = imageSize(body); await writeFile(filePath, body); }) @@ -138,7 +138,7 @@ module.exports = async () => { await Promise.all( supporters.backers.map(async backer => { const filePath = resolve(supporterImagePath, backer.id + '.png'); - const {body} = await needle('get', backer.avatar); + const {body} = await needle('get', encodeURI(backer.avatar)); await writeFile(filePath, body); }) ); From 80863b14709450f8d4eb7e22722d2de79ad62688 Mon Sep 17 00:00:00 2001 From: "Benjamin E. Coe" Date: Tue, 16 Jun 2020 23:25:11 -0700 Subject: [PATCH 1518/1771] docs: document Node.js --enable-source-maps flag --- docs/index.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/index.md b/docs/index.md index 9ae1048b9d..b8396ea39e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,6 +37,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in - [config file support](#-config-path) - [node debugger support](#-inspect-inspect-brk-inspect) - [node native ES modules support](#nodejs-native-esm-support) +- [source-map support](#-enable-source-maps) - [detects multiple calls to `done()`](#detects-multiple-calls-to-done) - [use any assertion library you want](#assertions) - [extensible reporting, bundled with 9+ reporters](#reporters) @@ -1142,6 +1143,19 @@ These flags vary depending on your version of Node.js. `node` flags can be defined in Mocha's [configuration](#configuring-mocha-nodejs). +### `--enable-source-maps` + +> _New in Node.js v12.12.0_ + +If the [`--enable-source-maps`](https://nodejs.org/dist/latest-v12.x/docs/api/cli.html#cli_enable_source_maps) flag +is passed to mocha, source maps will be collected and used to provide accurate stack traces for transpiled code: + +```bash +Error: cool + at Object. (/Users/fake-user/bigco/nodejs-tasks/build/src/index.js:27:7) + -> /Users/fake-user/bigco/nodejs-tasks/src/index.ts:24:7 +``` + ### About V8 Flags Prepend `--v8-` to any flag listed in the output of `node --v8-options` (excluding `--v8-options` itself) to use it. From 0368416cde1467db5f8a9b951d7351bea2673969 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 17 Jun 2020 13:22:57 -0700 Subject: [PATCH 1519/1771] trigger netlify deploy nightly (#4321) This sets up a job to run at 00:00 UTC every day, which rebuilds the site from the `mochajs.org` branch. This keeps the list of supporters up-to-date. Signed-off-by: Christopher Hiller --- .github/workflows/nightly-site-deploy.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/nightly-site-deploy.yml diff --git a/.github/workflows/nightly-site-deploy.yml b/.github/workflows/nightly-site-deploy.yml new file mode 100644 index 0000000000..ee426ace2b --- /dev/null +++ b/.github/workflows/nightly-site-deploy.yml @@ -0,0 +1,16 @@ +# Deploy `mochajs.org` branch nightly by hitting a netlify build URL. +# This updates the list of supporters + +name: Nightly mochajs.org Deploy +on: + schedule: + - cron: '0 0 * * *' +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Webhook Action + uses: joelwmale/webhook-action@1.0.0 + env: + data: '' + WEBHOOK_URL: ${{ secrets.NETLIFY_NIGHTLY_DEPLOY_URL }} From 109820b962209a444b94e777dfdffe8b6d7db87f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 17 Jun 2020 13:39:35 -0700 Subject: [PATCH 1520/1771] temporarily disable broken OC badges --- README.md | 2 +- docs/index.md | 302 +++++++++++++++++++++++++------------------------- 2 files changed, 152 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index 68634e1f10..15834af627 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

              ☕️ Simple, flexible, fun JavaScript test framework for Node.js & The Browser ☕️

              -

              Build Status Coverage Status FOSSA Status Gitter OpenCollective OpenCollective +

              Build Status Coverage Status FOSSA Status Gitter


              Mocha Browser Support h/t SauceLabs

              diff --git a/docs/index.md b/docs/index.md index b8396ea39e..96b2ed9a31 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,8 +8,8 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in {% include supporters.md %} @@ -78,9 +78,9 @@ In your editor: ```js var assert = require('assert'); -describe('Array', function () { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -160,7 +160,7 @@ spawn child process If you use callback-based async tests, Mocha will throw an error if `done()` is called multiple times. This is handy for catching accidental double callbacks. ```javascript -it('double done', function (done) { +it('double done', function(done) { // Calling `done()` twice is an error setImmediate(done); setImmediate(done); @@ -203,11 +203,11 @@ Mocha allows you to use any assertion library you wish. In the above example, we By adding an argument (usually named `done`) to `it()` to a test callback, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). ```js -describe('User', function () { - describe('#save()', function () { - it('should save without error', function (done) { +describe('User', function() { + describe('#save()', function() { + it('should save without error', function(done) { var user = new User('Luna'); - user.save(function (err) { + user.save(function(err) { if (err) done(err); else done(); }); @@ -219,9 +219,9 @@ describe('User', function () { Alternatively, use the `done()` callback directly (which will handle an error argument, if it exists): ```js -describe('User', function () { - describe('#save()', function () { - it('should save without error', function (done) { +describe('User', function() { + describe('#save()', function() { + it('should save without error', function(done) { var user = new User('Luna'); user.save(done); }); @@ -234,14 +234,14 @@ describe('User', function () { Alternately, instead of using the `done()` callback, you may return a [Promise][mdn-promise]. This is useful if the APIs you are testing return promises instead of taking callbacks: ```js -beforeEach(function () { - return db.clear().then(function () { +beforeEach(function() { + return db.clear().then(function() { return db.save([tobi, loki, jane]); }); }); -describe('#find()', function () { - it('respond with matching records', function () { +describe('#find()', function() { + it('respond with matching records', function() { return db.find({type: 'User'}).should.eventually.have.length(3); }); }); @@ -255,8 +255,8 @@ In Mocha v3.0.0 and newer, returning a `Promise` _and_ calling `done()` will res const assert = require('assert'); // antipattern -it('should complete this test', function (done) { - return new Promise(function (resolve) { +it('should complete this test', function(done) { + return new Promise(function(resolve) { assert.ok(true); resolve(); }).then(done); @@ -270,13 +270,13 @@ The above test will fail with `Error: Resolution method is overspecified. Specif If your JS environment supports [async / await][mdn-async], you can also write asynchronous tests like this: ```js -beforeEach(async function () { +beforeEach(async function() { await db.clear(); await db.save([tobi, loki, jane]); }); -describe('#find()', function () { - it('responds with matching records', async function () { +describe('#find()', function() { + it('responds with matching records', async function() { const users = await db.find({type: 'User'}); users.should.have.length(3); }); @@ -288,9 +288,9 @@ describe('#find()', function () { When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. ```js -describe('Array', function () { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -319,20 +319,20 @@ _If you do not need to use_ Mocha's context, lambdas should work. Be aware that With its default "BDD"-style interface, Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`. These should be used to set up preconditions and clean up after your tests. ```js -describe('hooks', function () { - before(function () { +describe('hooks', function() { + before(function() { // runs once before the first test in this block }); - after(function () { + after(function() { // runs once after the last test in this block }); - beforeEach(function () { + beforeEach(function() { // runs before each test in this block }); - afterEach(function () { + afterEach(function() { // runs after each test in this block }); @@ -347,7 +347,7 @@ describe('hooks', function () { Any hook can be invoked with an optional description, making it easier to pinpoint errors in your tests. If a hook is given a named function, that name will be used if no description is supplied. ```js -beforeEach(function () { +beforeEach(function() { // beforeEach hook }); @@ -355,7 +355,7 @@ beforeEach(function namedFun() { // beforeEach:namedFun }); -beforeEach('some description', function () { +beforeEach('some description', function() { // beforeEach:some description }); ``` @@ -365,22 +365,22 @@ beforeEach('some description', function () { All hooks (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: ```js -describe('Connection', function () { +describe('Connection', function() { var db = new Connection(), tobi = new User('tobi'), loki = new User('loki'), jane = new User('jane'); - beforeEach(function (done) { - db.clear(function (err) { + beforeEach(function(done) { + db.clear(function(err) { if (err) return done(err); db.save([tobi, loki, jane], done); }); }); - describe('#find()', function () { - it('respond with matching records', function (done) { - db.find({type: 'User'}, function (err, res) { + describe('#find()', function() { + it('respond with matching records', function(done) { + db.find({type: 'User'}, function(err, res) { if (err) return done(err); res.should.have.length(3); done(); @@ -403,10 +403,10 @@ As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanis If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: ```js -setTimeout(function () { +setTimeout(function() { // do some setup - describe('my suite', function () { + describe('my suite', function() { // ... }); @@ -419,8 +419,8 @@ setTimeout(function () { "Pending"--as in "someone should write these test cases eventually"--test-cases are those _without_ a callback: ```js -describe('Array', function () { - describe('#indexOf()', function () { +describe('Array', function() { + describe('#indexOf()', function() { // pending test below it('should return -1 when the value is not present'); }); @@ -439,8 +439,8 @@ The exclusivity feature allows you to run _only_ the specified suite or test-cas by appending `.only()` to the function. Here's an example of executing only a particular suite: ```js -describe('Array', function () { - describe.only('#indexOf()', function () { +describe('Array', function() { + describe.only('#indexOf()', function() { // ... }); }); @@ -451,13 +451,13 @@ _Note_: All nested suites will still be executed. Here's an example of executing an individual test case: ```js -describe('Array', function () { - describe('#indexOf()', function () { - it.only('should return -1 unless present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it.only('should return -1 unless present', function() { // ... }); - it('should return the index when present', function () { + it('should return the index when present', function() { // ... }); }); @@ -467,17 +467,17 @@ describe('Array', function () { Previous to v3.0.0, `.only()` used string matching to decide which tests to execute; this is no longer the case. In v3.0.0 or newer, `.only()` can be used multiple times to define a subset of tests to run: ```js -describe('Array', function () { - describe('#indexOf()', function () { - it.only('should return -1 unless present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it.only('should return -1 unless present', function() { // this test will be run }); - it.only('should return the index when present', function () { + it.only('should return the index when present', function() { // this test will also be run }); - it('should return -1 if called with a non-Array context', function () { + it('should return -1 if called with a non-Array context', function() { // this test will not be run }); }); @@ -487,25 +487,25 @@ describe('Array', function () { You may also choose multiple suites: ```js -describe('Array', function () { - describe.only('#indexOf()', function () { - it('should return -1 unless present', function () { +describe('Array', function() { + describe.only('#indexOf()', function() { + it('should return -1 unless present', function() { // this test will be run }); - it('should return the index when present', function () { + it('should return the index when present', function() { // this test will also be run }); }); - describe.only('#concat()', function () { - it('should return a new Array', function () { + describe.only('#concat()', function() { + it('should return a new Array', function() { // this test will also be run }); }); - describe('#slice()', function () { - it('should return a new Array', function () { + describe('#slice()', function() { + it('should return a new Array', function() { // this test will not be run }); }); @@ -515,13 +515,13 @@ describe('Array', function () { But _tests will have precedence_: ```js -describe('Array', function () { - describe.only('#indexOf()', function () { - it.only('should return -1 unless present', function () { +describe('Array', function() { + describe.only('#indexOf()', function() { + it.only('should return -1 unless present', function() { // this test will be run }); - it('should return the index when present', function () { + it('should return the index when present', function() { // this test will not be run }); }); @@ -537,13 +537,13 @@ _Note_: Hooks, if present, will still be executed. This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: ```js -describe('Array', function () { - describe('#indexOf()', function () { - it.skip('should return -1 unless present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it.skip('should return -1 unless present', function() { // this test will not be run }); - it('should return the index when present', function () { + it('should return the index when present', function() { // this test will be run }); }); @@ -553,9 +553,9 @@ describe('Array', function () { You can also put `.skip()` on an entire suite. This is equivalent to appending `.skip()` onto all tests in the suite. Hooks in the suite are also skipped. ```js -describe('Array', function () { - describe.skip('#indexOf()', function () { - it('should return -1 unless present', function () { +describe('Array', function() { + describe.skip('#indexOf()', function() { + it('should return -1 unless present', function() { // this test will not be run }); }); @@ -613,21 +613,21 @@ before(function() { This will skip all `it`, `beforeEach/afterEach`, and `describe` blocks within the suite. `before/after` hooks are skipped unless they are defined at the same level as the hook containing `this.skip()`. ```js -describe('outer', function () { - before(function () { +describe('outer', function() { + before(function() { this.skip(); }); - after(function () { + after(function() { // will be executed }); - describe('inner', function () { - before(function () { + describe('inner', function() { + before(function() { // will be skipped }); - after(function () { + after(function() { // will be skipped }); }); @@ -647,15 +647,15 @@ This feature does re-run a failed test and its corresponding `beforeEach/afterEa **NOTE**: Example below was written using Selenium webdriver (which [overwrites global Mocha hooks][selenium-webdriver-testing] for `Promise` chain). ```js -describe('retries', function () { +describe('retries', function() { // Retry all tests in this suite up to 4 times this.retries(4); - beforeEach(function () { + beforeEach(function() { browser.get('http://www.yahoo.com'); }); - it('should succeed on the 3rd try', function () { + it('should succeed on the 3rd try', function() { // Specify this test to only retry up to 2 times this.retries(2); expect($('.foo').isDisplayed()).to.eventually.be.true; @@ -673,20 +673,20 @@ Take the following example: var assert = require('chai').assert; function add() { - return Array.prototype.slice.call(arguments).reduce(function (prev, curr) { + return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { return prev + curr; }, 0); } -describe('add()', function () { +describe('add()', function() { var tests = [ {args: [1, 2], expected: 3}, {args: [1, 2, 3], expected: 6}, - {args: [1, 2, 3, 4], expected: 10}, + {args: [1, 2, 3, 4], expected: 10} ]; - tests.forEach(function (test) { - it('correctly adds ' + test.args.length + ' args', function () { + tests.forEach(function(test) { + it('correctly adds ' + test.args.length + ' args', function() { var res = add.apply(null, test.args); assert.equal(res, test.expected); }); @@ -722,10 +722,10 @@ There are three levels of test duration (depicted in the following image): To tweak what's considered "slow", you can use the `slow()` method: ```js -describe('something slow', function () { +describe('something slow', function() { this.slow(300000); // five minutes - it('should take long enough for me to go make a sandwich', function () { + it('should take long enough for me to go make a sandwich', function() { // ... }); }); @@ -738,14 +738,14 @@ describe('something slow', function () { Suite-level timeouts may be applied to entire test "suites", or disabled via `this.timeout(0)`. This will be inherited by all nested suites and test-cases that do not override the value. ```js -describe('a suite of tests', function () { +describe('a suite of tests', function() { this.timeout(500); - it('should take less than 500ms', function (done) { + it('should take less than 500ms', function(done) { setTimeout(done, 300); }); - it('should take less than 500ms as well', function (done) { + it('should take less than 500ms as well', function(done) { setTimeout(done, 250); }); }); @@ -756,7 +756,7 @@ describe('a suite of tests', function () { Test-specific timeouts may also be applied, or the use of `this.timeout(0)` to disable timeouts all together: ```js -it('should take less than 500ms', function (done) { +it('should take less than 500ms', function(done) { this.timeout(500); setTimeout(done, 300); }); @@ -767,8 +767,8 @@ it('should take less than 500ms', function (done) { Hook-level timeouts may also be applied: ```js -describe('a suite of tests', function () { - beforeEach(function (done) { +describe('a suite of tests', function() { + beforeEach(function(done) { this.timeout(3000); // A very long environment setup. setTimeout(done, 2500); }); @@ -1066,17 +1066,17 @@ Cause Mocha to only run tests matching the given `regexp`, which is internally c Suppose, for example, you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. ```js -describe('api', function () { - describe('GET /api/users', function () { - it('respond with an array of users', function () { +describe('api', function() { + describe('GET /api/users', function() { + it('respond with an array of users', function() { // ... }); }); }); -describe('app', function () { - describe('GET /users', function () { - it('respond with an array of users', function () { +describe('app', function() { + describe('GET /users', function() { + it('respond with an array of users', function() { // ... }); }); @@ -1229,12 +1229,12 @@ A _root hook_ is a hook in a test file which is _not defined_ within a suite. An // test/setup.js // root hook to run before every test (even in other files) -beforeEach(function () { +beforeEach(function() { doMySetup(); }); // root hook to run after every test (even in other files) -afterEach(function () { +afterEach(function() { doMyTeardown(); }); ``` @@ -1308,7 +1308,7 @@ exports.mochaHooks = { beforeEach(done) { // do something before every test done(); - }, + } }; ``` @@ -1325,7 +1325,7 @@ export const mochaHooks = { beforeEach(done) { // do something before every test done(); - }, + } }; ``` @@ -1361,7 +1361,7 @@ export const mochaHooks = { if (require('os').userInfo().username === 'bob') { return this.skip(); } - }, + } }; ``` @@ -1374,14 +1374,14 @@ Multiple root hooks can be defined in a single plugin, for organizational purpos export const mochaHooks = { beforeEach: [ - function (done) { + function(done) { // do something before every test, // then run the next hook in this array }, - async function () { + async function() { // async or Promise-returning functions allowed - }, - ], + } + ] }; ``` @@ -1397,20 +1397,20 @@ export const mochaHooks = () => { // root hooks object return { beforeEach: [ - function () { + function() { // CI-specific beforeEach }, - function () { + function() { // some other CI-specific beforeEach - }, - ], + } + ] }; } // root hooks object return { beforeEach() { // regular beforeEach - }, + } }; }; ``` @@ -1428,7 +1428,7 @@ export const mochaHooks = async () => { return { beforeEach() { // something - }, + } }; } }; @@ -1453,16 +1453,16 @@ For example, given the following file, `test/test.spec.js`, containing root hook ```js // test/test.spec.js -beforeEach(function () { +beforeEach(function() { // global setup for all tests }); -after(function () { +after(function() { // one-time final cleanup }); -describe('my test suite', function () { - it('should have run my global setup', function () { +describe('my test suite', function() { + it('should have run my global setup', function() { // make assertion }); }); @@ -1490,8 +1490,8 @@ Your original `test/test.spec.js` should now contain: ```js // test/test.spec.js -describe('my test suite', function () { - it('should have run my global setup', function () { +describe('my test suite', function() { + it('should have run my global setup', function() { // make assertion }); }); @@ -1520,24 +1520,24 @@ The **BDD** interface provides `describe()`, `context()`, `it()`, `specify()`, ` > All of the previous examples were written using the **BDD** interface. ```js -describe('Array', function () { - before(function () { +describe('Array', function() { + before(function() { // ... }); - describe('#indexOf()', function () { - context('when not present', function () { - it('should not throw an error', function () { - (function () { + describe('#indexOf()', function() { + context('when not present', function() { + it('should not throw an error', function() { + (function() { [1, 2, 3].indexOf(4); }.should.not.throw()); }); - it('should return -1', function () { + it('should return -1', function() { [1, 2, 3].indexOf(4).should.equal(-1); }); }); - context('when present', function () { - it('should return the index where the element first appears in the array', function () { + context('when present', function() { + it('should return the index where the element first appears in the array', function() { [1, 2, 3].indexOf(3).should.equal(2); }); }); @@ -1550,13 +1550,13 @@ describe('Array', function () { The **TDD** interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`: ```js -suite('Array', function () { - setup(function () { +suite('Array', function() { + setup(function() { // ... }); - suite('#indexOf()', function () { - test('should return -1 when not present', function () { + suite('#indexOf()', function() { + test('should return -1 when not present', function() { assert.equal(-1, [1, 2, 3].indexOf(4)); }); }); @@ -1569,17 +1569,17 @@ The **Exports** interface is much like Mocha's predecessor [expresso][]. The key ```js module.exports = { - before: function () { + before: function() { // ... }, Array: { '#indexOf()': { - 'should return -1 when not present': function () { + 'should return -1 when not present': function() { [1, 2, 3].indexOf(4).should.equal(-1); - }, - }, - }, + } + } + } }; ``` @@ -1594,12 +1594,12 @@ function ok(expr, msg) { suite('Array'); -test('#length', function () { +test('#length', function() { var arr = [1, 2, 3]; ok(arr.length == 3); }); -test('#indexOf()', function () { +test('#indexOf()', function() { var arr = [1, 2, 3]; ok(arr.indexOf(1) == 0); ok(arr.indexOf(2) == 1); @@ -1608,7 +1608,7 @@ test('#indexOf()', function () { suite('String'); -test('#length', function () { +test('#length', function() { ok('foo'.length == 3); }); ``` @@ -1625,13 +1625,13 @@ var pre = require('mocha').before; var assertions = require('mocha').it; var assert = require('chai').assert; -testCase('Array', function () { - pre(function () { +testCase('Array', function() { + pre(function() { // ... }); - testCase('#indexOf()', function () { - assertions('should return -1 when not present', function () { + testCase('#indexOf()', function() { + assertions('should return -1 when not present', function() { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -1735,9 +1735,9 @@ The Doc reporter outputs a hierarchical HTML body representation of your tests. For example, suppose you have the following JavaScript: ```js -describe('Array', function () { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -1893,7 +1893,7 @@ mocha.setup('tdd'); // This is equivalent to the above. mocha.setup({ - ui: 'tdd', + ui: 'tdd' }); // Examples of options: @@ -1908,7 +1908,7 @@ mocha.setup({ retries: 3, slow: '100', timeout: '2000', - ui: 'bdd', + ui: 'bdd' }); ``` From 903d2d12da05093c360aa867722f55ee0a966d93 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 18 Jun 2020 11:20:12 -0700 Subject: [PATCH 1521/1771] Revert "temporarily disable broken OC badges" This reverts commit 109820b962209a444b94e777dfdffe8b6d7db87f. --- README.md | 2 +- docs/index.md | 302 +++++++++++++++++++++++++------------------------- 2 files changed, 152 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index 15834af627..68634e1f10 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

              ☕️ Simple, flexible, fun JavaScript test framework for Node.js & The Browser ☕️

              -

              Build Status Coverage Status FOSSA Status Gitter +

              Build Status Coverage Status FOSSA Status Gitter OpenCollective OpenCollective


              Mocha Browser Support h/t SauceLabs

              diff --git a/docs/index.md b/docs/index.md index 96b2ed9a31..b8396ea39e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,8 +8,8 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in {% include supporters.md %} @@ -78,9 +78,9 @@ In your editor: ```js var assert = require('assert'); -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -160,7 +160,7 @@ spawn child process If you use callback-based async tests, Mocha will throw an error if `done()` is called multiple times. This is handy for catching accidental double callbacks. ```javascript -it('double done', function(done) { +it('double done', function (done) { // Calling `done()` twice is an error setImmediate(done); setImmediate(done); @@ -203,11 +203,11 @@ Mocha allows you to use any assertion library you wish. In the above example, we By adding an argument (usually named `done`) to `it()` to a test callback, Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an `Error` instance (or subclass thereof) _or_ a falsy value; anything else is invalid usage and throws an error (usually causing a failed test). ```js -describe('User', function() { - describe('#save()', function() { - it('should save without error', function(done) { +describe('User', function () { + describe('#save()', function () { + it('should save without error', function (done) { var user = new User('Luna'); - user.save(function(err) { + user.save(function (err) { if (err) done(err); else done(); }); @@ -219,9 +219,9 @@ describe('User', function() { Alternatively, use the `done()` callback directly (which will handle an error argument, if it exists): ```js -describe('User', function() { - describe('#save()', function() { - it('should save without error', function(done) { +describe('User', function () { + describe('#save()', function () { + it('should save without error', function (done) { var user = new User('Luna'); user.save(done); }); @@ -234,14 +234,14 @@ describe('User', function() { Alternately, instead of using the `done()` callback, you may return a [Promise][mdn-promise]. This is useful if the APIs you are testing return promises instead of taking callbacks: ```js -beforeEach(function() { - return db.clear().then(function() { +beforeEach(function () { + return db.clear().then(function () { return db.save([tobi, loki, jane]); }); }); -describe('#find()', function() { - it('respond with matching records', function() { +describe('#find()', function () { + it('respond with matching records', function () { return db.find({type: 'User'}).should.eventually.have.length(3); }); }); @@ -255,8 +255,8 @@ In Mocha v3.0.0 and newer, returning a `Promise` _and_ calling `done()` will res const assert = require('assert'); // antipattern -it('should complete this test', function(done) { - return new Promise(function(resolve) { +it('should complete this test', function (done) { + return new Promise(function (resolve) { assert.ok(true); resolve(); }).then(done); @@ -270,13 +270,13 @@ The above test will fail with `Error: Resolution method is overspecified. Specif If your JS environment supports [async / await][mdn-async], you can also write asynchronous tests like this: ```js -beforeEach(async function() { +beforeEach(async function () { await db.clear(); await db.save([tobi, loki, jane]); }); -describe('#find()', function() { - it('responds with matching records', async function() { +describe('#find()', function () { + it('responds with matching records', async function () { const users = await db.find({type: 'User'}); users.should.have.length(3); }); @@ -288,9 +288,9 @@ describe('#find()', function() { When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test. ```js -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -319,20 +319,20 @@ _If you do not need to use_ Mocha's context, lambdas should work. Be aware that With its default "BDD"-style interface, Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`. These should be used to set up preconditions and clean up after your tests. ```js -describe('hooks', function() { - before(function() { +describe('hooks', function () { + before(function () { // runs once before the first test in this block }); - after(function() { + after(function () { // runs once after the last test in this block }); - beforeEach(function() { + beforeEach(function () { // runs before each test in this block }); - afterEach(function() { + afterEach(function () { // runs after each test in this block }); @@ -347,7 +347,7 @@ describe('hooks', function() { Any hook can be invoked with an optional description, making it easier to pinpoint errors in your tests. If a hook is given a named function, that name will be used if no description is supplied. ```js -beforeEach(function() { +beforeEach(function () { // beforeEach hook }); @@ -355,7 +355,7 @@ beforeEach(function namedFun() { // beforeEach:namedFun }); -beforeEach('some description', function() { +beforeEach('some description', function () { // beforeEach:some description }); ``` @@ -365,22 +365,22 @@ beforeEach('some description', function() { All hooks (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync or async as well, behaving much like a regular test-case. For example, you may wish to populate database with dummy content before each test: ```js -describe('Connection', function() { +describe('Connection', function () { var db = new Connection(), tobi = new User('tobi'), loki = new User('loki'), jane = new User('jane'); - beforeEach(function(done) { - db.clear(function(err) { + beforeEach(function (done) { + db.clear(function (err) { if (err) return done(err); db.save([tobi, loki, jane], done); }); }); - describe('#find()', function() { - it('respond with matching records', function(done) { - db.find({type: 'User'}, function(err, res) { + describe('#find()', function () { + it('respond with matching records', function (done) { + db.find({type: 'User'}, function (err, res) { if (err) return done(err); res.should.have.length(3); done(); @@ -403,10 +403,10 @@ As of v8.0.0, [Root Hook Plugins](#root-hook-plugins) are the preferred mechanis If you need to perform asynchronous operations before any of your suites are run, you may delay the root suite. Run `mocha` with the `--delay` flag. This will attach a special callback function, `run()`, to the global context: ```js -setTimeout(function() { +setTimeout(function () { // do some setup - describe('my suite', function() { + describe('my suite', function () { // ... }); @@ -419,8 +419,8 @@ setTimeout(function() { "Pending"--as in "someone should write these test cases eventually"--test-cases are those _without_ a callback: ```js -describe('Array', function() { - describe('#indexOf()', function() { +describe('Array', function () { + describe('#indexOf()', function () { // pending test below it('should return -1 when the value is not present'); }); @@ -439,8 +439,8 @@ The exclusivity feature allows you to run _only_ the specified suite or test-cas by appending `.only()` to the function. Here's an example of executing only a particular suite: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { // ... }); }); @@ -451,13 +451,13 @@ _Note_: All nested suites will still be executed. Here's an example of executing an individual test case: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.only('should return -1 unless present', function () { // ... }); - it('should return the index when present', function() { + it('should return the index when present', function () { // ... }); }); @@ -467,17 +467,17 @@ describe('Array', function() { Previous to v3.0.0, `.only()` used string matching to decide which tests to execute; this is no longer the case. In v3.0.0 or newer, `.only()` can be used multiple times to define a subset of tests to run: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.only('should return -1 unless present', function () { // this test will be run }); - it.only('should return the index when present', function() { + it.only('should return the index when present', function () { // this test will also be run }); - it('should return -1 if called with a non-Array context', function() { + it('should return -1 if called with a non-Array context', function () { // this test will not be run }); }); @@ -487,25 +487,25 @@ describe('Array', function() { You may also choose multiple suites: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { - it('should return -1 unless present', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { + it('should return -1 unless present', function () { // this test will be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will also be run }); }); - describe.only('#concat()', function() { - it('should return a new Array', function() { + describe.only('#concat()', function () { + it('should return a new Array', function () { // this test will also be run }); }); - describe('#slice()', function() { - it('should return a new Array', function() { + describe('#slice()', function () { + it('should return a new Array', function () { // this test will not be run }); }); @@ -515,13 +515,13 @@ describe('Array', function() { But _tests will have precedence_: ```js -describe('Array', function() { - describe.only('#indexOf()', function() { - it.only('should return -1 unless present', function() { +describe('Array', function () { + describe.only('#indexOf()', function () { + it.only('should return -1 unless present', function () { // this test will be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will not be run }); }); @@ -537,13 +537,13 @@ _Note_: Hooks, if present, will still be executed. This feature is the inverse of `.only()`. By appending `.skip()`, you may tell Mocha to ignore test case(s). Anything skipped will be marked as [pending](#pending-tests), and reported as such. Here's an example of skipping an individual test: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it.skip('should return -1 unless present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it.skip('should return -1 unless present', function () { // this test will not be run }); - it('should return the index when present', function() { + it('should return the index when present', function () { // this test will be run }); }); @@ -553,9 +553,9 @@ describe('Array', function() { You can also put `.skip()` on an entire suite. This is equivalent to appending `.skip()` onto all tests in the suite. Hooks in the suite are also skipped. ```js -describe('Array', function() { - describe.skip('#indexOf()', function() { - it('should return -1 unless present', function() { +describe('Array', function () { + describe.skip('#indexOf()', function () { + it('should return -1 unless present', function () { // this test will not be run }); }); @@ -613,21 +613,21 @@ before(function() { This will skip all `it`, `beforeEach/afterEach`, and `describe` blocks within the suite. `before/after` hooks are skipped unless they are defined at the same level as the hook containing `this.skip()`. ```js -describe('outer', function() { - before(function() { +describe('outer', function () { + before(function () { this.skip(); }); - after(function() { + after(function () { // will be executed }); - describe('inner', function() { - before(function() { + describe('inner', function () { + before(function () { // will be skipped }); - after(function() { + after(function () { // will be skipped }); }); @@ -647,15 +647,15 @@ This feature does re-run a failed test and its corresponding `beforeEach/afterEa **NOTE**: Example below was written using Selenium webdriver (which [overwrites global Mocha hooks][selenium-webdriver-testing] for `Promise` chain). ```js -describe('retries', function() { +describe('retries', function () { // Retry all tests in this suite up to 4 times this.retries(4); - beforeEach(function() { + beforeEach(function () { browser.get('http://www.yahoo.com'); }); - it('should succeed on the 3rd try', function() { + it('should succeed on the 3rd try', function () { // Specify this test to only retry up to 2 times this.retries(2); expect($('.foo').isDisplayed()).to.eventually.be.true; @@ -673,20 +673,20 @@ Take the following example: var assert = require('chai').assert; function add() { - return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { + return Array.prototype.slice.call(arguments).reduce(function (prev, curr) { return prev + curr; }, 0); } -describe('add()', function() { +describe('add()', function () { var tests = [ {args: [1, 2], expected: 3}, {args: [1, 2, 3], expected: 6}, - {args: [1, 2, 3, 4], expected: 10} + {args: [1, 2, 3, 4], expected: 10}, ]; - tests.forEach(function(test) { - it('correctly adds ' + test.args.length + ' args', function() { + tests.forEach(function (test) { + it('correctly adds ' + test.args.length + ' args', function () { var res = add.apply(null, test.args); assert.equal(res, test.expected); }); @@ -722,10 +722,10 @@ There are three levels of test duration (depicted in the following image): To tweak what's considered "slow", you can use the `slow()` method: ```js -describe('something slow', function() { +describe('something slow', function () { this.slow(300000); // five minutes - it('should take long enough for me to go make a sandwich', function() { + it('should take long enough for me to go make a sandwich', function () { // ... }); }); @@ -738,14 +738,14 @@ describe('something slow', function() { Suite-level timeouts may be applied to entire test "suites", or disabled via `this.timeout(0)`. This will be inherited by all nested suites and test-cases that do not override the value. ```js -describe('a suite of tests', function() { +describe('a suite of tests', function () { this.timeout(500); - it('should take less than 500ms', function(done) { + it('should take less than 500ms', function (done) { setTimeout(done, 300); }); - it('should take less than 500ms as well', function(done) { + it('should take less than 500ms as well', function (done) { setTimeout(done, 250); }); }); @@ -756,7 +756,7 @@ describe('a suite of tests', function() { Test-specific timeouts may also be applied, or the use of `this.timeout(0)` to disable timeouts all together: ```js -it('should take less than 500ms', function(done) { +it('should take less than 500ms', function (done) { this.timeout(500); setTimeout(done, 300); }); @@ -767,8 +767,8 @@ it('should take less than 500ms', function(done) { Hook-level timeouts may also be applied: ```js -describe('a suite of tests', function() { - beforeEach(function(done) { +describe('a suite of tests', function () { + beforeEach(function (done) { this.timeout(3000); // A very long environment setup. setTimeout(done, 2500); }); @@ -1066,17 +1066,17 @@ Cause Mocha to only run tests matching the given `regexp`, which is internally c Suppose, for example, you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use `--grep api` or `--grep app` to run one or the other. The same goes for any other part of a suite or test-case title, `--grep users` would be valid as well, or even `--grep GET`. ```js -describe('api', function() { - describe('GET /api/users', function() { - it('respond with an array of users', function() { +describe('api', function () { + describe('GET /api/users', function () { + it('respond with an array of users', function () { // ... }); }); }); -describe('app', function() { - describe('GET /users', function() { - it('respond with an array of users', function() { +describe('app', function () { + describe('GET /users', function () { + it('respond with an array of users', function () { // ... }); }); @@ -1229,12 +1229,12 @@ A _root hook_ is a hook in a test file which is _not defined_ within a suite. An // test/setup.js // root hook to run before every test (even in other files) -beforeEach(function() { +beforeEach(function () { doMySetup(); }); // root hook to run after every test (even in other files) -afterEach(function() { +afterEach(function () { doMyTeardown(); }); ``` @@ -1308,7 +1308,7 @@ exports.mochaHooks = { beforeEach(done) { // do something before every test done(); - } + }, }; ``` @@ -1325,7 +1325,7 @@ export const mochaHooks = { beforeEach(done) { // do something before every test done(); - } + }, }; ``` @@ -1361,7 +1361,7 @@ export const mochaHooks = { if (require('os').userInfo().username === 'bob') { return this.skip(); } - } + }, }; ``` @@ -1374,14 +1374,14 @@ Multiple root hooks can be defined in a single plugin, for organizational purpos export const mochaHooks = { beforeEach: [ - function(done) { + function (done) { // do something before every test, // then run the next hook in this array }, - async function() { + async function () { // async or Promise-returning functions allowed - } - ] + }, + ], }; ``` @@ -1397,20 +1397,20 @@ export const mochaHooks = () => { // root hooks object return { beforeEach: [ - function() { + function () { // CI-specific beforeEach }, - function() { + function () { // some other CI-specific beforeEach - } - ] + }, + ], }; } // root hooks object return { beforeEach() { // regular beforeEach - } + }, }; }; ``` @@ -1428,7 +1428,7 @@ export const mochaHooks = async () => { return { beforeEach() { // something - } + }, }; } }; @@ -1453,16 +1453,16 @@ For example, given the following file, `test/test.spec.js`, containing root hook ```js // test/test.spec.js -beforeEach(function() { +beforeEach(function () { // global setup for all tests }); -after(function() { +after(function () { // one-time final cleanup }); -describe('my test suite', function() { - it('should have run my global setup', function() { +describe('my test suite', function () { + it('should have run my global setup', function () { // make assertion }); }); @@ -1490,8 +1490,8 @@ Your original `test/test.spec.js` should now contain: ```js // test/test.spec.js -describe('my test suite', function() { - it('should have run my global setup', function() { +describe('my test suite', function () { + it('should have run my global setup', function () { // make assertion }); }); @@ -1520,24 +1520,24 @@ The **BDD** interface provides `describe()`, `context()`, `it()`, `specify()`, ` > All of the previous examples were written using the **BDD** interface. ```js -describe('Array', function() { - before(function() { +describe('Array', function () { + before(function () { // ... }); - describe('#indexOf()', function() { - context('when not present', function() { - it('should not throw an error', function() { - (function() { + describe('#indexOf()', function () { + context('when not present', function () { + it('should not throw an error', function () { + (function () { [1, 2, 3].indexOf(4); }.should.not.throw()); }); - it('should return -1', function() { + it('should return -1', function () { [1, 2, 3].indexOf(4).should.equal(-1); }); }); - context('when present', function() { - it('should return the index where the element first appears in the array', function() { + context('when present', function () { + it('should return the index where the element first appears in the array', function () { [1, 2, 3].indexOf(3).should.equal(2); }); }); @@ -1550,13 +1550,13 @@ describe('Array', function() { The **TDD** interface provides `suite()`, `test()`, `suiteSetup()`, `suiteTeardown()`, `setup()`, and `teardown()`: ```js -suite('Array', function() { - setup(function() { +suite('Array', function () { + setup(function () { // ... }); - suite('#indexOf()', function() { - test('should return -1 when not present', function() { + suite('#indexOf()', function () { + test('should return -1 when not present', function () { assert.equal(-1, [1, 2, 3].indexOf(4)); }); }); @@ -1569,17 +1569,17 @@ The **Exports** interface is much like Mocha's predecessor [expresso][]. The key ```js module.exports = { - before: function() { + before: function () { // ... }, Array: { '#indexOf()': { - 'should return -1 when not present': function() { + 'should return -1 when not present': function () { [1, 2, 3].indexOf(4).should.equal(-1); - } - } - } + }, + }, + }, }; ``` @@ -1594,12 +1594,12 @@ function ok(expr, msg) { suite('Array'); -test('#length', function() { +test('#length', function () { var arr = [1, 2, 3]; ok(arr.length == 3); }); -test('#indexOf()', function() { +test('#indexOf()', function () { var arr = [1, 2, 3]; ok(arr.indexOf(1) == 0); ok(arr.indexOf(2) == 1); @@ -1608,7 +1608,7 @@ test('#indexOf()', function() { suite('String'); -test('#length', function() { +test('#length', function () { ok('foo'.length == 3); }); ``` @@ -1625,13 +1625,13 @@ var pre = require('mocha').before; var assertions = require('mocha').it; var assert = require('chai').assert; -testCase('Array', function() { - pre(function() { +testCase('Array', function () { + pre(function () { // ... }); - testCase('#indexOf()', function() { - assertions('should return -1 when not present', function() { + testCase('#indexOf()', function () { + assertions('should return -1 when not present', function () { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -1735,9 +1735,9 @@ The Doc reporter outputs a hierarchical HTML body representation of your tests. For example, suppose you have the following JavaScript: ```js -describe('Array', function() { - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { +describe('Array', function () { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { [1, 2, 3].indexOf(5).should.equal(-1); [1, 2, 3].indexOf(0).should.equal(-1); }); @@ -1893,7 +1893,7 @@ mocha.setup('tdd'); // This is equivalent to the above. mocha.setup({ - ui: 'tdd' + ui: 'tdd', }); // Examples of options: @@ -1908,7 +1908,7 @@ mocha.setup({ retries: 3, slow: '100', timeout: '2000', - ui: 'bdd' + ui: 'bdd', }); ``` From 61cbb85fab5a2fb431ec51e69bc7981fec2ec099 Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (aka Outsider)" Date: Sun, 21 Jun 2020 19:54:03 +0900 Subject: [PATCH 1522/1771] add missing commit in v8.0.0 release (#4337) Signed-off-by: Outsider --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 013a74e343..bd36ad8872 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ Let's welcome [**@giltayar**](https://github.com/giltayar) and [**@nicojs**](htt ## :boom: Breaking Changes -- [#4164](https://github.com/mochajs/mocha/issues/4164): **Mocha v8.0.0 now requires Node.js v10.0.0 or newer.** Mocha no longer supports the Node.js v8.x line ("Carbon"), which entered End-of-Life at the end of 2019 ([**@UlisesGascon**](https://github.com/UlisesGascon)) +- [#4164](https://github.com/mochajs/mocha/issues/4164): **Mocha v8.0.0 now requires Node.js v10.12.0 or newer.** Mocha no longer supports the Node.js v8.x line ("Carbon"), which entered End-of-Life at the end of 2019 ([**@UlisesGascon**](https://github.com/UlisesGascon)) - [#4175](https://github.com/mochajs/mocha/issues/4175): Having been deprecated with a warning since v7.0.0, **`mocha.opts` is no longer supported** ([**@juergba**](https://github.com/juergba)) @@ -35,6 +35,7 @@ Let's welcome [**@giltayar**](https://github.com/giltayar) and [**@nicojs**](htt - [#4223](https://github.com/mochajs/mocha/issues/4223): The context object's `skip()` (`this.skip()`) in a "before all" (`before()`) hook will no longer execute subsequent sibling hooks, in addition to hooks in child suites ([**@juergba**](https://github.com/juergba)) - [#4178](https://github.com/mochajs/mocha/issues/4178): Remove previously soft-deprecated APIs ([**@wnghdcjfe**](https://github.com/wnghdcjfe)): + - `Mocha.prototype.ignoreLeaks()` - `Mocha.prototype.useColors()` - `Mocha.prototype.useInlineDiffs()` @@ -54,6 +55,10 @@ Let's welcome [**@giltayar**](https://github.com/giltayar) and [**@nicojs**](htt - [#4246](https://github.com/mochajs/mocha/issues/4246): Add documentation for parallel mode and Root Hook plugins ([**@boneskull**](https://github.com/boneskull)) +## :nut_and_bolt: Other + +- [#4200](https://github.com/mochajs/mocha/issues/4200): Drop mkdirp and replace it with fs.mkdirSync ([**@HyunSangHan**](https://github.com/HyunSangHan)) + ## :bug: Fixes (All bug fixes in Mocha v8.0.0 are also breaking changes, and are listed above) From a1d39845510de456d212dfa7f2ff8e13279ae94f Mon Sep 17 00:00:00 2001 From: Michael Brade Date: Mon, 22 Jun 2020 15:17:26 +0200 Subject: [PATCH 1523/1771] Use background color in an inline-diffs (#4287) --- lib/reporters/base.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index cdf77a2847..aeca18f345 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -69,7 +69,9 @@ exports.colors = { light: 90, 'diff gutter': 90, 'diff added': 32, - 'diff removed': 31 + 'diff removed': 31, + 'diff added inline': '30;42', + 'diff removed inline': '30;41' }; /** @@ -406,9 +408,9 @@ function inlineDiff(actual, expected) { // legend msg = '\n' + - color('diff removed', 'actual') + + color('diff removed inline', 'actual') + ' ' + - color('diff added', 'expected') + + color('diff added inline', 'expected') + '\n\n' + msg + '\n'; @@ -474,10 +476,10 @@ function errorDiff(actual, expected) { .diffWordsWithSpace(actual, expected) .map(function(str) { if (str.added) { - return colorLines('diff added', str.value); + return colorLines('diff added inline', str.value); } if (str.removed) { - return colorLines('diff removed', str.value); + return colorLines('diff removed inline', str.value); } return str.value; }) From 181a20b1da1c2889cbb048b5c45cc282f26b1556 Mon Sep 17 00:00:00 2001 From: Gopishankar Haridas Date: Sat, 27 Jun 2020 20:24:51 +0530 Subject: [PATCH 1524/1771] update tests by removing call to createSandbox --- test/node-unit/buffered-runner.spec.js | 18 +-- test/node-unit/buffered-worker-pool.spec.js | 18 +-- test/node-unit/cli/config.spec.js | 21 +-- test/node-unit/cli/options.spec.js | 149 ++++++++---------- test/node-unit/mocha.spec.js | 50 +++--- .../reporters/parallel-buffered.spec.js | 16 +- test/node-unit/serializer.spec.js | 26 ++- test/node-unit/worker.spec.js | 30 ++-- test/reporters/base.spec.js | 28 ++-- test/reporters/dot.spec.js | 30 ++-- test/reporters/json.spec.js | 12 +- test/reporters/landing.spec.js | 24 ++- test/reporters/list.spec.js | 28 ++-- test/reporters/nyan.spec.js | 47 +++--- test/reporters/progress.spec.js | 31 ++-- test/reporters/spec.spec.js | 16 +- test/reporters/xunit.spec.js | 37 ++--- test/unit/mocha.spec.js | 75 ++++----- test/unit/runner.spec.js | 26 ++- test/unit/suite.spec.js | 15 +- test/unit/test.spec.js | 23 +-- test/unit/utils.spec.js | 16 +- 22 files changed, 320 insertions(+), 416 deletions(-) diff --git a/test/node-unit/buffered-runner.spec.js b/test/node-unit/buffered-runner.spec.js index 1fe935ddc2..ef308f0905 100644 --- a/test/node-unit/buffered-runner.spec.js +++ b/test/node-unit/buffered-runner.spec.js @@ -13,11 +13,10 @@ const BUFFERED_RUNNER_PATH = require.resolve( ); const Suite = require('../../lib/suite'); const Runner = require('../../lib/runner'); -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); describe('buffered-runner', function() { describe('BufferedRunner', function() { - let sandbox; let run; let BufferedWorkerPool; let terminate; @@ -27,19 +26,18 @@ describe('buffered-runner', function() { let cpuCount; beforeEach(function() { - sandbox = createSandbox(); cpuCount = 1; suite = new Suite('a root suite', {}, true); - warn = sandbox.stub(); + warn = sinon.stub(); // tests will want to further define the behavior of these. - run = sandbox.stub(); - terminate = sandbox.stub(); + run = sinon.stub(); + terminate = sinon.stub(); BufferedWorkerPool = { - create: sandbox.stub().returns({ + create: sinon.stub().returns({ run, terminate, - stats: sandbox.stub().returns({}) + stats: sinon.stub().returns({}) }) }; BufferedRunner = rewiremock.proxy(BUFFERED_RUNNER_PATH, r => ({ @@ -47,7 +45,7 @@ describe('buffered-runner', function() { BufferedWorkerPool }, os: { - cpus: sandbox.stub().callsFake(() => new Array(cpuCount)) + cpus: sinon.stub().callsFake(() => new Array(cpuCount)) }, '../../lib/utils': r.with({warn}).callThrough() })); @@ -157,7 +155,7 @@ describe('buffered-runner', function() { it('should delegate to Runner#uncaught', function(done) { const options = {}; - sandbox.spy(runner, 'uncaught'); + sinon.spy(runner, 'uncaught'); const err = new Error('whoops'); run.withArgs('some-file.js', options).rejects(new Error('whoops')); run.withArgs('some-other-file.js', options).resolves({ diff --git a/test/node-unit/buffered-worker-pool.spec.js b/test/node-unit/buffered-worker-pool.spec.js index 1c0b7a9083..b6f1dae039 100644 --- a/test/node-unit/buffered-worker-pool.spec.js +++ b/test/node-unit/buffered-worker-pool.spec.js @@ -1,11 +1,10 @@ 'use strict'; const rewiremock = require('rewiremock/node'); -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); describe('class BufferedWorkerPool', function() { let BufferedWorkerPool; - let sandbox; let pool; let stats; let serializeJavascript; @@ -13,24 +12,23 @@ describe('class BufferedWorkerPool', function() { let result; beforeEach(function() { - sandbox = createSandbox(); stats = {totalWorkers: 10, busyWorkers: 8, idleWorkers: 2, pendingTasks: 3}; result = {failures: 0, events: []}; pool = { - terminate: sandbox.stub().resolves(), - exec: sandbox.stub().resolves(result), - stats: sandbox.stub().returns(stats) + terminate: sinon.stub().resolves(), + exec: sinon.stub().resolves(result), + stats: sinon.stub().returns(stats) }; serializer = { - deserialize: sandbox.stub() + deserialize: sinon.stub() }; - serializeJavascript = sandbox.spy(require('serialize-javascript')); + serializeJavascript = sinon.spy(require('serialize-javascript')); BufferedWorkerPool = rewiremock.proxy( require.resolve('../../lib/nodejs/buffered-worker-pool'), { workerpool: { - pool: sandbox.stub().returns(pool), + pool: sinon.stub().returns(pool), cpus: 8 }, '../../lib/nodejs/serializer': serializer, @@ -43,7 +41,7 @@ describe('class BufferedWorkerPool', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('static method', function() { diff --git a/test/node-unit/cli/config.spec.js b/test/node-unit/cli/config.spec.js index 2d49423b2b..6f63d508f1 100644 --- a/test/node-unit/cli/config.spec.js +++ b/test/node-unit/cli/config.spec.js @@ -1,18 +1,13 @@ 'use strict'; -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const rewiremock = require('rewiremock/node'); describe('cli/config', function() { - let sandbox; const phonyConfigObject = {ok: true}; - beforeEach(function() { - sandbox = createSandbox(); - }); - afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('loadConfig()', function() { @@ -29,9 +24,9 @@ describe('cli/config', function() { describe('when parsing succeeds', function() { beforeEach(function() { - sandbox.stub(parsers, 'yaml').returns(phonyConfigObject); - sandbox.stub(parsers, 'json').returns(phonyConfigObject); - sandbox.stub(parsers, 'js').returns(phonyConfigObject); + sinon.stub(parsers, 'yaml').returns(phonyConfigObject); + sinon.stub(parsers, 'json').returns(phonyConfigObject); + sinon.stub(parsers, 'js').returns(phonyConfigObject); }); describe('when supplied a filepath with ".yaml" extension', function() { @@ -103,7 +98,7 @@ describe('cli/config', function() { describe('when supplied a filepath with unsupported extension', function() { beforeEach(function() { - sandbox.stub(parsers, 'json').returns(phonyConfigObject); + sinon.stub(parsers, 'json').returns(phonyConfigObject); }); it('should use the JSON parser', function() { @@ -114,7 +109,7 @@ describe('cli/config', function() { describe('when config file parsing fails', function() { beforeEach(function() { - sandbox.stub(parsers, 'yaml').throws(); + sinon.stub(parsers, 'yaml').throws(); }); it('should throw', function() { @@ -129,7 +124,7 @@ describe('cli/config', function() { let CONFIG_FILES; beforeEach(function() { - findup = {sync: sandbox.stub().returns('/some/path/.mocharc.js')}; + findup = {sync: sinon.stub().returns('/some/path/.mocharc.js')}; const config = rewiremock.proxy( require.resolve('../../../lib/cli/config'), r => ({ diff --git a/test/node-unit/cli/options.spec.js b/test/node-unit/cli/options.spec.js index 9c112d7df7..4a8f8e348c 100644 --- a/test/node-unit/cli/options.spec.js +++ b/test/node-unit/cli/options.spec.js @@ -1,6 +1,6 @@ 'use strict'; -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const rewiremock = require('rewiremock/node'); const {ONE_AND_DONE_ARGS} = require('../../../lib/cli/one-and-dones'); @@ -31,19 +31,14 @@ const defaults = { }; describe('options', function() { - let sandbox; let readFileSync; let findupSync; let loadOptions; let findConfig; let loadConfig; - beforeEach(function() { - sandbox = createSandbox(); - }); - afterEach(function() { - sandbox.restore(); + sinon.restore(); }); /** @@ -57,11 +52,11 @@ describe('options', function() { describe('when no parameter provided', function() { beforeEach(function() { this.timeout(1000); - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{}'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -91,12 +86,12 @@ describe('options', function() { beforeEach(function() { const filepath = '/some/package.json'; - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); // package.json readFileSync.onFirstCall().returns('{"mocha": {"retries": 3}}'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -135,12 +130,12 @@ describe('options', function() { describe('when path to package.json (`--package `) is invalid', function() { beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); // package.json readFileSync.onFirstCall().throws('yikes'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -165,14 +160,14 @@ describe('options', function() { beforeEach(function() { const filepath = '/some/package.json'; - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); // package.json readFileSync .onFirstCall() .returns('{"mocha": {"retries": 3, "_": ["foobar.spec.js"]}}'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns(filepath); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub().returns(filepath); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -208,11 +203,11 @@ describe('options', function() { describe('when called with package = false (`--no-package`)', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{}'); - findConfig = sandbox.stub().returns('/some/path/to/.mocharc.json'); - loadConfig = sandbox.stub().returns({'check-leaks': true}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/path/to/.mocharc.json'); + loadConfig = sinon.stub().returns({'check-leaks': true}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -251,15 +246,15 @@ describe('options', function() { describe('when called with config = false (`--no-config`)', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync .onFirstCall() .returns( '{"mocha": {"check-leaks": true, "_": ["foobar.spec.js"]}}' ); - findConfig = sandbox.stub(); - loadConfig = sandbox.stub(); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub(); + loadConfig = sinon.stub(); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -301,12 +296,12 @@ describe('options', function() { let config; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); config = '/some/.mocharc.json'; readFileSync.onFirstCall().returns('{}'); - findConfig = sandbox.stub(); - loadConfig = sandbox.stub().throws('Error', 'failed to parse'); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub(); + loadConfig = sinon.stub().throws('Error', 'failed to parse'); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -346,12 +341,12 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{}'); readFileSync.onSecondCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -382,12 +377,12 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{}'); readFileSync.onSecondCall().throws(); - findConfig = sandbox.stub().returns(null); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns(null); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -417,15 +412,15 @@ describe('options', function() { describe('config priority', function() { it('should prioritize package.json over defaults', function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync .onFirstCall() .returns( '{"mocha": {"timeout": 700, "require": "bar", "extension": "ts"}}' ); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -442,12 +437,12 @@ describe('options', function() { }); it('should prioritize rc file over package.json', function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{"mocha": {"timeout": 700}}'); readFileSync.onSecondCall().returns('--timeout 800'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({timeout: 600}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({timeout: 600}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -460,12 +455,12 @@ describe('options', function() { }); it('should prioritize args over rc file', function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().returns('{"mocha": {"timeout": 700}}'); readFileSync.onSecondCall().returns('--timeout 800'); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({timeout: 600}); - findupSync = sandbox.stub().returns('/some/package.json'); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({timeout: 600}); + findupSync = sinon.stub().returns('/some/package.json'); loadOptions = proxyLoadOptions({ readFileSync, @@ -485,10 +480,10 @@ describe('options', function() { describe('when called with a one-and-done arg', function() { beforeEach(function() { - readFileSync = sandbox.stub(); - findConfig = sandbox.stub(); - loadConfig = sandbox.stub(); - findupSync = sandbox.stub(); + readFileSync = sinon.stub(); + findConfig = sinon.stub(); + loadConfig = sinon.stub(); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -511,11 +506,11 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({extension: ['tsx']}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({extension: ['tsx']}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -534,11 +529,11 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox.stub().returns({}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -559,13 +554,11 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox - .stub() - .returns({spec: '{dirA,dirB}/**/*.spec.js'}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({spec: '{dirA,dirB}/**/*.spec.js'}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, @@ -588,13 +581,11 @@ describe('options', function() { let result; beforeEach(function() { - readFileSync = sandbox.stub(); + readFileSync = sinon.stub(); readFileSync.onFirstCall().throws(); - findConfig = sandbox.stub().returns('/some/.mocharc.json'); - loadConfig = sandbox - .stub() - .returns({ignore: '{dirA,dirB}/**/*.spec.js'}); - findupSync = sandbox.stub(); + findConfig = sinon.stub().returns('/some/.mocharc.json'); + loadConfig = sinon.stub().returns({ignore: '{dirA,dirB}/**/*.spec.js'}); + findupSync = sinon.stub(); loadOptions = proxyLoadOptions({ readFileSync, findConfig, diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index fc701aadc6..b5fc04d2b0 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -2,7 +2,7 @@ const path = require('path'); const rewiremock = require('rewiremock/node'); -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const {EventEmitter} = require('events'); const MODULE_PATH = require.resolve('../../lib/mocha.js'); @@ -15,41 +15,39 @@ describe('Mocha', function() { let stubs; let opts; let Mocha; - let sandbox; beforeEach(function() { - sandbox = createSandbox(); - opts = {reporter: sandbox.stub()}; + opts = {reporter: sinon.stub()}; stubs = {}; stubs.utils = { - supportsEsModules: sandbox.stub().returns(false), - warn: sandbox.stub(), - isString: sandbox.stub(), - noop: sandbox.stub(), - cwd: sandbox.stub().returns(process.cwd()), - isBrowser: sandbox.stub().returns(false) + supportsEsModules: sinon.stub().returns(false), + warn: sinon.stub(), + isString: sinon.stub(), + noop: sinon.stub(), + cwd: sinon.stub().returns(process.cwd()), + isBrowser: sinon.stub().returns(false) }; - stubs.suite = Object.assign(sandbox.createStubInstance(EventEmitter), { - slow: sandbox.stub(), - timeout: sandbox.stub(), - bail: sandbox.stub(), - reset: sandbox.stub(), - dispose: sandbox.stub() + stubs.suite = Object.assign(sinon.createStubInstance(EventEmitter), { + slow: sinon.stub(), + timeout: sinon.stub(), + bail: sinon.stub(), + reset: sinon.stub(), + dispose: sinon.stub() }); - stubs.Suite = sandbox.stub().returns(stubs.suite); + stubs.Suite = sinon.stub().returns(stubs.suite); stubs.Suite.constants = {}; - stubs.BufferedRunner = sandbox.stub().returns({}); - const runner = Object.assign(sandbox.createStubInstance(EventEmitter), { - run: sandbox + stubs.BufferedRunner = sinon.stub().returns({}); + const runner = Object.assign(sinon.createStubInstance(EventEmitter), { + run: sinon .stub() .callsArgAsync(0) .returnsThis(), - globals: sandbox.stub(), - grep: sandbox.stub(), - dispose: sandbox.stub() + globals: sinon.stub(), + grep: sinon.stub(), + dispose: sinon.stub() }); - stubs.Runner = sandbox.stub().returns(runner); + stubs.Runner = sinon.stub().returns(runner); // the Runner constructor is the main export, and constants is a static prop. // we don't need the constants themselves, but the object cannot be undefined stubs.Runner.constants = {}; @@ -67,7 +65,7 @@ describe('Mocha', function() { afterEach(function() { delete require.cache[DUMB_FIXTURE_PATH]; delete require.cache[DUMBER_FIXTURE_PATH]; - sandbox.restore(); + sinon.restore(); }); describe('instance method', function() { @@ -211,7 +209,7 @@ describe('Mocha', function() { describe('unloadFiles()', function() { it('should delegate Mocha.unloadFile() for each item in its list of files', function() { mocha.files = [DUMB_FIXTURE_PATH, DUMBER_FIXTURE_PATH]; - sandbox.stub(Mocha, 'unloadFile'); + sinon.stub(Mocha, 'unloadFile'); mocha.unloadFiles(); expect(Mocha.unloadFile, 'to have a call exhaustively satisfying', [ DUMB_FIXTURE_PATH diff --git a/test/node-unit/reporters/parallel-buffered.spec.js b/test/node-unit/reporters/parallel-buffered.spec.js index 65a74a72b8..e579b6e10d 100644 --- a/test/node-unit/reporters/parallel-buffered.spec.js +++ b/test/node-unit/reporters/parallel-buffered.spec.js @@ -19,16 +19,14 @@ const { EVENT_RUN_END } = require('../../../lib/runner').constants; const {EventEmitter} = require('events'); -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const rewiremock = require('rewiremock/node'); describe('ParallelBuffered', function() { - let sandbox; let runner; let ParallelBuffered; beforeEach(function() { - sandbox = createSandbox(); runner = new EventEmitter(); ParallelBuffered = rewiremock.proxy( require.resolve('../../../lib/nodejs/reporters/parallel-buffered'), @@ -56,15 +54,15 @@ describe('ParallelBuffered', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('constructor', function() { it('should listen for Runner events', function() { // EventEmitter#once calls thru to EventEmitter#on, which // befouls our assertion below. - sandbox.stub(runner, 'once'); - sandbox.stub(runner, 'on'); + sinon.stub(runner, 'once'); + sinon.stub(runner, 'on'); // eslint-disable-next-line no-new new ParallelBuffered(runner); expect(runner.on, 'to have calls satisfying', [ @@ -83,7 +81,7 @@ describe('ParallelBuffered', function() { }); it('should listen for Runner events expecting to occur once', function() { - sandbox.stub(runner, 'once'); + sinon.stub(runner, 'once'); // eslint-disable-next-line no-new new ParallelBuffered(runner); expect(runner.once, 'to have calls satisfying', [ @@ -172,7 +170,7 @@ describe('ParallelBuffered', function() { runner.emit(EVENT_TEST_PASS, test); runner.emit(EVENT_TEST_END, test); runner.emit(EVENT_SUITE_END, suite); - const cb = sandbox.stub(); + const cb = sinon.stub(); reporter.done(0, cb); expect(cb, 'to have a call satisfying', [ { @@ -221,7 +219,7 @@ describe('ParallelBuffered', function() { runner.emit(EVENT_TEST_PASS, test); runner.emit(EVENT_TEST_END, test); runner.emit(EVENT_SUITE_END, suite); - const cb = sandbox.stub(); + const cb = sinon.stub(); reporter.done(0, cb); expect(reporter.events, 'to be empty'); }); diff --git a/test/node-unit/serializer.spec.js b/test/node-unit/serializer.spec.js index 79f0093d11..86848d90b4 100644 --- a/test/node-unit/serializer.spec.js +++ b/test/node-unit/serializer.spec.js @@ -1,6 +1,6 @@ 'use strict'; -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const { serialize, deserialize, @@ -9,14 +9,8 @@ const { } = require('../../lib/nodejs/serializer'); describe('serializer', function() { - let sandbox; - - beforeEach(function() { - sandbox = createSandbox(); - }); - afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('function', function() { @@ -38,7 +32,7 @@ describe('serializer', function() { describe('having a `serialize` method', function() { it('should return the result of the `serialize` method', function() { const serializedObj = {foo: 'bar'}; - const obj = {serialize: sandbox.stub().returns(serializedObj)}; + const obj = {serialize: sinon.stub().returns(serializedObj)}; expect(serialize(obj), 'to be', serializedObj); }); }); @@ -76,9 +70,7 @@ describe('serializer', function() { it('should return the result of `SerializableWorkerResult.deserialize` called on the value', function() { const obj = Object.assign({}, SerializableWorkerResult.create()); - sandbox - .stub(SerializableWorkerResult, 'deserialize') - .returns('butts'); + sinon.stub(SerializableWorkerResult, 'deserialize').returns('butts'); deserialize(obj); expect( SerializableWorkerResult.deserialize, @@ -133,7 +125,7 @@ describe('serializer', function() { describe('when passed an object with a `serialize` method', function() { it('should call the `serialize` method', function() { const obj = { - serialize: sandbox.stub() + serialize: sinon.stub() }; SerializableEvent.create('some-event', obj).serialize(); expect(obj.serialize, 'was called once'); @@ -142,7 +134,7 @@ describe('serializer', function() { describe('when passed an object containing an object with a `serialize` method', function() { it('should call the `serialize` method', function() { - const stub = sandbox.stub(); + const stub = sinon.stub(); const obj = { nested: { serialize: stub @@ -400,7 +392,7 @@ describe('serializer', function() { describe('when the value data contains a prop with an array value', function() { beforeEach(function() { - sandbox.spy(SerializableEvent, '_deserializeObject'); + sinon.spy(SerializableEvent, '_deserializeObject'); }); it('should deserialize each prop', function() { @@ -480,7 +472,7 @@ describe('serializer', function() { describe('deserialize', function() { beforeEach(function() { - sandbox.stub(SerializableEvent, 'deserialize'); + sinon.stub(SerializableEvent, 'deserialize'); }); it('should call SerializableEvent#deserialize on each item in its `events` prop', function() { @@ -525,7 +517,7 @@ describe('serializer', function() { }); it('should call `SerializableEvent#serialize` of each of its events', function() { - sandbox.spy(SerializableEvent.prototype, 'serialize'); + sinon.spy(SerializableEvent.prototype, 'serialize'); const events = [ SerializableEvent.create('foo'), SerializableEvent.create('bar') diff --git a/test/node-unit/worker.spec.js b/test/node-unit/worker.spec.js index 78dfa1ac86..8d46ef4973 100644 --- a/test/node-unit/worker.spec.js +++ b/test/node-unit/worker.spec.js @@ -3,24 +3,22 @@ const serializeJavascript = require('serialize-javascript'); const rewiremock = require('rewiremock/node'); const {SerializableWorkerResult} = require('../../lib/nodejs/serializer'); -const {createSandbox} = require('sinon'); +const sinon = require('sinon'); const WORKER_PATH = require.resolve('../../lib/nodejs/worker.js'); describe('worker', function() { let worker; - let sandbox; let stubs; beforeEach(function() { - sandbox = createSandbox(); stubs = { workerpool: { isMainThread: false, - worker: sandbox.stub() + worker: sinon.stub() } }; - sandbox.spy(process, 'removeAllListeners'); + sinon.spy(process, 'removeAllListeners'); }); describe('when run as main process', function() { @@ -41,24 +39,24 @@ describe('worker', function() { beforeEach(function() { mocha = { - addFile: sandbox.stub().returnsThis(), - loadFilesAsync: sandbox.stub().resolves(), - run: sandbox.stub().callsArgAsync(0), - unloadFiles: sandbox.stub().returnsThis() + addFile: sinon.stub().returnsThis(), + loadFilesAsync: sinon.stub().resolves(), + run: sinon.stub().callsArgAsync(0), + unloadFiles: sinon.stub().returnsThis() }; - stubs.Mocha = Object.assign(sandbox.stub().returns(mocha), { - bdd: sandbox.stub(), + stubs.Mocha = Object.assign(sinon.stub().returns(mocha), { + bdd: sinon.stub(), interfaces: {} }); stubs.serializer = { - serialize: sandbox.stub() + serialize: sinon.stub() }; stubs.runHelpers = { - handleRequires: sandbox.stub(), - validatePlugin: sandbox.stub(), - loadRootHooks: sandbox.stub().resolves() + handleRequires: sinon.stub(), + validatePlugin: sinon.stub(), + loadRootHooks: sinon.stub().resolves() }; worker = rewiremock.proxy(WORKER_PATH, { @@ -216,7 +214,7 @@ describe('worker', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); // this is needed due to `require.cache` getting dumped in watch mode process.removeAllListeners('beforeExit'); }); diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index 744b92e69b..e8e0a782e9 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -12,14 +12,13 @@ var createElements = helpers.createElements; var makeTest = helpers.makeTest; describe('Base reporter', function() { - var sandbox; var stdout; function list(tests) { try { Base.list(tests); } finally { - sandbox.restore(); + sinon.restore(); } } @@ -29,7 +28,7 @@ describe('Base reporter', function() { try { diffStr = Base.generateDiff(actual, expected); } finally { - sandbox.restore(); + sinon.restore(); } return diffStr; @@ -40,14 +39,13 @@ describe('Base reporter', function() { }; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(process.stdout, 'write').callsFake(gather); + sinon.stub(Base, 'useColors').value(false); + sinon.stub(process.stdout, 'write').callsFake(gather); stdout = []; }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('showDiff', function() { @@ -103,7 +101,7 @@ describe('Base reporter', function() { it("should not show diffs if 'hideDiff' is true", function() { var test = makeTest(err); - sandbox.stub(Base, 'hideDiff').value(true); + sinon.stub(Base, 'hideDiff').value(true); list([test]); var errOut = stdout.join('\n'); @@ -136,7 +134,7 @@ describe('Base reporter', function() { var inlineDiffsStub; beforeEach(function() { - inlineDiffsStub = sandbox.stub(Base, 'inlineDiffs'); + inlineDiffsStub = sinon.stub(Base, 'inlineDiffs'); }); it("should generate unified diffs if 'inlineDiffs' is false", function() { @@ -170,7 +168,7 @@ describe('Base reporter', function() { describe('inline strings diff', function() { beforeEach(function() { - sandbox.stub(Base, 'inlineDiffs').value(true); + sinon.stub(Base, 'inlineDiffs').value(true); }); it("should show single line diff if 'inlineDiffs' is true", function() { @@ -213,7 +211,7 @@ describe('Base reporter', function() { describe('unified diff', function() { beforeEach(function() { - sandbox.stub(Base, 'inlineDiffs').value(false); + sinon.stub(Base, 'inlineDiffs').value(false); }); it('should separate diff hunks by two dashes', function() { @@ -426,13 +424,11 @@ describe('Base reporter', function() { }); describe('when reporter output immune to user test changes', function() { - var sandbox; var baseConsoleLog; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(console, 'log'); - baseConsoleLog = sandbox.stub(Base, 'consoleLog'); + sinon.stub(console, 'log'); + baseConsoleLog = sinon.stub(Base, 'consoleLog'); }); it('should let you stub out console.log without effecting reporters output', function() { @@ -444,7 +440,7 @@ describe('Base reporter', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); }); }); diff --git a/test/reporters/dot.spec.js b/test/reporters/dot.spec.js index 4a23c7951e..43d584af3c 100644 --- a/test/reporters/dot.spec.js +++ b/test/reporters/dot.spec.js @@ -17,22 +17,20 @@ var EVENT_TEST_PASS = events.EVENT_TEST_PASS; var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Dot reporter', function() { - var sandbox; var windowWidthStub; var runReporter = makeRunReporter(Dot); var noop = function() {}; beforeEach(function() { - sandbox = sinon.createSandbox(); - windowWidthStub = sandbox.stub(Base.window, 'width').value(0); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base, 'color').callsFake(function(type, str) { + windowWidthStub = sinon.stub(Base.window, 'width').value(0); + sinon.stub(Base, 'useColors').value(false); + sinon.stub(Base, 'color').callsFake(function(type, str) { return type.replace(/ /g, '-') + '_' + str; }); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { @@ -41,7 +39,7 @@ describe('Dot reporter', function() { var runner = createMockRunner('start', EVENT_RUN_BEGIN); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = ['\n']; expect(stdout, 'to equal', expectedArray); @@ -58,7 +56,7 @@ describe('Dot reporter', function() { var runner = createMockRunner('pending', EVENT_TEST_PENDING); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = ['\n ', 'pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); @@ -70,7 +68,7 @@ describe('Dot reporter', function() { var runner = createMockRunner('pending', EVENT_TEST_PENDING); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = ['pending_' + Base.symbols.comma]; expect(stdout, 'to equal', expectedArray); @@ -102,7 +100,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); expect(test.speed, 'to equal', 'fast'); var expectedArray = ['\n ', 'fast_' + Base.symbols.dot]; @@ -123,7 +121,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); expect(test.speed, 'to equal', 'fast'); var expectedArray = ['fast_' + Base.symbols.dot]; @@ -143,7 +141,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); expect(test.speed, 'to equal', 'medium'); var expectedArray = ['medium_' + Base.symbols.dot]; @@ -163,7 +161,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); expect(test.speed, 'to equal', 'slow'); var expectedArray = ['bright-yellow_' + Base.symbols.dot]; @@ -195,7 +193,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = ['\n ', 'fail_' + Base.symbols.bang]; expect(stdout, 'to equal', expectedArray); @@ -213,7 +211,7 @@ describe('Dot reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = ['fail_' + Base.symbols.bang]; expect(stdout, 'to equal', expectedArray); @@ -229,7 +227,7 @@ describe('Dot reporter', function() { }; var options = {}; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(fakeThis.epilogue.called, 'to be true'); }); diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index 9aa7e7a208..a92be62273 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -7,7 +7,6 @@ var Runner = Mocha.Runner; var Test = Mocha.Test; describe('JSON reporter', function() { - var sandbox; var suite; var runner; var testTitle = 'json test 1'; @@ -26,12 +25,11 @@ describe('JSON reporter', function() { }); beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(process.stdout, 'write').callsFake(noop); + sinon.stub(process.stdout, 'write').callsFake(noop); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); it('should have 1 test failure', function(done) { @@ -45,7 +43,7 @@ describe('JSON reporter', function() { suite.addTest(test); runner.run(function(failureCount) { - sandbox.restore(); + sinon.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ @@ -70,7 +68,7 @@ describe('JSON reporter', function() { suite.addTest(test); runner.run(function(failureCount) { - sandbox.restore(); + sinon.restore(); expect(runner, 'to satisfy', { testResults: { pending: [ @@ -102,7 +100,7 @@ describe('JSON reporter', function() { suite.addTest(test); runner.run(function(failureCount) { - sandbox.restore(); + sinon.restore(); expect(runner, 'to satisfy', { testResults: { failures: [ diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index acb2ee3ef6..a4f3b90de7 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -19,7 +19,6 @@ var STATE_FAILED = states.STATE_FAILED; var STATE_PASSED = states.STATE_PASSED; describe('Landing reporter', function() { - var sandbox; var runReporter = makeRunReporter(Landing); var resetCode = '\u001b[0m'; var expectedArray = [ @@ -34,35 +33,34 @@ describe('Landing reporter', function() { ]; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.window, 'width').value(1); + sinon.stub(Base, 'useColors').value(false); + sinon.stub(Base.window, 'width').value(1); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { describe("on 'start' event", function() { it('should write newlines', function() { - sandbox.stub(Base.cursor, 'hide'); + sinon.stub(Base.cursor, 'hide'); var runner = createMockRunner('start', EVENT_RUN_BEGIN); var options = {}; var stdout = runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(stdout[0], 'to equal', '\n\n\n '); }); it('should call cursor hide', function() { - var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); + var hideCursorStub = sinon.stub(Base.cursor, 'hide'); var runner = createMockRunner('start', EVENT_RUN_BEGIN); var options = {}; runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(hideCursorStub.called, 'to be true'); }); @@ -83,7 +81,7 @@ describe('Landing reporter', function() { ); var options = {}; var stdout = runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(stdout, 'to equal', expectedArray); }); @@ -104,7 +102,7 @@ describe('Landing reporter', function() { runner.total = 12; var options = {}; var stdout = runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(stdout, 'to equal', expectedArray); }); @@ -113,7 +111,7 @@ describe('Landing reporter', function() { describe("on 'end' event", function() { it('should call cursor show and epilogue', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var showCursorStub = sinon.stub(Base.cursor, 'show'); var fakeThis = { epilogue: sinon.spy() @@ -121,7 +119,7 @@ describe('Landing reporter', function() { var runner = createMockRunner('end', EVENT_RUN_END); var options = {}; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(fakeThis.epilogue.calledOnce, 'to be true'); expect(showCursorStub.called, 'to be true'); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index c10272e953..1954a2c41f 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -18,7 +18,6 @@ var EVENT_TEST_PASS = events.EVENT_TEST_PASS; var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('List reporter', function() { - var sandbox; var runReporter = makeRunReporter(List); var expectedTitle = 'some title'; var expectedDuration = 100; @@ -32,12 +31,11 @@ describe('List reporter', function() { }; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); + sinon.stub(Base, 'useColors').value(false); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { @@ -55,7 +53,7 @@ describe('List reporter', function() { epilogue: noop }; var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); var startString = '\n'; var testString = ' ' + expectedTitle + ': '; @@ -78,7 +76,7 @@ describe('List reporter', function() { epilogue: noop }; var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); }); @@ -88,7 +86,7 @@ describe('List reporter', function() { var crStub; beforeEach(function() { - crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + crStub = sinon.stub(Base.cursor, 'CR').callsFake(noop); }); it('should call cursor CR', function() { @@ -104,14 +102,14 @@ describe('List reporter', function() { epilogue: noop }; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(crStub.called, 'to be true'); }); it('should write expected symbol, title, and duration', function() { var expectedOkSymbol = 'OK'; - sandbox.stub(Base.symbols, 'ok').value(expectedOkSymbol); + sinon.stub(Base.symbols, 'ok').value(expectedOkSymbol); var runner = createMockRunner( 'pass', @@ -125,7 +123,7 @@ describe('List reporter', function() { epilogue: noop }; var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect( stdout[0], @@ -145,7 +143,7 @@ describe('List reporter', function() { var crStub; beforeEach(function() { - crStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); + crStub = sinon.stub(Base.cursor, 'CR').callsFake(noop); }); it('should call cursor CR', function() { @@ -161,7 +159,7 @@ describe('List reporter', function() { epilogue: noop }; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(crStub.called, 'to be true'); }); @@ -180,7 +178,7 @@ describe('List reporter', function() { epilogue: noop }; var stdout = runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect( stdout[0], @@ -222,7 +220,7 @@ describe('List reporter', function() { epilogue: noop }; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(typeof err.actual, 'to be', 'string'); expect(typeof err.expected, 'to be', 'string'); @@ -237,7 +235,7 @@ describe('List reporter', function() { epilogue: sinon.spy() }; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(fakeThis.epilogue.calledOnce, 'to be true'); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index ce65e97d85..3850ec50cb 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -17,15 +17,10 @@ var EVENT_TEST_PASS = events.EVENT_TEST_PASS; var EVENT_TEST_PENDING = events.EVENT_TEST_PENDING; describe('Nyan reporter', function() { - var sandbox; var noop = function() {}; - beforeEach(function() { - sandbox = sinon.createSandbox(); - }); - afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { @@ -144,7 +139,7 @@ describe('Nyan reporter', function() { }); it('should call Base show', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var showCursorStub = sinon.stub(Base.cursor, 'show'); var fakeThis = { draw: noop, epilogue: noop, @@ -153,7 +148,7 @@ describe('Nyan reporter', function() { var runner = createMockRunner('end', EVENT_RUN_END); var options = {}; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(showCursorStub.called, 'to be true'); }); @@ -165,7 +160,7 @@ describe('Nyan reporter', function() { var stdout; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub = sinon.stub(process.stdout, 'write'); stdoutWriteStub.callsFake(function(chunk, encoding, cb) { stdout.push(chunk); }); @@ -194,7 +189,7 @@ describe('Nyan reporter', function() { try { nyanCat.draw.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = [ @@ -237,7 +232,7 @@ describe('Nyan reporter', function() { try { nyanCat.draw.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = [ @@ -264,7 +259,7 @@ describe('Nyan reporter', function() { var stdout; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub = sinon.stub(process.stdout, 'write'); stdoutWriteStub.callsFake(function(chunk, encoding, cb) { stdout.push(chunk); }); @@ -280,7 +275,7 @@ describe('Nyan reporter', function() { try { nyanCat.cursorDown(expectedNumber); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = ['\u001b[' + expectedNumber + 'B']; @@ -293,7 +288,7 @@ describe('Nyan reporter', function() { var stdout; beforeEach(function() { - stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + stdoutWriteStub = sinon.stub(process.stdout, 'write'); stdoutWriteStub.callsFake(function(chunk, encoding, cb) { stdout.push(chunk); }); @@ -309,7 +304,7 @@ describe('Nyan reporter', function() { try { nyanCat.cursorUp(expectedNumber); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = ['\u001b[' + expectedNumber + 'A']; @@ -321,11 +316,11 @@ describe('Nyan reporter', function() { var useColorsStub; beforeEach(function() { - useColorsStub = sandbox.stub(Base, 'useColors'); + useColorsStub = sinon.stub(Base, 'useColors'); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe("when 'useColors' is false", function() { @@ -340,7 +335,7 @@ describe('Nyan reporter', function() { var inputString = 'hello'; var outputString = nyanCat.rainbowify(inputString); - sandbox.restore(); + sinon.restore(); var expectedString = inputString; expect(outputString, 'to be', expectedString); @@ -364,7 +359,7 @@ describe('Nyan reporter', function() { colorIndex: 0 }; var outputString = nyanCat.rainbowify.call(fakeThis, inputString); - sandbox.restore(); + sinon.restore(); var startCode = '\u001b[38;5;'; var endCode = '\u001b[0m'; @@ -453,10 +448,10 @@ describe('Nyan reporter', function() { var stdout; beforeEach(function() { - sandbox.stub(Base, 'color').callsFake(function(type, n) { + sinon.stub(Base, 'color').callsFake(function(type, n) { return type + n; }); - var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); stdoutWriteStub.callsFake(function(chunk, encoding, cb) { stdout.push(chunk); }); @@ -481,7 +476,7 @@ describe('Nyan reporter', function() { try { nyanCat.drawScoreboard.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = [ @@ -514,7 +509,7 @@ describe('Nyan reporter', function() { try { nyanCat.drawScoreboard.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } expect(fakeThis.cursorUp.calledWith(expectedNumberOfLines), 'to be true'); @@ -525,7 +520,7 @@ describe('Nyan reporter', function() { var stdout; beforeEach(function() { - var stdoutWriteStub = sandbox.stub(process.stdout, 'write'); + var stdoutWriteStub = sinon.stub(process.stdout, 'write'); stdoutWriteStub.callsFake(function(chunk, encoding, cb) { stdout.push(chunk); }); @@ -551,7 +546,7 @@ describe('Nyan reporter', function() { try { nyanCat.drawRainbow.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } var expectedArray = [ @@ -581,7 +576,7 @@ describe('Nyan reporter', function() { try { nyanCat.drawRainbow.call(fakeThis); } finally { - sandbox.restore(); + sinon.restore(); } expect(expectedCursorArgument, 'to be', expectedNumberOfLines); diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index 0d45abeaf7..4f7687d874 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -15,27 +15,22 @@ var EVENT_RUN_END = events.EVENT_RUN_END; var EVENT_TEST_END = events.EVENT_TEST_END; describe('Progress reporter', function() { - var sandbox; var runReporter = makeRunReporter(Progress); var noop = function() {}; - beforeEach(function() { - sandbox = sinon.createSandbox(); - }); - afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { describe("on 'start' event", function() { it('should call cursor hide', function() { - var hideCursorStub = sandbox.stub(Base.cursor, 'hide'); + var hideCursorStub = sinon.stub(Base.cursor, 'hide'); var runner = createMockRunner('start', EVENT_RUN_BEGIN); var options = {}; runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(hideCursorStub.called, 'to be true'); }); @@ -44,9 +39,9 @@ describe('Progress reporter', function() { describe("on 'test end' event", function() { describe('when line has changed', function() { it('should write expected progress of open and close options', function() { - var crCursorStub = sandbox.stub(Base.cursor, 'CR').callsFake(noop); - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.window, 'width').value(5); + var crCursorStub = sinon.stub(Base.cursor, 'CR').callsFake(noop); + sinon.stub(Base, 'useColors').value(false); + sinon.stub(Base.window, 'width').value(5); var expectedTotal = 12; var expectedOpen = 'OpEn'; @@ -65,7 +60,7 @@ describe('Progress reporter', function() { reporterOptions: expectedOptions }; var stdout = runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = [ '\u001b[J', @@ -82,16 +77,16 @@ describe('Progress reporter', function() { describe('when line has not changed', function() { it('should not write anything', function() { - sandbox.stub(Base, 'useColors').value(false); - sandbox.stub(Base.cursor, 'CR').callsFake(noop); - sandbox.stub(Base.window, 'width').value(-3); + sinon.stub(Base, 'useColors').value(false); + sinon.stub(Base.cursor, 'CR').callsFake(noop); + sinon.stub(Base.window, 'width').value(-3); var expectedTotal = 1; var runner = createMockRunner('test end', EVENT_TEST_END); runner.total = expectedTotal; var options = {}; var stdout = runReporter({}, runner, options); - sandbox.restore(); + sinon.restore(); expect(stdout, 'to equal', []); }); @@ -100,14 +95,14 @@ describe('Progress reporter', function() { describe("on 'end' event", function() { it('should call cursor show and epilogue', function() { - var showCursorStub = sandbox.stub(Base.cursor, 'show'); + var showCursorStub = sinon.stub(Base.cursor, 'show'); var fakeThis = { epilogue: sinon.spy() }; var runner = createMockRunner('end', EVENT_RUN_END); var options = {}; runReporter(fakeThis, runner, options); - sandbox.restore(); + sinon.restore(); expect(fakeThis.epilogue.calledOnce, 'to be true'); expect(showCursorStub.called, 'to be true'); diff --git a/test/reporters/spec.spec.js b/test/reporters/spec.spec.js index 608bc7f512..ee482892fa 100644 --- a/test/reporters/spec.spec.js +++ b/test/reporters/spec.spec.js @@ -19,15 +19,13 @@ describe('Spec reporter', function() { var runReporter = makeRunReporter(Spec); var expectedTitle = 'expectedTitle'; var noop = function() {}; - var sandbox; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); + sinon.stub(Base, 'useColors').value(false); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); describe('event handlers', function() { @@ -45,7 +43,7 @@ describe('Spec reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = [expectedTitle + '\n']; expect(stdout, 'to equal', expectedArray); @@ -66,7 +64,7 @@ describe('Spec reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = [' - ' + expectedTitle + '\n']; expect(stdout, 'to equal', expectedArray); @@ -93,7 +91,7 @@ describe('Spec reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedString = ' ' + @@ -127,7 +125,7 @@ describe('Spec reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedString = ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; @@ -151,7 +149,7 @@ describe('Spec reporter', function() { ); var options = {}; var stdout = runReporter({epilogue: noop}, runner, options); - sandbox.restore(); + sinon.restore(); var expectedArray = [ ' ' + functionCount + ') ' + expectedTitle + '\n' diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 323db703a9..f3dfe21e55 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -24,7 +24,6 @@ var STATE_FAILED = states.STATE_FAILED; var STATE_PASSED = states.STATE_PASSED; describe('XUnit reporter', function() { - var sandbox; var runner; var noop = function() {}; @@ -54,9 +53,8 @@ describe('XUnit reporter', function() { var fsCreateWriteStream; beforeEach(function() { - sandbox = sinon.createSandbox(); - fsMkdirSync = sandbox.stub(fs, 'mkdirSync'); - fsCreateWriteStream = sandbox.stub(fs, 'createWriteStream'); + fsMkdirSync = sinon.stub(fs, 'mkdirSync'); + fsCreateWriteStream = sinon.stub(fs, 'createWriteStream'); }); it('should open given file for writing, recursively creating directories in pathname', function() { @@ -77,7 +75,7 @@ describe('XUnit reporter', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); }); @@ -127,8 +125,7 @@ describe('XUnit reporter', function() { describe('when run in browser', function() { beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(fs, 'createWriteStream').value(false); + sinon.stub(fs, 'createWriteStream').value(false); }); it('should throw unsupported error', function() { @@ -141,7 +138,7 @@ describe('XUnit reporter', function() { }); afterEach(function() { - sandbox.restore(); + sinon.restore(); }); }); }); @@ -198,14 +195,13 @@ describe('XUnit reporter', function() { var callback; beforeEach(function() { - sandbox = sinon.createSandbox(); - callback = sandbox.spy(); + callback = sinon.spy(); }); afterEach(function() { callback = null; xunit = null; - sandbox.restore(); + sinon.restore(); }); describe('when output directed to file', function() { @@ -309,12 +305,11 @@ describe('XUnit reporter', function() { }; beforeEach(function() { - sandbox = sinon.createSandbox(); - sandbox.stub(Base, 'useColors').value(false); + sinon.stub(Base, 'useColors').value(false); }); afterEach(function() { - sandbox.restore(); + sinon.restore(); expectedWrite = null; }); @@ -339,7 +334,7 @@ describe('XUnit reporter', function() { }; xunit.test.call(fakeThis, expectedTest); - sandbox.restore(); + sinon.restore(); var expectedTag = ' Date: Tue, 30 Jun 2020 07:14:45 +0900 Subject: [PATCH 1525/1771] Use blocklist instead blacklist (#4355) * change blacklist to blocklist Signed-off-by: Outsider * hide skeevy sponsors Signed-off-by: Outsider --- docs/_data/{blacklist.json => blocklist.json} | 2 ++ docs/_data/supporters.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename docs/_data/{blacklist.json => blocklist.json} (88%) diff --git a/docs/_data/blacklist.json b/docs/_data/blocklist.json similarity index 88% rename from docs/_data/blacklist.json rename to docs/_data/blocklist.json index 3949526a9b..12a1718602 100644 --- a/docs/_data/blacklist.json +++ b/docs/_data/blocklist.json @@ -17,5 +17,7 @@ "trust-my-paper", "seowebsitetraffic-net", "pfannen-test", + "casinobosscanada-com", + "suominettikasinot24", "mochajs" ] diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js index 589dfa73a9..8e273d9b31 100644 --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -7,7 +7,7 @@ const {resolve} = require('path'); const debug = require('debug')('mocha:docs:data:supporters'); const needle = require('needle'); const imageSize = require('image-size'); -const blacklist = new Set(require('./blacklist.json')); +const blocklist = new Set(require('./blocklist.json')); const API_ENDPOINT = 'https://api.opencollective.com/graphql/v2'; @@ -91,7 +91,7 @@ module.exports = async () => { const supporters = orders .map(nodeToSupporter) - .filter(supporter => !blacklist.has(supporter.slug)) + .filter(supporter => !blocklist.has(supporter.slug)) .reduce((supporters, supporter) => { if (uniqueSupporters.has(supporter.slug)) { // aggregate donation totals From e30ae28ffc0029b885968cd432b86d3160076375 Mon Sep 17 00:00:00 2001 From: devjeel Date: Tue, 23 Jun 2020 04:26:09 -0400 Subject: [PATCH 1526/1771] Remove serial travis job --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 166bb054ba..ca2131eb66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,8 +39,6 @@ jobs: - script: COVERAGE=1 npm start test.node after_success: npm start coveralls name: 'Latest Node.js (with coverage)' - - script: MOCHA_PARALLEL=0 npm start test.node.unit - name: 'Latest Node.js (unit tests in serial mode)' - &node script: npm start test.node From 7540efb5ed6d8e319bef9c99b3ce2b218573b7fc Mon Sep 17 00:00:00 2001 From: Martin Oppitz Date: Wed, 1 Jul 2020 23:46:09 +0200 Subject: [PATCH 1527/1771] upgrade yargs-unparser; closes #4340 (#4354) * fix(vulnerabilty): update to yargs-unparser@1.6.1 --- package-lock.json | 100 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c499a50fd6..c5ce6ae7cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9131,8 +9131,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -10618,7 +10617,8 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -19263,13 +19263,97 @@ } }, "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yauzl": { diff --git a/package.json b/package.json index 174cd13fde..a111b14dcb 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "workerpool": "6.0.0", "yargs": "13.3.2", "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "yargs-unparser": "1.6.1" }, "devDependencies": { "@11ty/eleventy": "^0.10.0", From f77aa7a2eed8abeff8fa66f86c24c8b200656db4 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Thu, 2 Jul 2020 11:16:59 +0100 Subject: [PATCH 1528/1771] Browser usage issues with `delay` option (#4341) * Prioritise delay option * lint fix * Improve conditional --- browser-entry.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/browser-entry.js b/browser-entry.js index 114d2f7213..1568ddf488 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -139,11 +139,19 @@ mocha.setup = function(opts) { if (typeof opts === 'string') { opts = {ui: opts}; } - for (var opt in opts) { - if (Object.prototype.hasOwnProperty.call(opts, opt)) { - this[opt](opts[opt]); - } + if (opts.delay === true) { + this.delay(); } + var self = this; + Object.keys(opts) + .filter(function(opt) { + return opt !== 'delay'; + }) + .forEach(function(opt) { + if (Object.prototype.hasOwnProperty.call(opts, opt)) { + self[opt](opts[opt]); + } + }); return this; }; From 7d3151d08a3082dd022116d00234caf1600a71b5 Mon Sep 17 00:00:00 2001 From: Craig Taub Date: Thu, 2 Jul 2020 12:19:12 +0100 Subject: [PATCH 1529/1771] Remove GLOBALS in api docs (#4343) * Remove globals in api docs * Fix runnable + suite * Fix Runner issues * rename @module tags 2 b filepaths from /lib --- lib/browser/progress.js | 4 ++++ lib/cli/collect-files.js | 1 + lib/interfaces/common.js | 5 +++++ lib/mocha.js | 9 +++++++++ lib/nodejs/parallel-buffered-runner.js | 2 ++ lib/nodejs/serializer.js | 2 ++ lib/pending.js | 4 ++++ lib/runnable.js | 1 + lib/runner.js | 2 ++ lib/suite.js | 1 + 10 files changed, 31 insertions(+) diff --git a/lib/browser/progress.js b/lib/browser/progress.js index 553fc6eb56..72ce5c57c1 100644 --- a/lib/browser/progress.js +++ b/lib/browser/progress.js @@ -1,5 +1,9 @@ 'use strict'; +/** + @module browser/Progress +*/ + /** * Expose `Progress`. */ diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js index 5dc5e1fc99..551d5138e4 100644 --- a/lib/cli/collect-files.js +++ b/lib/cli/collect-files.js @@ -81,6 +81,7 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { /** * An object to configure how Mocha gathers test files + * @private * @typedef {Object} FileCollectionOptions * @property {string[]} extension - File extensions to use * @property {string[]} spec - Files, dirs, globs to run diff --git a/lib/interfaces/common.js b/lib/interfaces/common.js index 3c171ef8d7..f5ae760c9b 100644 --- a/lib/interfaces/common.js +++ b/lib/interfaces/common.js @@ -1,5 +1,9 @@ 'use strict'; +/** + @module interfaces/common +*/ + var Suite = require('../suite'); var errors = require('../errors'); var createMissingArgumentError = errors.createMissingArgumentError; @@ -9,6 +13,7 @@ var createForbiddenExclusivityError = errors.createForbiddenExclusivityError; /** * Functions common to more than one interface. * + * @private * @param {Suite[]} suites * @param {Context} context * @param {Mocha} mocha diff --git a/lib/mocha.js b/lib/mocha.js index 8aabcb8762..ee76ba1d50 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -35,23 +35,28 @@ exports = module.exports = Mocha; /** * A Mocha instance is a finite state machine. * These are the states it can be in. + * @private */ var mochaStates = utils.defineConstants({ /** * Initial state of the mocha instance + * @private */ INIT: 'init', /** * Mocha instance is running tests + * @private */ RUNNING: 'running', /** * Mocha instance is done running tests and references to test functions and hooks are cleaned. * You can reset this state by unloading the test files. + * @private */ REFERENCES_CLEANED: 'referencesCleaned', /** * Mocha instance is disposed and can no longer be used. + * @private */ DISPOSED: 'disposed' }); @@ -67,6 +72,7 @@ if (!utils.isBrowser() && typeof module.paths !== 'undefined') { /** * Expose internals. + * @private */ exports.utils = utils; @@ -921,6 +927,7 @@ Object.defineProperty(Mocha.prototype, 'version', { /** * Callback to be invoked when test execution is complete. * + * @private * @callback DoneCB * @param {number} failures - Number of failures that occurred. */ @@ -1091,6 +1098,7 @@ Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { /** * An alternative way to define root hooks that works with parallel runs. + * @private * @typedef {Object} MochaRootHookObject * @property {Function|Function[]} [beforeAll] - "Before all" hook(s) * @property {Function|Function[]} [beforeEach] - "Before each" hook(s) @@ -1100,6 +1108,7 @@ Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { /** * An function that returns a {@link MochaRootHookObject}, either sync or async. + * @private * @callback MochaRootHookFunction * @returns {MochaRootHookObject|Promise} */ diff --git a/lib/nodejs/parallel-buffered-runner.js b/lib/nodejs/parallel-buffered-runner.js index d31929804a..ee8635ab98 100644 --- a/lib/nodejs/parallel-buffered-runner.js +++ b/lib/nodejs/parallel-buffered-runner.js @@ -281,12 +281,14 @@ module.exports = ParallelBufferedRunner; /** * Listener function intended to be bound to `Process.SIGINT` event + * @private * @callback SigIntListener * @returns {Promise} */ /** * A function accepting a test file path and returning the results of a test run + * @private * @callback FileRunner * @param {string} filename - File to run * @returns {Promise} diff --git a/lib/nodejs/serializer.js b/lib/nodejs/serializer.js index dae366ce79..ac95bdc344 100644 --- a/lib/nodejs/serializer.js +++ b/lib/nodejs/serializer.js @@ -387,6 +387,7 @@ exports.SerializableWorkerResult = SerializableWorkerResult; /** * The result of calling `SerializableEvent.serialize`, as received * by the deserializer. + * @private * @typedef {Object} SerializedEvent * @property {object?} data - Optional serialized data * @property {object?} error - Optional serialized `Error` @@ -395,6 +396,7 @@ exports.SerializableWorkerResult = SerializableWorkerResult; /** * The result of calling `SerializableWorkerResult.serialize` as received * by the deserializer. + * @private * @typedef {Object} SerializedWorkerResult * @property {number} failureCount - Number of failures * @property {SerializedEvent[]} events - Serialized events diff --git a/lib/pending.js b/lib/pending.js index bb9a505337..cf9cc84a0e 100644 --- a/lib/pending.js +++ b/lib/pending.js @@ -1,5 +1,9 @@ 'use strict'; +/** + @module Pending +*/ + module.exports = Pending; /** diff --git a/lib/runnable.js b/lib/runnable.js index 342152c3c2..023481dd69 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -11,6 +11,7 @@ var createMultipleDoneError = errors.createMultipleDoneError; /** * Save timer references to avoid Sinon interfering (see GH-237). + * @private */ var Date = global.Date; var setTimeout = global.setTimeout; diff --git a/lib/runner.js b/lib/runner.js index 22e7bb91d6..1214121e1e 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -2,6 +2,7 @@ /** * Module dependencies. + * @private */ var util = require('util'); var EventEmitter = require('events').EventEmitter; @@ -31,6 +32,7 @@ var createFatalError = errors.createFatalError; /** * Non-enumerable globals. + * @private * @readonly */ var globals = [ diff --git a/lib/suite.js b/lib/suite.js index 24e6dd344e..e9d45d94c4 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -2,6 +2,7 @@ /** * Module dependencies. + * @private */ var EventEmitter = require('events').EventEmitter; var Hook = require('./hook'); From 40f951baa5cf8aab40dedec9bcb0f60ee9581333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Thu, 2 Jul 2020 22:27:27 +0200 Subject: [PATCH 1530/1771] replace browserify with rollup and babel (#4293) * Make browser specific TTY interop explicit instead of a magic bundling configuration * Remove unnessessary browserify ignore of cli related files and chokidar * Extract lookupFiles from utils to avoid node dependencies in browser bundle * Replace browserify with rollup for main library bundling * Polyfill global to check if IE11 will start working * Don't include esm-utils in browser build. Modern syntax breaks IE * Remove duplicate browserify configuration in karma config file * Add custom karma rollup plugin and use it to bundle browser tests * add process.listeners impl * Extract browser-only helper functions from shared utils file to their own files * Add browserslist, babel, babel-preset-env and prepare for modern js * Add mocha.js.map to npm distributed files * Use util function to check if we're running in a browser * Improve documentation of self-built karma-rollup-plugin * Renamed lib/cli/lookupFiles.js to lib/cli/lookup-files.js * Clean up rollup config * Kebab case file names * Remove last traces of unused browserify * fix bundle path under win32 * do not run bundle visualizer in CI * Remove use of mocha.opts in browser testing * Improved naming of rollup plugin to pick values from package.json Co-authored-by: Christopher Hiller Signed-off-by: Christopher Hiller --- .browserslistrc | 12 + .eslintrc.yml | 7 +- .gitignore | 4 + browser-entry.js | 13 +- karma.conf.js | 47 +- lib/browser/highlight-tags.js | 39 + lib/browser/parse-query.js | 24 + lib/browser/tty.js | 13 - lib/cli/collect-files.js | 4 +- lib/cli/lookup-files.js | 145 + lib/reporters/base.js | 23 +- lib/utils.js | 200 -- package-lock.json | 4360 +++++++++++++++++++++++++-- package-scripts.js | 16 +- package.json | 25 +- rollup.config.js | 43 + scripts/dedefine.js | 24 - scripts/karma-rollup-plugin.js | 151 + scripts/package-json-cullify.js | 17 - scripts/pick-from-package-json.js | 28 + test/browser-specific/mocha.opts | 6 - test/integration/file-utils.spec.js | 32 +- test/unit/parse-query.spec.js | 23 + test/unit/utils.spec.js | 21 - 24 files changed, 4641 insertions(+), 636 deletions(-) create mode 100644 .browserslistrc create mode 100644 lib/browser/highlight-tags.js create mode 100644 lib/browser/parse-query.js delete mode 100644 lib/browser/tty.js create mode 100644 lib/cli/lookup-files.js create mode 100644 rollup.config.js delete mode 100644 scripts/dedefine.js create mode 100644 scripts/karma-rollup-plugin.js delete mode 100644 scripts/package-json-cullify.js create mode 100644 scripts/pick-from-package-json.js delete mode 100644 test/browser-specific/mocha.opts create mode 100644 test/unit/parse-query.spec.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000000..a60e6a2256 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,12 @@ +node >= 10 +last 2 Chrome versions +last 2 Edge versions +last 2 Firefox versions +last 2 Safari versions +last 2 Opera versions +unreleased Chrome versions +unreleased Edge versions +unreleased Firefox versions +unreleased Safari versions +unreleased Opera versions +IE 11 diff --git a/.eslintrc.yml b/.eslintrc.yml index e185b97711..ee6c65f773 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -5,8 +5,9 @@ extends: env: node: true browser: true + es6: true parserOptions: - ecmaVersion: 5 + ecmaVersion: 2018 ecmaFeatures: jsx: false sourceType: script @@ -37,8 +38,6 @@ overrides: - 'test/integration/helpers.js' - 'test/integration/options/watch.spec.js' - 'test/node-unit/**/*.js' - parserOptions: - ecmaVersion: 2018 env: browser: false rules: @@ -48,6 +47,8 @@ overrides: property: 'assign' - files: - esm-utils.js + - rollup.config.js + - scripts/pick-from-package-json.js parserOptions: ecmaVersion: 2018 sourceType: module diff --git a/.gitignore b/.gitignore index 41f8d36d3c..1a7de6f73d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,13 @@ docs/_site docs/_dist docs/images/supporters mocha.js +mocha.js.map .karma/ !lib/mocha.js +# Bundle debugging +stats.html + ######################################### # NON-MOCHA STUFF GOES BELOW THIS THING # ######################################### diff --git a/browser-entry.js b/browser-entry.js index 1568ddf488..d5e3717c79 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -9,6 +9,8 @@ process.stdout = require('browser-stdout')({label: false}); +var parseQuery = require('./lib/browser/parse-query'); +var highlightTags = require('./lib/browser/highlight-tags'); var Mocha = require('./lib/mocha'); /** @@ -77,6 +79,13 @@ process.on = function(e, fn) { } }; +process.listeners = function(e) { + if (e === 'uncaughtException') { + return uncaughtExceptionHandlers; + } + return []; +}; + // The BDD UI is registered by default, but no UI will be functional in the // browser without an explicit call to the overridden `mocha.ui` (see below). // Ensure that this default UI does not expose its methods to the global scope. @@ -163,7 +172,7 @@ mocha.run = function(fn) { var options = mocha.options; mocha.globals('location'); - var query = Mocha.utils.parseQuery(global.location.search || ''); + var query = parseQuery(global.location.search || ''); if (query.grep) { mocha.grep(query.grep); } @@ -182,7 +191,7 @@ mocha.run = function(fn) { document.getElementById('mocha') && options.noHighlighting !== true ) { - Mocha.utils.highlightTags('code'); + highlightTags('code'); } if (fn) { fn(err); diff --git a/karma.conf.js b/karma.conf.js index a414236e3d..866671f7b6 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,6 +3,7 @@ const fs = require('fs'); const path = require('path'); const os = require('os'); +const rollupPlugin = require('./scripts/karma-rollup-plugin'); const baseBundleDirpath = path.join(__dirname, '.karma'); const hostname = os.hostname(); @@ -18,43 +19,23 @@ const browserPlatformPairs = { module.exports = config => { let bundleDirpath; const cfg = { - frameworks: ['browserify', 'mocha'], + frameworks: ['rollup', 'mocha'], files: [ // we use the BDD interface for all of the tests that // aren't interface-specific. 'test/unit/*.spec.js' ], - preprocessors: { - 'test/**/*.js': ['browserify'] - }, - browserify: { - debug: true, - configure: function configure(b) { - b.ignore('chokidar') - .ignore('fs') - .ignore('glob') - .ignore('path') - .ignore('supports-color') - .ignore('./lib/esm-utils.js') - .ignore('./lib/cli/*.js') - .ignore('./lib/nodejs/serializer.js') - .ignore('./lib/nodejs/worker.js') - .ignore('./lib/nodejs/buffered-worker-pool.js') - .ignore('./lib/nodejs/parallel-buffered-runner.js') - .ignore('./lib/nodejs/reporters/parallel-buffered.js') - .on('bundled', (err, content) => { - if (err) { - throw err; - } - if (bundleDirpath) { - // write bundle to directory for debugging - fs.writeFileSync( - path.join(bundleDirpath, `mocha.${Date.now()}.js`), - content - ); - } - }); - } + plugins: [ + 'karma-mocha', + 'karma-mocha-reporter', + 'karma-sauce-launcher', + 'karma-chrome-launcher', + rollupPlugin + ], + rollup: { + configFile: 'rollup.config.js', + include: ['test/**'], + bundlePath: bundleDirpath }, reporters: ['mocha'], colors: true, @@ -62,7 +43,7 @@ module.exports = config => { logLevel: config.LOG_INFO, client: { mocha: { - opts: require.resolve('./test/browser-specific/mocha.opts') + reporter: 'html' } }, mochaReporter: { diff --git a/lib/browser/highlight-tags.js b/lib/browser/highlight-tags.js new file mode 100644 index 0000000000..d98896e789 --- /dev/null +++ b/lib/browser/highlight-tags.js @@ -0,0 +1,39 @@ +'use strict'; + +/** + * Highlight the given string of `js`. + * + * @private + * @param {string} js + * @return {string} + */ +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace( + /\bnew[ \t]+(\w+)/gm, + 'new $1' + ) + .replace( + /\b(function|new|throw|return|var|if|else)\b/gm, + '$1' + ); +} + +/** + * Highlight the contents of tag `name`. + * + * @private + * @param {string} name + */ +module.exports = function highlightTags(name) { + var code = document.getElementById('mocha').getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; diff --git a/lib/browser/parse-query.js b/lib/browser/parse-query.js new file mode 100644 index 0000000000..dc1a884118 --- /dev/null +++ b/lib/browser/parse-query.js @@ -0,0 +1,24 @@ +'use strict'; + +/** + * Parse the given `qs`. + * + * @private + * @param {string} qs + * @return {Object} + */ +module.exports = function parseQuery(qs) { + return qs + .replace('?', '') + .split('&') + .reduce(function(obj, pair) { + var i = pair.indexOf('='); + var key = pair.slice(0, i); + var val = pair.slice(++i); + + // Due to how the URLSearchParams API treats spaces + obj[key] = decodeURIComponent(val.replace(/\+/g, '%20')); + + return obj; + }, {}); +}; diff --git a/lib/browser/tty.js b/lib/browser/tty.js deleted file mode 100644 index e903365023..0000000000 --- a/lib/browser/tty.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -exports.isatty = function isatty() { - return true; -}; - -exports.getWindowSize = function getWindowSize() { - if ('innerHeight' in global) { - return [global.innerHeight, global.innerWidth]; - } - // In a Web Worker, the DOM Window is not available. - return [640, 480]; -}; diff --git a/lib/cli/collect-files.js b/lib/cli/collect-files.js index 551d5138e4..9ea7e83fd2 100644 --- a/lib/cli/collect-files.js +++ b/lib/cli/collect-files.js @@ -4,8 +4,8 @@ const path = require('path'); const ansi = require('ansi-colors'); const debug = require('debug')('mocha:cli:run:helpers'); const minimatch = require('minimatch'); -const utils = require('../utils'); const {NO_FILES_MATCH_PATTERN} = require('../errors').constants; +const lookupFiles = require('./lookup-files'); /** * Exports a function that collects test files from CLI parameters. @@ -27,7 +27,7 @@ module.exports = ({ignore, extension, file, recursive, sort, spec} = {}) => { spec.forEach(arg => { let newFiles; try { - newFiles = utils.lookupFiles(arg, extension, recursive); + newFiles = lookupFiles(arg, extension, recursive); } catch (err) { if (err.code === NO_FILES_MATCH_PATTERN) { unmatched.push({message: err.message, pattern: err.pattern}); diff --git a/lib/cli/lookup-files.js b/lib/cli/lookup-files.js new file mode 100644 index 0000000000..2223ad09c2 --- /dev/null +++ b/lib/cli/lookup-files.js @@ -0,0 +1,145 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var glob = require('glob'); +var {format} = require('util'); +var errors = require('../errors'); +var createNoFilesMatchPatternError = errors.createNoFilesMatchPatternError; +var createMissingArgumentError = errors.createMissingArgumentError; +var {sQuote, dQuote} = require('../utils'); + +/** + * Determines if pathname would be a "hidden" file (or directory) on UN*X. + * + * @description + * On UN*X, pathnames beginning with a full stop (aka dot) are hidden during + * typical usage. Dotfiles, plain-text configuration files, are prime examples. + * + * @see {@link http://xahlee.info/UnixResource_dir/writ/unix_origin_of_dot_filename.html|Origin of Dot File Names} + * + * @private + * @param {string} pathname - Pathname to check for match. + * @return {boolean} whether pathname would be considered a hidden file. + * @example + * isHiddenOnUnix('.profile'); // => true + */ +function isHiddenOnUnix(pathname) { + return path.basename(pathname)[0] === '.'; +} + +/** + * Determines if pathname has a matching file extension. + * + * @private + * @param {string} pathname - Pathname to check for match. + * @param {string[]} exts - List of file extensions (sans period). + * @return {boolean} whether file extension matches. + * @example + * hasMatchingExtname('foo.html', ['js', 'css']); // => false + */ +function hasMatchingExtname(pathname, exts) { + var suffix = path.extname(pathname).slice(1); + return exts.some(function(element) { + return suffix === element; + }); +} + +/** + * Lookup file names at the given `path`. + * + * @description + * Filenames are returned in _traversal_ order by the OS/filesystem. + * **Make no assumption that the names will be sorted in any fashion.** + * + * @public + * @memberof Mocha.utils + * @param {string} filepath - Base path to start searching from. + * @param {string[]} [extensions=[]] - File extensions to look for. + * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. + * @return {string[]} An array of paths. + * @throws {Error} if no files match pattern. + * @throws {TypeError} if `filepath` is directory and `extensions` not provided. + */ +module.exports = function lookupFiles(filepath, extensions, recursive) { + extensions = extensions || []; + recursive = recursive || false; + var files = []; + var stat; + + if (!fs.existsSync(filepath)) { + var pattern; + if (glob.hasMagic(filepath)) { + // Handle glob as is without extensions + pattern = filepath; + } else { + // glob pattern e.g. 'filepath+(.js|.ts)' + var strExtensions = extensions + .map(function(v) { + return '.' + v; + }) + .join('|'); + pattern = filepath + '+(' + strExtensions + ')'; + } + files = glob.sync(pattern, {nodir: true}); + if (!files.length) { + throw createNoFilesMatchPatternError( + 'Cannot find any files matching pattern ' + dQuote(filepath), + filepath + ); + } + return files; + } + + // Handle file + try { + stat = fs.statSync(filepath); + if (stat.isFile()) { + return filepath; + } + } catch (err) { + // ignore error + return; + } + + // Handle directory + fs.readdirSync(filepath).forEach(function(dirent) { + var pathname = path.join(filepath, dirent); + var stat; + + try { + stat = fs.statSync(pathname); + if (stat.isDirectory()) { + if (recursive) { + files = files.concat(lookupFiles(pathname, extensions, recursive)); + } + return; + } + } catch (err) { + // ignore error + return; + } + if (!extensions.length) { + throw createMissingArgumentError( + format( + 'Argument %s required when argument %s is a directory', + sQuote('extensions'), + sQuote('filepath') + ), + 'extensions', + 'array' + ); + } + + if ( + !stat.isFile() || + !hasMatchingExtname(pathname, extensions) || + isHiddenOnUnix(pathname) + ) { + return; + } + files.push(pathname); + }); + + return files; +}; diff --git a/lib/reporters/base.js b/lib/reporters/base.js index aeca18f345..7d9e01c00a 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -6,15 +6,24 @@ * Module dependencies. */ -var tty = require('tty'); var diff = require('diff'); var milliseconds = require('ms'); var utils = require('../utils'); -var supportsColor = utils.isBrowser() ? null : require('supports-color'); +var supportsColor = require('supports-color'); var constants = require('../runner').constants; var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; +var isBrowser = require('../utils').isBrowser; + +function getBrowserWindowSize() { + if ('innerHeight' in global) { + return [global.innerHeight, global.innerWidth]; + } + // In a Web Worker, the DOM Window is not available. + return [640, 480]; +} + /** * Expose `Base`. */ @@ -25,7 +34,7 @@ exports = module.exports = Base; * Check if both stdio streams are associated with a tty. */ -var isatty = process.stdout.isTTY && process.stderr.isTTY; +var isatty = isBrowser ? true : process.stdout.isTTY && process.stderr.isTTY; /** * Save log references to avoid tests interfering (see GH-3604). @@ -120,9 +129,11 @@ exports.window = { }; if (isatty) { - exports.window.width = process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1]; + if (isBrowser) { + exports.window.width = getBrowserWindowSize()[1]; + } else { + exports.window.width = process.stdout.getWindowSize(1)[0]; + } } /** diff --git a/lib/utils.js b/lib/utils.js index e09322b9ee..fa26ad609a 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -9,14 +9,9 @@ * Module dependencies. */ -var fs = require('fs'); var path = require('path'); var util = require('util'); -var glob = require('glob'); var he = require('he'); -var errors = require('./errors'); -var createNoFilesMatchPatternError = errors.createNoFilesMatchPatternError; -var createMissingArgumentError = errors.createMissingArgumentError; var assign = (exports.assign = require('object.assign').getPolyfill()); @@ -96,67 +91,6 @@ exports.clean = function(str) { return str.trim(); }; -/** - * Parse the given `qs`. - * - * @private - * @param {string} qs - * @return {Object} - */ -exports.parseQuery = function(qs) { - return qs - .replace('?', '') - .split('&') - .reduce(function(obj, pair) { - var i = pair.indexOf('='); - var key = pair.slice(0, i); - var val = pair.slice(++i); - - // Due to how the URLSearchParams API treats spaces - obj[key] = decodeURIComponent(val.replace(/\+/g, '%20')); - - return obj; - }, {}); -}; - -/** - * Highlight the given string of `js`. - * - * @private - * @param {string} js - * @return {string} - */ -function highlight(js) { - return js - .replace(//g, '>') - .replace(/\/\/(.*)/gm, '//$1') - .replace(/('.*?')/gm, '$1') - .replace(/(\d+\.\d+)/gm, '$1') - .replace(/(\d+)/gm, '$1') - .replace( - /\bnew[ \t]+(\w+)/gm, - 'new $1' - ) - .replace( - /\b(function|new|throw|return|var|if|else)\b/gm, - '$1' - ); -} - -/** - * Highlight the contents of tag `name`. - * - * @private - * @param {string} name - */ -exports.highlightTags = function(name) { - var code = document.getElementById('mocha').getElementsByTagName(name); - for (var i = 0, len = code.length; i < len; ++i) { - code[i].innerHTML = highlight(code[i].innerHTML); - } -}; - /** * If a value could have properties, and has none, this function is called, * which returns a string representation of the empty value. @@ -444,140 +378,6 @@ exports.canonicalize = function canonicalize(value, stack, typeHint) { return canonicalizedObj; }; -/** - * Determines if pathname has a matching file extension. - * - * @private - * @param {string} pathname - Pathname to check for match. - * @param {string[]} exts - List of file extensions (sans period). - * @return {boolean} whether file extension matches. - * @example - * hasMatchingExtname('foo.html', ['js', 'css']); // => false - */ -function hasMatchingExtname(pathname, exts) { - var suffix = path.extname(pathname).slice(1); - return exts.some(function(element) { - return suffix === element; - }); -} - -/** - * Determines if pathname would be a "hidden" file (or directory) on UN*X. - * - * @description - * On UN*X, pathnames beginning with a full stop (aka dot) are hidden during - * typical usage. Dotfiles, plain-text configuration files, are prime examples. - * - * @see {@link http://xahlee.info/UnixResource_dir/writ/unix_origin_of_dot_filename.html|Origin of Dot File Names} - * - * @private - * @param {string} pathname - Pathname to check for match. - * @return {boolean} whether pathname would be considered a hidden file. - * @example - * isHiddenOnUnix('.profile'); // => true - */ -function isHiddenOnUnix(pathname) { - return path.basename(pathname)[0] === '.'; -} - -/** - * Lookup file names at the given `path`. - * - * @description - * Filenames are returned in _traversal_ order by the OS/filesystem. - * **Make no assumption that the names will be sorted in any fashion.** - * - * @public - * @param {string} filepath - Base path to start searching from. - * @param {string[]} [extensions=[]] - File extensions to look for. - * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. - * @return {string[]} An array of paths. - * @throws {Error} if no files match pattern. - * @throws {TypeError} if `filepath` is directory and `extensions` not provided. - */ -exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { - extensions = extensions || []; - recursive = recursive || false; - var files = []; - var stat; - - if (!fs.existsSync(filepath)) { - var pattern; - if (glob.hasMagic(filepath)) { - // Handle glob as is without extensions - pattern = filepath; - } else { - // glob pattern e.g. 'filepath+(.js|.ts)' - var strExtensions = extensions - .map(function(v) { - return '.' + v; - }) - .join('|'); - pattern = filepath + '+(' + strExtensions + ')'; - } - files = glob.sync(pattern, {nodir: true}); - if (!files.length) { - throw createNoFilesMatchPatternError( - 'Cannot find any files matching pattern ' + exports.dQuote(filepath), - filepath - ); - } - return files; - } - - // Handle file - try { - stat = fs.statSync(filepath); - if (stat.isFile()) { - return filepath; - } - } catch (err) { - // ignore error - return; - } - - // Handle directory - fs.readdirSync(filepath).forEach(function(dirent) { - var pathname = path.join(filepath, dirent); - var stat; - - try { - stat = fs.statSync(pathname); - if (stat.isDirectory()) { - if (recursive) { - files = files.concat(lookupFiles(pathname, extensions, recursive)); - } - return; - } - } catch (err) { - // ignore error - return; - } - if (!extensions.length) { - throw createMissingArgumentError( - util.format( - 'Argument %s required when argument %s is a directory', - exports.sQuote('extensions'), - exports.sQuote('filepath') - ), - 'extensions', - 'array' - ); - } - - if ( - !stat.isFile() || - !hasMatchingExtname(pathname, extensions) || - isHiddenOnUnix(pathname) - ) { - return; - } - files.push(pathname); - }); - - return files; -}; - /** * process.emitWarning or a polyfill * @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options diff --git a/package-lock.json b/package-lock.json index c5ce6ae7cb..98e6e513cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -314,6 +314,49 @@ "@babel/highlight": "^7.8.3" } }, + "@babel/compat-data": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", + "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001081", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", + "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.469", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", + "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "@babel/core": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", @@ -376,6 +419,536 @@ "source-map": "^0.5.0" } }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.1", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001081", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", + "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.469", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", + "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@babel/helper-function-name": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", @@ -396,7 +969,41 @@ "@babel/types": "^7.8.3" } }, - "@babel/helper-member-expression-to-functions": { + "@babel/helper-hoist-variables": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", + "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", @@ -411,97 +1018,2301 @@ "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", + "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", + "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", + "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", + "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-numeric-separator": "^7.10.1" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", + "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", + "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", + "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", + "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", + "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", + "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", + "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", + "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", + "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", + "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "@babel/plugin-transform-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" } }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "@babel/plugin-transform-template-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", + "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", + "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "@babel/preset-env": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/compat-data": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-dynamic-import": "^7.10.1", + "@babel/plugin-proposal-json-strings": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-private-methods": "^7.10.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.1", + "@babel/plugin-transform-arrow-functions": "^7.10.1", + "@babel/plugin-transform-async-to-generator": "^7.10.1", + "@babel/plugin-transform-block-scoped-functions": "^7.10.1", + "@babel/plugin-transform-block-scoping": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.1", + "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-destructuring": "^7.10.1", + "@babel/plugin-transform-dotall-regex": "^7.10.1", + "@babel/plugin-transform-duplicate-keys": "^7.10.1", + "@babel/plugin-transform-exponentiation-operator": "^7.10.1", + "@babel/plugin-transform-for-of": "^7.10.1", + "@babel/plugin-transform-function-name": "^7.10.1", + "@babel/plugin-transform-literals": "^7.10.1", + "@babel/plugin-transform-member-expression-literals": "^7.10.1", + "@babel/plugin-transform-modules-amd": "^7.10.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-umd": "^7.10.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.10.1", + "@babel/plugin-transform-object-super": "^7.10.1", + "@babel/plugin-transform-parameters": "^7.10.1", + "@babel/plugin-transform-property-literals": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-reserved-words": "^7.10.1", + "@babel/plugin-transform-shorthand-properties": "^7.10.1", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/plugin-transform-sticky-regex": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-typeof-symbol": "^7.10.1", + "@babel/plugin-transform-unicode-escapes": "^7.10.1", + "@babel/plugin-transform-unicode-regex": "^7.10.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.2", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001081", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", + "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.469", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", + "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } }, "@babel/runtime": { "version": "7.9.2", @@ -658,6 +3469,69 @@ "fastq": "^1.6.0" } }, + "@rollup/plugin-babel": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", + "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@rollup/pluginutils": "^3.0.8" + } + }, + "@rollup/plugin-commonjs": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", + "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.0", + "estree-walker": "^1.0.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" + } + }, + "@rollup/plugin-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.0.2.tgz", + "integrity": "sha512-t4zJMc98BdH42mBuzjhQA7dKh0t4vMJlUka6Fz0c+iO5IVnWaEMiYBy1uBj9ruHZzXBW23IPDGL9oCzBkQ9Udg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.4" + } + }, + "@rollup/plugin-multi-entry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-multi-entry/-/plugin-multi-entry-3.0.1.tgz", + "integrity": "sha512-Gcp9E8y68Kx+Jo8zy/ZpiiAkb0W01cSqnxOz6h9bPR7MU3gaoTEdRf7xXYplwli1SBFEswXX588ESj+50Brfxw==", + "dev": true, + "requires": { + "matched": "^1.0.2" + } + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz", + "integrity": "sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.6", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + } + }, + "@rollup/pluginutils": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.8.tgz", + "integrity": "sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==", + "dev": true, + "requires": { + "estree-walker": "^1.0.1" + } + }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -739,6 +3613,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -786,6 +3666,15 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -820,6 +3709,23 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "dev": true, + "requires": { + "xtend": "~3.0.0" + }, + "dependencies": { + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1695,6 +4601,12 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "dev": true + }, "async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", @@ -1803,6 +4715,15 @@ "resolve": "^1.12.0" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -1811,6 +4732,14 @@ "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + } } }, "babel-types": { @@ -2605,28 +5534,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -2637,14 +5566,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -2655,42 +5584,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, + "resolved": "", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, + "resolved": "", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -2700,28 +5629,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, + "resolved": "", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -2731,14 +5660,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -2755,7 +5684,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, + "resolved": "", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -2770,14 +5699,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -2787,7 +5716,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -2797,7 +5726,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -2808,21 +5737,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -2832,14 +5761,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -2849,14 +5778,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, + "resolved": "", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, + "resolved": "", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -2867,7 +5796,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -2877,7 +5806,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, + "resolved": "", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -2887,14 +5816,14 @@ }, "ms": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -2906,7 +5835,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, + "resolved": "", "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -2925,7 +5854,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -2936,7 +5865,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -2946,14 +5875,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, + "resolved": "", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -2965,7 +5894,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -2978,21 +5907,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -3002,21 +5931,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -3027,21 +5956,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -3054,7 +5983,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, + "resolved": "", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -3070,7 +5999,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -3080,49 +6009,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -3134,7 +6063,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -3144,7 +6073,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -3154,14 +6083,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, + "resolved": "", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -3177,14 +6106,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -3194,14 +6123,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -3536,11 +6465,16 @@ "safe-buffer": "^5.1.2" } }, - "browserify-package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", - "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=", - "dev": true + "browserify-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", + "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", + "dev": true, + "requires": { + "level-filesystem": "^1.0.1", + "level-js": "^2.1.3", + "levelup": "^0.18.2" + } }, "browserify-rsa": { "version": "4.0.1", @@ -3632,6 +6566,12 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-es6": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", + "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -3650,6 +6590,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -4205,6 +7151,12 @@ } } }, + "clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", + "dev": true + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -4652,11 +7604,23 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } }, "core-util-is": { "version": "1.0.2", @@ -5238,6 +8202,15 @@ } } }, + "deferred-leveldown": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", + "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", + "dev": true, + "requires": { + "abstract-leveldown": "~0.12.1" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -5308,6 +8281,35 @@ "rimraf": "^2.2.8" }, "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -6009,6 +9011,12 @@ "esprima": "^4.0.1" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6591,6 +9599,12 @@ "integrity": "sha1-0yOky15awzHOoDNBOpJT4WQ+B8Q=", "dev": true }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -6811,6 +9825,15 @@ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -7234,6 +10257,12 @@ "for-in": "^1.0.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -7365,6 +10394,41 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "fwd-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26-4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "gather-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", @@ -7731,43 +10795,47 @@ "ini": "^1.3.4" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "isexe": "^2.0.0" } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true } } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "gm-papandreou": { "version": "1.23.0-patch1", "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", @@ -7997,6 +11065,26 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "dev": true, + "requires": { + "is-glob": "^3.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -8125,12 +11213,6 @@ } } }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", - "dev": true - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8153,6 +11235,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -8469,6 +11560,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "idb-wrapper": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", + "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", + "dev": true + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -8784,6 +11881,15 @@ "p-is-promise": "^1.1.0" } }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -8796,6 +11902,12 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, + "is": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "dev": true + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -9043,6 +12155,12 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -9154,6 +12272,15 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, + "is-reference": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", + "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } + }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -9243,6 +12370,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, "is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -9288,6 +12421,12 @@ "buffer-alloc": "^1.2.0" } }, + "isbuffer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", + "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9372,6 +12511,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -9523,12 +12668,6 @@ "nopt": "~4.0.1" } }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -9882,20 +13021,6 @@ } } }, - "karma-browserify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-7.0.0.tgz", - "integrity": "sha512-SLgh1dmF2eZEj3glrmTD2CMJRGZwEiKA6k2hBr2+2JDC4JMU1dlsvBKpV66Lvi/tbj3H9qA+Vl/FdIcfPRrJpA==", - "dev": true, - "requires": { - "convert-source-map": "^1.1.3", - "hat": "^0.0.3", - "js-string-escape": "^1.0.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.0", - "os-shim": "^0.1.3" - } - }, "karma-chrome-launcher": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", @@ -10039,6 +13164,262 @@ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, + "level-blobs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", + "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "dev": true, + "requires": { + "level-peek": "1.0.6", + "once": "^1.3.0", + "readable-stream": "^1.0.26-4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "level-filesystem": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", + "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", + "dev": true, + "requires": { + "concat-stream": "^1.4.4", + "errno": "^0.1.1", + "fwd-stream": "^1.0.4", + "level-blobs": "^0.1.7", + "level-peek": "^1.0.6", + "level-sublevel": "^5.2.0", + "octal": "^1.0.0", + "once": "^1.3.0", + "xtend": "^2.2.0" + }, + "dependencies": { + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true + } + } + }, + "level-fix-range": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", + "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", + "dev": true + }, + "level-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", + "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", + "dev": true, + "requires": { + "string-range": "~1.2" + } + }, + "level-js": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", + "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", + "dev": true, + "requires": { + "abstract-leveldown": "~0.12.0", + "idb-wrapper": "^1.5.0", + "isbuffer": "~0.0.0", + "ltgt": "^2.1.2", + "typedarray-to-buffer": "~1.0.0", + "xtend": "~2.1.2" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", + "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "level-peek": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", + "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", + "dev": true, + "requires": { + "level-fix-range": "~1.0.2" + } + }, + "level-sublevel": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", + "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", + "dev": true, + "requires": { + "level-fix-range": "2.0", + "level-hooks": ">=4.4.0 <5", + "string-range": "~1.2.1", + "xtend": "~2.0.4" + }, + "dependencies": { + "is-object": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", + "dev": true + }, + "level-fix-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", + "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "dev": true, + "requires": { + "clone": "~0.1.9" + } + }, + "object-keys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "dev": true, + "requires": { + "foreach": "~2.0.1", + "indexof": "~0.0.1", + "is": "~0.2.6" + } + }, + "xtend": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "dev": true, + "requires": { + "is-object": "~0.1.2", + "object-keys": "~0.2.0" + } + } + } + }, + "levelup": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", + "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", + "dev": true, + "requires": { + "bl": "~0.8.1", + "deferred-leveldown": "~0.2.0", + "errno": "~0.1.1", + "prr": "~0.0.0", + "readable-stream": "~1.0.26", + "semver": "~2.3.1", + "xtend": "~3.0.0" + }, + "dependencies": { + "bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -10879,6 +14260,15 @@ "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -10923,12 +14313,27 @@ "yallist": "^2.1.2" } }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, "luxon": { "version": "1.23.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.23.0.tgz", "integrity": "sha512-+6a/bXsCWrrR8vfbL41iM92es12zwV2Rum/KPkT+ubOZnnU3Sqbqok/FmD1xsWlWN2Y9Hu0fU/vNgU24ns7bpA==", "dev": true }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "magicpen": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-6.2.1.tgz", @@ -11187,6 +14592,20 @@ "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, + "matched": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", + "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.1", + "glob": "^7.1.2", + "has-glob": "^1.0.0", + "is-valid-glob": "^1.0.0", + "resolve-dir": "^1.0.0" + } + }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -11672,6 +15091,12 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -12399,6 +15824,11 @@ "strip-ansi": "^6.0.0" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -12575,6 +16005,12 @@ "has": "^1.0.3" } }, + "octal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", + "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -12601,6 +16037,15 @@ "mimic-fn": "^2.1.0" } }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", @@ -12724,12 +16169,6 @@ "lcid": "^1.0.0" } }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -12963,6 +16402,12 @@ "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", "dev": true }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -14218,12 +17663,24 @@ "clipboard": "^2.0.0" } }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, + "process-es6": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", + "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14509,6 +17966,15 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -14759,12 +18225,37 @@ "strip-indent": "^1.0.1" } }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -14781,6 +18272,20 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", @@ -14800,6 +18305,29 @@ "rc": "^1.0.1" } }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -14981,6 +18509,12 @@ "psl": "^1.1.28", "punycode": "^2.1.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -15056,6 +18590,16 @@ "path-parse": "^1.0.6" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -15188,6 +18732,236 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.2.tgz", + "integrity": "sha512-tivFM8UXBlYOUqpBYD3pRktYpZvK/eiCQ190eYlrAyrpE/lzkyG2gbawroNdbwmzyUc7Y4eT297xfzv0BDh9qw==", + "dev": true, + "requires": { + "fsevents": "~2.1.2" + } + }, + "rollup-plugin-node-builtins": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", + "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=", + "dev": true, + "requires": { + "browserify-fs": "^1.0.0", + "buffer-es6": "^4.9.2", + "crypto-browserify": "^3.11.0", + "process-es6": "^0.11.2" + } + }, + "rollup-plugin-node-globals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz", + "integrity": "sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "buffer-es6": "^4.9.3", + "estree-walker": "^0.5.2", + "magic-string": "^0.22.5", + "process-es6": "^0.11.6", + "rollup-pluginutils": "^2.3.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "^0.2.2" + } + } + } + }, + "rollup-plugin-visualizer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-3.3.2.tgz", + "integrity": "sha512-jAJxpC97jHoWU5mQkGw5MroguV8fbZsLPxdV7MdE/fX7lAR+t1UDLpSH41rqdxyJCtqi2/UoDOBuADCyZdHaYA==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "nanoid": "^2.1.6", + "open": "^6.0.0", + "pupa": "^2.0.0", + "source-map": "^0.7.3", + "yargs": "^15.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, "run-async": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", @@ -16267,6 +20041,12 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -16632,6 +20412,12 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, + "string-range": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", + "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -17129,6 +20915,14 @@ "requires": { "temp-dir": "^1.0.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "term-size": { @@ -17675,6 +21469,34 @@ "xtend": "^4.0.0" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, "unified": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", @@ -18018,9 +21840,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true }, "v8-compile-cache": { @@ -18091,6 +21913,12 @@ "unist-util-stringify-position": "^2.0.0" } }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -18235,28 +22063,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -18267,14 +22095,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -18285,42 +22113,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, + "resolved": "", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, + "resolved": "", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -18330,28 +22158,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, + "resolved": "", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -18361,14 +22189,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -18385,7 +22213,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, + "resolved": "", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -18400,14 +22228,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -18417,7 +22245,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -18427,7 +22255,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -18438,21 +22266,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -18462,14 +22290,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -18479,14 +22307,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, + "resolved": "", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, + "resolved": "", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -18497,7 +22325,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -18507,7 +22335,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, + "resolved": "", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -18517,14 +22345,14 @@ }, "ms": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -18536,7 +22364,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, + "resolved": "", "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -18555,7 +22383,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -18566,7 +22394,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -18576,14 +22404,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, + "resolved": "", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -18595,7 +22423,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -18608,21 +22436,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -18632,21 +22460,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -18657,21 +22485,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -18684,7 +22512,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, + "resolved": "", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -18700,7 +22528,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -18710,49 +22538,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -18764,7 +22592,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -18774,7 +22602,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -18784,14 +22612,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, + "resolved": "", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -18807,14 +22635,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -18824,14 +22652,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true diff --git a/package-scripts.js b/package-scripts.js index f62540ba17..71418cf198 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -34,21 +34,7 @@ function test(testName, mochaParams) { module.exports = { scripts: { build: { - script: `browserify -e browser-entry.js \ - --plugin ./scripts/dedefine \ - --ignore 'chokidar' \ - --ignore 'fs' \ - --ignore 'glob' \ - --ignore 'path' \ - --ignore 'supports-color' \ - --ignore './lib/cli/*.js' \ - --ignore './lib/esm-utils.js' \ - --ignore './lib/nodejs/serializer.js' \ - --ignore './lib/nodejs/parallel-buffered-runner.js' \ - --ignore './lib/nodejs/reporters/parallel-buffered.js' \ - --ignore './lib/nodejs/worker.js' \ - --ignore './lib/nodejs/buffered-worker-pool.js' \ - -o mocha.js`, + script: `rollup -c`, description: 'Build browser bundle' }, lint: { diff --git a/package.json b/package.json index a111b14dcb..ced7c8dc28 100644 --- a/package.json +++ b/package.json @@ -80,12 +80,16 @@ "devDependencies": { "@11ty/eleventy": "^0.10.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", + "@babel/preset-env": "^7.10.2", "@mocha/docdash": "^2.1.3", + "@rollup/plugin-babel": "^5.0.3", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-json": "^4.0.2", + "@rollup/plugin-multi-entry": "^3.0.1", + "@rollup/plugin-node-resolve": "^7.1.1", "assetgraph-builder": "^8.0.1", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", - "browserify": "^16.5.0", - "browserify-package-json": "^1.0.1", "chai": "^4.2.0", "coffee-script": "^1.12.7", "coveralls": "^3.0.11", @@ -106,7 +110,6 @@ "image-size": "^0.8.3", "jsdoc": "^3.6.3", "karma": "^4.4.1", - "karma-browserify": "^7.0.0", "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", @@ -128,6 +131,10 @@ "remark-inline-links": "^3.1.3", "rewiremock": "^3.14.1", "rimraf": "^3.0.2", + "rollup": "^2.10.2", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", + "rollup-plugin-visualizer": "^3.3.2", "sinon": "^9.0.1", "strip-ansi": "^6.0.0", "svgo": "^1.3.2", @@ -137,6 +144,7 @@ "unexpected-eventemitter": "^2.2.0", "unexpected-sinon": "^10.11.2", "uslug": "^1.0.4", + "uuid": "^8.0.0", "watchify": "^3.11.1" }, "files": [ @@ -146,21 +154,14 @@ "index.js", "mocha.css", "mocha.js", + "mocha.js.map", "browser-entry.js" ], - "browserify": { - "transform": [ - "./scripts/package-json-cullify" - ] - }, "browser": { "./index.js": "./browser-entry.js", "./lib/nodejs/growl.js": "./lib/browser/growl.js", - "tty": "./lib/browser/tty.js", - "./lib/cli/*.js": false, - "chokidar": false, + "./lib/esm-utils.js": false, "fs": false, - "glob": false, "path": false, "supports-color": false, "./lib/nodejs/serializer.js": false, diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000000..dba97e38bb --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,43 @@ +import commonjs from '@rollup/plugin-commonjs'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import json from '@rollup/plugin-json'; +import builtins from 'rollup-plugin-node-builtins'; +import globals from 'rollup-plugin-node-globals'; + +import {babel} from '@rollup/plugin-babel'; + +// Debugging tools +import visualizer from 'rollup-plugin-visualizer'; + +import pickFromPackageJson from './scripts/pick-from-package-json'; + +const config = { + input: './browser-entry.js', + output: [ + { + file: './mocha.js', + format: 'iife', + sourcemap: true + } + ], + + plugins: [ + json(), + pickFromPackageJson({ + keys: ['name', 'version', 'homepage', 'notifyLogo'] + }), + commonjs(), + globals(), + builtins(), + nodeResolve({ + browser: true + }), + babel({presets: ['@babel/preset-env'], babelHelpers: 'bundled'}) + ] +}; + +if (!process.env.CI) { + config.plugins.push(visualizer()); +} + +export default config; diff --git a/scripts/dedefine.js b/scripts/dedefine.js deleted file mode 100644 index e563c629bf..0000000000 --- a/scripts/dedefine.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/** - * This is a transform stream we're using to strip AMD calls from - * dependencies in our Browserify bundle. - */ - -const through = require('through2'); -const defineRx = /typeof\s+define\s*===?\s*['"]function['"]\s*&&\s*(?:define\.amd|typeof\s+define\.amd\s*===?\s*['"]object['"]\s*&&\s*define\.amd)/g; -function createStream() { - return through.obj(function(chunk, enc, next) { - this.push(String(chunk).replace(defineRx, 'false')); - next(); - }); -} - -module.exports = b => { - const wrap = () => { - b.pipeline.get('wrap').push(createStream()); - }; - - b.on('reset', wrap); - wrap(); -}; diff --git a/scripts/karma-rollup-plugin.js b/scripts/karma-rollup-plugin.js new file mode 100644 index 0000000000..5d9e80ab24 --- /dev/null +++ b/scripts/karma-rollup-plugin.js @@ -0,0 +1,151 @@ +'use strict'; + +/** + * This Karma plugin bundles all test files into a single file for browser + * testing. + * + * The plugin reads the file configuration from your Karma config and replaces + * them with a single bundle file instead. This is done by creating a rollup + * bundle file at a new path, then replacing all input file glob patterns with + * the bundle file. Then a bundle processor transform is added to handle that + * specific new file. The bundle preprocessor is the one actually calling + * rollup with a modified config that allows for multiple entry points for a + * single output bundle. + * + * This is am implementation that specifically solves Mocha's use case. It + * does not support watch mode. It is possible that is coulkd eventually be + * made reusable with more work and actual testing. + * + * We do not use karma-rollup-preprocessor because at the time of + * implementation it had a behavior where each individual file gets bundled + * separately with no deduplication of dependencies across bundles. This makes + * the operation slow to a point where it is actively blocking a responsive + * feedback loop in development. + * See issue at https://github.com/jlmakes/karma-rollup-preprocessor/issues/49 + * + * This plugin was based on the architecture of + * https://www.npmjs.com/package/karma-browserify in order to achieve the + * behavior where all input files get bundled into a single file. The code has + * been modified heavily to simplify and support rollup instead of browserify. + */ + +const os = require('os'); +const fs = require('fs'); +const path = require('path'); +const uuid = require('uuid'); +const rollup = require('rollup'); +const glob = require('glob'); +const minimatch = require('minimatch'); +const loadConfigFile = require('rollup/dist/loadConfigFile'); +const multiEntry = require('@rollup/plugin-multi-entry'); + +const fileMap = new Map(); + +/** + * The rollup framework that creates the initial logger and bundle file + * as well as prepends the bundle file to the karma file configuration. + */ +function framework(fileConfigs, pluginConfig, basePath, preprocessors) { + const includePatterns = pluginConfig.include.map(pattern => + path.resolve(basePath, pattern) + ); + + const bundlePatterns = fileConfigs + .map(fileConfig => fileConfig.pattern) + .filter(filePath => + includePatterns.some(includePattern => + minimatch(filePath, includePattern) + ) + ); + + const bundleFiles = [ + ...new Set(bundlePatterns.map(pattern => glob.sync(pattern)).flat()) + ]; + + let bundleLocation = pluginConfig.bundlePath + ? pluginConfig.bundlePath + : path.resolve(os.tmpdir(), `${uuid.v4()}.rollup.js`); + if (process.platform === 'win32') { + bundleLocation = bundleLocation.replace(/\\/g, '/'); + } + + fs.closeSync(fs.openSync(bundleLocation, 'w')); + preprocessors[bundleLocation] = ['rollup']; + + // Save file mapping for later + fileMap.set(bundleLocation, bundleFiles); + + // Remove all file match patterns that were included in bundle + // And inject the bundle in their place. + // Need to use array mutation, otherwise Karma ignores us + let bundleInjected = false; + for (const bundlePattern of bundlePatterns) { + const idx = fileConfigs.findIndex(({pattern}) => pattern === bundlePattern); + + if (idx > -1) { + if (bundleInjected) { + fileConfigs.splice(idx, 1); + } else { + fileConfigs.splice(idx, 1, { + pattern: bundleLocation, + served: true, + included: true, + watched: true + }); + bundleInjected = true; + } + } + } +} + +framework.$inject = [ + 'config.files', + 'config.rollup', + 'config.basePath', + 'config.preprocessors' +]; + +/** + * A special preprocessor that builds the main rollup bundle once and + * passes the bundle contents through on all later preprocessing request. + */ +function bundlePreprocessor(config) { + const { + basePath, + rollup: {configFile} + } = config; + + const configPromise = loadConfigFile(path.resolve(basePath, configFile)); + + return async function(content, file, done) { + const {options, warnings} = await configPromise; + const plugins = options[0].plugins || []; + + warnings.flush(); + + const bundle = await rollup.rollup({ + input: fileMap.get(file.path), + plugins: [...plugins, multiEntry({exports: false})] + }); + + const {output} = await bundle.generate({ + sourcemap: true, + format: 'iife' + }); + + await bundle.write({ + file: file.path, + sourcemap: true, + format: 'iife' + }); + + done(null, output[0].code); + }; +} + +bundlePreprocessor.$inject = ['config']; + +module.exports = { + 'framework:rollup': ['factory', framework], + 'preprocessor:rollup': ['factory', bundlePreprocessor] +}; diff --git a/scripts/package-json-cullify.js b/scripts/package-json-cullify.js deleted file mode 100644 index 794b5efa56..0000000000 --- a/scripts/package-json-cullify.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -/** - * This is a transform stream used to cull "package.json" results - * when our source is transformed for our Browserify bundle. - * - * Based on Nolan Lawson's "package-json-versionify" package. - */ - -const browserifyPackageJSON = require('browserify-package-json'); - -module.exports = function(filename, options) { - const fieldsToKeep = ['name', 'version', 'homepage', 'notifyLogo']; - const bpjOptions = Object.assign(options || {}, {only: fieldsToKeep}); - - return browserifyPackageJSON(filename, bpjOptions); -}; diff --git a/scripts/pick-from-package-json.js b/scripts/pick-from-package-json.js new file mode 100644 index 0000000000..30db576db3 --- /dev/null +++ b/scripts/pick-from-package-json.js @@ -0,0 +1,28 @@ +/** + * This rollup plugin lets you pick specific fields you want to export + * for the specific case of importing a modules `package.json`. + * + * This helps reduce the file size of the resulting bundle. + * + * @param {object} options + * @param {string[]} options.keys List of keys to export from package.json + */ +export default function pickFromPackageJson({keys}) { + return { + name: 'pick-from-package-json', + load: id => { + if (id.endsWith('mocha/package.json')) { + const manifest = require(id); + + const result = {}; + + for (const key of keys) { + result[key] = manifest[key]; + } + + return {code: JSON.stringify(result)}; + } + return null; + } + }; +} diff --git a/test/browser-specific/mocha.opts b/test/browser-specific/mocha.opts deleted file mode 100644 index 8cbe156637..0000000000 --- a/test/browser-specific/mocha.opts +++ /dev/null @@ -1,6 +0,0 @@ -### -### mocha.opts -### - ---reporter html ---timeout 1000 diff --git a/test/integration/file-utils.spec.js b/test/integration/file-utils.spec.js index 8c48e4a826..9b8f86e79f 100644 --- a/test/integration/file-utils.spec.js +++ b/test/integration/file-utils.spec.js @@ -1,6 +1,6 @@ 'use strict'; -var utils = require('../../lib/utils'); +var lookupFiles = require('../../lib/cli/lookup-files'); var fs = require('fs'); var path = require('path'); var os = require('os'); @@ -22,14 +22,14 @@ describe('file utils', function() { } }); - describe('.lookupFiles', function() { + describe('lookupFiles', function() { it('should not return broken symlink file path', function() { if (!symlinkSupported) { return this.skip(); } expect( - utils.lookupFiles(tmpDir, ['js'], false), + lookupFiles(tmpDir, ['js'], false), 'to contain', tmpFile('mocha-utils-link.js'), tmpFile('mocha-utils.js') @@ -37,13 +37,13 @@ describe('file utils', function() { expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', true); fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob')); expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', false); - expect(utils.lookupFiles(tmpDir, ['js'], false), 'to equal', []); + expect(lookupFiles(tmpDir, ['js'], false), 'to equal', []); }); it('should accept a glob "path" value', function() { - var res = utils - .lookupFiles(tmpFile('mocha-utils*'), ['js'], false) - .map(path.normalize.bind(path)); + var res = lookupFiles(tmpFile('mocha-utils*'), ['js'], false).map( + path.normalize.bind(path) + ); var expectedLength = 0; var ex = expect(res, 'to contain', tmpFile('mocha-utils.js')); @@ -61,7 +61,7 @@ describe('file utils', function() { var nonJsFile = tmpFile('mocha-utils-text.txt'); fs.writeFileSync(nonJsFile, 'yippy skippy ying yang yow'); - var res = utils.lookupFiles(tmpDir, ['txt'], false); + var res = lookupFiles(tmpDir, ['txt'], false); expect(res, 'to contain', nonJsFile).and('to have length', 1); }); @@ -69,9 +69,9 @@ describe('file utils', function() { var TsFile = tmpFile('mocha-utils.ts'); fs.writeFileSync(TsFile, 'yippy skippy ying yang yow'); - var res = utils - .lookupFiles(tmpFile('mocha-utils'), ['js'], false) - .map(path.normalize.bind(path)); + var res = lookupFiles(tmpFile('mocha-utils'), ['js'], false).map( + path.normalize.bind(path) + ); expect(res, 'to contain', tmpFile('mocha-utils.js')).and( 'to have length', 1 @@ -82,9 +82,9 @@ describe('file utils', function() { var TsFile = tmpFile('mocha-utils.ts'); fs.writeFileSync(TsFile, 'yippy skippy ying yang yow'); - var res = utils - .lookupFiles(tmpFile('mocha-utils'), ['js', 'ts'], false) - .map(path.normalize.bind(path)); + var res = lookupFiles(tmpFile('mocha-utils'), ['js', 'ts'], false).map( + path.normalize.bind(path) + ); expect( res, 'to contain', @@ -95,7 +95,7 @@ describe('file utils', function() { it('should require the extensions parameter when looking up a file', function() { var dirLookup = function() { - return utils.lookupFiles(tmpFile('mocha-utils'), undefined, false); + return lookupFiles(tmpFile('mocha-utils'), undefined, false); }; expect(dirLookup, 'to throw', { name: 'Error', @@ -105,7 +105,7 @@ describe('file utils', function() { it('should require the extensions parameter when looking up a directory', function() { var dirLookup = function() { - return utils.lookupFiles(tmpDir, undefined, false); + return lookupFiles(tmpDir, undefined, false); }; expect(dirLookup, 'to throw', { name: 'TypeError', diff --git a/test/unit/parse-query.spec.js b/test/unit/parse-query.spec.js new file mode 100644 index 0000000000..c86e92dd1f --- /dev/null +++ b/test/unit/parse-query.spec.js @@ -0,0 +1,23 @@ +'use strict'; + +var parseQuery = require('../../lib/browser/parse-query'); + +describe('parseQuery()', function() { + it('should get queryString and return key-value object', function() { + expect(parseQuery('?foo=1&bar=2&baz=3'), 'to equal', { + foo: '1', + bar: '2', + baz: '3' + }); + + expect(parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*'), 'to equal', { + r1: '^@(?!.*\\)$)', + r2: 'm{2}', + r3: '^co.*' + }); + }); + + it('should parse "+" as a space', function() { + expect(parseQuery('?grep=foo+bar'), 'to equal', {grep: 'foo bar'}); + }); +}); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 2556820d33..6dcff87d18 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -561,27 +561,6 @@ describe('lib/utils', function() { }); }); - describe('parseQuery()', function() { - var parseQuery = utils.parseQuery; - it('should get queryString and return key-value object', function() { - expect(parseQuery('?foo=1&bar=2&baz=3'), 'to equal', { - foo: '1', - bar: '2', - baz: '3' - }); - - expect(parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*'), 'to equal', { - r1: '^@(?!.*\\)$)', - r2: 'm{2}', - r3: '^co.*' - }); - }); - - it('should parse "+" as a space', function() { - expect(parseQuery('?grep=foo+bar'), 'to equal', {grep: 'foo bar'}); - }); - }); - describe('isPromise()', function() { it('should return true if the value is Promise-ish', function() { expect( From 1392bc937c751e5d23ee26757f3dce4c742398c0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 1 Jul 2020 13:04:23 -0700 Subject: [PATCH 1531/1771] do not run production build on netlify for PRs - non-production builds will now publish from `docs/_site` - branches and production contexts will use production build - `npm start docs` now does _not_ run in production build - use `npm start docs.production` for production build - `scripts/netlify-headers.js` now requires a path - fixed duplicate message in `scripts/netlify-headers.js` - add `RUBY_VERSION` to netlify env --- netlify.toml | 7 ++++++- package-scripts.js | 8 ++++++-- scripts/netlify-headers.js | 13 ++++++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/netlify.toml b/netlify.toml index 521973cbaf..07c12162f8 100644 --- a/netlify.toml +++ b/netlify.toml @@ -10,7 +10,12 @@ [build] publish = "docs/_dist/" - command = "npm start docs" + command = "npm start docs.production" [build.environment] NODE_VERSION = "12" + RUBY_VERSION = "2.7.1" + +[context.deploy-preview] + command = "npm start docs" + publish = "docs/_site/" diff --git a/package-scripts.js b/package-scripts.js index 71418cf198..e4a98e4b14 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -274,9 +274,13 @@ module.exports = { docs: { default: { script: - 'nps docs.prebuild && nps docs.api && eleventy && nps docs.linkcheck && nps docs.postbuild', + 'nps docs.prebuild && nps docs.api && eleventy && nps docs.linkcheck && node scripts/netlify-headers.js docs/_site >> docs/_site/_headers', description: 'Build documentation' }, + production: { + script: 'nps docs && nps docs.postbuild', + description: 'Build docs for production' + }, prebuild: { script: 'rimraf docs/_dist docs/_site', description: 'Prepare system for doc building', @@ -288,7 +292,7 @@ module.exports = { }, postbuild: { script: - 'buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --svgo --inlinehtmlimage 9400 --inlinehtmlscript 0 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js >> docs/_dist/_headers', + 'buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --svgo --inlinehtmlimage 9400 --inlinehtmlscript 0 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js docs/_dist >> docs/_dist/_headers', description: 'Post-process docs after build', hiddenFromHelp: true }, diff --git a/scripts/netlify-headers.js b/scripts/netlify-headers.js index 4faae6f13d..b6ee59f2c2 100644 --- a/scripts/netlify-headers.js +++ b/scripts/netlify-headers.js @@ -2,6 +2,14 @@ const AssetGraph = require('assetgraph'); +const dest = process.argv[2]; + +if (!dest) { + console.error('usage: node netlify-headers.js '); + console.error('example: node netlify-headers.js docs/_dist'); + process.exit(1); +} + const headers = ['Content-Security-Policy']; const resourceHintTypeMap = { @@ -25,7 +33,7 @@ function getHeaderForRelation(rel) { console.error('Generating optimal netlify headers...'); -new AssetGraph({root: 'docs/_dist'}) +new AssetGraph({root: dest}) .loadAssets('*.html') .populate({ followRelations: {type: 'HtmlAnchor', crossorigin: false} @@ -112,8 +120,7 @@ new AssetGraph({root: 'docs/_dist'}) }); console.log(''); - - console.error('netlify headers done!'); }); + console.error('netlify headers done!'); }) .run(); From 7000336b40c8ac04f01aa43dd3fc3a0ad8379ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Tue, 7 Jul 2020 21:29:28 +0200 Subject: [PATCH 1532/1771] Reduce rollup noise (#4363) * Treat sinon as external in bundled tests * Silence circular dependency warnings in rollup * Let rollup deal with file globbing in karma-rollup-plugin * Update rollup and all plugins to avoid installation peer dependencies warning * Reuse more rollup config in karma-rollup-plugin --- karma.conf.js | 1 + package-lock.json | 2737 ++++++++++++++++---------------- package.json | 12 +- rollup.config.js | 9 +- scripts/karma-rollup-plugin.js | 28 +- 5 files changed, 1416 insertions(+), 1371 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 866671f7b6..ac65e5a578 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -141,6 +141,7 @@ module.exports = config => { } cfg.files.unshift( + require.resolve('sinon/pkg/sinon.js'), require.resolve('unexpected/unexpected'), {pattern: require.resolve('unexpected/unexpected.js.map'), included: false}, require.resolve('unexpected-sinon'), diff --git a/package-lock.json b/package-lock.json index 98e6e513cb..85e832440d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -315,9 +315,9 @@ } }, "@babel/compat-data": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", - "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", + "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", "dev": true, "requires": { "browserslist": "^4.12.0", @@ -326,27 +326,33 @@ }, "dependencies": { "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "caniuse-lite": { - "version": "1.0.30001081", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", - "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "version": "1.0.30001093", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", + "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", "dev": true }, "electron-to-chromium": { - "version": "1.3.469", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", - "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "version": "1.3.488", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", + "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, "semver": { @@ -420,27 +426,27 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", - "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -454,28 +460,28 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", - "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -489,12 +495,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", - "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.1", + "@babel/compat-data": "^7.10.4", "browserslist": "^4.12.0", "invariant": "^2.2.4", "levenary": "^1.1.1", @@ -502,27 +508,33 @@ }, "dependencies": { "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "caniuse-lite": { - "version": "1.0.30001081", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", - "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "version": "1.0.30001093", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", + "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", "dev": true }, "electron-to-chromium": { - "version": "1.3.469", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", - "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "version": "1.3.488", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", + "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, "semver": { @@ -534,157 +546,157 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", - "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz", + "integrity": "sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -707,97 +719,97 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", - "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-regex": "^7.10.1", + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", - "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", + "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -811,123 +823,123 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", - "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", "dev": true, "requires": { - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -970,27 +982,27 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", - "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1046,141 +1058,141 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", - "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", + "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", - "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1240,125 +1252,125 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", - "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1409,115 +1421,115 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", - "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", + "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", - "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", - "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", - "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", - "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", - "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-numeric-separator": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", - "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.1" + "@babel/plugin-transform-parameters": "^7.10.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", - "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", - "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", - "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", - "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-async-generators": { @@ -1530,12 +1542,12 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", - "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1566,12 +1578,12 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", - "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -1602,56 +1614,56 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", - "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", - "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", - "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1665,178 +1677,178 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", - "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", - "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", + "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", - "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1859,141 +1871,141 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", - "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", - "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", - "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", - "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", - "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", - "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", - "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2007,206 +2019,206 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", - "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", - "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", - "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", + "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2229,189 +2241,189 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", - "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2434,189 +2446,189 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", - "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", + "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.1", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2639,187 +2651,187 @@ } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", - "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2842,171 +2854,171 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", - "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", - "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -3029,37 +3041,37 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", - "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", + "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -3073,163 +3085,163 @@ } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", - "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", - "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", - "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", - "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", - "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-regex": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", - "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", + "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", - "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", - "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", - "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", + "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.1", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.1", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.1", - "@babel/plugin-transform-arrow-functions": "^7.10.1", - "@babel/plugin-transform-async-to-generator": "^7.10.1", - "@babel/plugin-transform-block-scoped-functions": "^7.10.1", - "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", - "@babel/plugin-transform-destructuring": "^7.10.1", - "@babel/plugin-transform-dotall-regex": "^7.10.1", - "@babel/plugin-transform-duplicate-keys": "^7.10.1", - "@babel/plugin-transform-exponentiation-operator": "^7.10.1", - "@babel/plugin-transform-for-of": "^7.10.1", - "@babel/plugin-transform-function-name": "^7.10.1", - "@babel/plugin-transform-literals": "^7.10.1", - "@babel/plugin-transform-member-expression-literals": "^7.10.1", - "@babel/plugin-transform-modules-amd": "^7.10.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", - "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.10.1", - "@babel/plugin-transform-object-super": "^7.10.1", - "@babel/plugin-transform-parameters": "^7.10.1", - "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", - "@babel/plugin-transform-reserved-words": "^7.10.1", - "@babel/plugin-transform-shorthand-properties": "^7.10.1", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", - "@babel/plugin-transform-typeof-symbol": "^7.10.1", - "@babel/plugin-transform-unicode-escapes": "^7.10.1", - "@babel/plugin-transform-unicode-regex": "^7.10.1", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.4", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -3238,53 +3250,59 @@ }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "caniuse-lite": { - "version": "1.0.30001081", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", - "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", + "version": "1.0.30001093", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", + "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", "dev": true }, "electron-to-chromium": { - "version": "1.3.469", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.469.tgz", - "integrity": "sha512-O9JM6ZsFhS0uy0S2Y3G8EoNfqio3srdxCuwuJh8tKgQKa6rf7je/xQ3TIoiEaEtpf2/qFFLAGt/xB4MjuUZqRw==", + "version": "1.3.488", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", + "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, "semver": { @@ -3470,9 +3488,9 @@ } }, "@rollup/plugin-babel": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", - "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.4.tgz", + "integrity": "sha512-MBtNoi5gqBEbqy1gE9jZBfPsi10kbuK2CEu9bx53nk1Z3ATRvBOoZ/GsbhXOeVbS76xXi/DeYM+vYX6EGIDv9A==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.7.4", @@ -3480,25 +3498,27 @@ } }, "@rollup/plugin-commonjs": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", - "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.0.tgz", + "integrity": "sha512-Anxc3qgkAi7peAyesTqGYidG5GRim9jtg8xhmykNaZkImtvjA7Wsqep08D2mYsqw1IF7rA3lYfciLgzUSgRoqw==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.0", + "@rollup/pluginutils": "^3.0.8", + "commondir": "^1.0.1", "estree-walker": "^1.0.1", + "glob": "^7.1.2", "is-reference": "^1.1.2", "magic-string": "^0.25.2", "resolve": "^1.11.0" } }, "@rollup/plugin-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.0.2.tgz", - "integrity": "sha512-t4zJMc98BdH42mBuzjhQA7dKh0t4vMJlUka6Fz0c+iO5IVnWaEMiYBy1uBj9ruHZzXBW23IPDGL9oCzBkQ9Udg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.4" + "@rollup/pluginutils": "^3.0.8" } }, "@rollup/plugin-multi-entry": { @@ -3511,25 +3531,29 @@ } }, "@rollup/plugin-node-resolve": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz", - "integrity": "sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.1.0.tgz", + "integrity": "sha512-ovq7ZM3JJYUUmEjjO+H8tnUdmQmdQudJB7xruX8LFZ1W2q8jXdPUS6SsIYip8ByOApu4RR7729Am9WhCeCMiHA==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.6", + "@rollup/pluginutils": "^3.0.8", "@types/resolve": "0.0.8", "builtin-modules": "^3.1.0", + "deep-freeze": "^0.0.1", + "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.14.2" } }, "@rollup/pluginutils": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.8.tgz", - "integrity": "sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { - "estree-walker": "^1.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" } }, "@samverschueren/stream-to-observable": { @@ -5534,28 +5558,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -5566,14 +5590,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -5584,42 +5608,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -5629,28 +5653,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -5660,14 +5684,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -5684,7 +5708,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -5699,14 +5723,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -5716,7 +5740,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -5726,7 +5750,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -5737,21 +5761,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -5761,14 +5785,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -5778,14 +5802,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -5796,7 +5820,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -5806,7 +5830,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -5816,14 +5840,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -5835,7 +5859,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -5854,7 +5878,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -5865,7 +5889,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -5875,14 +5899,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -5894,7 +5918,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -5907,21 +5931,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -5931,21 +5955,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -5956,21 +5980,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -5983,7 +6007,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -5999,7 +6023,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -6009,49 +6033,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -6063,7 +6087,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -6073,7 +6097,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -6083,14 +6107,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -6106,14 +6130,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -6123,14 +6147,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -8179,12 +8203,24 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -9011,6 +9047,12 @@ "esprima": "^4.0.1" } }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -12273,12 +12315,12 @@ "dev": true }, "is-reference": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", - "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { - "@types/estree": "0.0.39" + "@types/estree": "*" } }, "is-regex": { @@ -17663,12 +17705,6 @@ "clipboard": "^2.0.0" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -18247,13 +18283,12 @@ "dev": true }, "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" + "@babel/runtime": "^7.8.4" } }, "regex-not": { @@ -18733,9 +18768,9 @@ } }, "rollup": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.2.tgz", - "integrity": "sha512-tivFM8UXBlYOUqpBYD3pRktYpZvK/eiCQ190eYlrAyrpE/lzkyG2gbawroNdbwmzyUc7Y4eT297xfzv0BDh9qw==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.18.2.tgz", + "integrity": "sha512-+mzyZhL9ZyLB3eHBISxRNTep9Z2qCuwXzAYkUbFyz7yNKaKH03MFKeiGOS1nv2uvPgDb4ASKv+FiS5mC4h5IFQ==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -22063,28 +22098,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -22095,14 +22130,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -22113,42 +22148,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -22158,28 +22193,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -22189,14 +22224,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -22213,7 +22248,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -22228,14 +22263,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -22245,7 +22280,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -22255,7 +22290,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -22266,21 +22301,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -22290,14 +22325,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -22307,14 +22342,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -22325,7 +22360,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -22335,7 +22370,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -22345,14 +22380,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -22364,7 +22399,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -22383,7 +22418,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -22394,7 +22429,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -22404,14 +22439,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -22423,7 +22458,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -22436,21 +22471,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -22460,21 +22495,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -22485,21 +22520,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -22512,7 +22547,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -22528,7 +22563,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -22538,49 +22573,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -22592,7 +22627,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -22602,7 +22637,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -22612,14 +22647,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -22635,14 +22670,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -22652,14 +22687,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true diff --git a/package.json b/package.json index ced7c8dc28..a178cd873d 100644 --- a/package.json +++ b/package.json @@ -80,13 +80,13 @@ "devDependencies": { "@11ty/eleventy": "^0.10.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", - "@babel/preset-env": "^7.10.2", + "@babel/preset-env": "^7.10.4", "@mocha/docdash": "^2.1.3", - "@rollup/plugin-babel": "^5.0.3", - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-json": "^4.0.2", + "@rollup/plugin-babel": "^5.0.4", + "@rollup/plugin-commonjs": "^13.0.0", + "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-multi-entry": "^3.0.1", - "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-node-resolve": "^8.1.0", "assetgraph-builder": "^8.0.1", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", @@ -131,7 +131,7 @@ "remark-inline-links": "^3.1.3", "rewiremock": "^3.14.1", "rimraf": "^3.0.2", - "rollup": "^2.10.2", + "rollup": "^2.18.2", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-globals": "^1.4.0", "rollup-plugin-visualizer": "^3.3.2", diff --git a/rollup.config.js b/rollup.config.js index dba97e38bb..c03a2de9d9 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -33,7 +33,14 @@ const config = { browser: true }), babel({presets: ['@babel/preset-env'], babelHelpers: 'bundled'}) - ] + ], + + onwarn: (warning, warn) => { + if (warning.code === 'CIRCULAR_DEPENDENCY') return; + + // Use default for everything else + warn(warning); + } }; if (!process.env.CI) { diff --git a/scripts/karma-rollup-plugin.js b/scripts/karma-rollup-plugin.js index 5d9e80ab24..440dd943fc 100644 --- a/scripts/karma-rollup-plugin.js +++ b/scripts/karma-rollup-plugin.js @@ -34,7 +34,6 @@ const fs = require('fs'); const path = require('path'); const uuid = require('uuid'); const rollup = require('rollup'); -const glob = require('glob'); const minimatch = require('minimatch'); const loadConfigFile = require('rollup/dist/loadConfigFile'); const multiEntry = require('@rollup/plugin-multi-entry'); @@ -58,10 +57,6 @@ function framework(fileConfigs, pluginConfig, basePath, preprocessors) { ) ); - const bundleFiles = [ - ...new Set(bundlePatterns.map(pattern => glob.sync(pattern)).flat()) - ]; - let bundleLocation = pluginConfig.bundlePath ? pluginConfig.bundlePath : path.resolve(os.tmpdir(), `${uuid.v4()}.rollup.js`); @@ -73,7 +68,7 @@ function framework(fileConfigs, pluginConfig, basePath, preprocessors) { preprocessors[bundleLocation] = ['rollup']; // Save file mapping for later - fileMap.set(bundleLocation, bundleFiles); + fileMap.set(bundleLocation, bundlePatterns); // Remove all file match patterns that were included in bundle // And inject the bundle in their place. @@ -119,24 +114,31 @@ function bundlePreprocessor(config) { return async function(content, file, done) { const {options, warnings} = await configPromise; - const plugins = options[0].plugins || []; + const config = options[0]; + const plugins = config.plugins || []; warnings.flush(); const bundle = await rollup.rollup({ input: fileMap.get(file.path), - plugins: [...plugins, multiEntry({exports: false})] + plugins: [...plugins, multiEntry({exports: false})], + external: ['sinon'], + onwarn: config.onwarn }); - const {output} = await bundle.generate({ + const sharedOutputConfig = { sourcemap: true, - format: 'iife' - }); + format: 'iife', + globals: { + sinon: 'sinon' + } + }; + + const {output} = await bundle.generate(sharedOutputConfig); await bundle.write({ file: file.path, - sourcemap: true, - format: 'iife' + ...sharedOutputConfig }); done(null, output[0].code); From 7c8896c70faf58d942249190df1343f7349cf946 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 1 Jul 2020 15:20:56 -0700 Subject: [PATCH 1533/1771] fixes failure output in mocha init w/o target `yargs.exit()` is not always present, apparently. it will throw in this case--we don't need to be calling it anyway. --- lib/cli/cli.js | 2 +- test/integration/init.spec.js | 46 +++++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index 2e004ba4a3..ffbe5dada5 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -52,7 +52,7 @@ exports.main = (argv = process.argv.slice(2)) => { debug('caught error sometime before command handler: %O', err); yargs.showHelp(); console.error(`\n${symbols.error} ${ansi.red('ERROR:')} ${msg}`); - yargs.exit(1); + process.exitCode = 1; }) .help('help', 'Show usage information & exit') .alias('help', 'h') diff --git a/test/integration/init.spec.js b/test/integration/init.spec.js index 176b852c56..3961b27844 100644 --- a/test/integration/init.spec.js +++ b/test/integration/init.spec.js @@ -23,19 +23,39 @@ describe('init command', function() { } catch (ignored) {} }); - it('should break if no path supplied', function(done) { - invokeMocha( - ['init'], - function(err, result) { - if (err) { - return done(err); - } - expect(result, 'to have failed'); - expect(result.output, 'to match', /not enough non-option arguments/i); - done(); - }, - {stdio: 'pipe'} - ); + describe('when no path is supplied', function() { + it('should fail', function(done) { + invokeMocha( + ['init'], + function(err, result) { + if (err) { + return done(err); + } + expect( + result, + 'to have failed with output', + /not enough non-option arguments/i + ); + done(); + }, + {stdio: 'pipe'} + ); + }); + it('should not throw', function(done) { + invokeMocha( + ['init'], + function(err, result) { + if (err) { + return done(err); + } + expect(result, 'to have failed').and('not to satisfy', { + output: /throw/i + }); + done(); + }, + {stdio: 'pipe'} + ); + }); }); it('should create some files in the dest dir', function(done) { From 2d32246de032185297f5b4afd1136b850fefe065 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 10 Jul 2020 17:10:19 -0700 Subject: [PATCH 1534/1771] block more spammers using regexes - also update blocklist - make script executable outside of 11ty context, e.g., `node docs/_data/supporters.js` Signed-off-by: Christopher Hiller --- docs/_data/blocklist.json | 29 +++++------- docs/_data/supporters.js | 99 +++++++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 37 deletions(-) mode change 100644 => 100755 docs/_data/supporters.js diff --git a/docs/_data/blocklist.json b/docs/_data/blocklist.json index 12a1718602..36479d2a4a 100644 --- a/docs/_data/blocklist.json +++ b/docs/_data/blocklist.json @@ -1,23 +1,18 @@ [ "cheap-writing-service", - "emailmarketingservices-io", + "coin-master-free-spins", "device-tricks1", - "my-true-media", - "yiannakis-ttafounas-ttafounas", - "writerseperhour", - "casinotop-com", - "casino-topp", - "casinoutanreg", - "supercazino-ro", - "igor-noskov", - "blue-link-seo", - "casino-online", "domywriting", - "writemypaper4me", - "trust-my-paper", - "seowebsitetraffic-net", + "emailmarketingservices-io", + "hurtiglaan-nu", + "igor-noskov", + "mochajs", + "my-true-media", + "open-apk-file", "pfannen-test", - "casinobosscanada-com", - "suominettikasinot24", - "mochajs" + "thetoy", + "trust-my-paper", + "writemypaper4me", + "writerseperhour", + "yiannakis-ttafounas-ttafounas" ] diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js old mode 100644 new mode 100755 index 8e273d9b31..dd797aebbc --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -1,14 +1,39 @@ #!/usr/bin/env node + +/** + * This script gathers metdata for supporters of Mocha from OpenCollective's API by + * aggregating order ("donation") information. + * + * It's intended to be used with 11ty, but can be run directly. Running directly + * enables debug output. + * + * - gathers logo/avatar images (they are always pngs) + * - gathers links + * - sorts by total contributions and tier + * - validates images + * - writes images to a temp dir + * @see https://docs.opencollective.com/help/contributing/development/api + */ + 'use strict'; -const {mkdirSync} = require('fs'); -const {writeFile} = require('fs').promises; +const {writeFile, mkdir} = require('fs').promises; const {resolve} = require('path'); const debug = require('debug')('mocha:docs:data:supporters'); const needle = require('needle'); const imageSize = require('image-size'); const blocklist = new Set(require('./blocklist.json')); +/** + * In addition to the blocklist, any account slug matching this regex will not + * be displayed on the website. + */ +const BLOCKED_STRINGS = /(?:vpn|[ck]a[sz]ino|seo|slots|gambl(?:e|ing)|crypto)/i; + +/** + * The OC API endpoint + + */ const API_ENDPOINT = 'https://api.opencollective.com/graphql/v2'; const query = `query account($limit: Int, $offset: Int, $slug: String) { @@ -84,17 +109,20 @@ const getAllOrders = async (slug = 'mochajs') => { } }; -module.exports = async () => { +const isAllowed = ({slug}) => + !blocklist.has(slug) && !BLOCKED_STRINGS.test(slug); + +const getSupporters = async () => { const orders = await getAllOrders(); // Deduplicating supporters with multiple orders const uniqueSupporters = new Map(); const supporters = orders + // turn raw query result into a better data structure .map(nodeToSupporter) - .filter(supporter => !blocklist.has(supporter.slug)) + // aggregate total $ donated by unique supporter (using slug) .reduce((supporters, supporter) => { if (uniqueSupporters.has(supporter.slug)) { - // aggregate donation totals uniqueSupporters.get(supporter.slug).totalDonations += supporter.totalDonations; return supporters; @@ -102,33 +130,49 @@ module.exports = async () => { uniqueSupporters.set(supporter.slug, supporter); return [...supporters, supporter]; }, []) + // discard spammy supporters + .filter(isAllowed) + // sort by total $ donated, descending .sort((a, b) => b.totalDonations - a.totalDonations) + // determine which url to use depending on tier .reduce( (supporters, supporter) => { if (supporter.type === 'INDIVIDUAL') { if (supporter.name !== 'anonymous') { - supporters.backers.push({ - ...supporter, - avatar: supporter.imgUrlSmall - }); + supporters.backers = [ + ...supporters.backers, + { + ...supporter, + avatar: encodeURI(supporter.imgUrlSmall) + } + ]; } } else { - supporters.sponsors.push({...supporter, avatar: supporter.imgUrlMed}); + supporters.sponsors = [ + ...supporters.sponsors, + { + ...supporter, + avatar: encodeURI(supporter.imgUrlMed) + } + ]; } return supporters; }, - {sponsors: [], backers: []} + { + sponsors: [], + backers: [] + } ); const supporterImagePath = resolve(__dirname, '../images/supporters'); - mkdirSync(supporterImagePath, {recursive: true}); + await mkdir(supporterImagePath, {recursive: true}); // Fetch images for sponsors and save their image dimensions await Promise.all( supporters.sponsors.map(async sponsor => { - const filePath = resolve(supporterImagePath, sponsor.id + '.png'); - const {body} = await needle('get', encodeURI(sponsor.avatar)); + const filePath = resolve(supporterImagePath, `${sponsor.id}.png`); + const {body} = await needle('get', sponsor.avatar); sponsor.dimensions = imageSize(body); await writeFile(filePath, body); }) @@ -137,17 +181,32 @@ module.exports = async () => { // Fetch images for backers and save their image dimensions await Promise.all( supporters.backers.map(async backer => { - const filePath = resolve(supporterImagePath, backer.id + '.png'); - const {body} = await needle('get', encodeURI(backer.avatar)); + const filePath = resolve(supporterImagePath, `${backer.id}.png`); + const {body} = await needle('get', backer.avatar); await writeFile(filePath, body); }) ); + const backerCount = supporters.backers.length; + const sponsorCount = supporters.sponsors.length; + const totalValidSupportersCount = backerCount + sponsorCount; + debug( - 'found %d valid backers and %d valid sponsors (%d total)', - supporters.backers.length, - supporters.sponsors.length, - supporters.backers.length + supporters.sponsors.length + 'found %d valid backers and %d valid sponsors (of %d total; %d blocked)', + backerCount, + sponsorCount, + totalValidSupportersCount, + uniqueSupporters.size - totalValidSupportersCount ); return supporters; }; + +module.exports = getSupporters; + +if (require.main === module) { + require('debug').enable('mocha:docs:data:supporters'); + process.on('unhandledRejection', err => { + throw err; + }); + getSupporters(); +} From 02bdb6bc6c029fb0c01389b27797d00faa76ddde Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 17 Jul 2020 09:00:56 -0700 Subject: [PATCH 1535/1771] add pirate tv site to blocklist --- docs/_data/blocklist.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_data/blocklist.json b/docs/_data/blocklist.json index 36479d2a4a..8093309e23 100644 --- a/docs/_data/blocklist.json +++ b/docs/_data/blocklist.json @@ -1,6 +1,7 @@ [ "cheap-writing-service", "coin-master-free-spins", + "cyberflix-tv", "device-tricks1", "domywriting", "emailmarketingservices-io", From ad03d2972deba18a7a214324fbd73cb14bbe0d79 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 28 Jul 2020 14:11:00 -0700 Subject: [PATCH 1536/1771] build UMD bundle and polyfill language features (#4366) - use rollup's `umd` bundle instead of `iife` - consume Rollup config's `output` prop in `karma-rollup-plugin` - simplify `rollup.config.js` `output` prop - fix invalid `script` tag `src` attrib in `lib/browser/template.html` (& reformat) - use core-js polyfills - remove old ESlint rule to disallow `Object.assign` (it's now allowed... but so is object rest/spread, which works in many cases) - fix travis script - karma-related: - update Symbol test for IE11, as the polyfill is just a polyfill. - add a proper RequireJS integration test - remove the old `bundle/amd.spec.js` test - try to make `karma.conf.js` less intimidating - allow custom externals/globals in karma rollup plugin - `unexpected`, `unexpected-eventemitter`, and `unexpected-sinon` are now external (not bundled) and loaded via their globals - modified `test/browser-specific/setup.js` to use `require()` since we can do that now - bundle now has an inline source map since I couldn't figure out any other way to load it - removed duplication of work in the karma plugin; no call to `bundle.generate()` is needed. furthermore the `code` prop did not include the inline source maps. so we just write the file and read the result. could probably avoid reading the file by manually stitching the `code` and `map` props together, but I'm unsure how - loads `mocha.js.map` for debugging --- .eslintrc.yml | 5 - .travis.yml | 2 +- browser-entry.js | 6 +- karma.conf.js | 414 ++++++++++++------ lib/browser/template.html | 12 +- package-lock.json | 282 ++++++------ package-scripts.js | 16 +- package.json | 3 + rollup.config.js | 35 +- scripts/karma-rollup-plugin.js | 49 ++- .../fixtures/requirejs/lib.fixture.js | 3 + .../fixtures/requirejs/main.fixture.js | 9 + test/browser-specific/requirejs-setup.js | 17 + test/browser-specific/setup.js | 6 +- test/bundle/amd.spec.js | 16 - test/unit/utils.spec.js | 6 +- 16 files changed, 546 insertions(+), 335 deletions(-) create mode 100644 test/browser-specific/fixtures/requirejs/lib.fixture.js create mode 100644 test/browser-specific/fixtures/requirejs/main.fixture.js create mode 100644 test/browser-specific/requirejs-setup.js delete mode 100644 test/bundle/amd.spec.js diff --git a/.eslintrc.yml b/.eslintrc.yml index ee6c65f773..2e30c5e3e2 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -15,11 +15,6 @@ rules: strict: - error - safe - # disallow Object.assign - no-restricted-properties: - - error - - object: 'Object' - property: 'assign' overrides: - files: - 'docs/js/**/*.js' diff --git a/.travis.yml b/.travis.yml index ca2131eb66..adcf866c6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,7 @@ jobs: node_js: '10' name: 'Node.js v10' - - script: npm start test.bundle test.browser + - script: npm start test.browser name: 'Browser' node_js: 12 install: npm ci # we need the native modules here diff --git a/browser-entry.js b/browser-entry.js index d5e3717c79..cdcb56b6fb 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -210,10 +210,10 @@ Mocha.process = process; * Expose mocha. */ -global.Mocha = Mocha; -global.mocha = mocha; +mocha.Mocha = Mocha; +mocha.mocha = mocha; // this allows test/acceptance/required-tokens.js to pass; thus, // you can now do `const describe = require('mocha').describe` in a // browser context (assuming browserification). should fix #880 -module.exports = global; +module.exports = Object.assign(mocha, global); diff --git a/karma.conf.js b/karma.conf.js index ac65e5a578..785172061b 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,14 +1,35 @@ -'use strict'; +/** + * Mocha's Karma config. + * + * IMPORTANT: + * - Karma must _always_ be run with `NODE_PATH=.` where `.` is the project + * root; this allows `karma-mocha` to use our built version of Mocha + * - You must build Mocha's browser bundle before running Karma. This is + * typically done automatically in `package-scripts.js`. + * + * There are actually several different configurations here depending on the + * values of various environment variables (e.g., `MOCHA_TEST`, `CI`, etc.), + * which is why it's so hairy. + * + * This code avoids mutating the configuration object (the `cfg` variable) + * directly; instead, we create new objects/arrays. This makes it a little more + * obvious what's happening, even though it's verbose. + * + * The main export is a function which Karma calls with a config object; the + * final line of this function should be `config.set(cfg)` which registers the + * configuration we've built. + */ +'use strict'; const fs = require('fs'); const path = require('path'); const os = require('os'); const rollupPlugin = require('./scripts/karma-rollup-plugin'); -const baseBundleDirpath = path.join(__dirname, '.karma'); - +const BASE_BUNDLE_DIR_PATH = path.join(__dirname, '.karma'); +const env = process.env; const hostname = os.hostname(); -const browserPlatformPairs = { +const SAUCE_BROWSER_PLATFORM_MAP = { 'chrome@latest': 'Windows 10', 'MicrosoftEdge@latest': 'Windows 10', 'internet explorer@latest': 'Windows 10', @@ -16,57 +37,58 @@ const browserPlatformPairs = { 'safari@latest': 'macOS 10.13' }; -module.exports = config => { - let bundleDirpath; - const cfg = { - frameworks: ['rollup', 'mocha'], - files: [ - // we use the BDD interface for all of the tests that - // aren't interface-specific. - 'test/unit/*.spec.js' - ], - plugins: [ - 'karma-mocha', - 'karma-mocha-reporter', - 'karma-sauce-launcher', - 'karma-chrome-launcher', - rollupPlugin - ], - rollup: { - configFile: 'rollup.config.js', - include: ['test/**'], - bundlePath: bundleDirpath - }, - reporters: ['mocha'], - colors: true, - browsers: ['ChromeHeadless'], - logLevel: config.LOG_INFO, - client: { - mocha: { - reporter: 'html' - } - }, - mochaReporter: { - showDiff: true - }, - customLaunchers: { - ChromeDebug: { - base: 'Chrome', - flags: ['--remote-debugging-port=9333'] - } +const baseConfig = { + frameworks: ['rollup', 'mocha'], + files: [ + // we use the BDD interface for all of the tests that + // aren't interface-specific. + 'test/unit/*.spec.js' + ], + plugins: [ + 'karma-mocha', + 'karma-mocha-reporter', + 'karma-sauce-launcher', + 'karma-chrome-launcher', + rollupPlugin + ], + rollup: { + configFile: 'rollup.config.js', + include: ['test/**'] + }, + reporters: ['mocha'], + colors: true, + browsers: ['ChromeHeadless'], + client: { + mocha: { + // this helps debug + reporter: 'html' } - }; + }, + mochaReporter: { + showDiff: true + }, + customLaunchers: { + ChromeDebug: { + base: 'Chrome', + flags: ['--remote-debugging-port=9333'] + } + } +}; + +module.exports = config => { + let bundleDirPath = path.join(BASE_BUNDLE_DIR_PATH, hostname); + let cfg = {...baseConfig}; // TO RUN AGAINST SAUCELABS LOCALLY, execute: // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= npm start test.browser` - const env = process.env; let sauceConfig; + // configuration for CI mode if (env.CI) { console.error('CI mode enabled'); if (env.TRAVIS) { console.error('Travis-CI detected'); - bundleDirpath = path.join(baseBundleDirpath, process.env.TRAVIS_BUILD_ID); + bundleDirPath = path.join(BASE_BUNDLE_DIR_PATH, env.TRAVIS_BUILD_ID); if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis sauceConfig = { @@ -82,7 +104,6 @@ module.exports = config => { throw new Error('no browser tests should run on AppVeyor!'); } else { console.error(`Local environment (${hostname}) detected`); - bundleDirpath = path.join(baseBundleDirpath, hostname); // don't need to run sauce from appveyor b/c travis does it. if (env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY) { const id = `${hostname} (${Date.now()})`; @@ -96,94 +117,241 @@ module.exports = config => { console.error('No SauceLabs credentials present'); } } - fs.mkdirSync(bundleDirpath, {recursive: true}); - } else { - console.error('CI mode disabled'); } - if (sauceConfig) { - cfg.sauceLabs = sauceConfig; - addSauceTests(cfg); + cfg = createBundleDir(cfg, bundleDirPath); + cfg = addSauceTests(cfg, sauceConfig); + cfg = chooseTestSuite(cfg, env.MOCHA_TEST); + + // include sourcemap + cfg = { + ...cfg, + files: [...cfg.files, {pattern: './mocha.js.map', included: false}] + }; + + config.set(cfg); +}; + +/** + * Creates dir `bundleDirPath` if it does not exist; returns new Karma config + * containing `bundleDirPath` for rollup plugin. + * + * If this fails, the rollup plugin will use a temp dir. + * @param {object} cfg - Karma config. + * @param {string} [bundleDirPath] - Path where the output bundle should live + * @returns {object} - New Karma config + */ +const createBundleDir = (cfg, bundleDirPath) => { + if (bundleDirPath) { + try { + fs.mkdirSync(bundleDirPath, {recursive: true}); + cfg = { + ...cfg, + rollup: { + ...cfg.rollup, + bundleDirPath + } + }; + } catch (ignored) { + console.error( + `Failed to create ${bundleDirPath}; using temp directory instead` + ); + } } + return {...cfg}; +}; - /* the MOCHA_TEST env var will be set for "special" cases of tests. - * these may require different interfaces or other setup which make - * them unable to be batched w/ the rest. - */ - const MOCHA_TEST = env.MOCHA_TEST; - switch (MOCHA_TEST) { - case 'bdd': - case 'tdd': - case 'qunit': - if (cfg.sauceLabs) { - cfg.sauceLabs.testName = `Interface "${MOCHA_TEST}" Integration Tests`; - } - cfg.files = [`test/interfaces/${MOCHA_TEST}.spec.js`]; - cfg.client.mocha.ui = MOCHA_TEST; - break; +/** + * Adds Saucelabs-specific config to a Karma config object. + * + * If `sauceLabs` parameter is falsy, just return a clone of the `cfg` parameter. + * + * @see https://github.com/karma-runner/karma-sauce-launcher + * @see https://github.com/bermi/sauce-connect-launcher#advanced-usage + * @param {object} cfg - Karma config + * @param {object} [sauceLabs] - SauceLabs config + * @returns {object} Karma config + */ +const addSauceTests = (cfg, sauceLabs) => { + if (sauceLabs) { + const sauceBrowsers = Object.keys(SAUCE_BROWSER_PLATFORM_MAP); - case 'esm': - // just run against ChromeHeadless, since other browsers may not - // support - cfg.browsers = ['ChromeHeadless']; - cfg.files = [ - { - pattern: 'test/browser-specific/fixtures/esm.fixture.mjs', - type: 'module' - }, - {pattern: 'test/browser-specific/esm.spec.mjs', type: 'module'} - ]; - break; - default: - if (cfg.sauceLabs) { - cfg.sauceLabs.testName = 'Unit Tests'; - } + // creates Karma `customLauncher` configs from `SAUCE_BROWSER_PLATFORM_MAP` + const customLaunchers = sauceBrowsers.reduce((acc, sauceBrowser) => { + const platform = SAUCE_BROWSER_PLATFORM_MAP[sauceBrowser]; + const [browserName, version] = sauceBrowser.split('@'); + return { + ...acc, + [sauceBrowser]: { + base: 'SauceLabs', + browserName, + version, + platform + } + }; + }, {}); + + return { + ...cfg, + reporters: [...cfg.reporters, 'saucelabs'], + browsers: [...cfg.browsers, ...sauceBrowsers], + customLaunchers: { + ...cfg.customLaunchers, + ...customLaunchers + }, + sauceLabs: { + ...sauceLabs, + public: 'public', + connectOptions: { + connectRetries: 2, + connectRetryTimeout: 30000, + detached: sauceLabs.startConnect, + tunnelIdentifier: sauceLabs.tunnelIdentifier + } + }, + concurrency: Infinity, + retryLimit: 1, + captureTimeout: 120000, + browserNoActivityTimeout: 20000 + }; } + return {...cfg}; +}; - cfg.files.unshift( +/** + * Returns a new Karma config containing standard dependencies for our tests. + * + * Most suites use this. + * @param {object} cfg - Karma config + * @returns {object} New Karma config + */ +const addStandardDependencies = cfg => ({ + ...cfg, + files: [ require.resolve('sinon/pkg/sinon.js'), require.resolve('unexpected/unexpected'), - {pattern: require.resolve('unexpected/unexpected.js.map'), included: false}, + { + pattern: require.resolve('unexpected/unexpected.js.map'), + included: false + }, require.resolve('unexpected-sinon'), require.resolve('unexpected-eventemitter/dist/unexpected-eventemitter.js'), - require.resolve('./test/browser-specific/setup') - ); - - config.set(cfg); -}; - -function addSauceTests(cfg) { - cfg.reporters.push('saucelabs'); - const browsers = Object.keys(browserPlatformPairs); - cfg.browsers = cfg.browsers.concat(browsers); - cfg.customLaunchers = browsers.reduce((acc, browser) => { - const platform = browserPlatformPairs[browser]; - const [browserName, version] = browser.split('@'); - acc[browser] = { - base: 'SauceLabs', - browserName: browserName, - version: version, - platform: platform - }; - return acc; - }, cfg.customLaunchers); - - // See https://github.com/karma-runner/karma-sauce-launcher - // See https://github.com/bermi/sauce-connect-launcher#advanced-usage - Object.assign(cfg.sauceLabs, { - public: 'public', - connectOptions: { - connectRetries: 2, - connectRetryTimeout: 30000, - detached: cfg.sauceLabs.startConnect, - tunnelIdentifier: cfg.sauceLabs.tunnelIdentifier + require.resolve('./test/browser-specific/setup'), + ...cfg.files + ], + rollup: { + ...cfg.rollup, + external: [ + 'sinon', + 'unexpected', + 'unexpected-eventemitter', + 'unexpected-sinon' + ], + globals: { + sinon: 'sinon', + unexpected: 'weknowhow.expect', + 'unexpected-sinon': 'weknowhow.unexpectedSinon', + 'unexpected-eventemitter': 'unexpectedEventEmitter' } - }); + } +}); - cfg.concurrency = Infinity; - cfg.retryLimit = 1; +/** + * Adds a name for the tests, reflected in SauceLabs' UI. Returns new Karma + * config. + * + * Does not add a test name if the `sauceLabs` prop of `cfg` is falsy (which + * would imply that we're not running tests on SauceLabs). + * + * @param {string} testName - SauceLabs test name + * @param {object} cfg - Karma config. + * @returns {object} New Karma config + */ +const addSauceLabsTestName = (testName, cfg) => + cfg.sauceLabs + ? { + ...cfg, + sauceLabs: { + ...cfg.sauceLabs, + testName + } + } + : {...cfg}; - // for slow browser booting, ostensibly - cfg.captureTimeout = 120000; - cfg.browserNoActivityTimeout = 20000; -} +/** + * Returns a new Karma config to run with specific configuration (which cannot + * be run with other configurations) as specified by `value`. Known values: + * + * - `bdd` - `bdd`-specific tests + * - `tdd` - `tdd`-specific tests + * - `qunit` - `qunit`-specific tests + * - `esm` - ESM-specific tests + * - `requirejs` - RequireJS-specific tests + * + * Since we can't change Mocha's interface on-the-fly, tests for specific interfaces + * must be run in isolation. + * @param {object} cfg - Karma config + * @param {string} [value] - Configuration identifier, if any + * @returns {object} New Karma config + */ +const chooseTestSuite = (cfg, value) => { + switch (value) { + case 'bdd': + case 'tdd': + case 'qunit': + return addStandardDependencies({ + ...cfg, + ...addSauceLabsTestName(`Interface "${value}" Integration Tests`, cfg), + files: [`test/interfaces/${value}.spec.js`], + client: { + ...cfg.client, + mocha: { + ...cfg.client.mocha, + ui: value + } + } + }); + case 'esm': + return addStandardDependencies({ + ...addSauceLabsTestName('ESM Integration Tests', cfg), + // just run against ChromeHeadless, since other browsers may not + // support ESM. + // XXX: remove following line when dropping IE11 + browsers: ['ChromeHeadless'], + files: [ + { + pattern: 'test/browser-specific/fixtures/esm.fixture.mjs', + type: 'module' + }, + { + pattern: 'test/browser-specific/esm.spec.mjs', + type: 'module' + } + ] + }); + case 'requirejs': + // no standard deps because I'm too lazy to figure out how to make + // them work with RequireJS. not important anyway + return { + ...addSauceLabsTestName('RequireJS Tests', cfg), + plugins: [...cfg.plugins, 'karma-requirejs'], + frameworks: ['requirejs', ...cfg.frameworks], + files: [ + { + pattern: 'test/browser-specific/fixtures/requirejs/*.fixture.js', + included: false + }, + 'test/browser-specific/requirejs-setup.js' + ], + // this skips bundling the above tests & fixtures + rollup: { + ...cfg.rollup, + include: [] + } + }; + default: + return addStandardDependencies({ + ...addSauceLabsTestName('Unit Tests', cfg) + }); + } +}; diff --git a/lib/browser/template.html b/lib/browser/template.html index af4d3e4f42..4ebd4af488 100644 --- a/lib/browser/template.html +++ b/lib/browser/template.html @@ -1,16 +1,18 @@ - + Mocha - - + +
              - - + + diff --git a/package-lock.json b/package-lock.json index 85e832440d..c2d9f39ad8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5558,28 +5558,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -5590,14 +5590,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -5608,42 +5608,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, + "resolved": "", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, + "resolved": "", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -5653,28 +5653,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, + "resolved": "", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -5684,14 +5684,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -5708,7 +5708,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, + "resolved": "", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -5723,14 +5723,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -5740,7 +5740,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -5750,7 +5750,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -5761,21 +5761,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -5785,14 +5785,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -5802,14 +5802,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, + "resolved": "", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, + "resolved": "", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -5820,7 +5820,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -5830,7 +5830,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, + "resolved": "", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -5840,14 +5840,14 @@ }, "ms": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -5859,7 +5859,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, + "resolved": "", "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -5878,7 +5878,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -5889,7 +5889,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -5899,14 +5899,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, + "resolved": "", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -5918,7 +5918,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -5931,21 +5931,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -5955,21 +5955,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -5980,21 +5980,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -6007,7 +6007,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, + "resolved": "", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -6023,7 +6023,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -6033,49 +6033,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -6087,7 +6087,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -6097,7 +6097,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -6107,14 +6107,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, + "resolved": "", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -6130,14 +6130,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -6147,14 +6147,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -7628,6 +7628,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true + }, "core-js-compat": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", @@ -13131,6 +13137,12 @@ } } }, + "karma-requirejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-1.1.0.tgz", + "integrity": "sha1-/driy4fX68FvsCIok1ZNf+5Xh5g=", + "dev": true + }, "karma-sauce-launcher": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-2.0.2.tgz", @@ -18601,6 +18613,12 @@ "integrity": "sha1-/CwfhjbPuFWvmrlVrArQh4vK2wo=", "dev": true }, + "requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -22098,28 +22116,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -22130,14 +22148,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -22148,42 +22166,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, + "resolved": "", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, + "resolved": "", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -22193,28 +22211,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, + "resolved": "", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -22224,14 +22242,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -22248,7 +22266,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, + "resolved": "", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -22263,14 +22281,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -22280,7 +22298,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -22290,7 +22308,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -22301,21 +22319,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -22325,14 +22343,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -22342,14 +22360,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, + "resolved": "", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, + "resolved": "", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -22360,7 +22378,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -22370,7 +22388,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, + "resolved": "", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -22380,14 +22398,14 @@ }, "ms": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -22399,7 +22417,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, + "resolved": "", "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -22418,7 +22436,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -22429,7 +22447,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -22439,14 +22457,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, + "resolved": "", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -22458,7 +22476,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -22471,21 +22489,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -22495,21 +22513,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -22520,21 +22538,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -22547,7 +22565,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, + "resolved": "", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -22563,7 +22581,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -22573,49 +22591,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -22627,7 +22645,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -22637,7 +22655,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -22647,14 +22665,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, + "resolved": "", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -22670,14 +22688,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -22687,14 +22705,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true diff --git a/package-scripts.js b/package-scripts.js index e4a98e4b14..dd9f1f7af8 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -75,7 +75,7 @@ module.exports = { }, test: { default: { - script: 'nps lint test.node test.browser test.bundle', + script: 'nps lint test.node test.browser', description: 'Run all linters and all tests' }, node: { @@ -221,7 +221,7 @@ module.exports = { browser: { default: { script: - 'nps clean build test.browser.unit test.browser.bdd test.browser.tdd test.browser.qunit test.browser.esm', + 'nps clean build test.browser.unit test.browser.bdd test.browser.tdd test.browser.qunit test.browser.esm test.browser.requirejs', description: 'Run browser tests' }, unit: { @@ -247,16 +247,10 @@ module.exports = { script: 'cross-env MOCHA_TEST=esm nps test.browser.unit', description: 'Run browser ES modules support test', hiddenFromHelp: true - } - }, - bundle: { - default: { - script: 'nps clean build test.bundle.amd', - description: 'Run bundle-related tests' }, - amd: { - script: test('amd', 'test/bundle/amd.spec'), - description: 'Run AMD bundle tests', + requirejs: { + script: 'cross-env MOCHA_TEST=requirejs nps test.browser.unit', + description: 'Run RequireJS compat test', hiddenFromHelp: true } } diff --git a/package.json b/package.json index a178cd873d..a835bf9afd 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "babel-eslint": "^10.1.0", "chai": "^4.2.0", "coffee-script": "^1.12.7", + "core-js": "^3.6.5", "coveralls": "^3.0.11", "cross-env": "^6.0.3", "cross-spawn": "^7.0.1", @@ -113,6 +114,7 @@ "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", + "karma-requirejs": "^1.1.0", "karma-sauce-launcher": "^2.0.2", "lint-staged": "^9.5.0", "markdown-it": "^10.0.0", @@ -129,6 +131,7 @@ "remark": "^11.0.2", "remark-github": "^8.0.0", "remark-inline-links": "^3.1.3", + "requirejs": "^2.3.6", "rewiremock": "^3.14.1", "rimraf": "^3.0.2", "rollup": "^2.18.2", diff --git a/rollup.config.js b/rollup.config.js index c03a2de9d9..9005b6138a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -13,14 +13,12 @@ import pickFromPackageJson from './scripts/pick-from-package-json'; const config = { input: './browser-entry.js', - output: [ - { - file: './mocha.js', - format: 'iife', - sourcemap: true - } - ], - + output: { + file: './mocha.js', + format: 'umd', + sourcemap: true, + name: 'mocha' + }, plugins: [ json(), pickFromPackageJson({ @@ -32,9 +30,26 @@ const config = { nodeResolve({ browser: true }), - babel({presets: ['@babel/preset-env'], babelHelpers: 'bundled'}) + babel({ + exclude: /core-js/, + presets: [ + [ + '@babel/preset-env', + { + modules: false, + spec: true, + useBuiltIns: 'usage', + forceAllTransforms: true, + corejs: { + version: 3, + proposals: false + } + } + ] + ], + babelHelpers: 'bundled' + }) ], - onwarn: (warning, warn) => { if (warning.code === 'CIRCULAR_DEPENDENCY') return; diff --git a/scripts/karma-rollup-plugin.js b/scripts/karma-rollup-plugin.js index 440dd943fc..cf7b4796b0 100644 --- a/scripts/karma-rollup-plugin.js +++ b/scripts/karma-rollup-plugin.js @@ -12,7 +12,7 @@ * rollup with a modified config that allows for multiple entry points for a * single output bundle. * - * This is am implementation that specifically solves Mocha's use case. It + * This is an implementation that specifically solves Mocha's use case. It * does not support watch mode. It is possible that is coulkd eventually be * made reusable with more work and actual testing. * @@ -57,9 +57,11 @@ function framework(fileConfigs, pluginConfig, basePath, preprocessors) { ) ); - let bundleLocation = pluginConfig.bundlePath - ? pluginConfig.bundlePath - : path.resolve(os.tmpdir(), `${uuid.v4()}.rollup.js`); + const bundleFilename = `${uuid.v4()}.rollup.js`; + let bundleLocation = path.resolve( + pluginConfig.bundleDirPath ? pluginConfig.bundleDirPath : os.tmpdir(), + bundleFilename + ); if (process.platform === 'win32') { bundleLocation = bundleLocation.replace(/\\/g, '/'); } @@ -107,7 +109,7 @@ framework.$inject = [ function bundlePreprocessor(config) { const { basePath, - rollup: {configFile} + rollup: {configFile, globals = {}, external = []} } = config; const configPromise = loadConfigFile(path.resolve(basePath, configFile)); @@ -115,33 +117,34 @@ function bundlePreprocessor(config) { return async function(content, file, done) { const {options, warnings} = await configPromise; const config = options[0]; - const plugins = config.plugins || []; + // plugins is always an array + const pluginConfig = [ + ...(config.plugins || []), + multiEntry({exports: false}) + ]; + // XXX: output is always an array, but we only have one output config. + // if we have multiple, this code needs changing. + const outputConfig = { + ...((config.output || [])[0] || {}), + file: file.path, + globals, + sourcemap: 'inline' + }; warnings.flush(); const bundle = await rollup.rollup({ input: fileMap.get(file.path), - plugins: [...plugins, multiEntry({exports: false})], - external: ['sinon'], + plugins: pluginConfig, + external, onwarn: config.onwarn }); - const sharedOutputConfig = { - sourcemap: true, - format: 'iife', - globals: { - sinon: 'sinon' - } - }; - - const {output} = await bundle.generate(sharedOutputConfig); - - await bundle.write({ - file: file.path, - ...sharedOutputConfig - }); + await bundle.write(outputConfig); + console.error(`wrote bundle to ${file.path}`); + const code = fs.readFileSync(outputConfig.file, 'utf8'); - done(null, output[0].code); + done(null, code); }; } diff --git a/test/browser-specific/fixtures/requirejs/lib.fixture.js b/test/browser-specific/fixtures/requirejs/lib.fixture.js new file mode 100644 index 0000000000..7c0ff46219 --- /dev/null +++ b/test/browser-specific/fixtures/requirejs/lib.fixture.js @@ -0,0 +1,3 @@ +define('lib', function() { + return 'foo'; +}); diff --git a/test/browser-specific/fixtures/requirejs/main.fixture.js b/test/browser-specific/fixtures/requirejs/main.fixture.js new file mode 100644 index 0000000000..1e1e1fa25c --- /dev/null +++ b/test/browser-specific/fixtures/requirejs/main.fixture.js @@ -0,0 +1,9 @@ +define(['lib'], function(lib) { + describe('lib', function() { + it('should equal "foo"', function() { + if (lib !== 'foo') { + throw new Error('should be "foo"'); + } + }); + }); +}); diff --git a/test/browser-specific/requirejs-setup.js b/test/browser-specific/requirejs-setup.js new file mode 100644 index 0000000000..360703778b --- /dev/null +++ b/test/browser-specific/requirejs-setup.js @@ -0,0 +1,17 @@ +/* eslint-disable strict */ +(function() { + 'use strict'; + var tests = []; + + for (var file in window.__karma__.files) { + if (/fixture\.js$/.test(file)) { + tests.push(file); + } + } + + require.config({ + baseUrl: '/base', + deps: tests, + callback: window.__karma__.start + }); +})(); diff --git a/test/browser-specific/setup.js b/test/browser-specific/setup.js index 31f5c82396..6809f3b294 100644 --- a/test/browser-specific/setup.js +++ b/test/browser-specific/setup.js @@ -2,7 +2,7 @@ process.stdout = require('browser-stdout')(); -global.expect = global.weknowhow.expect +global.expect = require('unexpected') .clone() - .use(global.weknowhow.unexpectedSinon) - .use(global.unexpectedEventEmitter); + .use(require('unexpected-sinon')) + .use(require('unexpected-eventemitter')); diff --git a/test/bundle/amd.spec.js b/test/bundle/amd.spec.js deleted file mode 100644 index bc6e93aa4e..0000000000 --- a/test/bundle/amd.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -var path = require('path'); -var fs = require('fs'); - -it('should build a non-broken bundle for AMD', function(done) { - var bundle = path.join(process.cwd(), 'mocha.js'); - fs.readFile(bundle, 'utf8', function(err, content) { - if (err) { - return done(err); - } - - expect(content, 'not to match', /define.amd/); - done(); - }); -}); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 6dcff87d18..9fa6cc74e4 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -496,11 +496,11 @@ describe('lib/utils', function() { if (typeof global.Symbol === 'function') { it('should handle Symbol', function() { var symbol = Symbol('value'); - expect(stringify(symbol), 'to be', 'Symbol(value)'); + expect(stringify(symbol), 'to match', /^Symbol\(value\)/); expect( stringify({symbol: symbol}), - 'to be', - '{\n "symbol": Symbol(value)\n}' + 'to match', + /"symbol": Symbol\(value\)/ ); }); } From 78848932cef7e3feab9184a161b9899b7c024c82 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 29 Jul 2020 16:44:39 -0400 Subject: [PATCH 1537/1771] ensure hook titles are consistent; closes #4348 (PR #4383) * fix #4348 * Addressing PR feedback * rename "suite" to "suite1" to make test cases clearer * addressing PR feedback --- lib/runner.js | 76 +++++++++---------- .../multiple-done-before-each.fixture.js | 2 +- .../fixtures/multiple-done-before.fixture.js | 2 +- test/integration/multiple-done.spec.js | 27 +++---- test/unit/runner.spec.js | 70 ++++++++++++----- 5 files changed, 98 insertions(+), 79 deletions(-) diff --git a/lib/runner.js b/lib/runner.js index 1214121e1e..cd91173e10 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -360,6 +360,19 @@ Runner.prototype.checkGlobals = function(test) { /** * Fail the given `test`. * + * If `test` is a hook, failures work in the following pattern: + * - If bail, run corresponding `after each` and `after` hooks, + * then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * * @private * @param {Runnable} test * @param {Error} err @@ -398,44 +411,6 @@ Runner.prototype.fail = function(test, err, force) { this.emit(constants.EVENT_TEST_FAIL, test, err); }; -/** - * Fail the given `hook` with `err`. - * - * Hook failures work in the following pattern: - * - If bail, run corresponding `after each` and `after` hooks, - * then exit - * - Failed `before` hook skips all tests in a suite and subsuites, - * but jumps to corresponding `after` hook - * - Failed `before each` hook skips remaining tests in a - * suite and jumps to corresponding `after each` hook, - * which is run only once - * - Failed `after` hook does not alter execution order - * - Failed `after each` hook skips remaining tests in a - * suite and subsuites, but executes other `after each` - * hooks - * - * @private - * @param {Hook} hook - * @param {Error} err - */ -Runner.prototype.failHook = function(hook, err) { - hook.originalTitle = hook.originalTitle || hook.title; - if (hook.ctx && hook.ctx.currentTest) { - hook.title = - hook.originalTitle + ' for ' + dQuote(hook.ctx.currentTest.title); - } else { - var parentTitle; - if (hook.parent.title) { - parentTitle = hook.parent.title; - } else { - parentTitle = hook.parent.root ? '{root}' : ''; - } - hook.title = hook.originalTitle + ' in ' + dQuote(parentTitle); - } - - this.fail(hook, err); -}; - /** * Run hook `name` callbacks and then invoke `fn()`. * @@ -464,13 +439,15 @@ Runner.prototype.hook = function(name, fn) { hook.ctx.currentTest = self.test; } + setHookTitle(hook); + hook.allowUncaught = self.allowUncaught; self.emit(constants.EVENT_HOOK_BEGIN, hook); if (!hook.listeners('error').length) { self._addEventListener(hook, 'error', function(err) { - self.failHook(hook, err); + self.fail(hook, err); }); } @@ -504,18 +481,35 @@ Runner.prototype.hook = function(name, fn) { } else { hook.pending = false; var errForbid = createUnsupportedError('`this.skip` forbidden'); - self.failHook(hook, errForbid); + self.fail(hook, errForbid); return fn(errForbid); } } else if (err) { - self.failHook(hook, err); + self.fail(hook, err); // stop executing hooks, notify callee of hook err return fn(err); } self.emit(constants.EVENT_HOOK_END, hook); delete hook.ctx.currentTest; + setHookTitle(hook); next(++i); }); + + function setHookTitle(hook) { + hook.originalTitle = hook.originalTitle || hook.title; + if (hook.ctx && hook.ctx.currentTest) { + hook.title = + hook.originalTitle + ' for ' + dQuote(hook.ctx.currentTest.title); + } else { + var parentTitle; + if (hook.parent.title) { + parentTitle = hook.parent.title; + } else { + parentTitle = hook.parent.root ? '{root}' : ''; + } + hook.title = hook.originalTitle + ' in ' + dQuote(parentTitle); + } + } } Runner.immediately(function() { diff --git a/test/integration/fixtures/multiple-done-before-each.fixture.js b/test/integration/fixtures/multiple-done-before-each.fixture.js index 32de2bf442..6c93167cfb 100644 --- a/test/integration/fixtures/multiple-done-before-each.fixture.js +++ b/test/integration/fixtures/multiple-done-before-each.fixture.js @@ -1,6 +1,6 @@ 'use strict'; -describe('suite', function () { +describe('suite1', function () { beforeEach(function (done) { setTimeout(done, 10); setTimeout(done, 20); diff --git a/test/integration/fixtures/multiple-done-before.fixture.js b/test/integration/fixtures/multiple-done-before.fixture.js index 1e1bc71a16..cfa18de0c0 100644 --- a/test/integration/fixtures/multiple-done-before.fixture.js +++ b/test/integration/fixtures/multiple-done-before.fixture.js @@ -1,6 +1,6 @@ 'use strict'; -describe('suite', function () { +describe('suite1', function () { before(function (done) { setTimeout(done, 10); setTimeout(done, 30); diff --git a/test/integration/multiple-done.spec.js b/test/integration/multiple-done.spec.js index 2019df25c5..b7348ab488 100644 --- a/test/integration/multiple-done.spec.js +++ b/test/integration/multiple-done.spec.js @@ -95,9 +95,9 @@ describe('multiple calls to done()', function() { it('correctly attributes the error', function() { expect(res.failures[0], 'to satisfy', { - fullTitle: 'suite "before all" hook in "suite"', + fullTitle: 'suite1 "before all" hook in "suite1"', err: { - message: /done\(\) called multiple times in hook of file.+multiple-done-before\.fixture\.js/ + message: /done\(\) called multiple times in hook of file.+multiple-done-before\.fixture\.js/ } }); }); @@ -119,20 +119,17 @@ describe('multiple calls to done()', function() { }); it('correctly attributes the errors', function() { - expect(res.failures, 'to satisfy', [ - { - fullTitle: 'suite "before each" hook in "suite"', - err: { - message: /done\(\) called multiple times in hook of file.+multiple-done-before-each\.fixture\.js/ - } - }, - { - fullTitle: 'suite "before each" hook in "suite"', - err: { - message: /done\(\) called multiple times in hook of file.+multiple-done-before-each\.fixture\.js/ - } + expect(res.failures[0], 'to equal', res.failures[1]).and('to satisfy', { + fullTitle: 'suite1 "before each" hook in "suite1"', + err: { + message: /done\(\) called multiple times in hook of file.+multiple-done-before-each\.fixture\.js/, + multiple: [ + { + code: 'ERR_MOCHA_MULTIPLE_DONE' + } + ] } - ]); + }); }); }); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index 28a152fc1e..730c40003d 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -12,7 +12,9 @@ var Hook = Mocha.Hook; var noop = Mocha.utils.noop; var errors = require('../../lib/errors'); var EVENT_HOOK_BEGIN = Runner.constants.EVENT_HOOK_BEGIN; +var EVENT_HOOK_END = Runner.constants.EVENT_HOOK_END; var EVENT_TEST_FAIL = Runner.constants.EVENT_TEST_FAIL; +var EVENT_TEST_PASS = Runner.constants.EVENT_TEST_PASS; var EVENT_TEST_RETRY = Runner.constants.EVENT_TEST_RETRY; var EVENT_TEST_END = Runner.constants.EVENT_TEST_END; var EVENT_RUN_END = Runner.constants.EVENT_RUN_END; @@ -252,6 +254,44 @@ describe('Runner', function() { runner.hook('afterEach', noop); runner.hook('afterAll', noop); }); + + it('should augment hook title with current test title', function(done) { + var expectedHookTitle; + function assertHookTitle() { + expect(hook.title, 'to be', expectedHookTitle); + } + var failHook = false; + var hookError = new Error('failed hook'); + suite.beforeEach(function() { + assertHookTitle(); + if (failHook) { + throw hookError; + } + }); + runner.on(EVENT_HOOK_BEGIN, assertHookTitle); + runner.on(EVENT_HOOK_END, assertHookTitle); + runner.on(EVENT_TEST_FAIL, assertHookTitle); + runner.on(EVENT_TEST_PASS, assertHookTitle); + var hook = suite._beforeEach[0]; + + suite.addTest(new Test('should behave', noop)); + suite.addTest(new Test('should obey', noop)); + runner.suite = suite; + + runner.test = suite.tests[0]; + expectedHookTitle = '"before each" hook for "should behave"'; + runner.hook('beforeEach', function(err) { + if (err && err !== hookError) return done(err); + + runner.test = suite.tests[1]; + failHook = true; + expectedHookTitle = '"before each" hook for "should obey"'; + runner.hook('beforeEach', function(err) { + if (err && err !== hookError) return done(err); + return done(); + }); + }); + }); }); describe('fail()', function() { @@ -418,31 +458,19 @@ describe('Runner', function() { }); }); - describe('.failHook(hook, err)', function() { + describe('.fail(hook, err)', function() { it('should increment .failures', function() { expect(runner.failures, 'to be', 0); var test1 = new Test('fail hook 1', noop); var test2 = new Test('fail hook 2', noop); suite.addTest(test1); suite.addTest(test2); - runner.failHook(test1, new Error('error1')); + runner.fail(test1, new Error('error1')); expect(runner.failures, 'to be', 1); - runner.failHook(test2, new Error('error2')); + runner.fail(test2, new Error('error2')); expect(runner.failures, 'to be', 2); }); - it('should augment hook title with current test title', function() { - var hook = new Hook('"before each" hook'); - hook.ctx = {currentTest: new Test('should behave', noop)}; - - runner.failHook(hook, {}); - expect(hook.title, 'to be', '"before each" hook for "should behave"'); - - hook.ctx.currentTest = new Test('should obey', noop); - runner.failHook(hook, {}); - expect(hook.title, 'to be', '"before each" hook for "should obey"'); - }); - it('should emit "fail"', function(done) { var hook = new Hook(); hook.parent = suite; @@ -452,7 +480,7 @@ describe('Runner', function() { expect(_err, 'to be', err); done(); }); - runner.failHook(hook, err); + runner.fail(hook, err); }); it('should not emit "end" if suite bail is not true', function(done) { @@ -462,7 +490,7 @@ describe('Runner', function() { suite.bail(false); expect( function() { - runner.failHook(hook, err); + runner.fail(hook, err); }, 'not to emit from', hook, @@ -727,7 +755,7 @@ describe('Runner', function() { expect(_err.stack, 'to be', stack.slice(0, 3).join('\n')); done(); }); - runner.failHook(hook, err); + runner.fail(hook, err); }); }); @@ -745,7 +773,7 @@ describe('Runner', function() { expect(_err.stack, 'to be', stack.join('\n')); done(); }); - runner.failHook(hook, err); + runner.fail(hook, err); }); }); @@ -796,7 +824,7 @@ describe('Runner', function() { ); done(); }); - runner.failHook(hook, err); + runner.fail(hook, err); }); it('should not hang if overlong error message is multiple lines', function(done) { @@ -816,7 +844,7 @@ describe('Runner', function() { ); done(); }); - runner.failHook(hook, err); + runner.fail(hook, err); }); }); }); From 29012aa9fa0c4e5f86e72f2e4fa4d72027ccb42d Mon Sep 17 00:00:00 2001 From: kundol Date: Thu, 30 Jul 2020 05:47:33 +0900 Subject: [PATCH 1538/1771] Update javascript-serialize 3.1.0 to 4.0.0; closes #4375 (#4378) * Update javascript-serialize 3.1.0 to 4.0.0 * Change package-lock.json * Change package-lock.json --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2d9f39ad8..8521a648fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19343,9 +19343,9 @@ } }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } diff --git a/package.json b/package.json index a835bf9afd..7f7d35e016 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "ms": "2.1.2", "object.assign": "4.1.0", "promise.allsettled": "1.0.2", - "serialize-javascript": "3.1.0", + "serialize-javascript": "4.0.0", "strip-json-comments": "3.0.1", "supports-color": "7.1.0", "which": "2.0.2", From edc09bf147bef3a40cd5557fb797808136b7d3da Mon Sep 17 00:00:00 2001 From: indieisaconcept Date: Sun, 26 Jul 2020 12:07:58 +1000 Subject: [PATCH 1539/1771] Ensure root level hooks are called when running in watch mode ## Rationale Tests with root level hooks are ignored when running in watch mode. This occurs on initial & subsequent runs. ## Changes - updated `lib/cli/run-watch` to re-initialise rootHooks As we have swapped out the root suite it is necessary to re-initialize root level hooks again. - Extended integration tests for watch to take into consideration hooks ## Refs - mochajs/mocha/issues/4347 --- lib/cli/watch-run.js | 8 ++++ .../fixtures/options/watch/hook.fixture.js | 7 ++++ test/integration/options/watch.spec.js | 37 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 test/integration/fixtures/options/watch/hook.fixture.js diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index a3135c791a..0fb214d92e 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -59,6 +59,10 @@ exports.watchParallelRun = ( // in `createRerunner`), we need to call `mocha.ui()` again to set up the context/globals. newMocha.ui(newMocha.options.ui); + // we need to call `newMocha.rootHooks` to set up rootHooks for the new + // suite + newMocha.rootHooks(newMocha.options.rootHooks); + // in parallel mode, the main Mocha process doesn't actually load the // files. this flag prevents `mocha.run()` from autoloading. newMocha.lazyLoadFiles(true); @@ -118,6 +122,10 @@ exports.watchRun = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { // in `createRerunner`), we need to call `mocha.ui()` again to set up the context/globals. newMocha.ui(newMocha.options.ui); + // we need to call `newMocha.rootHooks` to set up rootHooks for the new + // suite + newMocha.rootHooks(newMocha.options.rootHooks); + return newMocha; }, afterRun({watcher}) { diff --git a/test/integration/fixtures/options/watch/hook.fixture.js b/test/integration/fixtures/options/watch/hook.fixture.js new file mode 100644 index 0000000000..3463761f3a --- /dev/null +++ b/test/integration/fixtures/options/watch/hook.fixture.js @@ -0,0 +1,7 @@ +module.exports = { + mochaHooks: { + [""]: function() { + throw new Error(" Hook Error"); + }, + }, +}; diff --git a/test/integration/options/watch.spec.js b/test/integration/options/watch.spec.js index 55ea345ab7..822b28b6da 100644 --- a/test/integration/options/watch.spec.js +++ b/test/integration/options/watch.spec.js @@ -275,6 +275,43 @@ describe('--watch', function() { expect(results[1].tests, 'to have length', 2); }); }); + + describe('with required hooks', function() { + /** + * Helper for setting up hook tests + * + * @param {string} hookName name of hook to test + * @return {function} + */ + function setupHookTest(hookName) { + return function() { + const testFile = path.join(tempDir, 'test.js'); + const hookFile = path.join(tempDir, 'hook.js'); + + copyFixture('__default__', testFile); + copyFixture('options/watch/hook', hookFile); + + replaceFileContents(hookFile, '', hookName); + + return runMochaWatch( + [testFile, '--require', hookFile], + tempDir, + () => { + touchFile(testFile); + } + ).then(results => { + expect(results.length, 'to equal', 2); + expect(results[0].failures, 'to have length', 1); + expect(results[1].failures, 'to have length', 1); + }); + }; + } + + it('mochaHooks.beforeAll runs as expected', setupHookTest('beforeAll')); + it('mochaHooks.beforeEach runs as expected', setupHookTest('beforeEach')); + it('mochaHooks.afterAll runs as expected', setupHookTest('afterAll')); + it('mochaHooks.afterEach runs as expected', setupHookTest('afterEach')); + }); }); }); From 8970429ee06c6f2c52505026af0214471cf67b18 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 29 Jul 2020 14:54:15 -0700 Subject: [PATCH 1540/1771] update CHANGELOG for v8.1.0 Signed-off-by: Christopher Hiller --- CHANGELOG.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd36ad8872..ad6f7d2fe0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +# 8.1.0 / 2020-07-29 + +In this release, Mocha now builds its browser bundle with Rollup and Babel, which will provide the project's codebase more flexibility and consistency. + +While we've been diligent about backwards compatibility, it's _possible_ consumers of the browser bundle will encounter differences (other than an increase in the bundle size). If you _do_ encounter an issue with the build, please [report it here](https://github.com/mochajs/mocha/issues/new?labels=unconfirmed-bug&template=bug_report.md&title=). + +This release **does not** drop support for IE11. + +Other community contributions came from [**@Devjeel**](https://github.com/Devjeel) and [**@sharath2106**](https://github.com/sharath2106). _Thank you_ to everyone who contributed to this release! + +> Do you read Korean? See [this guide to running parallel tests in Mocha](https://blog.outsider.ne.kr/1489), translated by our maintainer, [**@outsideris**](https://github.com/outsideris). + +## :tada: Enhancements + +- [#4287](https://github.com/mochajs/mocha/issues/4287): Use background colors with inline diffs for better visual distinction ([**@michael-brade**](https://github.com/michael-brade)) + +## :bug: Fixes + +- [#4328](https://github.com/mochajs/mocha/issues/4328): Fix "watch" mode when Mocha run in parallel ([**@boneskull**](https://github.com/boneskull)) +- [#4382](https://github.com/mochajs/mocha/issues/4382): Fix root hook execution in "watch" mode ([**@indieisaconcept**](https://github.com/indieisaconcept)) +- [#4383](https://github.com/mochajs/mocha/issues/4383): Consistent auto-generated hook titles ([**@cspotcode**](https://github.com/cspotcode)) +- [#4359](https://github.com/mochajs/mocha/issues/4359): Better errors when running `mocha init` ([**@boneskull**](https://github.com/boneskull)) +- [#4341](https://github.com/mochajs/mocha/issues/4341): Fix weirdness when using `delay` option in browser ([**@craigtaub**](https://github.com/craigtaub)) + +## :lock: Security Fixes + +- [#4378](https://github.com/mochajs/mocha/issues/4378), [#4333](https://github.com/mochajs/mocha/issues/4333): Update [javascript-serialize](https://npm.im/javascript-serialize) ([**@martinoppitz**](https://github.com/martinoppitz), [**@wnghdcjfe**](https://github.com/wnghdcjfe)) +- [#4354](https://github.com/mochajs/mocha/issues/4354): Update [yargs-unparser](https://npm.im/yargs-unparser) ([**@martinoppitz**](https://github.com/martinoppitz)) + +## :book: Documentation & Website + +- [#4173](https://github.com/mochajs/mocha/issues/4173): Document how to use `--enable-source-maps` with Mocha ([**@bcoe**](https://github.com/bcoe)) +- [#4343](https://github.com/mochajs/mocha/issues/4343): Clean up some API docs ([**@craigtaub**](https://github.com/craigtaub)) +- [#4318](https://github.com/mochajs/mocha/issues/4318): Sponsor images are now self-hosted ([**@Munter**](https://github.com/Munter)) + +## :nut_and_bolt: Other + +- [#4293](https://github.com/mochajs/mocha/issues/4293): Use Rollup and Babel in build pipeline; add source map to published files ([**@Munter**](https://github.com/Munter)) + # 8.0.1 / 2020-06-10 The obligatory patch after a major. From f966c943e637eea1e05b90e6904ce3e84271d279 Mon Sep 17 00:00:00 2001 From: Sri Harsha Date: Fri, 10 Jul 2020 13:12:31 +0530 Subject: [PATCH 1541/1771] Fixing typos --- lib/cli/watch-run.js | 6 +++--- lib/errors.js | 4 ++-- lib/mocha.js | 6 +++--- lib/utils.js | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/cli/watch-run.js b/lib/cli/watch-run.js index 0fb214d92e..d36a58394e 100644 --- a/lib/cli/watch-run.js +++ b/lib/cli/watch-run.js @@ -19,7 +19,7 @@ const collectFiles = require('./collect-files'); * @param {Object} opts - Options * @param {string[]} [opts.watchFiles] - List of paths and patterns to * watch. If not provided all files with an extension included in - * `fileColletionParams.extension` are watched. See first argument of + * `fileCollectionParams.extension` are watched. See first argument of * `chokidar.watch`. * @param {string[]} opts.watchIgnore - List of paths and patterns to * exclude from watching. See `ignored` option of `chokidar`. @@ -81,7 +81,7 @@ exports.watchParallelRun = ( * @param {Object} opts - Options * @param {string[]} [opts.watchFiles] - List of paths and patterns to * watch. If not provided all files with an extension included in - * `fileColletionParams.extension` are watched. See first argument of + * `fileCollectionParams.extension` are watched. See first argument of * `chokidar.watch`. * @param {string[]} opts.watchIgnore - List of paths and patterns to * exclude from watching. See `ignored` option of `chokidar`. @@ -144,7 +144,7 @@ exports.watchRun = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => { * @param {AfterWatchRun} [opts.afterRun] - Function to call after `mocha.run()` * @param {string[]} [opts.watchFiles] - List of paths and patterns to watch. If * not provided all files with an extension included in - * `fileColletionParams.extension` are watched. See first argument of + * `fileCollectionParams.extension` are watched. See first argument of * `chokidar.watch`. * @param {string[]} [opts.watchIgnore] - List of paths and patterns to exclude * from watching. See `ignored` option of `chokidar`. diff --git a/lib/errors.js b/lib/errors.js index 929f56399c..56e01c04c3 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -59,12 +59,12 @@ var constants = { UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED', /** - * Invalid state transition occuring in `Mocha` instance + * Invalid state transition occurring in `Mocha` instance */ INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', /** - * Invalid state transition occuring in `Mocha` instance + * Invalid state transition occurring in `Mocha` instance */ INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', diff --git a/lib/mocha.js b/lib/mocha.js index ee76ba1d50..dc18b585a5 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -252,7 +252,7 @@ Mocha.prototype.addFile = function(file) { * @public * @see [CLI option](../#-reporter-name-r-name) * @see [Reporters](../#reporters) - * @param {String|Function} reporter - Reporter name or constructor. + * @param {String|Function} reporterName - Reporter name or constructor. * @param {Object} [reporterOptions] - Options used to configure the reporter. * @returns {Mocha} this * @chainable @@ -775,8 +775,8 @@ Mocha.prototype.timeout = function(msecs) { * // Allow any failed test to retry one more time * mocha.retries(1); */ -Mocha.prototype.retries = function(n) { - this.suite.retries(n); +Mocha.prototype.retries = function(retry) { + this.suite.retries(retry); return this; }; diff --git a/lib/utils.js b/lib/utils.js index fa26ad609a..00d6fcc938 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -604,7 +604,7 @@ exports.defineConstants = function(obj) { * Whether current version of Node support ES modules * * @description - * Versions prior to 10 did not support ES Modules, and version 10 has an old incompatibile version of ESM. + * Versions prior to 10 did not support ES Modules, and version 10 has an old incompatible version of ESM. * This function returns whether Node.JS has ES Module supports that is compatible with Mocha's needs, * which is version >=12.11. * From cf736fedfb15203824c0d21af7900112354f5804 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 1 Jul 2020 14:51:53 -0700 Subject: [PATCH 1542/1771] handle errors in supporter images during 11ty build - `canvas` now checks for errors and discards supporters, which will avoid problems during postbuild step - output debug info in build - remove `image-size` in lieu of `canvas` which is now a direct dev dependency --- docs/_data/supporters.js | 93 ++++++++++++++++++++++++++-------------- netlify.toml | 1 + package-lock.json | 18 -------- package.json | 2 +- 4 files changed, 63 insertions(+), 51 deletions(-) diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js index dd797aebbc..6fb7116686 100755 --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -17,11 +17,11 @@ 'use strict'; -const {writeFile, mkdir} = require('fs').promises; +const {loadImage} = require('canvas'); +const {writeFile, mkdir, rmdir} = require('fs').promises; const {resolve} = require('path'); const debug = require('debug')('mocha:docs:data:supporters'); const needle = require('needle'); -const imageSize = require('image-size'); const blocklist = new Set(require('./blocklist.json')); /** @@ -36,7 +36,12 @@ const BLOCKED_STRINGS = /(?:vpn|[ck]a[sz]ino|seo|slots|gambl(?:e|ing)|crypto)/i; */ const API_ENDPOINT = 'https://api.opencollective.com/graphql/v2'; -const query = `query account($limit: Int, $offset: Int, $slug: String) { +const SPONSOR_TIER = 'sponsor'; +const BACKER_TIER = 'backer'; + +const SUPPORTER_IMAGE_PATH = resolve(__dirname, '../images/supporters'); + +const SUPPORTER_QUERY = `query account($limit: Int, $offset: Int, $slug: String) { account(slug: $slug) { orders(limit: $limit, offset: $offset) { limit @@ -61,7 +66,9 @@ const query = `query account($limit: Int, $offset: Int, $slug: String) { } }`; -const graphqlPageSize = 1000; +const GRAPHQL_PAGE_SIZE = 1000; + +const invalidSupporters = []; const nodeToSupporter = node => ({ id: node.fromAccount.id, @@ -75,6 +82,30 @@ const nodeToSupporter = node => ({ type: node.fromAccount.type }); +const fetchImage = async supporter => { + try { + const {avatar: url} = supporter; + const {body: imageBuf} = await needle('get', url); + debug('fetched %s', url); + const canvasImage = await loadImage(imageBuf); + debug('ok %s', url); + supporter.dimensions = { + width: canvasImage.width, + height: canvasImage.height + }; + debug('dimensions %s %dw %dh', url, canvasImage.width, canvasImage.height); + const filePath = resolve(SUPPORTER_IMAGE_PATH, supporter.id + '.png'); + await writeFile(filePath, imageBuf); + debug('wrote %s', filePath); + } catch (err) { + console.error( + `failed to load ${supporter.avatar}; will discard ${supporter.tier} "${supporter.name} (${supporter.slug}). reason:\n`, + err + ); + invalidSupporters.push(supporter); + } +}; + /** * Retrieves donation data from OC * @@ -84,26 +115,26 @@ const nodeToSupporter = node => ({ */ const getAllOrders = async (slug = 'mochajs') => { let allOrders = []; - const variables = {limit: graphqlPageSize, offset: 0, slug}; + const variables = {limit: GRAPHQL_PAGE_SIZE, offset: 0, slug}; // Handling pagination if necessary (2 pages for ~1400 results in May 2019) while (true) { const result = await needle( 'post', API_ENDPOINT, - {query, variables}, + {query: SUPPORTER_QUERY, variables}, {json: true} ); const orders = result.body.data.account.orders.nodes; allOrders = [...allOrders, ...orders]; - variables.offset += graphqlPageSize; - if (orders.length < graphqlPageSize) { + variables.offset += GRAPHQL_PAGE_SIZE; + if (orders.length < GRAPHQL_PAGE_SIZE) { debug('retrieved %d orders', allOrders.length); return allOrders; } else { debug( 'loading page %d of orders...', - Math.floor(variables.offset / graphqlPageSize) + Math.floor(variables.offset / GRAPHQL_PAGE_SIZE) ); } } @@ -143,7 +174,8 @@ const getSupporters = async () => { ...supporters.backers, { ...supporter, - avatar: encodeURI(supporter.imgUrlSmall) + avatar: encodeURI(supporter.imgUrlSmall), + tier: BACKER_TIER } ]; } @@ -152,7 +184,8 @@ const getSupporters = async () => { ...supporters.sponsors, { ...supporter, - avatar: encodeURI(supporter.imgUrlMed) + avatar: encodeURI(supporter.imgUrlMed), + tier: SPONSOR_TIER } ]; } @@ -164,38 +197,34 @@ const getSupporters = async () => { } ); - const supporterImagePath = resolve(__dirname, '../images/supporters'); - - await mkdir(supporterImagePath, {recursive: true}); + await rmdir(SUPPORTER_IMAGE_PATH, {recursive: true}); + debug('blasted %s', SUPPORTER_IMAGE_PATH); + await mkdir(SUPPORTER_IMAGE_PATH, {recursive: true}); + debug('created %s', SUPPORTER_IMAGE_PATH); // Fetch images for sponsors and save their image dimensions - await Promise.all( - supporters.sponsors.map(async sponsor => { - const filePath = resolve(supporterImagePath, `${sponsor.id}.png`); - const {body} = await needle('get', sponsor.avatar); - sponsor.dimensions = imageSize(body); - await writeFile(filePath, body); - }) - ); - - // Fetch images for backers and save their image dimensions - await Promise.all( - supporters.backers.map(async backer => { - const filePath = resolve(supporterImagePath, `${backer.id}.png`); - const {body} = await needle('get', backer.avatar); - await writeFile(filePath, body); - }) - ); + await Promise.all([ + ...supporters.sponsors.map(fetchImage), + ...supporters.backers.map(fetchImage) + ]); + + invalidSupporters.forEach(supporter => { + supporters[supporter.tier].splice( + supporters[supporter.tier].indexOf(supporter), + 1 + ); + }); const backerCount = supporters.backers.length; const sponsorCount = supporters.sponsors.length; const totalValidSupportersCount = backerCount + sponsorCount; debug( - 'found %d valid backers and %d valid sponsors (of %d total; %d blocked)', + 'found %d valid backers and %d valid sponsors (%d total; %d invalid; %d blocked)', backerCount, sponsorCount, totalValidSupportersCount, + invalidSupporters.length, uniqueSupporters.size - totalValidSupportersCount ); return supporters; diff --git a/netlify.toml b/netlify.toml index 07c12162f8..e9ee7d4443 100644 --- a/netlify.toml +++ b/netlify.toml @@ -13,6 +13,7 @@ command = "npm start docs.production" [build.environment] + DEBUG = "mocha:docs*" NODE_VERSION = "12" RUBY_VERSION = "2.7.1" diff --git a/package-lock.json b/package-lock.json index 8521a648fa..a1b9a224c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11635,15 +11635,6 @@ "minimatch": "^3.0.4" } }, - "image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "dev": true, - "requires": { - "queue": "6.0.1" - } - }, "imageinfo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/imageinfo/-/imageinfo-1.0.4.tgz", @@ -18064,15 +18055,6 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", diff --git a/package.json b/package.json index 7f7d35e016..5f61980fe1 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "assetgraph-builder": "^8.0.1", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", + "canvas": "^2.6.1", "chai": "^4.2.0", "coffee-script": "^1.12.7", "core-js": "^3.6.5", @@ -108,7 +109,6 @@ "fs-extra": "^9.0.0", "husky": "^4.2.3", "hyperlink": "^4.4.3", - "image-size": "^0.8.3", "jsdoc": "^3.6.3", "karma": "^4.4.1", "karma-chrome-launcher": "^3.1.0", From 60858dc4f32713f67112f837063380639042737e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 29 Jul 2020 15:08:21 -0700 Subject: [PATCH 1543/1771] devDependency updates for v8.1.0 Signed-off-by: Christopher Hiller update CHANGELOG Signed-off-by: Christopher Hiller --- CHANGELOG.md | 4 +- package-lock.json | 1113 ++++++++++++++++++++++++--------------------- package.json | 8 +- 3 files changed, 597 insertions(+), 528 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad6f7d2fe0..6800b9c046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 8.1.0 / 2020-07-29 +# 8.1.0 / 2020-07-30 In this release, Mocha now builds its browser bundle with Rollup and Babel, which will provide the project's codebase more flexibility and consistency. @@ -6,7 +6,7 @@ While we've been diligent about backwards compatibility, it's _possible_ consume This release **does not** drop support for IE11. -Other community contributions came from [**@Devjeel**](https://github.com/Devjeel) and [**@sharath2106**](https://github.com/sharath2106). _Thank you_ to everyone who contributed to this release! +Other community contributions came from [**@Devjeel**](https://github.com/Devjeel), @Harsha509 and [**@sharath2106**](https://github.com/sharath2106). _Thank you_ to everyone who contributed to this release! > Do you read Korean? See [this guide to running parallel tests in Mocha](https://blog.outsider.ne.kr/1489), translated by our maintainer, [**@outsideris**](https://github.com/outsideris). diff --git a/package-lock.json b/package-lock.json index a1b9a224c0..517be26440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4259,9 +4259,9 @@ "dev": true }, "assetgraph": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.5.tgz", - "integrity": "sha512-t+S7aDhjxY7c/s/PX2Tz17R8rDorsMVZTSlPnUXClpnbet8R+xTNrZ47hoES7yAZ9MsgXkBKmV6TT4giYyXhOw==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.8.tgz", + "integrity": "sha512-pYOnn57YwvSrXAMJXr2PIt6mtJfOV40vlujATgr6ArXLgGWHlK8TDVOcD3BHk08njeXNZVu8hb8VIy8d5csgtA==", "dev": true, "requires": { "acorn": "^7.0.0", @@ -4290,6 +4290,7 @@ "normalizeurl": "^1.0.0", "perfectionist": "^2.4.0", "postcss": "^7.0.14", + "qs": "^6.5.2", "read-pkg-up": "^6.0.0", "repeat-string": "^1.5.4", "schemes": "^1.0.1", @@ -4304,15 +4305,15 @@ }, "dependencies": { "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4321,6 +4322,12 @@ "lines-and-columns": "^1.1.6" } }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "dev": true + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -4367,12 +4374,13 @@ } }, "assetgraph-builder": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-8.0.1.tgz", - "integrity": "sha512-4ssOaw3brKEBVsA3ORoRT4rwGYxGxwPkhUW7j6Gst6EgdS6QnRNtW9tIq5CSjdyJCxfkrwloRJXd2scA5yq5Wg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-8.1.0.tgz", + "integrity": "sha512-Mb+16EZ/JxAEov1Ni9ciLBuC/MyaHbQnJLNb62YKCh7xuBcv5ytXWeKOQ4vfrK9+wq9TX3Vag3clLJq6zqgpcg==", "dev": true, "requires": { - "assetgraph": "6.0.7", + "assetgraph": "6.0.8", + "assetgraph-hashfiles": "^1.0.1", "assetgraph-sprite": "^3.2.0", "browserslist": "^4.4.2", "chalk": "^4.0.0", @@ -4395,111 +4403,24 @@ "urltools": "^0.4.1" }, "dependencies": { - "acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true - }, - "assetgraph": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.0.7.tgz", - "integrity": "sha512-6e8xWY0LuTt128CBo9G7H8l/XUJ0cBMldIdqj9zGTDfg9pkw2bP4aBElss8W0Ftn8jwJ3atb0Mbe9WJsD7ypYA==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.1", - "bluebird": "^3.5.1", - "chalk": "^2.0.1", - "common-path-prefix": "^1.0.0", - "createerror": "^1.3.0", - "cssnano": "^4.1.10", - "data-urls": "^1.0.0", - "domspace": "^1.2.1", - "esanimate": "^1.1.0", - "escodegen": "^1.12.0", - "espurify": "^2.0.1", - "estraverse": "^4.3.0", - "estraverse-fb": "^1.3.2", - "gettemporaryfilepath": "^1.0.0", - "glob": "^7.0.5", - "html-minifier": "^4.0.0", - "imageinfo": "^1.0.4", - "jsdom": "^15.0.0", - "lines-and-columns": "^1.1.6", - "lodash": "4.17.15", - "memoizesync": "1.1.1", - "mkdirp": "^0.5.1", - "normalizeurl": "^1.0.0", - "perfectionist": "^2.4.0", - "postcss": "^7.0.14", - "read-pkg-up": "^6.0.0", - "repeat-string": "^1.5.4", - "schemes": "^1.0.1", - "semver": "^6.0.0", - "sift": "^7.0.1", - "source-map": "~0.6.1", - "specificity": "^0.4.0", - "sw-precache": "^5.2.0", - "teepee": "^2.31.1", - "terser": "^4.0.0", - "urltools": "^0.4.1" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "color-convert": { @@ -4531,77 +4452,22 @@ "requires": { "aggregate-error": "^3.0.0" } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", - "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", - "dev": true, - "requires": { - "find-up": "^4.0.0", - "read-pkg": "^5.1.1", - "type-fest": "^0.5.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, + "assetgraph-hashfiles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/assetgraph-hashfiles/-/assetgraph-hashfiles-1.0.1.tgz", + "integrity": "sha512-nqSK4oxNZg/u9YhT4Jld6n2NHVC2piwnYUh7yc5hHYAS+23ah93lsTXu2Z8QXv4za2sbZwIfHnCIY8Gjl6lliw==", + "dev": true, + "requires": { + "urltools": "^0.4.1" + } + }, "assetgraph-sprite": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-3.2.0.tgz", - "integrity": "sha512-qp2DBV+Tn27jU6AtPx3zUZGheRbT9Jv6L0FFB6n7EB8mwgxTGul10HacyyzMJ3c7imOAPINgsPHSMJp/zBxw5A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-3.2.1.tgz", + "integrity": "sha512-oyL1D3GBe/zrKwDGNap/yTadoMnE+dMTMnjco9BXFJkudPd1Wp16WeiW5e9jURreqcfdzKZctgi3t65RNmgFZA==", "dev": true, "requires": { "canvas": "^2.3.1" @@ -5558,28 +5424,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -5590,14 +5456,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -5608,42 +5474,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -5653,28 +5519,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -5684,14 +5550,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -5708,7 +5574,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -5723,14 +5589,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -5740,7 +5606,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -5750,7 +5616,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -5761,21 +5627,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -5785,14 +5651,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -5802,14 +5668,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -5820,7 +5686,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -5830,7 +5696,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -5840,14 +5706,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -5859,7 +5725,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -5878,7 +5744,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -5889,7 +5755,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -5899,14 +5765,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -5918,7 +5784,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -5931,21 +5797,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -5955,21 +5821,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -5980,21 +5846,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -6007,7 +5873,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -6023,7 +5889,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -6033,49 +5899,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -6087,7 +5953,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -6097,7 +5963,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -6107,14 +5973,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -6130,14 +5996,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -6147,14 +6013,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -7996,9 +7862,9 @@ "dev": true }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" @@ -8060,9 +7926,9 @@ "dev": true }, "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", "dev": true }, "date-time": { @@ -9077,9 +8943,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -10602,9 +10468,9 @@ } }, "gettemporaryfilepath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gettemporaryfilepath/-/gettemporaryfilepath-1.0.0.tgz", - "integrity": "sha1-I1R5Hw9c27yIGri9edR4wWahIwU=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gettemporaryfilepath/-/gettemporaryfilepath-1.0.1.tgz", + "integrity": "sha512-MVCSgF1blIZuIV3KYhMKOwU1OSxPF1s+ZcyqWMSGR5Fzl6fN7EjIXDFGu9PmWAAwyGjMjmkS2ruqPaj13J3SXA==", "dev": true }, "github-from-package": { @@ -11564,9 +11430,9 @@ } }, "hyperlink": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.4.3.tgz", - "integrity": "sha512-g5kjgE/TvF3Oe8mi0Lh5y2ZP6XkfI+ngHuSyniMrCB89Joj2YBDjTbaEi3GfnYhZBuhr/AHe9V2udaAuV2H1Rw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.5.0.tgz", + "integrity": "sha512-xQT0D+Qy2CLSLhToI/wFAjKuzKZhqGQaHuIiiSu3+f9stOv9U7DkxTgY6X2d6TEi2FBs23kkVTzGM5jEOK3c8A==", "dev": true, "requires": { "@munter/tap-render": "^0.2.0", @@ -11746,23 +11612,20 @@ "dev": true }, "inkscape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inkscape/-/inkscape-2.0.0.tgz", - "integrity": "sha512-HajZYZn6zuytzOq8dPCtfymFBmUy6FE611ftdBy2RypcYrDxqSvDTnyrsqkAFXNtVWi8SScJiYA69Y9PuSFK2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/inkscape/-/inkscape-2.1.0.tgz", + "integrity": "sha512-XiqxZkYdWNHeKtJnThrSRLIzEdN8ZKJ5mMygdiyhm8gDU1rB27M6F0ch6i1ggacN5KrLJdDIUpNOJH8MX68Rhg==", "dev": true, "requires": { - "async": "^2.6.1", + "async": "^3.0.0", "gettemporaryfilepath": "^1.0.0" }, "dependencies": { "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true } } }, @@ -12452,13 +12315,10 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isbuffer": { "version": "0.0.0", @@ -12656,31 +12516,20 @@ "dev": true }, "jpegtran": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.0.6.tgz", - "integrity": "sha512-H1TQgIg62gueqy1BkBVPO2mTFh68rseOhRhiTBBLAFiEUpyQlNa3EGa0lACAVeAXfryrFQCFVrS2xhsrlpXY9Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jpegtran/-/jpegtran-1.1.0.tgz", + "integrity": "sha512-0bs0BFaI75ZIvWz3fqqLCFrPmWhStqRsw5hzUMgEgxQWmN3FiLag4xIBqYfbNWnSR8jCtMIYc7uUPUQgWj8tQA==", "dev": true, "requires": { - "jpegtran-bin": "^4.0.0", + "jpegtran-bin": "^5.0.1", "memoizeasync": "^1.0.0", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "which": "^2.0.1" } }, "jpegtran-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", - "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-5.0.2.tgz", + "integrity": "sha512-4FSmgIcr8d5+V6T1+dHbPZjaFH0ogVyP4UVsE+zri7S9YLO4qAT2our4IN3sW3STVgNTbqPermdIgt2XuAJ4EA==", "dev": true, "requires": { "bin-build": "^3.0.0", @@ -12689,9 +12538,9 @@ } }, "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz", + "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==", "dev": true }, "js-beautify": { @@ -12833,9 +12682,9 @@ }, "dependencies": { "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, "acorn-globals": { @@ -12857,9 +12706,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", "dev": true } } @@ -13004,52 +12853,233 @@ "dev": true }, "karma": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", - "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.1.1.tgz", + "integrity": "sha512-xAlOr5PMqUbiKXSv5PCniHWV3aiwj6wIZ0gUVcwpTCPVQm/qH2WAMFWxtnpM6KJqhkRWrIpovR4Rb0rn8GtJzQ==", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", + "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", + "colors": "^1.4.0", + "connect": "^3.7.0", "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", + "dom-serialize": "^2.2.1", + "flatted": "^2.0.2", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.15", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" + "tmp": "0.2.1", + "ua-parser-js": "0.7.21", + "yargs": "^15.3.1" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "requires": { - "glob": "^7.1.3" + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "source-map": { @@ -13057,6 +13087,84 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -13081,20 +13189,12 @@ } }, "karma-mocha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", "dev": true, "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "minimist": "^1.2.3" } }, "karma-mocha-reporter": { @@ -14260,16 +14360,16 @@ } }, "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { - "date-format": "^2.0.0", + "date-format": "^3.0.0", "debug": "^4.1.1", - "flatted": "^2.0.0", + "flatted": "^2.0.1", "rfdc": "^1.1.4", - "streamroller": "^1.0.6" + "streamroller": "^2.2.4" }, "dependencies": { "debug": { @@ -16151,32 +16251,21 @@ } }, "optipng": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/optipng/-/optipng-2.1.0.tgz", - "integrity": "sha512-Qih2It6tRiHr6tjxY3fL16G+vXJa4+LbpIA4vrNabpvpCOzlnNUwNQqQg9h4lxu/fTz3yReqlqqeIna+KVhTDA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/optipng/-/optipng-2.2.0.tgz", + "integrity": "sha512-qVLokbWDo++lO/cThbrlcRNBuTKHgwWC1nV5ri0O8BHfjIBBHVUyReo4hP0C0U8I0qIu//DYlDp59IEf1iL1yQ==", "dev": true, "requires": { "gettemporaryfilepath": "^1.0.0", "memoizeasync": "^1.1.0", - "optipng-bin": "^6.0.0", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "optipng-bin": "^7.0.0", + "which": "^2.0.1" } }, "optipng-bin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-6.0.0.tgz", - "integrity": "sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.0.tgz", + "integrity": "sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA==", "dev": true, "requires": { "bin-build": "^3.0.0", @@ -16881,32 +16970,21 @@ "dev": true }, "pngcrush": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-2.0.1.tgz", - "integrity": "sha512-U78ij8Rg5z3/GarINEMdkp4f5ORmNna5VL9xxKdv5/HpOBYaYUpjKhnXH3mkOOyTCxawqpXvDrs99pzcf8izUw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-2.1.0.tgz", + "integrity": "sha512-ehR7lJpbvePOYiq7MlCbpMlPpxXfhalJI/oiDeibPOBJzFtfbSdjYU7VaDZ2v8JJ+1ToAoQf3cZsSYpQg3HZJw==", "dev": true, "requires": { "gettemporaryfilepath": "^1.0.0", "memoizeasync": "^1.0.0", - "pngcrush-bin": "^4.0.0", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "pngcrush-bin": "^5.0.0", + "which": "^2.0.1" } }, "pngcrush-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pngcrush-bin/-/pngcrush-bin-4.0.0.tgz", - "integrity": "sha512-SFR9a/OgkuFiiksjM6yevTGvOdn+7JrL5r0j/zCVAZTurfRzh2smwDRYKnPMEwxgVOkwWt/tlVWRJUstSH7RcA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pngcrush-bin/-/pngcrush-bin-5.0.1.tgz", + "integrity": "sha512-fe11NCaVzSrMyteBKuBUFs4g382FHuSOzK6TI/HJdPhEFA4j5QJM0lEhtiZkNempOES7rS+LlN1dXIzU03MXnQ==", "dev": true, "requires": { "bin-build": "^3.0.0", @@ -16915,25 +16993,14 @@ } }, "pngquant": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-3.0.0.tgz", - "integrity": "sha512-zGcAUXEnDDJ9iAu3an1Dr77HlS8UJbrnsaTcPMyyZPibhyB6XGTG6REDOyAiVOa6MgQwxL8nCqAFVlFixK+HPg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pngquant/-/pngquant-3.1.0.tgz", + "integrity": "sha512-P4GpptqgUOlHUuHvjVoN0Yl1FMISKVv+qXX9NsqsG6eKSwQ9qUX8Sw3dT2i1/WiOEEBb6oAuTsQ6nvlP45W0lA==", "dev": true, "requires": { "memoizeasync": "1.1.0", "pngquant-bin": "^5.0.2", - "which": "1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "which": "2.0.2" } }, "pngquant-bin": { @@ -17603,9 +17670,9 @@ "dev": true }, "prebuild-install": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.4.tgz", - "integrity": "sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", + "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", "dev": true, "requires": { "detect-libc": "^1.0.3", @@ -18548,21 +18615,29 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -20053,9 +20128,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -20392,34 +20467,38 @@ } }, "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "lodash": "^4.17.14" + "ms": "^2.1.1" } }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } @@ -20861,9 +20940,9 @@ } }, "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", "dev": true, "requires": { "bl": "^4.0.1", @@ -20970,9 +21049,9 @@ } }, "terser": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", - "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -21814,16 +21893,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, "uslug": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", @@ -22098,28 +22167,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -22130,14 +22199,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -22148,42 +22217,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -22193,28 +22262,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -22224,14 +22293,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -22248,7 +22317,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -22263,14 +22332,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -22280,7 +22349,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -22290,7 +22359,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -22301,21 +22370,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -22325,14 +22394,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -22342,14 +22411,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -22360,7 +22429,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -22370,7 +22439,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -22380,14 +22449,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -22399,7 +22468,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -22418,7 +22487,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -22429,7 +22498,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -22439,14 +22508,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -22458,7 +22527,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -22471,21 +22540,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -22495,21 +22564,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -22520,21 +22589,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -22547,7 +22616,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -22563,7 +22632,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -22573,49 +22642,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -22627,7 +22696,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -22637,7 +22706,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -22647,14 +22716,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -22670,14 +22739,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -22687,14 +22756,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true diff --git a/package.json b/package.json index 5f61980fe1..5bcaf9748b 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-multi-entry": "^3.0.1", "@rollup/plugin-node-resolve": "^8.1.0", - "assetgraph-builder": "^8.0.1", + "assetgraph-builder": "^8.1.0", "autoprefixer": "^9.7.4", "babel-eslint": "^10.1.0", "canvas": "^2.6.1", @@ -108,11 +108,11 @@ "eslint-plugin-standard": "^4.0.1", "fs-extra": "^9.0.0", "husky": "^4.2.3", - "hyperlink": "^4.4.3", + "hyperlink": "^4.5.0", "jsdoc": "^3.6.3", - "karma": "^4.4.1", + "karma": "^5.1.1", "karma-chrome-launcher": "^3.1.0", - "karma-mocha": "^1.3.0", + "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-requirejs": "^1.1.0", "karma-sauce-launcher": "^2.0.2", From a6203c6967d9e73cd6696c82a587213f5e86cee3 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 30 Jul 2020 12:57:12 -0700 Subject: [PATCH 1544/1771] add git tag message to .npmrc Signed-off-by: Christopher Hiller --- .npmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..a09c5d73fc --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ + message=Release v%s \ No newline at end of file From 7e250ef1168cf93e9d473321dc93b0b81f9a0d98 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 30 Jul 2020 12:57:28 -0700 Subject: [PATCH 1545/1771] Release v8.1.0 --- AUTHORS | 8 ++++++++ CHANGELOG.md | 2 +- package-lock.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 17a05b7217..cdcfae85a3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -495,5 +495,13 @@ Daniel0113 Nico Jansen JacobLey <37151850+JacobLey@users.noreply.github.com> Gil Tayar +Martin Oppitz +Benjamin E. Coe +Michael Brade +Gopishankar Haridas +devjeel +Martin Oppitz +indieisaconcept +Sri Harsha # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6800b9c046..1d46785f58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ While we've been diligent about backwards compatibility, it's _possible_ consume This release **does not** drop support for IE11. -Other community contributions came from [**@Devjeel**](https://github.com/Devjeel), @Harsha509 and [**@sharath2106**](https://github.com/sharath2106). _Thank you_ to everyone who contributed to this release! +Other community contributions came from [**@Devjeel**](https://github.com/Devjeel), [**@Harsha509**](https://github.com/Harsha509) and [**@sharath2106**](https://github.com/sharath2106). _Thank you_ to everyone who contributed to this release! > Do you read Korean? See [this guide to running parallel tests in Mocha](https://blog.outsider.ne.kr/1489), translated by our maintainer, [**@outsideris**](https://github.com/outsideris). diff --git a/package-lock.json b/package-lock.json index 517be26440..5d13ea9386 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.0.1", + "version": "8.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5bcaf9748b..22683f01dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.0.1", + "version": "8.1.0", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 962c81644a523b78b571db2dc4b637a323f928e0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 4 Aug 2020 10:24:57 -0700 Subject: [PATCH 1546/1771] fix window width problem; closes #4393 looks like maybe a bad merge, but `isBrowser()` was used incorrectly --- lib/reporters/base.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 7d9e01c00a..1f97e319dd 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -14,7 +14,7 @@ var constants = require('../runner').constants; var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; -var isBrowser = require('../utils').isBrowser; +const isBrowser = utils.isBrowser(); function getBrowserWindowSize() { if ('innerHeight' in global) { @@ -34,7 +34,7 @@ exports = module.exports = Base; * Check if both stdio streams are associated with a tty. */ -var isatty = isBrowser ? true : process.stdout.isTTY && process.stderr.isTTY; +var isatty = isBrowser || (process.stdout.isTTY && process.stderr.isTTY); /** * Save log references to avoid tests interfering (see GH-3604). @@ -46,7 +46,7 @@ var consoleLog = console.log; */ exports.useColors = - !utils.isBrowser() && + !isBrowser && (supportsColor.stdout || process.env.MOCHA_COLORS !== undefined); /** From 84fb640aa1e579b18337afcc57a3fe395ef95e36 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 4 Aug 2020 12:07:18 -0700 Subject: [PATCH 1547/1771] update CHANGELOG.md for v8.1.1 Signed-off-by: Christopher Hiller --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d46785f58..555e9d00c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 8.1.1 / 2020-08-04 + +## :bug: Fixes + +- #4394: Fix regression wherein certain reporters did not correctly detect terminal width (@boneskull) + # 8.1.0 / 2020-07-30 In this release, Mocha now builds its browser bundle with Rollup and Babel, which will provide the project's codebase more flexibility and consistency. From 78d979db7c41b68941518f026b5cad7d59376ada Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 4 Aug 2020 12:07:31 -0700 Subject: [PATCH 1548/1771] Release v8.1.1 --- CHANGELOG.md | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 555e9d00c0..1082e6ea47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## :bug: Fixes -- #4394: Fix regression wherein certain reporters did not correctly detect terminal width (@boneskull) +- [#4394](https://github.com/mochajs/mocha/issues/4394): Fix regression wherein certain reporters did not correctly detect terminal width ([**@boneskull**](https://github.com/boneskull)) # 8.1.0 / 2020-07-30 diff --git a/package-lock.json b/package-lock.json index 5d13ea9386..328c2a81d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.0", + "version": "8.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 22683f01dc..6f88bd7033 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.0", + "version": "8.1.1", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 2b8a1ff636d58b023ae727dcef8e0c5d7784496e Mon Sep 17 00:00:00 2001 From: irrationnelle Date: Sun, 9 Aug 2020 03:43:29 +0900 Subject: [PATCH 1549/1771] fix: add Mocha to global variable --- rollup.config.js | 3 ++- test/browser-specific/esm.spec.mjs | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index 9005b6138a..e90bb5203e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -17,7 +17,8 @@ const config = { file: './mocha.js', format: 'umd', sourcemap: true, - name: 'mocha' + name: 'mocha', + footer: 'window.Mocha = window.mocha.Mocha;' }, plugins: [ json(), diff --git a/test/browser-specific/esm.spec.mjs b/test/browser-specific/esm.spec.mjs index 884f64324b..477aa505cc 100644 --- a/test/browser-specific/esm.spec.mjs +++ b/test/browser-specific/esm.spec.mjs @@ -3,3 +3,7 @@ import './fixtures/esm.fixture.mjs'; it('should register a global if it did not fail', function() { expect(window.MOCHA_IS_OK, 'to be ok'); }); + +it('should has global Mocha', function() { + expect(window.Mocha, 'not to be', undefined); +}); From 4e2b47df31fbc0865cbfa4477226e8609d2ee56e Mon Sep 17 00:00:00 2001 From: Donghoon Song <32301380+Donghoon759@users.noreply.github.com> Date: Mon, 17 Aug 2020 21:20:15 +0900 Subject: [PATCH 1550/1771] Fixing typos (#4404) * Fix typo * Fix typos * Fix netlify deploy preview issue --- lib/mocha.js | 4 ++-- lib/nodejs/serializer.js | 2 +- lib/runner.js | 2 +- lib/utils.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index dc18b585a5..0b4aa5a4bd 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -807,7 +807,7 @@ Mocha.prototype.slow = function(msecs) { * * @public * @see [CLI option](../#-async-only-a) - * @param {boolean} [asyncOnly=true] - Wether to force `done` callback or promise. + * @param {boolean} [asyncOnly=true] - Whether to force `done` callback or promise. * @return {Mocha} this * @chainable */ @@ -847,7 +847,7 @@ Mocha.prototype.allowUncaught = function(allowUncaught) { * Delays root suite execution. * * @description - * Used to perform asynch operations before any suites are run. + * Used to perform async operations before any suites are run. * * @public * @see [delayed root suite](../#delayed-root-suite) diff --git a/lib/nodejs/serializer.js b/lib/nodejs/serializer.js index ac95bdc344..448cb52e45 100644 --- a/lib/nodejs/serializer.js +++ b/lib/nodejs/serializer.js @@ -56,7 +56,7 @@ class SerializableWorkerResult { /** * Instantiates a new {@link SerializableWorkerResult}. * @param {...any} args - Args to constructor - * @returns {SerilizableWorkerResult} + * @returns {SerializableWorkerResult} */ static create(...args) { return new SerializableWorkerResult(...args); diff --git a/lib/runner.js b/lib/runner.js index cd91173e10..876d64fb24 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -206,7 +206,7 @@ Runner.prototype._addEventListener = function(target, eventName, listener) { /** * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping. * @param {EventEmitter} target - The `EventEmitter` - * @param {string} eventName - The event anme + * @param {string} eventName - The event name * @param {function} listener - Listener function * @private */ diff --git a/lib/utils.js b/lib/utils.js index 00d6fcc938..cf483760cf 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -508,7 +508,7 @@ exports.isPromise = function isPromise(value) { * Clamps a numeric value to an inclusive range. * * @param {number} value - Value to be clamped. - * @param {numer[]} range - Two element array specifying [min, max] range. + * @param {number[]} range - Two element array specifying [min, max] range. * @returns {number} clamped value */ exports.clamp = function clamp(value, range) { From 16d4f3a06d111ca3e5e57c58d1a9b8fc278bde5d Mon Sep 17 00:00:00 2001 From: Sujin Park Date: Wed, 19 Aug 2020 00:09:28 +0900 Subject: [PATCH 1551/1771] Update Code of Conduct governance document link in CODE_OF_CONDUCT.md (#4405) --- .github/CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 06fc2b30ed..1d08ae277e 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -91,4 +91,4 @@ For reporting issues in spaces managed by the OpenJS Foundation, for example, re The OpenJS Foundation maintains a Code of Conduct Panel (CoCP). This is a foundation-wide team established to manage escalation when a reporter believes that a report to a member project or the CPC has not been properly handled. In order to escalate to the CoCP send an email to `"coc-escalation@lists.openjsf.org`. For more information, refer to the full -[Code of Conduct governance document](https://github.com/openjs-foundation/bootstrap/blob/master/proposals/stage-1/CODE_OF_CONDUCT/FOUNDATION_CODE_OF_CONDUCT_REQUIREMENTS.md). +[Code of Conduct governance document](https://github.com/openjs-foundation/cross-project-council/blob/master/FOUNDATION_CODE_OF_CONDUCT_REQUIREMENTS.md). From 7c91d821e0e7c52f4b37fb70aadfd5411c59ea54 Mon Sep 17 00:00:00 2001 From: KIM HYO RIN Date: Tue, 18 Aug 2020 23:28:32 +0900 Subject: [PATCH 1552/1771] update js reference link (map, assign) in lib/utils.js --- lib/utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index cf483760cf..64dfe9b964 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -568,9 +568,9 @@ exports.noop = function() {}; * doesn't support it. Recommended for use in Mocha's public APIs. * * @public - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map|MDN:Map} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Custom_and_Null_objects|MDN:Map} * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects} - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign|MDN:Object.assign} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Custom_and_Null_objects|MDN:Object.assign} * @param {...*} [obj] - Arguments to `Object.assign()`. * @returns {Object} An object with no prototype, having `...obj` properties */ From 24d1dfb0f8ff806acd8d056eaf1de5bf82b39e00 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 18 Aug 2020 11:49:03 -0700 Subject: [PATCH 1553/1771] fix broken template processing in jsdoc output (#4381) because the files generated by jsdoc were output to `docs/_site`, they were not processed as liquid templates, which meant the custom reporter tutorial was broken. to fix this, we needed to: 1. change the output directory of jsdoc to `docs/api` (just somewhere else) 2. add this to `.gitignore`, obviously 3. tell eleventy to _ignore_ `.gitignore` (just rely on its `.eleventyignore` file) 4. tell eleventy to pass-through all assets underneath `docs/api` (css, images, etc) 5. update the file-loading 11ty data script to output a raw file 6. update the tutorial to use a fenced code block (jsdoc markdown plugin seems to strip html?) and tell Prettier to ignore the liquid template directive also: - removed link to google group - prettier-related reformats - tweak data script to use `fs.promises` * update @mocha/docdash Signed-off-by: Christopher Hiller --- .eleventy.js | 6 +- .gitignore | 1 + docs/.eleventyignore | 3 + docs/API.md | 5 +- docs/_data/files.js | 22 ++-- docs/api-tutorials/custom-reporter.md | 3 + jsdoc.conf.json | 2 +- package-lock.json | 138 +++++++++++++------------- package-scripts.js | 6 +- package.json | 2 +- 10 files changed, 98 insertions(+), 90 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 04a49f2df9..89a80a7093 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -16,6 +16,9 @@ module.exports = function(eleventyConfig) { eleventyConfig.addPassthroughCopy('docs/_headers'); eleventyConfig.addPassthroughCopy('docs/favicon.ico'); eleventyConfig.addPassthroughCopy('docs/example'); + eleventyConfig.addPassthroughCopy('docs/api/images'); + eleventyConfig.addPassthroughCopy('docs/api/scripts'); + eleventyConfig.addPassthroughCopy('docs/api/styles'); /* Markdown Plugins */ const markdown = require('markdown-it')({ @@ -43,11 +46,12 @@ module.exports = function(eleventyConfig) { eleventyConfig.setLibrary('md', markdown); + eleventyConfig.setUseGitIgnore(false); + return { passthroughFileCopy: true, dir: { input: 'docs', - includes: '_includes', output: 'docs/_site' } }; diff --git a/.gitignore b/.gitignore index 1a7de6f73d..a575d78bef 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ docs/_site docs/_dist docs/images/supporters +docs/api mocha.js mocha.js.map .karma/ diff --git a/docs/.eleventyignore b/docs/.eleventyignore index cb6f694698..b3e62b8870 100644 --- a/docs/.eleventyignore +++ b/docs/.eleventyignore @@ -5,3 +5,6 @@ LICENSE* _dist/ example/ changelogs/ +api-tutorials/ +_site/ + diff --git a/docs/API.md b/docs/API.md index d92d3e689c..573a56fe3e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,8 +1,8 @@ # Mocha's API Documentation -* * * +--- -Congratulations! You've found Mocha's API documentation. These docs are for developers who wish to: +Congratulations! You've found Mocha's API documentation. These docs are for developers who wish to: - Create an extension for Mocha, or - Develop Mocha itself, or @@ -16,5 +16,4 @@ Otherwise, **you probably want the [main documentation](https://mochajs.org)**. - **[Release Notes / History / Changes](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)** - [Code of Conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) - [Gitter Chatroom](https://gitter.im/mochajs/mocha) (ask questions here!) -- [Google Group](https://groups.google.com/group/mochajs) - [Issue Tracker](https://github.com/mochajs/mocha/issues) diff --git a/docs/_data/files.js b/docs/_data/files.js index abbf25cbfe..908fae8a34 100644 --- a/docs/_data/files.js +++ b/docs/_data/files.js @@ -1,7 +1,7 @@ 'use strict'; const {resolve, relative, dirname} = require('path'); -const {readFileSync} = require('fs'); +const {promises: fs} = require('fs'); const PROJECT_ROOT_DIR = resolve(__dirname, '..', '..'); const FILES = [ @@ -12,12 +12,9 @@ const FILES = [ } ]; -const HEADER = '```js\n'; -const FOOTER = '```\n'; - -const loadFile = (path, {header} = {}) => { +const loadFile = async (path, {header} = {}) => { const relativeDir = relative(dirname(path), PROJECT_ROOT_DIR); - let content = readFileSync(path, 'utf-8'); + let content = await fs.readFile(path, 'utf-8'); // replace relative paths in `require()` to root with "mocha". // might not work in the general case. not gonna parse an AST for this // e.g. `require('../../lib/foo')` => `require('mocha/lib/foo')` @@ -28,18 +25,19 @@ const loadFile = (path, {header} = {}) => { "require('mocha$1')" ) .trim(); - return `${HEADER}${header}\n\n${content}${FOOTER}`; + return `${header}\n\n${content}`; }; /** * Loads files from disk (see `FILES` above) to be shown as data. * Used for embedding sources directly into pages */ -module.exports = () => { - const files = FILES.map(({path, header, slug}) => { - const content = loadFile(path, {header}); - return {slug, content}; - }); +module.exports = async () => { + const files = []; + for await (const {path, header, slug} of FILES) { + const content = await loadFile(path, {header}); + files.push({slug, content}); + } return files.reduce( (files, {slug, content}) => ({ ...files, diff --git a/docs/api-tutorials/custom-reporter.md b/docs/api-tutorials/custom-reporter.md index d858b99970..99ca9d6d2f 100644 --- a/docs/api-tutorials/custom-reporter.md +++ b/docs/api-tutorials/custom-reporter.md @@ -6,7 +6,10 @@ For example, if `mocha-foo-reporter` was published to the npm registry, you coul If you're looking to get started quickly, here's an example of a custom reporter: + +```js {{ files.simplereporter }} +``` To use this reporter, execute `mocha --reporter /path/to/my-reporter.js`. diff --git a/jsdoc.conf.json b/jsdoc.conf.json index e8ea986021..25d06ae7df 100644 --- a/jsdoc.conf.json +++ b/jsdoc.conf.json @@ -8,7 +8,7 @@ "static": false }, "opts": { - "destination": "docs/_site/api", + "destination": "docs/api", "encoding": "utf8", "recurse": true, "template": "node_modules/@mocha/docdash", diff --git a/package-lock.json b/package-lock.json index 328c2a81d2..318577097d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3434,9 +3434,9 @@ "dev": true }, "@mocha/docdash": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-2.1.3.tgz", - "integrity": "sha512-7LL6uH/VtQb+c2VUPeMo46/6BySwLL0CWftK8qa8b2OvSJOkdhJ2K3aB2ptFI9KOzZzxlS+GIExDmMqQJH7ljw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-3.0.0.tgz", + "integrity": "sha512-k/mjHfHe6shnj7gUH3wjVqFyWPiJqiV1IXxn9kzS85mzljS45VB+8zsUKOrKpXtX5YdI6DJmHfqDrR0oHGFNMA==", "dev": true, "requires": { "taffydb": "^2.7.3" @@ -5424,28 +5424,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -5456,14 +5456,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -5474,42 +5474,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, + "resolved": "", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, + "resolved": "", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -5519,28 +5519,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, + "resolved": "", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -5550,14 +5550,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -5574,7 +5574,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, + "resolved": "", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -5589,14 +5589,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -5606,7 +5606,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -5616,7 +5616,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -5627,21 +5627,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -5651,14 +5651,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -5668,14 +5668,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, + "resolved": "", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, + "resolved": "", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -5686,7 +5686,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -5696,7 +5696,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, + "resolved": "", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -5706,14 +5706,14 @@ }, "ms": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, + "resolved": "", "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -5725,7 +5725,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, + "resolved": "", "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -5744,7 +5744,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, + "resolved": "", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -5755,7 +5755,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -5765,14 +5765,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, + "resolved": "", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -5784,7 +5784,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -5797,21 +5797,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -5821,21 +5821,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -5846,21 +5846,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -5873,7 +5873,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, + "resolved": "", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -5889,7 +5889,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -5899,49 +5899,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, + "resolved": "", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -5953,7 +5953,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -5963,7 +5963,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -5973,14 +5973,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, + "resolved": "", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -5996,14 +5996,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -6013,14 +6013,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, + "resolved": "", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true diff --git a/package-scripts.js b/package-scripts.js index dd9f1f7af8..410393fa2c 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -268,15 +268,15 @@ module.exports = { docs: { default: { script: - 'nps docs.prebuild && nps docs.api && eleventy && nps docs.linkcheck && node scripts/netlify-headers.js docs/_site >> docs/_site/_headers', + 'nps docs.clean && nps docs.api && eleventy && nps docs.linkcheck && node scripts/netlify-headers.js docs/_site >> docs/_site/_headers', description: 'Build documentation' }, production: { script: 'nps docs && nps docs.postbuild', description: 'Build docs for production' }, - prebuild: { - script: 'rimraf docs/_dist docs/_site', + clean: { + script: 'rimraf docs/_dist docs/_site docs/api', description: 'Prepare system for doc building', hiddenFromHelp: true }, diff --git a/package.json b/package.json index 6f88bd7033..da078c2939 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@11ty/eleventy": "^0.10.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", "@babel/preset-env": "^7.10.4", - "@mocha/docdash": "^2.1.3", + "@mocha/docdash": "^3.0.0", "@rollup/plugin-babel": "^5.0.4", "@rollup/plugin-commonjs": "^13.0.0", "@rollup/plugin-json": "^4.1.0", From 21371633e704c0735c54909f92cc3afed7eefdb6 Mon Sep 17 00:00:00 2001 From: Chuf <42591821+GChuf@users.noreply.github.com> Date: Tue, 18 Aug 2020 23:49:53 +0200 Subject: [PATCH 1554/1771] Update dependencies & dev dependencies (#4396) * Update dependencies & dev dependencies * fix build, remove spec:true from babel config update lint-staged config Signed-off-by: Christopher Hiller Co-authored-by: Christopher Hiller --- .lintstagedrc.json | 7 +- package-lock.json | 7635 ++++++++++++++++++++++++++++---------------- package.json | 86 +- rollup.config.js | 1 - 4 files changed, 4847 insertions(+), 2882 deletions(-) diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 8535d17cd1..5c26d5f799 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,6 +1,5 @@ { - "*.js": ["eslint --fix", "git add"], - "bin/*": ["eslint --fix", "git add"], - "!(package*).json": ["prettier --write", "git add"], - "*.{yml,md,html}": ["prettier --write", "git add"] + "@(*.js|bin/*)": ["eslint --fix"], + "!(package*).json": ["prettier --write"], + "*.{yml,md,html}": ["prettier --write"] } diff --git a/package-lock.json b/package-lock.json index 318577097d..f8b8be6604 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,41 +11,41 @@ "dev": true }, "@11ty/eleventy": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.10.0.tgz", - "integrity": "sha512-GOgG5ZvFfdJ4fMDlF+OHLQyvwu4cDkCdE8U0x/cfKze2Bu+27htaJ7qW8XbaGArySlBvYGhJD/z8vjdn/+hpLw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.11.0.tgz", + "integrity": "sha512-ozkfpmSlhodVoGCNFhBFsNbFxJbaiPYiVGKCeVdsFBTfDLhGyWS8cieNWjsvKyEHWT8OLNSIBvJYv4JxuxTivg==", "dev": true, "requires": { "@11ty/dependency-tree": "^1.0.0", "browser-sync": "^2.26.7", "chalk": "^3.0.0", - "chokidar": "^3.3.1", + "chokidar": "^3.4.0", "debug": "^4.1.1", - "dependency-graph": "^0.8.1", - "ejs": "^2.6.2", - "fast-glob": "^3.1.1", + "dependency-graph": "^0.9.0", + "ejs": "^2.7.4", + "fast-glob": "^3.2.2", "fs-extra": "^8.1.0", "gray-matter": "^4.0.2", "hamljs": "^0.6.2", - "handlebars": "^4.5.3", + "handlebars": "^4.7.6", "javascript-stringify": "^2.0.1", "liquidjs": "^6.4.3", "lodash": "^4.17.15", - "luxon": "^1.21.3", - "markdown-it": "^8.4.2", - "minimist": "^1.2.0", + "luxon": "^1.24.1", + "markdown-it": "^10.0.0", + "minimist": "^1.2.5", "moo": "^0.5.1", "multimatch": "^4.0.0", - "mustache": "^2.3.0", + "mustache": "^2.3.2", "normalize-path": "^3.0.0", - "nunjucks": "^3.2.0", + "nunjucks": "^3.2.1", "parse-filepath": "^1.0.2", "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", "pug": "^2.0.4", "recursive-copy": "^2.0.10", - "semver": "^7.1.0", - "slugify": "^1.3.6", + "semver": "^7.3.2", + "slugify": "^1.4.0", "time-require": "^0.1.2", "valid-url": "^1.0.9" }, @@ -85,14 +85,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true }, "fs-extra": { "version": "8.1.0", @@ -114,14 +111,20 @@ "graceful-fs": "^4.1.6" } }, + "luxon": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz", + "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg==", + "dev": true + }, "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, "requires": { "argparse": "^1.0.7", - "entities": "~1.1.1", + "entities": "~2.0.0", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" @@ -179,6 +182,17 @@ "slugify": "^1.3.0", "time-require": "^0.1.2", "valid-url": "^1.0.9" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "@nodelib/fs.stat": { @@ -315,9 +329,9 @@ } }, "@babel/compat-data": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", - "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "dev": true, "requires": { "browserslist": "^4.12.0", @@ -326,33 +340,33 @@ }, "dependencies": { "browserslist": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", - "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001088", - "electron-to-chromium": "^1.3.483", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, "caniuse-lite": { - "version": "1.0.30001093", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", - "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", + "version": "1.0.30001115", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001115.tgz", + "integrity": "sha512-NZrG0439ePYna44lJX8evHX2L7Z3/z3qjVLnHgbBb/duNEnGo348u+BQS5o4HTWcrb++100dHFrU36IesIrC1Q==", "dev": true }, "electron-to-chromium": { - "version": "1.3.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", - "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "version": "1.3.535", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.535.tgz", + "integrity": "sha512-5k7WGdl1ZnbcU97acUnY/UXu6bCMDnKCAnEc1N0xNToPvMCp99PEvh5K3xNr4ZUVCf2FuratM++NgOxCtbtXzA==", "dev": true }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", "dev": true }, "semver": { @@ -364,29 +378,140 @@ } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -396,20 +521,32 @@ "safe-buffer": "~5.1.1" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "ms": "^2.1.1" + "minimist": "^1.2.5" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true } } }, @@ -441,16 +578,22 @@ "dev": true }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -476,16 +619,22 @@ "dev": true }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -508,33 +657,33 @@ }, "dependencies": { "browserslist": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", - "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001088", - "electron-to-chromium": "^1.3.483", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, "caniuse-lite": { - "version": "1.0.30001093", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", - "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", + "version": "1.0.30001115", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001115.tgz", + "integrity": "sha512-NZrG0439ePYna44lJX8evHX2L7Z3/z3qjVLnHgbBb/duNEnGo348u+BQS5o4HTWcrb++100dHFrU36IesIrC1Q==", "dev": true }, "electron-to-chromium": { - "version": "1.3.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", - "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "version": "1.3.535", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.535.tgz", + "integrity": "sha512-5k7WGdl1ZnbcU97acUnY/UXu6bCMDnKCAnEc1N0xNToPvMCp99PEvh5K3xNr4ZUVCf2FuratM++NgOxCtbtXzA==", "dev": true }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", "dev": true }, "semver": { @@ -546,13 +695,13 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz", - "integrity": "sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-replace-supers": "^7.10.4", @@ -568,18 +717,6 @@ "@babel/highlight": "^7.10.4" } }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, "@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", @@ -600,43 +737,13 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -657,9 +764,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -673,42 +780,22 @@ "@babel/types": "^7.10.4" } }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -730,14 +817,14 @@ } }, "@babel/helper-define-map": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", - "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" }, "dependencies": { "@babel/code-frame": { @@ -787,9 +874,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -804,16 +891,22 @@ } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -842,14 +935,13 @@ } }, "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, @@ -874,12 +966,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -900,9 +992,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -917,41 +1009,38 @@ } }, "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", + "@babel/generator": "^7.11.0", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -997,16 +1086,22 @@ "dev": true }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1016,45 +1111,215 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "@babel/helper-plugin-utils": { @@ -1064,12 +1329,20 @@ "dev": true }, "@babel/helper-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", - "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "dev": true, "requires": { - "lodash": "^4.17.13" + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } } }, "@babel/helper-remap-async-to-generator": { @@ -1095,14 +1368,13 @@ } }, "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, @@ -1127,12 +1399,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -1153,9 +1425,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -1170,41 +1442,38 @@ } }, "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", + "@babel/generator": "^7.11.0", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -1215,50 +1484,13 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", - "dev": true - }, - "@babel/helper-wrap-function": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" }, @@ -1273,14 +1505,13 @@ } }, "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, @@ -1305,12 +1536,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -1331,9 +1562,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -1348,41 +1579,38 @@ } }, "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", + "@babel/generator": "^7.11.0", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -1392,263 +1620,23 @@ } } }, - "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", - "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", - "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/helper-module-imports": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { @@ -1657,17 +1645,51 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, - "@babel/types": { + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "dev": true + }, + "@babel/template": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1676,39 +1698,71 @@ } } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", - "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "lodash": "^4.17.13" + "@babel/types": "^7.8.3" } }, - "@babel/plugin-transform-classes": { + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helper-wrap-function": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { @@ -1721,14 +1775,13 @@ } }, "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, @@ -1752,43 +1805,13 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -1809,9 +1832,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -1826,41 +1849,38 @@ } }, "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", + "@babel/generator": "^7.11.0", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -1870,70 +1890,15 @@ } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { + "@babel/helpers": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { @@ -1945,6 +1910,17 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", @@ -1965,6 +1941,15 @@ "@babel/types": "^7.10.4" } }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", @@ -1983,9 +1968,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -1999,17 +1984,40 @@ "@babel/types": "^7.10.4" } }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2018,667 +2026,325 @@ } } }, - "@babel/plugin-transform-literals": { + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "dev": true, "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-member-expression-literals": { + "@babel/plugin-proposal-dynamic-import": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, - "@babel/plugin-transform-modules-amd": { + "@babel/plugin-proposal-export-namespace-from": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", - "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", - "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "@babel/plugin-transform-modules-commonjs": { + "@babel/plugin-proposal-json-strings": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", - "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-modules-systemjs": { + "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", - "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", - "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@babel/helper-remap-async-to-generator": "^7.10.4" } }, - "@babel/plugin-transform-modules-umd": { + "@babel/plugin-transform-block-scoped-functions": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-function-name": { @@ -2701,77 +2367,13 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", - "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -2792,9 +2394,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -2808,42 +2410,22 @@ "@babel/types": "^7.10.4" } }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -2853,32 +2435,70 @@ } } }, - "@babel/plugin-transform-named-capturing-groups-regex": { + "@babel/plugin-transform-computed-properties": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-new-target": { + "@babel/plugin-transform-destructuring": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-object-super": { + "@babel/plugin-transform-dotall-regex": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { "@babel/code-frame": { @@ -2890,18 +2510,6 @@ "@babel/highlight": "^7.10.4" } }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, "@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", @@ -2922,45 +2530,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", @@ -2979,9 +2548,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/template": { @@ -2995,42 +2564,22 @@ "@babel/types": "^7.10.4" } }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -3040,10 +2589,101 @@ } } }, - "@babel/plugin-transform-parameters": { + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", - "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.10.4", @@ -3066,16 +2706,22 @@ "dev": true }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3121,12 +2767,13 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", - "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -3140,9 +2787,9 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", - "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -3178,30 +2825,34 @@ } }, "@babel/preset-env": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", - "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.11.0", "@babel/helper-compilation-targets": "^7.10.4", "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-proposal-async-generator-functions": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", "@babel/plugin-proposal-private-methods": "^7.10.4", "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", @@ -3234,14 +2885,14 @@ "@babel/plugin-transform-regenerator": "^7.10.4", "@babel/plugin-transform-reserved-words": "^7.10.4", "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", "@babel/plugin-transform-sticky-regex": "^7.10.4", "@babel/plugin-transform-template-literals": "^7.10.4", "@babel/plugin-transform-typeof-symbol": "^7.10.4", "@babel/plugin-transform-unicode-escapes": "^7.10.4", "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.4", + "@babel/types": "^7.11.0", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -3249,15 +2900,6 @@ "semver": "^5.5.0" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", @@ -3265,44 +2907,50 @@ "dev": true }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, "browserslist": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", - "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001088", - "electron-to-chromium": "^1.3.483", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, "caniuse-lite": { - "version": "1.0.30001093", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", - "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", + "version": "1.0.30001115", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001115.tgz", + "integrity": "sha512-NZrG0439ePYna44lJX8evHX2L7Z3/z3qjVLnHgbBb/duNEnGo348u+BQS5o4HTWcrb++100dHFrU36IesIrC1Q==", "dev": true }, "electron-to-chromium": { - "version": "1.3.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", - "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "version": "1.3.535", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.535.tgz", + "integrity": "sha512-5k7WGdl1ZnbcU97acUnY/UXu6bCMDnKCAnEc1N0xNToPvMCp99PEvh5K3xNr4ZUVCf2FuratM++NgOxCtbtXzA==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", "dev": true }, "semver": { @@ -3333,18 +2981,18 @@ } }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true } } @@ -3408,17 +3056,46 @@ } }, "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", + "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3488,19 +3165,19 @@ } }, "@rollup/plugin-babel": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.4.tgz", - "integrity": "sha512-MBtNoi5gqBEbqy1gE9jZBfPsi10kbuK2CEu9bx53nk1Z3ATRvBOoZ/GsbhXOeVbS76xXi/DeYM+vYX6EGIDv9A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.0.tgz", + "integrity": "sha512-CPABsajaKjINgBQ3it+yMnfVO3ibsrMBxRzbUOUw2cL1hsZJ7aogU8mgglQm3S2hHJgjnAmxPz0Rq7DVdmHsTw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@rollup/pluginutils": "^3.0.8" + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" } }, "@rollup/plugin-commonjs": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.0.tgz", - "integrity": "sha512-Anxc3qgkAi7peAyesTqGYidG5GRim9jtg8xhmykNaZkImtvjA7Wsqep08D2mYsqw1IF7rA3lYfciLgzUSgRoqw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz", + "integrity": "sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==", "dev": true, "requires": { "@rollup/pluginutils": "^3.0.8", @@ -3531,18 +3208,29 @@ } }, "@rollup/plugin-node-resolve": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.1.0.tgz", - "integrity": "sha512-ovq7ZM3JJYUUmEjjO+H8tnUdmQmdQudJB7xruX8LFZ1W2q8jXdPUS6SsIYip8ByOApu4RR7729Am9WhCeCMiHA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", + "integrity": "sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", "deep-freeze": "^0.0.1", "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.14.2" + "resolve": "^1.17.0" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } } }, "@rollup/pluginutils": { @@ -3556,15 +3244,6 @@ "picomatch": "^2.2.2" } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -3572,9 +3251,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -3600,9 +3279,9 @@ } }, "@sinonjs/samsam": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", - "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.1.0.tgz", + "integrity": "sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", @@ -3616,6 +3295,15 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, "@types/babel-types": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", @@ -3631,11 +3319,22 @@ "@types/babel-types": "*" } }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/estree": { "version": "0.0.39", @@ -3643,20 +3342,24 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", "dev": true }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", "dev": true, "requires": { - "@types/events": "*", - "@types/minimatch": "*", "@types/node": "*" } }, @@ -3667,9 +3370,9 @@ "dev": true }, "@types/node": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", - "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", + "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==", "dev": true }, "@types/normalize-package-data": { @@ -3684,6 +3387,15 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/puppeteer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-3.0.1.tgz", + "integrity": "sha512-t03eNKCvWJXhQ8wkc5C6GYuSqMEdKLOX0GLMGtks25YZr38wKZlKTwGM/BoAPVtdysX7Bb9tdwrDS1+NrW3RRA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", @@ -3691,9 +3403,18 @@ "dev": true }, "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dev": true, "requires": { "@types/node": "*" @@ -3705,6 +3426,100 @@ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", "dev": true }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@wdio/config": { + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.1.14.tgz", + "integrity": "sha512-MXHMHwtkAblfnIxONs9aW//T9Fq5XIw3oH+tztcBRvNTTAIXmwHd+4sOjAwjpCdBSGs0C4kM/aTpGfwDZVURvQ==", + "dev": true, + "requires": { + "@wdio/logger": "6.0.16", + "deepmerge": "^4.0.0", + "glob": "^7.1.2" + } + }, + "@wdio/logger": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.0.16.tgz", + "integrity": "sha512-VbH5UnQIG/3sSMV+Y38+rOdwyK9mVA9vuL7iOngoTafHwUjL1MObfN/Cex84L4mGxIgfxCu6GV48iUmSuQ7sqA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "@wdio/protocols": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.3.6.tgz", + "integrity": "sha512-cocBRkv5sYUBxXResuxskQhIkKgDgE/yAtgMGR5wXLrtG/sMpZ2HVy6LOcOeARidAaRwbav80M2ZHjTCjPn53w==", + "dev": true + }, + "@wdio/repl": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-6.4.0.tgz", + "integrity": "sha512-3oSRBzbWM67kng/ZqcDtFTHhTVO/fIALNqfyEEzaMb7oJ2OXgibBzjEa1r8ZhKIC8TpEAJ29BdSll4brHUhQrw==", + "dev": true, + "requires": { + "@wdio/utils": "6.4.0" + } + }, + "@wdio/utils": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.4.0.tgz", + "integrity": "sha512-sAVBbgQjUmvbvkQ/EyWIUSDoebtiZewmf6wb6Pt6EZfaTm4hul30Txd+IXfazhuxp701PskwufkMWzrQIXhpKw==", + "dev": true, + "requires": { + "@wdio/logger": "6.0.16" + } + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -3820,12 +3635,6 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "adm-zip": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", - "dev": true - }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -3833,13 +3642,10 @@ "dev": true }, "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true }, "aggregate-error": { "version": "3.0.1", @@ -3964,12 +3770,6 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -3988,33 +3788,109 @@ "default-require-extensions": "^3.0.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", - "dev": true - }, - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", + "dev": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, + "archiver": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.0.0.tgz", + "integrity": "sha512-AEWhJz6Yi6hWtN1Sqy/H4sZo/lLMJ/NftXxGaDy/TnOMmmjsRaZc/Ts+U4BsPoBQkuunTN6t8hk7iU9A+HBxLw==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.1.2", + "zip-stream": "^4.0.0" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dev": true, "requires": { - "file-type": "^4.2.0" - }, - "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", - "dev": true - } + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" } }, "archy": { @@ -4310,6 +4186,24 @@ "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "parse-json": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", @@ -4357,6 +4251,18 @@ "find-up": "^4.0.0", "read-pkg": "^5.1.1", "type-fest": "^0.5.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + } } }, "semver": { @@ -4555,18 +4461,82 @@ } }, "autoprefixer": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", - "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { - "browserslist": "^4.11.0", - "caniuse-lite": "^1.0.30001036", - "chalk": "^2.4.2", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.27", - "postcss-value-parser": "^4.0.3" + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "browserslist": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" + } + }, + "caniuse-lite": { + "version": "1.0.30001115", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001115.tgz", + "integrity": "sha512-NZrG0439ePYna44lJX8evHX2L7Z3/z3qjVLnHgbBb/duNEnGo348u+BQS5o4HTWcrb++100dHFrU36IesIrC1Q==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.535", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.535.tgz", + "integrity": "sha512-5k7WGdl1ZnbcU97acUnY/UXu6bCMDnKCAnEc1N0xNToPvMCp99PEvh5K3xNr4ZUVCf2FuratM++NgOxCtbtXzA==", + "dev": true + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "aws-sign2": { @@ -5020,9 +4990,9 @@ } }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "bindings": { "version": "1.5.0", @@ -5146,6 +5116,12 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "dev": true + }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -5424,28 +5400,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -5456,14 +5432,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -5474,42 +5450,42 @@ }, "chownr": { "version": "1.1.4", - "resolved": "", + "resolved": false, "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "", + "resolved": false, "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, @@ -5519,28 +5495,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "", + "resolved": false, "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, @@ -5550,14 +5526,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -5574,7 +5550,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "", + "resolved": false, "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, @@ -5589,14 +5565,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -5606,7 +5582,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, @@ -5616,7 +5592,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -5627,21 +5603,21 @@ }, "inherits": { "version": "2.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -5651,14 +5627,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -5668,14 +5644,14 @@ }, "minimist": { "version": "1.2.5", - "resolved": "", + "resolved": false, "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "", + "resolved": false, "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, @@ -5686,7 +5662,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, @@ -5696,7 +5672,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "", + "resolved": false, "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, @@ -5706,14 +5682,14 @@ }, "ms": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "", + "resolved": false, "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, @@ -5725,7 +5701,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "", + "resolved": false, "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, @@ -5744,7 +5720,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "", + "resolved": false, "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, @@ -5755,7 +5731,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, @@ -5765,14 +5741,14 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "", + "resolved": false, "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, @@ -5784,7 +5760,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -5797,21 +5773,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -5821,21 +5797,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -5846,21 +5822,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -5873,7 +5849,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": "", + "resolved": false, "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, @@ -5889,7 +5865,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, @@ -5899,49 +5875,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "", + "resolved": false, "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -5953,7 +5929,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -5963,7 +5939,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -5973,14 +5949,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "", + "resolved": false, "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, @@ -5996,14 +5972,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -6013,14 +5989,14 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true @@ -6515,6 +6491,12 @@ "unset-value": "^1.0.0" } }, + "cacheable-lookup": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", + "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==", + "dev": true + }, "cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", @@ -6583,9 +6565,9 @@ }, "dependencies": { "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -6709,6 +6691,38 @@ "simple-get": "^3.0.3" } }, + "capital-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.3.tgz", + "integrity": "sha512-OlUSJpUr7SY0uZFOxcwnDOU7/MpHlKTZx2mqnDYQFrDudXLFm0JJ9wr/l4csB+rh2Ug0OPuoSO53PqiZBqno9A==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case-first": "^2.0.1" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + } + } + }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", @@ -6776,22 +6790,91 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, + "change-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.1.tgz", + "integrity": "sha512-qRlUWn/hXnX1R1LBDF/RelJLiqNjKjUqlmuBVSEIyye8kq49CXqkZWKmi8XeUAdDXWFOcGLUMZ+aHn3Q5lzUXw==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "capital-case": "^1.0.3", + "constant-case": "^3.0.3", + "dot-case": "^3.0.3", + "header-case": "^2.0.3", + "no-case": "^3.0.3", + "param-case": "^3.0.3", + "pascal-case": "^3.1.1", + "path-case": "^3.0.3", + "sentence-case": "^3.0.3", + "snake-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + } + } + }, "character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", @@ -6838,9 +6921,9 @@ "dev": true }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -6849,7 +6932,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.4.0" } }, "chownr": { @@ -6858,6 +6941,37 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "chrome-launcher": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.4.tgz", + "integrity": "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==", + "dev": true, + "requires": { + "@types/node": "*", + "escape-string-regexp": "^1.0.5", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^0.5.3", + "rimraf": "^3.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } + } + }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", @@ -6936,54 +7050,78 @@ } }, "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "color-name": "~1.1.4" } }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } } } @@ -7142,6 +7280,12 @@ "simple-swizzle": "^0.2.2" } }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -7272,6 +7416,31 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, + "compress-commons": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.1.tgz", + "integrity": "sha512-xZm9o6iikekkI0GnXCmAl3LQGZj5TBDj0zLowsqi7tJtEa3FMGSEcHcqrSJIrOAk1UG/NBbDn/F1q+MG/p/EsA==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -7354,32 +7523,65 @@ } }, "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "dependencies": { - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "semver": "^6.0.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true } } @@ -7437,6 +7639,47 @@ "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", "dev": true }, + "constant-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.3.tgz", + "integrity": "sha512-FXtsSnnrFYpzDmvwDGQW+l8XK3GV1coLyBN0eBz16ZUzGaZcT2ANVCJmLeuw2GQgxKHQIe9e0w2dzkSfaRlUmA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case": "^2.0.1" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "upper-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.1.tgz", + "integrity": "sha512-laAsbea9SY5osxrv7S99vH9xAaJKrw5Qpdh4ENRLcaxipjKsiaBwiAsxfa8X5mObKNTQPsupSq0J/VIxsSJe3A==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + } + } + }, "constantinople": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", @@ -7549,16 +7792,48 @@ } }, "coveralls": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.11.tgz", - "integrity": "sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", "dev": true, "requires": { "js-yaml": "^3.13.1", "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", "minimist": "^1.2.5", - "request": "^2.88.0" + "request": "^2.88.2" + } + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.0.tgz", + "integrity": "sha512-tyMw2IeUX6t9jhgXI6um0eKfWq4EIDpfv5m7GX4Jzp7eVelQ360xd8EPXJhp2mHwLQIkqlnMLjzqSZI3a+0wRw==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "create-ecdh": { @@ -7614,18 +7889,18 @@ "dev": true }, "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0" + "cross-spawn": "^7.0.1" } }, "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -7733,6 +8008,12 @@ } } }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, "css-what": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", @@ -7919,12 +8200,6 @@ "whatwg-url": "^7.0.0" } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -7938,9 +8213,9 @@ "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -8110,6 +8385,12 @@ } } }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "dev": true + }, "deferred-leveldown": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", @@ -8255,9 +8536,9 @@ "dev": true }, "dependency-graph": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.1.tgz", - "integrity": "sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", + "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", "dev": true }, "deps-sort": { @@ -8328,6 +8609,12 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, "detective": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", @@ -8345,6 +8632,36 @@ "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", "dev": true }, + "devtools": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-6.4.0.tgz", + "integrity": "sha512-E2T+tiElHOQg2t+5L4TZwTX9krTIsTIZy9AS/DMkEv0IFUqr314fIvBbsVzo9qk0dv88E7DSf+n5GsbSrMngpA==", + "dev": true, + "requires": { + "@wdio/config": "6.1.14", + "@wdio/logger": "6.0.16", + "@wdio/protocols": "6.3.6", + "@wdio/utils": "6.4.0", + "chrome-launcher": "^0.13.1", + "puppeteer-core": "^5.1.0", + "ua-parser-js": "^0.7.21", + "uuid": "^8.0.0" + }, + "dependencies": { + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + } + } + }, + "devtools-protocol": { + "version": "0.0.781568", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.781568.tgz", + "integrity": "sha512-9Uqnzy6m6zEStluH9iyJ3iHyaQziFnMnLeC8vK0eN6smiJmIx7+yB64d67C2lH/LZra+5cGscJAJsNXO+MdPMg==", + "dev": true + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -8373,23 +8690,6 @@ "randombytes": "^2.0.0" } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, "dnserrors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/dnserrors/-/dnserrors-2.1.2.tgz", @@ -8499,6 +8799,37 @@ "domelementtype": "1" } }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + } + } + }, "dot-prop": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", @@ -8573,9 +8904,9 @@ } }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexer2": { @@ -8659,12 +8990,6 @@ "integrity": "sha512-ESY3UGekvNQwofHvgdsFW8GQEoudbqtJfoSDovnsCRRx8t0+0dPbE1XD/ZQdB+jbskSyPwUtIVYSyKwSXW/A6Q==", "dev": true }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "elliptic": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", @@ -8804,6 +9129,15 @@ "has-binary2": "~1.0.2" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -8900,15 +9234,6 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "esanimate": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/esanimate/-/esanimate-1.1.1.tgz", @@ -8920,9 +9245,9 @@ } }, "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", "dev": true }, "escape-goat": { @@ -8938,9 +9263,9 @@ "dev": true }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { "version": "1.14.3", @@ -9103,9 +9428,9 @@ } }, "eslint-config-prettier": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", - "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -9120,9 +9445,9 @@ } }, "eslint-config-semistandard": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", - "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.1.tgz", + "integrity": "sha512-sfV+qNBWKOmF0kZJll1VH5XqOAdTmLlhbOl9WKI11d2eMEe+Kicxnpm24PQWHOqAfk5pAWU2An0LjNCXKa4Usg==", "dev": true }, "eslint-config-standard": { @@ -9132,9 +9457,9 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -9213,23 +9538,24 @@ } }, "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { @@ -9350,8 +9676,17 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" } }, "strip-bom": { @@ -9400,9 +9735,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -9870,6 +10205,29 @@ } } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -9889,9 +10247,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -9933,9 +10291,9 @@ "dev": true }, "fastq": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", - "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -9958,6 +10316,14 @@ "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "file-entry-cache": { @@ -10050,15 +10416,43 @@ "pkg-dir": "^4.1.0" }, "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10077,11 +10471,11 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -10236,9 +10630,9 @@ } }, "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", + "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", "dev": true }, "fs-constants": { @@ -10248,9 +10642,9 @@ "dev": true }, "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -10292,9 +10686,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "optional": true }, "function-bind": { @@ -10431,6 +10825,18 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true + }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -10700,6 +11106,21 @@ } } }, + "global-agent": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", + "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "dev": true, + "requires": { + "boolean": "^3.0.1", + "core-js": "^3.6.5", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + } + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -10750,6 +11171,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "gm-papandreou": { "version": "1.23.0-patch1", "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", @@ -10839,6 +11269,12 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "gray-matter": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", @@ -10977,7 +11413,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-glob": { "version": "1.0.0", @@ -11083,6 +11520,12 @@ } } }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -11132,6 +11575,16 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "header-case": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.3.tgz", + "integrity": "sha512-LChe/V32mnUQnTwTxd3aAlNMk8ia9tjCDb/LjYtoMrdAPApxLB+azejUk5ERZIZdIqvinwv6BAUuFXH/tQPdZA==", + "dev": true, + "requires": { + "capital-case": "^1.0.3", + "tslib": "^1.10.0" + } + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -11273,6 +11726,16 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "httperrors": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/httperrors/-/httperrors-2.2.0.tgz", @@ -11297,24 +11760,30 @@ "dev": true }, "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "5", + "debug": "4" } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", "dev": true, "requires": { - "chalk": "^3.0.0", + "chalk": "^4.0.0", "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", + "compare-versions": "^3.6.0", "cosmiconfig": "^6.0.0", "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", @@ -11335,9 +11804,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -11378,6 +11847,16 @@ "yaml": "^1.7.2" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -11388,73 +11867,232 @@ "resolve-from": "^4.0.0" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "hyperlink": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.5.2.tgz", + "integrity": "sha512-FigorO1/7Mcx5ReVloQNB8pLxU2COcRJCAm1KS+NBhyNkb6mJmQJGbS8T56G5s4PxEPKy+6+qVzu0+xo/zpUbA==", + "dev": true, + "requires": { + "@munter/tap-render": "^0.2.0", + "assetgraph": "^6.2.0", + "async": "^3.1.0", + "hreftypes": "^1.0.1", + "optimist": "^0.6.1", + "pretty-bytes": "^5.2.0", + "request": "^2.88.0", + "urltools": "^0.4.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "assetgraph": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-6.2.0.tgz", + "integrity": "sha512-MnDAvtlnvMXfNzyvj9WYWVdwL6IOOSPXzV365bIjdv0Nfv631JdXBFQOmgDxYdhNGK+EExKPRdgmZyb2umF86w==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.1", + "bluebird": "^3.5.1", + "chalk": "^2.0.1", + "common-path-prefix": "^1.0.0", + "createerror": "^1.3.0", + "cssnano": "^4.1.10", + "data-urls": "^1.0.0", + "domspace": "^1.2.1", + "esanimate": "^1.1.0", + "escodegen": "^1.12.0", + "espurify": "^2.0.1", + "estraverse": "^4.3.0", + "estraverse-fb": "^1.3.2", + "gettemporaryfilepath": "^1.0.0", + "glob": "^7.0.5", + "html-minifier": "^4.0.0", + "imageinfo": "^1.0.4", + "jsdom": "^15.0.0", + "lines-and-columns": "^1.1.6", + "lodash": "4.17.15", + "memoizesync": "1.1.1", + "mkdirp": "^0.5.1", + "normalizeurl": "^1.0.0", + "perfectionist": "^2.4.0", + "postcss": "^7.0.14", + "qs": "^6.5.2", + "read-pkg-up": "^6.0.0", + "repeat-string": "^1.5.4", + "schemes": "^1.0.1", + "semver": "^6.0.0", + "sift": "^7.0.1", + "source-map": "~0.6.1", + "specificity": "^0.4.0", + "sw-precache": "^5.2.0", + "teepee": "^2.31.1", + "terser": "^4.0.0", + "urltools": "^0.4.1" + } + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "read-pkg-up": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "hyperlink": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/hyperlink/-/hyperlink-4.5.0.tgz", - "integrity": "sha512-xQT0D+Qy2CLSLhToI/wFAjKuzKZhqGQaHuIiiSu3+f9stOv9U7DkxTgY6X2d6TEi2FBs23kkVTzGM5jEOK3c8A==", - "dev": true, - "requires": { - "@munter/tap-render": "^0.2.0", - "assetgraph": "^6.0.2", - "async": "^3.1.0", - "hreftypes": "^1.0.1", - "optimist": "^0.6.1", - "pretty-bytes": "^5.2.0", - "request": "^2.88.0", - "urltools": "^0.4.1" - }, - "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -11507,12 +12145,6 @@ "integrity": "sha1-HdJFbsuW/DlfCqEXnEZ9+z1deio=", "dev": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", @@ -11707,6 +12339,14 @@ "dev": true, "requires": { "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "is-fullwidth-code-point": { @@ -11988,6 +12628,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, "is-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", @@ -12107,23 +12753,6 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -12308,6 +12937,12 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -12359,15 +12994,12 @@ } }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -12397,14 +13029,23 @@ }, "dependencies": { "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -12431,9 +13072,9 @@ }, "dependencies": { "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -12458,15 +13099,6 @@ "source-map": "^0.6.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12569,9 +13201,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12593,27 +13225,33 @@ "dev": true }, "jsdoc": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", - "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.5.tgz", + "integrity": "sha512-SbY+i9ONuxSK35cgVHaI8O9senTE4CDYAmGSDJ5l3+sfe62Ff4gy96osy6OW84t4K4A8iGnMrlRrsSItSNp3RQ==", "dev": true, "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", "catharsis": "^0.8.11", "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", + "js2xmlparser": "^4.0.1", "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.7.0", - "mkdirp": "^0.5.1", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^0.8.2", + "mkdirp": "^1.0.4", "requizzle": "^0.2.3", - "strip-json-comments": "^3.0.1", + "strip-json-comments": "^3.1.0", "taffydb": "2.6.2", - "underscore": "~1.9.1" + "underscore": "~1.10.2" }, "dependencies": { + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -12621,29 +13259,35 @@ "dev": true }, "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, "requires": { "argparse": "^1.0.7", - "entities": "~1.1.1", + "entities": "~2.0.0", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true - }, - "underscore": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", - "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", - "dev": true } } }, @@ -12765,12 +13409,12 @@ "dev": true }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.0" } }, "jsonc-parser": { @@ -12822,18 +13466,6 @@ "promise": "^7.0.1" } }, - "jszip": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.3.0.tgz", - "integrity": "sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, "junk": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", @@ -13011,6 +13643,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "mime": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", @@ -13023,6 +13664,15 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "socket.io": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", @@ -13154,6 +13804,18 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + } } }, "yargs-parser": { @@ -13235,14 +13897,14 @@ "dev": true }, "karma-sauce-launcher": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-2.0.2.tgz", - "integrity": "sha512-jLUFaJhHMcKpxFWUesyWYihzM5FvQiJsDwGcCtKeOy2lsWhkVw0V0Byqb1d+wU6myU1mribBtsIcub23HS4kWA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-4.1.5.tgz", + "integrity": "sha512-X6/1IaUTOhbSuw+Y8ea8/1fAHsIbitDosJVnxqC0ZxIlDQMM4/U0WbETtCIbwUDoa89jwM3alfDs5RTRUW5mJw==", "dev": true, "requires": { - "sauce-connect-launcher": "^1.2.4", - "saucelabs": "^1.5.0", - "selenium-webdriver": "^4.0.0-alpha.1" + "global-agent": "^2.1.8", + "saucelabs": "^4.3.0", + "webdriverio": "^6.1.9" } }, "keyv": { @@ -13294,6 +13956,15 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -13575,13 +14246,31 @@ "type-check": "~0.3.2" } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "lighthouse-logger": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz", + "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==", "dev": true, "requires": { - "immediate": "~3.0.5" + "debug": "^2.6.8", + "marky": "^1.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "limiter": { @@ -13606,112 +14295,118 @@ } }, "lint-staged": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", - "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", + "version": "10.2.11", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.11.tgz", + "integrity": "sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "commander": "^2.20.0", - "cosmiconfig": "^5.2.1", + "chalk": "^4.0.0", + "cli-truncate": "2.1.0", + "commander": "^5.1.0", + "cosmiconfig": "^6.0.0", "debug": "^4.1.1", "dedent": "^0.7.0", - "del": "^5.0.0", - "execa": "^2.0.3", - "listr": "^0.14.3", - "log-symbols": "^3.0.0", + "enquirer": "^2.3.5", + "execa": "^4.0.1", + "listr2": "^2.1.0", + "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "string-argv": "^0.3.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", "stringify-object": "^3.3.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "ms": "^2.1.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, - "del": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, "execa": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", - "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", "dev": true, "requires": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", + "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", + "npm-run-path": "^4.0.0", "onetime": "^5.1.0", - "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" } }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -13729,19 +14424,25 @@ } }, "npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" } }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } }, "path-key": { "version": "3.1.1", @@ -13749,10 +14450,16 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } @@ -13810,172 +14517,85 @@ } } }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "listr2": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.0.tgz", + "integrity": "sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA==", "dev": true, "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.2", + "through": "^2.3.8" }, "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "chalk": "^1.0.0" + "color-name": "~1.1.4" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "tslib": "^1.9.0" } } } @@ -14133,11 +14753,11 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -14170,12 +14790,24 @@ "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", "dev": true }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, "lodash.differencewith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", @@ -14212,6 +14844,12 @@ "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", "dev": true }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -14267,12 +14905,24 @@ "lodash._reinterpolate": "^3.0.0" } }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -14280,81 +14930,132 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "requires": { - "chalk": "^2.4.2" + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } } }, "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "onetime": { + "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "color-name": "~1.1.4" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -14393,6 +15094,18 @@ "squeak": "^1.0.0" } }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -14554,36 +15267,45 @@ "dev": true }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.0.tgz", + "integrity": "sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg==", "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true + }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } } } }, "markdown-it-anchor": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.7.tgz", - "integrity": "sha512-REFmIaSS6szaD1bye80DMbp7ePwsPNvLTR5HunsUcZ0SG0rWJQ+Pz24R4UlTKtjKBPhxo0v0tOBDYjZQQknW8Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", "dev": true }, "markdown-it-attrs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-3.0.2.tgz", - "integrity": "sha512-q45vdXU9TSWaHgFkWEFM97YHEoCmOyG9csLLdv3oVC6ARjT77u4wfng9rRtSOMb5UpxzT7zTX5GBbwm15H40dw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-3.0.3.tgz", + "integrity": "sha512-cLnICU2t61skNCr4Wih/sdza+UbQcqJGZwvqAypnbWA284nzDm+Gpc90iaRk/JjsIy4emag5v3s0rXFhFBWhCA==", "dev": true }, "markdown-it-emoji": { @@ -14593,12 +15315,12 @@ "dev": true }, "markdown-it-prism": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.5.tgz", - "integrity": "sha512-u2jErcoLCnENIOUnEbS9w9RWUGiId8fjQovD0Gbo4iT8tZU0/Un4v72E8g8sj/NAzieSCvFVG6KtMwlurSBMnw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.1.1.tgz", + "integrity": "sha512-U1k2mOMC8FCApQBx2qMV7uYq0jfICfjmpBezFDxLeEIjzM3qsczofYuLY6k3XF3MVjdGTxkrb1Lq3YMDbGAJKw==", "dev": true, "requires": { - "prismjs": "1.19.0" + "prismjs": "1.21.0" } }, "markdown-link": { @@ -14608,10 +15330,13 @@ "dev": true }, "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "requires": { + "repeat-string": "^1.0.0" + } }, "markdown-toc": { "version": "1.2.0", @@ -14667,18 +15392,39 @@ } }, "markdownlint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.19.0.tgz", - "integrity": "sha512-+MsWOnYVUH4klcKM7iRx5cno9FQMDAb6FC6mWlZkeXPwIaK6Z5Vd9VkXkykPidRqmLHU2wI+MNyfUMnUCBw3pQ==", + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.20.4.tgz", + "integrity": "sha512-jpfaPgjT0OpeBbemjYNZbzGG3hCLcAIvrm/pEY3+q/szDScG6ZonDacqySVRJAv9glbo8y4wBPJ0wgW17+9GGA==", "dev": true, "requires": { "markdown-it": "10.0.0" + }, + "dependencies": { + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + } } }, "markdownlint-cli": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.22.0.tgz", - "integrity": "sha512-qRg6tK5dXWqkaFvEstz9YSQal1ECMgofrSZgdBOaPWG8cD50pk8Hs0ZpBCJ6SCHPKF71pCdtuSL2u82sIx2XWA==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.23.2.tgz", + "integrity": "sha512-OSl5OZ8xzGN6z355cqRkiq67zPi3reJimklaF72p0554q85Dng5ToOjjSB9tDKZebSt85jX8cp+ruoQlPqOsPA==", "dev": true, "requires": { "commander": "~2.9.0", @@ -14690,9 +15436,10 @@ "jsonc-parser": "~2.2.0", "lodash.differencewith": "~4.5.0", "lodash.flatten": "~4.4.0", - "markdownlint": "~0.19.0", - "markdownlint-rule-helpers": "~0.7.0", + "markdownlint": "~0.20.4", + "markdownlint-rule-helpers": "~0.11.0", "minimatch": "~3.0.4", + "minimist": "~1.2.5", "rc": "~1.2.7" }, "dependencies": { @@ -14718,23 +15465,39 @@ "dev": true }, "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, "markdownlint-rule-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.7.0.tgz", - "integrity": "sha512-xZByWJNBaCMHo7nYPv/5aO8Jt68YcMvyouFXhuXmJzbqCsQy8rfCj0kYcv22kdK5PwAgMdbHg0hyTdURbUZtJw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.11.0.tgz", + "integrity": "sha512-PhGii9dOiDJDXxiRMpK8N0FM9powprvRPsXALgkjlSPTwLh6ymH+iF3iUe3nq8KGu26tclFBlLL5xAGy/zb7FA==", "dev": true }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "marky": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz", + "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==", "dev": true }, "matched": { @@ -14751,6 +15514,15 @@ "resolve-dir": "^1.0.0" } }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "requires": { + "escape-string-regexp": "^4.0.0" + } + }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -14804,21 +15576,21 @@ } }, "mdast-util-compact": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", - "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "unist-util-visit": "^2.0.0" } }, "mdast-util-definitions": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", - "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-2.0.1.tgz", + "integrity": "sha512-Co+DQ6oZlUzvUR7JCpP249PcexxygiaKk9axJh+eRzHDZJk2julbIdKB4PXHVxdBuLzvJ1Izb+YDpj2deGMOuA==", "dev": true, "requires": { - "unist-util-visit": "^1.0.0" + "unist-util-visit": "^2.0.0" } }, "mdast-util-to-string": { @@ -15237,9 +16009,9 @@ "dev": true }, "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", "dev": true }, "nanomatch": { @@ -15274,14 +16046,25 @@ "dev": true }, "needle": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", - "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", "dev": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "negotiator": { @@ -15303,9 +16086,9 @@ "dev": true }, "nise": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", - "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", @@ -15384,9 +16167,9 @@ } }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, "isarray": { @@ -15623,9 +16406,9 @@ } }, "nps": { - "version": "5.9.12", - "resolved": "https://registry.npmjs.org/nps/-/nps-5.9.12.tgz", - "integrity": "sha512-zuUAz/2VVp6kd1hJ4Fuq3p4ETTaj3zQ5/P4ck7c2O1NsG79BjQvRJprQvHbz2av7qFXmbR33UCp9y2PkcbW4TQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/nps/-/nps-5.10.0.tgz", + "integrity": "sha512-tye+0hoKq3pB6NhykoPcOzwn4nEvwVvh1kJEDc+21gYordNdaBlkPv8ZlrZkuEWLUeujvS8VQ56KO9QGoPKkEA==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -15762,9 +16545,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -15847,9 +16630,9 @@ "dev": true }, "nyc": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", - "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -15860,6 +16643,7 @@ "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", @@ -15931,21 +16715,58 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -15969,11 +16790,6 @@ "strip-ansi": "^6.0.0" } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -15986,9 +16802,9 @@ } }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -16001,13 +16817,13 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -16183,18 +16999,30 @@ } }, "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz", + "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, "openurl": { @@ -16364,17 +17192,27 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" + }, + "dependencies": { + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "requires": { + "p-try": "^2.0.0" + } + } } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -16497,9 +17335,9 @@ } }, "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dev": true, "requires": { "character-entities": "^1.0.0", @@ -16572,6 +17410,37 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -16590,6 +17459,16 @@ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, + "path-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.3.tgz", + "integrity": "sha512-UMFU6UETFpCNWbIWNczshPrnK/7JAXBP2NYw80ojElbQ2+JYxdqWDBkvvqM93u4u6oLmuJ/tPOf2tM8KtXv4eg==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -16750,6 +17629,12 @@ "supports-color": "^2.0.0" }, "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -17575,6 +18460,12 @@ "supports-color": "^2.0.0" }, "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -17767,9 +18658,9 @@ } }, "prismjs": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", - "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", + "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -17835,6 +18726,12 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -18081,6 +18978,77 @@ "escape-goat": "^2.0.0" } }, + "puppeteer-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.2.1.tgz", + "integrity": "sha512-gLjEOrzwgcnwRH+sm4hS1TBqe2/DN248nRb2hYB7+lZ9kCuLuACNvuzlXILlPAznU3Ob+mEvVEBDcLuFa0zq3g==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.781568", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + } + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -18122,6 +19090,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -18280,12 +19254,21 @@ } } }, + "readdir-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.0.0.tgz", + "integrity": "sha512-km0DIcwQVZ1ZUhXhMWpF74/Wm5aFEd5/jDiVWF1Hkw2myPQovG8vCQ8+FQO2KXE9npQQvCnAMZhhWuUee4WcCQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "readline-sync": { @@ -18440,67 +19423,67 @@ } }, "remark": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/remark/-/remark-11.0.2.tgz", - "integrity": "sha512-bh+eJgn8wgmbHmIBOuwJFdTVRVpl3fcVP6HxmpPWO0ULGP9Qkh6INJh0N5Uy7GqlV7DQYGoqaKiEIpM5LLvJ8w==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", + "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", "dev": true, "requires": { - "remark-parse": "^7.0.0", - "remark-stringify": "^7.0.0", - "unified": "^8.2.0" + "remark-parse": "^8.0.0", + "remark-stringify": "^8.0.0", + "unified": "^9.0.0" } }, "remark-github": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark-github/-/remark-github-8.0.0.tgz", - "integrity": "sha512-N1gWYcvYguZesBGMwfNXBCJEquuWSlb1sSINWiun8fg5k/ea6H9FL/t5I6M4eIgeXLrz3vN8RjJUxkyGdyJQZQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-github/-/remark-github-9.0.1.tgz", + "integrity": "sha512-ITzuJ7MBC+uA2+gA4gIzxzBftoO02mWA788ZEJHF3UPSiN5corALwUCN8dpliGmu4VFRFjV8+mojdFAHryMbMg==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0", - "mdast-util-to-string": "^1.0.1", - "unist-util-visit": "^1.0.0" + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" } }, "remark-inline-links": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-inline-links/-/remark-inline-links-3.1.3.tgz", - "integrity": "sha512-mgCdL6mDkhwT1i+XxPK/CcSJphwvvODmnsT0XFQdj5JazYl84BiGzYVbyI9ou7mDEu1y/dzTVKMM4luTDGJA/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-inline-links/-/remark-inline-links-4.0.0.tgz", + "integrity": "sha512-weoqXR6jgTYnX581taNrnhSXlqpwTUGVc8hSfTHJ3glKdCwtZPN6V8/bTRniIxPI2lpbCyu6IjYOFUmcnRIzYg==", "dev": true, "requires": { - "mdast-util-definitions": "^1.1.1", - "unist-util-remove": "^1.0.0", - "unist-util-visit": "^1.1.0" + "mdast-util-definitions": "^2.0.0", + "unist-util-visit": "^2.0.0" } }, "remark-parse": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", - "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", "dev": true, "requires": { + "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0", "is-whitespace-character": "^1.0.0", "is-word-character": "^1.0.0", "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", + "parse-entities": "^2.0.0", "repeat-string": "^1.5.4", "state-toggle": "^1.0.0", "trim": "0.0.1", "trim-trailing-lines": "^1.0.0", "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", "xtend": "^4.0.1" } }, "remark-stringify": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-7.0.4.tgz", - "integrity": "sha512-qck+8NeA1D0utk1ttKcWAoHRrJxERYQzkHDyn+pF5Z4whX1ug98uCNPPSeFgLSaNERRxnD6oxIug6DzZQth6Pg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", "dev": true, "requires": { "ccount": "^1.0.0", @@ -18509,12 +19492,12 @@ "is-whitespace-character": "^1.0.0", "longest-streak": "^2.0.1", "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", "repeat-string": "^1.5.4", "state-toggle": "^1.0.0", - "stringify-entities": "^2.0.0", + "stringify-entities": "^3.0.0", "unherit": "^1.0.4", "xtend": "^4.0.1" } @@ -18700,6 +19683,12 @@ "path-parse": "^1.0.6" } }, + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", + "dev": true + }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -18758,6 +19747,23 @@ "lowercase-keys": "^1.0.0" } }, + "resq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.8.0.tgz", + "integrity": "sha512-VObcnfPcE6/EKfHqsi5qoJ0+BF9qfl5181CytP1su3HgzilqF03DrQ+Y7kZQrd+5myfmantl9W3/5uUcpwvKeg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -18781,9 +19787,9 @@ "dev": true }, "rewiremock": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.1.tgz", - "integrity": "sha512-fxjaEv7Iq/mXURg0WLhcss/9jr5VJ8pPduTnYxwjwVaPNSaUZxVowxU9WwLdrQllxWLecb72WnGkurFL1m8Cxw==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.3.tgz", + "integrity": "sha512-6BaUGfp7NtxBjisxcGN73nNiA2fS2AwhEk/9DMUqxfv5v0aDM1wpOYpj5GSArqsJi07YCfLhkD8C74LAN7+FkQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -18808,6 +19814,12 @@ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", "dev": true }, + "rgb2hex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.0.tgz", + "integrity": "sha512-cHdNTwmTMPu/TpP1bJfdApd6MbD+Kzi4GNnM6h35mdFChhQPSi9cAI8J7DMn5kQDKX8NuBaQXAyo360Oa7tOEA==", + "dev": true + }, "rgba-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", @@ -18842,10 +19854,32 @@ "inherits": "^2.0.1" } }, + "roarr": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", + "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", + "dev": true, + "requires": { + "boolean": "^3.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, "rollup": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.18.2.tgz", - "integrity": "sha512-+mzyZhL9ZyLB3eHBISxRNTep9Z2qCuwXzAYkUbFyz7yNKaKH03MFKeiGOS1nv2uvPgDb4ASKv+FiS5mC4h5IFQ==", + "version": "2.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.3.tgz", + "integrity": "sha512-Mlt39/kL2rA9egcbQbaZV1SNVplGqYYhDDMcGgHPPE0tvM3R4GrB+IEdYy2QtTrdzMQx57ZcqDFf/KWWm8F+uw==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -18901,14 +19935,13 @@ } }, "rollup-plugin-visualizer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-3.3.2.tgz", - "integrity": "sha512-jAJxpC97jHoWU5mQkGw5MroguV8fbZsLPxdV7MdE/fX7lAR+t1UDLpSH41rqdxyJCtqi2/UoDOBuADCyZdHaYA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-4.1.0.tgz", + "integrity": "sha512-RzsWRrFhZHNM7UQ5wLRsn6Jz3zJHkH+/n1ZaS5h1OTYY4qG7TguSFOFzaM+IA/DSAcloXzGpCi0ue894Jdvv+A==", "dev": true, "requires": { - "mkdirp": "^0.5.1", - "nanoid": "^2.1.6", - "open": "^6.0.0", + "nanoid": "^3.0.1", + "open": "^7.0.3", "pupa": "^2.0.0", "source-map": "^0.7.3", "yargs": "^15.0.0" @@ -18990,17 +20023,345 @@ "p-limit": "^2.2.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saucelabs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-4.4.4.tgz", + "integrity": "sha512-RKem5TFBuGrQqUF4uhhVON+zXJSz8jOAzK4PTdwNRtgV30CayyvOOQnp2eC0KOnICnOEQgieaV9NUM6UH1PhuQ==", + "dev": true, + "requires": { + "bin-wrapper": "^4.1.0", + "change-case": "^4.1.1", + "form-data": "^3.0.0", + "got": "^11.1.4", + "hash.js": "^1.1.7", + "tunnel": "0.0.6", + "yargs": "^15.3.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.1.tgz", + "integrity": "sha512-tLnujxFtfH7F+i5ghUfgGlJsvyCKvUnSMFMlWybFdX9/DdX8svb4Zwx1gV0gkkVCHXtmPSetoAR3QlKfOld6Tw==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.5.2.tgz", + "integrity": "sha512-yUhpEDLeuGiGJjRSzEq3kvt4zJtAcjKmhIiwNp/eUs75tRlXfWcHo5tcBaMQtnjHWC7nQYT5HkY/l0QOQTkVww==", + "dev": true, + "requires": { + "@sindresorhus/is": "^3.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.0", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", + "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } }, "string-width": { "version": "4.2.0", @@ -19025,9 +20386,9 @@ } }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -19040,13 +20401,13 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -19055,127 +20416,6 @@ } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sauce-connect-launcher": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.1.tgz", - "integrity": "sha512-vIf9qDol3q2FlYzrKt0dr3kvec6LSjX2WS+/mVnAJIhqh1evSkPKCR2AzcJrnSmx9Xt9PtV0tLY7jYh0wsQi8A==", - "dev": true, - "requires": { - "adm-zip": "~0.4.3", - "async": "^2.1.2", - "https-proxy-agent": "^3.0.0", - "lodash": "^4.16.6", - "rimraf": "^2.5.4" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - }, - "dependencies": { - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - } - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -19248,41 +20488,10 @@ "dev": true, "optional": true }, - "selenium-webdriver": { - "version": "4.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", - "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", - "dev": true, - "requires": { - "jszip": "^3.2.2", - "rimraf": "^2.7.1", - "tmp": "0.0.30" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "semver-compare": { @@ -19399,6 +20608,55 @@ } } }, + "sentence-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.3.tgz", + "integrity": "sha512-ZPr4dgTcNkEfcGOMFQyDdJrTU9uQO1nb1cjf+nuzb6FxgMDgKddZOM29qEsB7jvsZSMruLRcL2KfM4ypKpa0LA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case-first": "^2.0.1" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + } + } + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -19507,12 +20765,6 @@ "to-object-path": "^0.3.0" } }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -19724,17 +20976,17 @@ } }, "sinon": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.1.tgz", - "integrity": "sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz", + "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/commons": "^1.7.2", + "@sinonjs/fake-timers": "^6.0.1", "@sinonjs/formatio": "^5.0.1", - "@sinonjs/samsam": "^5.0.3", + "@sinonjs/samsam": "^5.1.0", "diff": "^4.0.2", - "nise": "^4.0.1", + "nise": "^4.0.4", "supports-color": "^7.1.0" } }, @@ -19761,6 +21013,16 @@ "integrity": "sha512-FtLNsMGBSRB/0JOE2A0fxlqjI6fJsgHGS13iTuVT28kViI4JjUiNqp/vyis0ZXYcMnpR3fzGNkv+6vRlI2GwdQ==", "dev": true }, + "snake-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.3.tgz", + "integrity": "sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -20188,9 +21450,9 @@ }, "dependencies": { "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -20299,6 +21561,14 @@ "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "strip-ansi": { @@ -20605,9 +21875,9 @@ } }, "stringify-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", - "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", "dev": true, "requires": { "character-entities-html4": "^1.0.0", @@ -20716,6 +21986,14 @@ "dev": true, "requires": { "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "stylehacks": { @@ -20803,6 +22081,55 @@ "pretty-bytes": "^4.0.2", "sw-toolbox": "^3.4.0", "update-notifier": "^2.3.0" + }, + "dependencies": { + "configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + } } }, "sw-toolbox": { @@ -21117,6 +22444,14 @@ "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "strip-ansi": { @@ -21143,12 +22478,25 @@ "dev": true }, "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "readable-stream": "2 || 3" + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "time-require": { @@ -21275,6 +22623,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -21362,6 +22716,14 @@ "dev": true, "requires": { "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, "trim-trailing-lines": { @@ -21376,6 +22738,26 @@ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -21388,6 +22770,12 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -21612,13 +23000,14 @@ "dev": true }, "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", + "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", "dev": true, "requires": { "bail": "^1.0.0", "extend": "^3.0.0", + "is-buffer": "^2.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" @@ -21666,27 +23055,18 @@ } }, "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", "dev": true }, - "unist-util-remove": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", - "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", - "dev": true, - "requires": { - "unist-util-is": "^3.0.0" - } - }, "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "unist-util-visit": "^2.0.0" } }, "unist-util-stringify-position": { @@ -21699,21 +23079,24 @@ } }, "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, "requires": { - "unist-util-visit-parents": "^2.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" } }, "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", "dev": true, "requires": { - "unist-util-is": "^3.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" } }, "universalify": { @@ -21756,72 +23139,476 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", + "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "requires": { + "ini": "^1.3.5" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "isarray": "1.0.0" + "ansi-regex": "^5.0.0" } } } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, + "upper-case-first": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.1.tgz", + "integrity": "sha512-105J8XqQ+9RxW3l9gHZtgve5oaiR9TIwvmZAMAIZWRHe00T21cdvewKORTlOJf/zXW6VukuTshM+HXZNWz7N5w==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -21944,9 +23731,9 @@ "dev": true }, "uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", "dev": true }, "v8-compile-cache": { @@ -22002,9 +23789,9 @@ } }, "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", + "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==", "dev": true }, "vfile-message": { @@ -22866,6 +24653,163 @@ } } }, + "webdriver": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.4.0.tgz", + "integrity": "sha512-yF5i2Wc6G+uQdEl3iAFpDPFP3xgfucUWaj6uXogEcMtq67SSIc4G9mq6vZCUF6F/GoW0H5c9F0L8ab8ZSTSX6w==", + "dev": true, + "requires": { + "@wdio/config": "6.1.14", + "@wdio/logger": "6.0.16", + "@wdio/protocols": "6.3.6", + "@wdio/utils": "6.4.0", + "got": "^11.0.2", + "lodash.merge": "^4.6.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.1.tgz", + "integrity": "sha512-tLnujxFtfH7F+i5ghUfgGlJsvyCKvUnSMFMlWybFdX9/DdX8svb4Zwx1gV0gkkVCHXtmPSetoAR3QlKfOld6Tw==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.5.2.tgz", + "integrity": "sha512-yUhpEDLeuGiGJjRSzEq3kvt4zJtAcjKmhIiwNp/eUs75tRlXfWcHo5tcBaMQtnjHWC7nQYT5HkY/l0QOQTkVww==", + "dev": true, + "requires": { + "@sindresorhus/is": "^3.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.0", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", + "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + } + } + }, + "webdriverio": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-6.4.0.tgz", + "integrity": "sha512-dtttlqvOLp5tCvCvT/A9Slau/W+9d2VtaMsL8awF9lPpjKMRBXRfD541CqU8fxnIl1XszqAAvcXdTJkqgtGPyg==", + "dev": true, + "requires": { + "@types/puppeteer": "^3.0.1", + "@wdio/config": "6.1.14", + "@wdio/logger": "6.0.16", + "@wdio/repl": "6.4.0", + "@wdio/utils": "6.4.0", + "archiver": "^5.0.0", + "atob": "^2.1.2", + "css-value": "^0.0.1", + "devtools": "6.4.0", + "get-port": "^5.1.1", + "grapheme-splitter": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "lodash.isobject": "^3.0.2", + "lodash.isplainobject": "^4.0.6", + "lodash.zip": "^4.2.0", + "minimatch": "^3.0.4", + "puppeteer-core": "^5.1.0", + "resq": "^1.6.0", + "rgb2hex": "^0.2.0", + "serialize-error": "^7.0.0", + "webdriver": "6.4.0" + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -23105,13 +25049,10 @@ "dev": true }, "yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.7" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true }, "yargs": { "version": "13.3.2", @@ -23303,6 +25244,30 @@ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true + }, + "zip-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.2.tgz", + "integrity": "sha512-TGxB2g+1ur6MHkvM644DuZr8Uzyz0k0OYWtS3YlpfWBEmK4woaC2t3+pozEL3dBfIPmpgmClR5B2QRcMgGt22g==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } } } } diff --git a/package.json b/package.json index da078c2939..963a670be0 100644 --- a/package.json +++ b/package.json @@ -53,16 +53,16 @@ "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", + "chokidar": "3.4.2", + "debug": "4.1.1", "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", "ms": "2.1.2", "object.assign": "4.1.0", @@ -78,76 +78,78 @@ "yargs-unparser": "1.6.1" }, "devDependencies": { - "@11ty/eleventy": "^0.10.0", + "@11ty/eleventy": "^0.11.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", - "@babel/preset-env": "^7.10.4", + "@babel/preset-env": "^7.11.0", "@mocha/docdash": "^3.0.0", - "@rollup/plugin-babel": "^5.0.4", - "@rollup/plugin-commonjs": "^13.0.0", + "@rollup/plugin-babel": "^5.1.0", + "@rollup/plugin-commonjs": "^14.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-multi-entry": "^3.0.1", - "@rollup/plugin-node-resolve": "^8.1.0", + "@rollup/plugin-node-resolve": "^8.4.0", "assetgraph-builder": "^8.1.0", - "autoprefixer": "^9.7.4", + "autoprefixer": "^9.8.6", "babel-eslint": "^10.1.0", "canvas": "^2.6.1", "chai": "^4.2.0", "coffee-script": "^1.12.7", + "configstore": "^5.0.1", "core-js": "^3.6.5", - "coveralls": "^3.0.11", - "cross-env": "^6.0.3", - "cross-spawn": "^7.0.1", + "coveralls": "^3.1.0", + "cross-env": "^7.0.2", + "cross-spawn": "^7.0.3", "eslint": "^6.8.0", - "eslint-config-prettier": "^6.10.0", - "eslint-config-semistandard": "^15.0.0", + "eslint-config-prettier": "^6.11.0", + "eslint-config-semistandard": "^15.0.1", "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.20.1", + "eslint-plugin-import": "^2.22.0", "eslint-plugin-node": "^11.0.0", - "eslint-plugin-prettier": "^3.1.2", + "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", - "fs-extra": "^9.0.0", - "husky": "^4.2.3", - "hyperlink": "^4.5.0", - "jsdoc": "^3.6.3", + "fs-extra": "^9.0.1", + "husky": "^4.2.5", + "hyperlink": "^4.5.2", + "jsdoc": "^3.6.5", "karma": "^5.1.1", "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-requirejs": "^1.1.0", - "karma-sauce-launcher": "^2.0.2", - "lint-staged": "^9.5.0", - "markdown-it": "^10.0.0", - "markdown-it-anchor": "^5.2.5", - "markdown-it-attrs": "^3.0.2", + "karma-sauce-launcher": "^4.1.5", + "lint-staged": "^10.2.11", + "markdown-it": "^11.0.0", + "markdown-it-anchor": "^5.3.0", + "markdown-it-attrs": "^3.0.3", "markdown-it-emoji": "^1.4.0", - "markdown-it-prism": "^2.0.5", + "markdown-it-prism": "^2.1.1", "markdown-toc": "^1.2.0", - "markdownlint-cli": "^0.22.0", - "needle": "^2.4.1", - "nps": "^5.9.12", - "nyc": "^15.0.0", + "markdownlint-cli": "^0.23.2", + "needle": "^2.5.0", + "nps": "^5.10.0", + "nyc": "^15.1.0", "prettier": "^1.19.1", - "remark": "^11.0.2", - "remark-github": "^8.0.0", - "remark-inline-links": "^3.1.3", + "remark": "^12.0.1", + "remark-github": "^9.0.1", + "remark-inline-links": "^4.0.0", "requirejs": "^2.3.6", - "rewiremock": "^3.14.1", + "rewiremock": "^3.14.3", "rimraf": "^3.0.2", - "rollup": "^2.18.2", + "rollup": "^2.23.1", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-visualizer": "^3.3.2", - "sinon": "^9.0.1", + "rollup-plugin-visualizer": "^4.1.0", + "sinon": "^9.0.3", "strip-ansi": "^6.0.0", "svgo": "^1.3.2", - "through2": "^3.0.1", + "through2": "^4.0.2", "to-vfile": "^6.1.0", "unexpected": "^11.14.0", "unexpected-eventemitter": "^2.2.0", "unexpected-sinon": "^10.11.2", + "update-notifier": "^4.1.0", "uslug": "^1.0.4", - "uuid": "^8.0.0", + "uuid": "^8.3.0", "watchify": "^3.11.1" }, "files": [ diff --git a/rollup.config.js b/rollup.config.js index e90bb5203e..d475c477a9 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -38,7 +38,6 @@ const config = { '@babel/preset-env', { modules: false, - spec: true, useBuiltIns: 'usage', forceAllTransforms: true, corejs: { From 667e9a21c10649185e92b319006cea5eb8d61f31 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 18 Aug 2020 15:48:36 -0700 Subject: [PATCH 1555/1771] amend 2b8a1ff; put change in browser-entry.js Signed-off-by: Christopher Hiller --- browser-entry.js | 4 ++-- rollup.config.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/browser-entry.js b/browser-entry.js index cdcb56b6fb..dee3789231 100644 --- a/browser-entry.js +++ b/browser-entry.js @@ -210,8 +210,8 @@ Mocha.process = process; * Expose mocha. */ -mocha.Mocha = Mocha; -mocha.mocha = mocha; +global.Mocha = Mocha; +global.mocha = mocha; // this allows test/acceptance/required-tokens.js to pass; thus, // you can now do `const describe = require('mocha').describe` in a diff --git a/rollup.config.js b/rollup.config.js index d475c477a9..4b4f3494e4 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -17,8 +17,7 @@ const config = { file: './mocha.js', format: 'umd', sourcemap: true, - name: 'mocha', - footer: 'window.Mocha = window.mocha.Mocha;' + name: 'mocha' }, plugins: [ json(), From 4d7a1716ff5c7fbc74ca048a21b67f4524fcd55a Mon Sep 17 00:00:00 2001 From: Sujin Park Date: Sat, 22 Aug 2020 15:41:59 +0900 Subject: [PATCH 1556/1771] fix typo & org members link in CONTRIBUTING.md (#4413) --- .github/CONTRIBUTING.md | 2 +- docs/_data/supporters.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2d7b5e5f85..25a8462296 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -91,7 +91,7 @@ _Excellent._ Here's how: - **Can you write ~~good~~ well?** The [documentation](https://mochajs.org) almost always needs some love. See the [doc-related issues](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). - **Design your thing?** [Our site](https://mochajs.org) needs your magic touch. - **Familiar with Mocha's codebase?** We could use your help triaging issues and/or reviewing pull requests. Please contact an [org member](https://github.com/orgs/mochajs/people), and we'll chat. -- **Want to build our community?** Mocha has a _lot_ of users. We could use your help bringing everyone together in peace and harmony. Please contact an [org member](https://github.com/mochajs/people). +- **Want to build our community?** Mocha has a _lot_ of users. We could use your help bringing everyone together in peace and harmony. Please contact an [org member](https://github.com/orgs/mochajs/people). - **You can sell dirt to worms?** Let's raise Mocha's profile in the JavaScript and OSS communities. Please contact an [org member](https://github.com/orgs/mochajs/people)! - **Wait--you write unit tests for _fun_?** A PR which increases coverage is unlikely to be turned down. - **Are you experienced?** :guitar: If you're a seasoned Mocha user, why not help answer some questions in the [main chat room](https://gitter.im/mochajs/mocha)? diff --git a/docs/_data/supporters.js b/docs/_data/supporters.js index 6fb7116686..8af54b167d 100755 --- a/docs/_data/supporters.js +++ b/docs/_data/supporters.js @@ -1,7 +1,7 @@ #!/usr/bin/env node /** - * This script gathers metdata for supporters of Mocha from OpenCollective's API by + * This script gathers metadata for supporters of Mocha from OpenCollective's API by * aggregating order ("donation") information. * * It's intended to be used with 11ty, but can be run directly. Running directly From aeec37a0f1ebee474bbf61ee8b253804ddd0613a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 25 Aug 2020 11:17:29 -0700 Subject: [PATCH 1557/1771] prefer all mocha flags over node flags; closes #4417 - no more `require` special-case - future-proofs `mocha` against the introduction of conflicting flags in `node` --- lib/cli/node-flags.js | 13 ++++----- lib/cli/run-option-metadata.js | 27 ++++++++++++++++-- test/node-unit/cli/node-flags.spec.js | 40 +++++++++++++-------------- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/lib/cli/node-flags.js b/lib/cli/node-flags.js index b7cc9a3864..1203ad2ea8 100644 --- a/lib/cli/node-flags.js +++ b/lib/cli/node-flags.js @@ -7,6 +7,7 @@ */ const nodeFlags = process.allowedNodeEnvironmentFlags; +const {isMochaFlag} = require('./run-option-metadata'); const unparse = require('yargs-unparser'); /** @@ -43,16 +44,14 @@ exports.isNodeFlag = (flag, bareword = true) => { flag = flag.replace(/^--?/, ''); } return ( - // treat --require/-r as Mocha flag even though it's also a node flag - !(flag === 'require' || flag === 'r') && // check actual node flags from `process.allowedNodeEnvironmentFlags`, // then historical support for various V8 and non-`NODE_OPTIONS` flags // and also any V8 flags with `--v8-` prefix - ((nodeFlags && nodeFlags.has(flag)) || - debugFlags.has(flag) || - /(?:preserve-symlinks(?:-main)?|harmony(?:[_-]|$)|(?:trace[_-].+$)|gc(?:[_-]global)?$|es[_-]staging$|use[_-]strict$|v8[_-](?!options).+?$)/.test( - flag - )) + (!isMochaFlag(flag) && nodeFlags && nodeFlags.has(flag)) || + debugFlags.has(flag) || + /(?:preserve-symlinks(?:-main)?|harmony(?:[_-]|$)|(?:trace[_-].+$)|gc(?:[_-]global)?$|es[_-]staging$|use[_-]strict$|v8[_-](?!options).+?$)/.test( + flag + ) ); }; diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index da3b7d995d..33cd15ae08 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -12,7 +12,7 @@ * @type {{string:string[]}} * @private */ -exports.types = { +const TYPES = (exports.types = { array: [ 'extension', 'file', @@ -58,7 +58,7 @@ exports.types = { 'slow', 'timeout' ] -}; +}); /** * Option aliases keyed by canonical option name. @@ -88,3 +88,26 @@ exports.aliases = { ui: ['u'], watch: ['w'] }; + +const ALL_MOCHA_FLAGS = Object.keys(TYPES).reduce((acc, key) => { + // gets all flags from each of the fields in `types`, adds those, + // then adds aliases of each flag (if any) + TYPES[key].forEach(flag => { + acc.add(flag); + const aliases = exports.aliases[flag] || []; + aliases.forEach(alias => { + acc.add(alias); + }); + }); + return acc; +}, new Set()); + +/** + * Returns `true` if the provided `flag` is known to Mocha. + * @param {string} flag - Flag to check + * @returns {boolean} If `true`, this is a Mocha flag + * @private + */ +exports.isMochaFlag = flag => { + return ALL_MOCHA_FLAGS.has(flag.replace(/^--?/, '')); +}; diff --git a/test/node-unit/cli/node-flags.spec.js b/test/node-unit/cli/node-flags.spec.js index f7167fa527..838d659fab 100644 --- a/test/node-unit/cli/node-flags.spec.js +++ b/test/node-unit/cli/node-flags.spec.js @@ -1,22 +1,34 @@ 'use strict'; -const nodeEnvFlags = process.allowedNodeEnvironmentFlags; +const nodeEnvFlags = [...process.allowedNodeEnvironmentFlags]; const { isNodeFlag, impliesNoTimeouts, unparseNodeFlags } = require('../../../lib/cli/node-flags'); +const {isMochaFlag} = require('../../../lib/cli/run-option-metadata'); + describe('node-flags', function() { describe('isNodeFlag()', function() { describe('for all allowed node environment flags', function() { - // NOTE: this is not stubbing nodeEnvFlags in any way, so relies on - // the userland polyfill to be correct. - nodeEnvFlags.forEach(envFlag => { - it(`${envFlag} should return true`, function() { - expect(isNodeFlag(envFlag), 'to be true'); + nodeEnvFlags + .filter(flag => !isMochaFlag(flag)) + .forEach(envFlag => { + it(`${envFlag} should return true`, function() { + expect(isNodeFlag(envFlag), 'to be true'); + }); + }); + }); + + describe('for all allowed node env flags which conflict with mocha flags', function() { + nodeEnvFlags + .filter(flag => isMochaFlag(flag)) + .forEach(envFlag => { + it(`${envFlag} should return false`, function() { + expect(isNodeFlag(envFlag), 'to be false'); + }); }); - }); }); describe('when expecting leading dashes', function() { @@ -24,11 +36,6 @@ describe('node-flags', function() { expect(isNodeFlag('throw-deprecation', false), 'to be false'); expect(isNodeFlag('--throw-deprecation', false), 'to be true'); }); - - it('should return false for --require/-r', function() { - expect(isNodeFlag('--require', false), 'to be false'); - expect(isNodeFlag('-r', false), 'to be false'); - }); }); describe('special cases', function() { @@ -132,14 +139,5 @@ describe('node-flags', function() { ['--v8-numeric-one=1', '--v8-boolean-one', '--v8-numeric-two=2'] ); }); - - it('should special-case "--require"', function() { - // note the only way for this to happen IN REAL LIFE is if you use "--require esm"; - // mocha eats all --require args otherwise. - expect(unparseNodeFlags({require: 'mcrib'}), 'to equal', [ - '--require', - 'mcrib' - ]); - }); }); }); From 5f69c286a2ddcb00adfe41feda7402f42292a999 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 25 Aug 2020 12:16:52 -0700 Subject: [PATCH 1558/1771] update changelog for v8.1.2 [skip ci] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1082e6ea47..c760fab088 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# 8.1.2 / 2020-08-25 + +## :bug: Fixes + +- #4418: Fix command-line flag incompatibility in forthcoming Node.js v14.9.0 (@boneskull) +- #4401: Fix missing global variable in browser (@irrationelle) + +## :lock: Security Fixes + +- #4396: Update many dependencies (@GChuf) + +## :book: Documentation + +- Various fixes by @sujin-park, @wwhurin & @Donghoon759 + # 8.1.1 / 2020-08-04 ## :bug: Fixes From c733254a5c28504e9fcd2e2954b580980c4583dd Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 25 Aug 2020 12:18:38 -0700 Subject: [PATCH 1559/1771] Release v8.1.2 --- AUTHORS | 5 +++++ CHANGELOG.md | 8 ++++---- package-lock.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index cdcfae85a3..82a8bfae0d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -503,5 +503,10 @@ devjeel Martin Oppitz indieisaconcept Sri Harsha +irrationnelle +Donghoon Song <32301380+Donghoon759@users.noreply.github.com> +Sujin Park +KIM HYO RIN +Chuf <42591821+GChuf@users.noreply.github.com> # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index c760fab088..fef83cf212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,16 @@ ## :bug: Fixes -- #4418: Fix command-line flag incompatibility in forthcoming Node.js v14.9.0 (@boneskull) -- #4401: Fix missing global variable in browser (@irrationelle) +- [#4418](https://github.com/mochajs/mocha/issues/4418): Fix command-line flag incompatibility in forthcoming Node.js v14.9.0 ([**@boneskull**](https://github.com/boneskull)) +- [#4401](https://github.com/mochajs/mocha/issues/4401): Fix missing global variable in browser ([**@irrationelle**](https://github.com/irrationelle)) ## :lock: Security Fixes -- #4396: Update many dependencies (@GChuf) +- [#4396](https://github.com/mochajs/mocha/issues/4396): Update many dependencies ([**@GChuf**](https://github.com/GChuf)) ## :book: Documentation -- Various fixes by @sujin-park, @wwhurin & @Donghoon759 +- Various fixes by [**@sujin-park**](https://github.com/sujin-park), [**@wwhurin**](https://github.com/wwhurin) & [**@Donghoon759**](https://github.com/Donghoon759) # 8.1.1 / 2020-08-04 diff --git a/package-lock.json b/package-lock.json index f8b8be6604..cc2ad65367 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.1", + "version": "8.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 963a670be0..60cc192776 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.1", + "version": "8.1.2", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From 8bc376cb4d4049740e5882a830411aa86b2265b6 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 26 Aug 2020 16:37:25 -0700 Subject: [PATCH 1560/1771] fix lintstagedrc --- .lintstagedrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 5c26d5f799..b5c13bbd10 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,5 +1,5 @@ { - "@(*.js|bin/*)": ["eslint --fix"], + "@(**/*.js|bin/*)": ["eslint --fix"], "!(package*).json": ["prettier --write"], "*.{yml,md,html}": ["prettier --write"] } From 4976e179774aea28bc788c6e237330ce932d218d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 26 Aug 2020 16:37:34 -0700 Subject: [PATCH 1561/1771] refactor assertions into an actual unexpected plugin `test/assertions.js` now conforms to this style and is loaded via `expect.use()` like anything else Signed-off-by: Christopher Hiller --- test/assertions.js | 661 +++++++++++++++++++++++---------------------- test/setup.js | 14 +- 2 files changed, 340 insertions(+), 335 deletions(-) diff --git a/test/assertions.js b/test/assertions.js index ef678ff4ea..3bc72ffa5b 100644 --- a/test/assertions.js +++ b/test/assertions.js @@ -1,341 +1,346 @@ 'use strict'; -exports.mixinMochaAssertions = function(expect) { - return expect - .addType({ - name: 'RawResult', - base: 'object', - identify: function(v) { - return ( - Object.prototype.toString.call(v) === '[object Object]' && - typeof v.output === 'string' && - 'code' in v && // may be null - Array.isArray(v.args) - ); - } - }) - .addType({ - name: 'JSONRunResult', - base: 'object', - identify: function(v) { - return ( - Object.prototype.toString.call(v) === '[object Object]' && - Object.prototype.toString.call(v.stats) === '[object Object]' && - Array.isArray(v.failures) && - typeof v.code === 'number' - ); - } - }) - .addType({ - name: 'RawRunResult', - base: 'object', - identify: function(v) { - return ( - Object.prototype.toString.call(v) === '[object Object]' && - typeof v.passing === 'number' && - typeof v.failing === 'number' && - typeof v.pending === 'number' && - typeof v.output === 'string' && - typeof v.code === 'number' - ); - } - }) - .addAssertion(' [not] to have (passed|succeeded)', function( - expect, - result - ) { - expect(result, 'to satisfy', { - code: expect.it('[not] to be', 0), - stats: { - failures: expect.it('[not] to be', 0) - }, - failures: expect.it('[not] to be empty') - }); - }) - .addAssertion( - ' [not] to have (passed|succeeded)', - function(expect, result) { - expect(result, '[not] to have property', 'code', 0); - } - ) - .addAssertion( - ' [not] to have completed with [exit] code ', - function(expect, result, code) { - expect(result.code, '[not] to be', code); - } - ) - .addAssertion( - ' [not] to have passed (with|having) count ', - function(expect, result, count) { - expect(result, '[not] to pass').and('[not] to satisfy', { - stats: {passes: expect.it('to be', count)} - }); - } - ) - .addAssertion( - ' [not] to have failed (with|having) count ', - function(expect, result, count) { - expect(result, '[not] to have failed').and('[not] to satisfy', { - stats: {failures: expect.it('to be', count)} - }); - } - ) - .addAssertion(' [not] to have failed', function( - expect, - result - ) { - expect(result, '[not] to satisfy', { - code: expect.it('to be greater than', 0), - stats: { - failures: expect.it('to be greater than', 0) - }, - failures: expect.it('to be non-empty') - }); - }) - .addAssertion(' [not] to have failed', function( - expect, - result - ) { - expect(result, '[not] to satisfy', { - code: expect.it('to be greater than', 0) - }); - }) - .addAssertion( - ' [not] to have failed (with|having) output ', - function(expect, result, output) { +const {version} = require('../package.json'); + +module.exports = { + name: 'unexpected-mocha-internal', + version, + installInto(expect) { + expect + .addType({ + name: 'RawResult', + base: 'object', + identify: function(v) { + return ( + Object.prototype.toString.call(v) === '[object Object]' && + typeof v.output === 'string' && + 'code' in v && // may be null + Array.isArray(v.args) + ); + } + }) + .addType({ + name: 'JSONRunResult', + base: 'object', + identify: function(v) { + return ( + Object.prototype.toString.call(v) === '[object Object]' && + Object.prototype.toString.call(v.stats) === '[object Object]' && + Array.isArray(v.failures) && + typeof v.code === 'number' + ); + } + }) + .addType({ + name: 'RawRunResult', + base: 'object', + identify: function(v) { + return ( + Object.prototype.toString.call(v) === '[object Object]' && + typeof v.passing === 'number' && + typeof v.failing === 'number' && + typeof v.pending === 'number' && + typeof v.output === 'string' && + typeof v.code === 'number' + ); + } + }) + .addAssertion( + ' [not] to have (passed|succeeded)', + function(expect, result) { + expect(result, 'to satisfy', { + code: expect.it('[not] to be', 0), + stats: { + failures: expect.it('[not] to be', 0) + }, + failures: expect.it('[not] to be empty') + }); + } + ) + .addAssertion( + ' [not] to have (passed|succeeded)', + function(expect, result) { + expect(result, '[not] to have property', 'code', 0); + } + ) + .addAssertion( + ' [not] to have completed with [exit] code ', + function(expect, result, code) { + expect(result.code, '[not] to be', code); + } + ) + .addAssertion( + ' [not] to have passed (with|having) count ', + function(expect, result, count) { + expect(result, '[not] to pass').and('[not] to satisfy', { + stats: {passes: expect.it('to be', count)} + }); + } + ) + .addAssertion( + ' [not] to have failed (with|having) count ', + function(expect, result, count) { + expect(result, '[not] to have failed').and('[not] to satisfy', { + stats: {failures: expect.it('to be', count)} + }); + } + ) + .addAssertion(' [not] to have failed', function( + expect, + result + ) { expect(result, '[not] to satisfy', { code: expect.it('to be greater than', 0), - output: output + stats: { + failures: expect.it('to be greater than', 0) + }, + failures: expect.it('to be non-empty') }); - } - ) - .addAssertion( - ' [not] to have passed (with|having) output ', - function(expect, result, output) { + }) + .addAssertion(' [not] to have failed', function( + expect, + result + ) { expect(result, '[not] to satisfy', { - code: 0, - output: output + code: expect.it('to be greater than', 0) }); - } - ) - .addAssertion( - ' [not] to have failed [test] count ', - function(expect, result, count) { - expect(result.failing, '[not] to be', count); - } - ) - .addAssertion( - ' [not] to have passed [test] count ', - function(expect, result, count) { - expect(result.passing, '[not] to be', count); - } - ) - .addAssertion( - ' [not] to have pending [test] count ', - function(expect, result, count) { - expect(result.pending, '[not] to be', count); - } - ) - .addAssertion(' [not] to have test count ', function( - expect, - result, - count - ) { - expect(result.stats.tests, '[not] to be', count); - }) - .addAssertion( - ' [not] to have failed [test] count ', - function(expect, result, count) { - expect(result.stats.failures, '[not] to be', count); - } - ) - .addAssertion( - ' [not] to have passed [test] count ', - function(expect, result, count) { - expect(result.stats.passes, '[not] to be', count); - } - ) - .addAssertion( - ' [not] to have pending [test] count ', - function(expect, result, count) { - expect(result.stats.pending, '[not] to be', count); - } - ) - .addAssertion( - ' [not] to have run (test|tests) ', - function(expect, result, titles) { - Array.prototype.slice.call(arguments, 2).forEach(function(title) { - expect( - result, - '[not] to have a value satisfying', - expect.it('to have an item satisfying', {title: title}) - ); - }); - } - ) - .addAssertion( - ' [not] to have failed (test|tests) ', - function(expect, result, titles) { - Array.prototype.slice.call(arguments, 2).forEach(function(title) { - expect(result.failures, '[not] to have an item satisfying', { - title: title - }); - }); - } - ) - .addAssertion( - ' [not] to have failed with (error|errors) ', - function(expect, result, errors) { - Array.prototype.slice.call(arguments, 2).forEach(function(error) { - expect(result, '[not] to have failed').and('[not] to satisfy', { - failures: expect.it('to have an item satisfying', { - err: expect - .it('to satisfy', error) - .or('to satisfy', {message: error}) - }) + }) + .addAssertion( + ' [not] to have failed (with|having) output ', + function(expect, result, output) { + expect(result, '[not] to satisfy', { + code: expect.it('to be greater than', 0), + output: output }); - }); - } - ) - .addAssertion( - ' [not] to have (error|errors) ', - function(expect, result, errors) { - Array.prototype.slice.call(arguments, 2).forEach(function(error) { + } + ) + .addAssertion( + ' [not] to have passed (with|having) output ', + function(expect, result, output) { expect(result, '[not] to satisfy', { - failures: expect.it('to have an item satisfying', { - err: expect - .it('to satisfy', error) - .or('to satisfy', {message: error}) + code: 0, + output: output + }); + } + ) + .addAssertion( + ' [not] to have failed [test] count ', + function(expect, result, count) { + expect(result.failing, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have passed [test] count ', + function(expect, result, count) { + expect(result.passing, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have pending [test] count ', + function(expect, result, count) { + expect(result.pending, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have test count ', + function(expect, result, count) { + expect(result.stats.tests, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have failed [test] count ', + function(expect, result, count) { + expect(result.stats.failures, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have passed [test] count ', + function(expect, result, count) { + expect(result.stats.passes, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have pending [test] count ', + function(expect, result, count) { + expect(result.stats.pending, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have run (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect( + result, + '[not] to have a value satisfying', + expect.it('to have an item satisfying', {title: title}) + ); + }); + } + ) + .addAssertion( + ' [not] to have failed (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect(result.failures, '[not] to have an item satisfying', { + title: title + }); + }); + } + ) + .addAssertion( + ' [not] to have failed with (error|errors) ', + function(expect, result, errors) { + Array.prototype.slice.call(arguments, 2).forEach(function(error) { + expect(result, '[not] to have failed').and('[not] to satisfy', { + failures: expect.it('to have an item satisfying', { + err: expect + .it('to satisfy', error) + .or('to satisfy', {message: error}) + }) + }); + }); + } + ) + .addAssertion( + ' [not] to have (error|errors) ', + function(expect, result, errors) { + Array.prototype.slice.call(arguments, 2).forEach(function(error) { + expect(result, '[not] to satisfy', { + failures: expect.it('to have an item satisfying', { + err: expect + .it('to satisfy', error) + .or('to satisfy', {message: error}) + }) + }); + }); + } + ) + .addAssertion( + ' [not] to have passed (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect(result.passes, '[not] to have an item satisfying', { + title: title + }); + }); + } + ) + .addAssertion( + ' [not] to have test order ', + function(expect, result, state, titles) { + expect( + result[state].slice(0, titles.length), + '[not] to satisfy', + titles.map(function(title) { + return typeof title === 'string' ? {title: title} : title; }) + ); + } + ) + .addAssertion( + ' [not] to have passed test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'passes', titles); + } + ) + .addAssertion( + ' [not] to have passed test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'passes', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion( + ' [not] to have failed test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'failures', titles); + } + ) + .addAssertion( + ' [not] to have failed test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'failures', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion( + ' [not] to have pending test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'pending', titles); + } + ) + .addAssertion( + ' [not] to have pending test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'pending', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion(' [not] to have pending tests', function( + expect, + result + ) { + expect(result.stats.pending, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have passed tests', function( + expect, + result + ) { + expect(result.stats.passes, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have failed tests', function( + expect, + result + ) { + expect(result.stats.failed, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have tests', function( + expect, + result + ) { + expect(result.stats.tests, '[not] to be greater than', 0); + }) + .addAssertion( + ' [not] to have retried test ', + function(expect, result, title) { + expect(result.tests, '[not] to have an item satisfying', { + title: title, + currentRetry: expect.it('to be positive') }); - }); - } - ) - .addAssertion( - ' [not] to have passed (test|tests) ', - function(expect, result, titles) { - Array.prototype.slice.call(arguments, 2).forEach(function(title) { - expect(result.passes, '[not] to have an item satisfying', { - title: title + } + ) + .addAssertion( + ' [not] to have retried test ', + function(expect, result, title, count) { + expect(result.tests, '[not] to have an item satisfying', { + title: title, + currentRetry: count }); - }); - } - ) - .addAssertion( - ' [not] to have test order ', - function(expect, result, state, titles) { - expect( - result[state].slice(0, titles.length), - '[not] to satisfy', - titles.map(function(title) { - return typeof title === 'string' ? {title: title} : title; - }) - ); - } - ) - .addAssertion( - ' [not] to have passed test order ', - function(expect, result, titles) { - expect(result, '[not] to have test order', 'passes', titles); - } - ) - .addAssertion( - ' [not] to have passed test order ', - function(expect, result, titles) { - expect( - result, - '[not] to have test order', - 'passes', - Array.prototype.slice.call(arguments, 2) - ); - } - ) - .addAssertion( - ' [not] to have failed test order ', - function(expect, result, titles) { - expect(result, '[not] to have test order', 'failures', titles); - } - ) - .addAssertion( - ' [not] to have failed test order ', - function(expect, result, titles) { - expect( - result, - '[not] to have test order', - 'failures', - Array.prototype.slice.call(arguments, 2) - ); - } - ) - .addAssertion( - ' [not] to have pending test order ', - function(expect, result, titles) { - expect(result, '[not] to have test order', 'pending', titles); - } - ) - .addAssertion( - ' [not] to have pending test order ', - function(expect, result, titles) { - expect( - result, - '[not] to have test order', - 'pending', - Array.prototype.slice.call(arguments, 2) - ); - } - ) - .addAssertion(' [not] to have pending tests', function( - expect, - result - ) { - expect(result.stats.pending, '[not] to be greater than', 0); - }) - .addAssertion(' [not] to have passed tests', function( - expect, - result - ) { - expect(result.stats.passes, '[not] to be greater than', 0); - }) - .addAssertion(' [not] to have failed tests', function( - expect, - result - ) { - expect(result.stats.failed, '[not] to be greater than', 0); - }) - .addAssertion(' [not] to have tests', function( - expect, - result - ) { - expect(result.stats.tests, '[not] to be greater than', 0); - }) - .addAssertion( - ' [not] to have retried test ', - function(expect, result, title) { - expect(result.tests, '[not] to have an item satisfying', { - title: title, - currentRetry: expect.it('to be positive') - }); - } - ) - .addAssertion( - ' [not] to have retried test ', - function(expect, result, title, count) { - expect(result.tests, '[not] to have an item satisfying', { - title: title, - currentRetry: count - }); - } - ) - .addAssertion( - ' [not] to contain [output] ', - function(expect, result, output) { - expect(result.output, '[not] to satisfy', output); - } - ) - .addAssertion( - ' to have [exit] code ', - function(expect, result, code) { - expect(result.code, 'to be', code); - } - ); + } + ) + .addAssertion( + ' [not] to contain [output] ', + function(expect, result, output) { + expect(result.output, '[not] to satisfy', output); + } + ) + .addAssertion( + ' to have [exit] code ', + function(expect, result, code) { + expect(result.code, 'to be', code); + } + ); + } }; diff --git a/test/setup.js b/test/setup.js index 1732ae9d84..58bda9cb95 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,9 +1,9 @@ 'use strict'; -var unexpected = require('unexpected'); -global.expect = require('./assertions').mixinMochaAssertions( - unexpected - .clone() - .use(require('unexpected-sinon')) - .use(require('unexpected-eventemitter')) -); +const unexpected = require('unexpected'); + +global.expect = unexpected + .clone() + .use(require('unexpected-sinon')) + .use(require('unexpected-eventemitter')) + .use(require('./assertions')); From 4b2b6e06c58c9580333edd9cb0e67128641ba99f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 26 Aug 2020 16:04:11 -0700 Subject: [PATCH 1562/1771] update @mocha/docdash to latest version see #4412 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc2ad65367..207dd6d30c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3111,9 +3111,9 @@ "dev": true }, "@mocha/docdash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-3.0.0.tgz", - "integrity": "sha512-k/mjHfHe6shnj7gUH3wjVqFyWPiJqiV1IXxn9kzS85mzljS45VB+8zsUKOrKpXtX5YdI6DJmHfqDrR0oHGFNMA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mocha/docdash/-/docdash-3.0.1.tgz", + "integrity": "sha512-gzdsI+iJeOqgD01pHILKinuV1rvoWRzUfDCmadamefAMXXhWvdldDTVLWQrTDOMRQ3/zssISpSb+dbeNFflg9A==", "dev": true, "requires": { "taffydb": "^2.7.3" diff --git a/package.json b/package.json index 60cc192776..e409e4a6cd 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@11ty/eleventy": "^0.11.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.0", "@babel/preset-env": "^7.11.0", - "@mocha/docdash": "^3.0.0", + "@mocha/docdash": "^3.0.1", "@rollup/plugin-babel": "^5.1.0", "@rollup/plugin-commonjs": "^14.0.0", "@rollup/plugin-json": "^4.1.0", From 247d9611ea1a77d1c1029b0eae812b271445592f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 25 Aug 2020 13:41:34 -0700 Subject: [PATCH 1563/1771] alias lookupFiles, loadRc, loadPkgRc and loadOptions to lib/cli module; fixes #4398 - fixes API documentation for all of these (and `module:lib/cli.main`) via JSDoc aliasing - aliases `lib/cli/cli.js` to `module:lib/cli`; `module:lib/cli/cli` is no longer a thing - the `lib/cli/options.js` and `lib/cli/lookup-files.js` _modules_ (not necessarily their _contents_) are now private example usage: ```js const {loadRc, loadPkgRc, loadOptions, lookupFiles} = require('mocha/lib/cli'); ``` --- lib/cli/cli.js | 27 +++++++++++++++++++-------- lib/cli/index.js | 6 ------ lib/cli/lookup-files.js | 8 +++++++- lib/cli/options.js | 9 +++++---- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/lib/cli/cli.js b/lib/cli/cli.js index ffbe5dada5..f3b780cf9d 100755 --- a/lib/cli/cli.js +++ b/lib/cli/cli.js @@ -3,19 +3,24 @@ 'use strict'; /** - * This is where we finally parse and handle arguments passed to the `mocha` executable. - * Option parsing is handled by {@link https://npm.im/yargs yargs}. - * If executed via `node`, this module will run {@linkcode module:lib/cli/cli.main main()}. - * - * @private - * @module + * Contains CLI entry point and public API for programmatic usage in Node.js. + * - Option parsing is handled by {@link https://npm.im/yargs yargs}. + * - If executed via `node`, this module will run {@linkcode module:lib/cli.main main()}. + * @public + * @module lib/cli */ const debug = require('debug')('mocha:cli:cli'); const symbols = require('log-symbols'); const yargs = require('yargs/yargs'); const path = require('path'); -const {loadOptions, YARGS_PARSER_CONFIG} = require('./options'); +const { + loadRc, + loadPkgRc, + loadOptions, + YARGS_PARSER_CONFIG +} = require('./options'); +const lookupFiles = require('./lookup-files'); const commands = require('./commands'); const ansi = require('ansi-colors'); const {repository, homepage, version, gitter} = require('../../package.json'); @@ -25,7 +30,8 @@ const {cwd} = require('../utils'); * - Accepts an `Array` of arguments * - Modifies {@link https://nodejs.org/api/modules.html#modules_module_paths Node.js' search path} for easy loading of consumer modules * - Sets {@linkcode https://nodejs.org/api/errors.html#errors_error_stacktracelimit Error.stackTraceLimit} to `Infinity` - * @summary Mocha's main entry point from the command-line. + * @public + * @summary Mocha's main command-line entry-point. * @param {string[]} argv - Array of arguments to parse, or by default the lovely `process.argv.slice(2)` */ exports.main = (argv = process.argv.slice(2)) => { @@ -71,6 +77,11 @@ exports.main = (argv = process.argv.slice(2)) => { .parse(args._); }; +exports.lookupFiles = lookupFiles; +exports.loadOptions = loadOptions; +exports.loadPkgRc = loadPkgRc; +exports.loadRc = loadRc; + // allow direct execution if (require.main === module) { exports.main(); diff --git a/lib/cli/index.js b/lib/cli/index.js index d792f0c9de..f20314ea99 100644 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -1,9 +1,3 @@ 'use strict'; -/** - * Just exports {@link module:lib/cli/cli} for convenience. - * @private - * @module lib/cli - * @exports module:lib/cli/cli - */ module.exports = require('./cli'); diff --git a/lib/cli/lookup-files.js b/lib/cli/lookup-files.js index 2223ad09c2..c49204842a 100644 --- a/lib/cli/lookup-files.js +++ b/lib/cli/lookup-files.js @@ -1,5 +1,11 @@ 'use strict'; +/** + * Contains `lookupFiles`, which takes some globs/dirs/options and returns a list of files. + * @module + * @private + */ + var fs = require('fs'); var path = require('path'); var glob = require('glob'); @@ -53,7 +59,7 @@ function hasMatchingExtname(pathname, exts) { * **Make no assumption that the names will be sorted in any fashion.** * * @public - * @memberof Mocha.utils + * @alias module:lib/cli.lookupFiles * @param {string} filepath - Base path to start searching from. * @param {string[]} [extensions=[]] - File extensions to look for. * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. diff --git a/lib/cli/options.js b/lib/cli/options.js index c51865916d..1ffa000398 100644 --- a/lib/cli/options.js +++ b/lib/cli/options.js @@ -3,7 +3,8 @@ /** * Main entry point for handling filesystem-based configuration, * whether that's a config file or `package.json` or whatever. - * @module + * @module lib/cli/options + * @private */ const fs = require('fs'); @@ -150,7 +151,7 @@ const parse = (args = [], defaultValues = {}, ...configObjects) => { * @param {Object} [args] - Arguments object * @param {string|boolean} [args.config] - Path to config file or `false` to skip * @public - * @memberof module:lib/cli/options + * @alias module:lib/cli.loadRc * @returns {external:yargsParser.Arguments|void} Parsed config, or nothing if `args.config` is `false` */ const loadRc = (args = {}) => { @@ -167,7 +168,7 @@ module.exports.loadRc = loadRc; * @param {Object} [args] - Arguments object * @param {string|boolean} [args.config] - Path to `package.json` or `false` to skip * @public - * @memberof module:lib/cli/options + * @alias module:lib/cli.loadPkgRc * @returns {external:yargsParser.Arguments|void} Parsed config, or nothing if `args.package` is `false` */ const loadPkgRc = (args = {}) => { @@ -210,7 +211,7 @@ module.exports.loadPkgRc = loadPkgRc; * @summary Parses options read from `.mocharc.*` and `package.json`. * @param {string|string[]} [argv] - Arguments to parse * @public - * @memberof module:lib/cli/options + * @alias module:lib/cli.loadOptions * @returns {external:yargsParser.Arguments} Parsed args from everything */ const loadOptions = (argv = []) => { From 52f07f01894504615cd412c91cfad8e9b8a6d76e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 26 Aug 2020 15:26:52 -0700 Subject: [PATCH 1564/1771] restore and deprecate lookupFiles() in lib/utils lookupFiles() broke (moved) in version v8.1.0, this returns it and issues a soft deprecation warning. in the browser, this function should not be called, but if it is, an `ERR_MOCHA_UNSUPPORTED` `Error` is thrown --- lib/utils.js | 29 ++++++++++++++++++++++++++ package.json | 3 ++- test/unit/utils.spec.js | 45 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 64dfe9b964..e6eed672ac 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -645,3 +645,32 @@ exports.cwd = function cwd() { exports.isBrowser = function isBrowser() { return Boolean(process.browser); }; + +/** + * Lookup file names at the given `path`. + * + * @description + * Filenames are returned in _traversal_ order by the OS/filesystem. + * **Make no assumption that the names will be sorted in any fashion.** + * + * @public + * @alias module:lib/cli.lookupFiles + * @param {string} filepath - Base path to start searching from. + * @param {string[]} [extensions=[]] - File extensions to look for. + * @param {boolean} [recursive=false] - Whether to recurse into subdirectories. + * @return {string[]} An array of paths. + * @throws {Error} if no files match pattern. + * @throws {TypeError} if `filepath` is directory and `extensions` not provided. + * @deprecated Moved to {@link module:lib/cli.lookupFiles} + */ +exports.lookupFiles = (...args) => { + if (exports.isBrowser()) { + throw require('./errors').createUnsupportedError( + 'lookupFiles() is only supported in Node.js!' + ); + } + exports.deprecate( + '`lookupFiles()` in module `mocha/lib/utils` has moved to module `mocha/lib/cli` and will be removed in the next major revision of Mocha' + ); + return require('./cli').lookupFiles(...args); +}; diff --git a/package.json b/package.json index e409e4a6cd..625a4140a5 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,8 @@ "./lib/nodejs/worker.js": false, "./lib/nodejs/buffered-worker-pool.js": false, "./lib/nodejs/parallel-buffered-runner.js": false, - "./lib/nodejs/reporters/parallel-buffered.js": false + "./lib/nodejs/reporters/parallel-buffered.js": false, + "./lib/cli/index.js": false }, "prettier": { "singleQuote": true, diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 9fa6cc74e4..3fa408d064 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -742,4 +742,49 @@ describe('lib/utils', function() { expect(utils.slug('poppies & fritz'), 'to be', 'poppies-fritz'); }); }); + + describe('lookupFiles()', function() { + beforeEach(function() { + sinon.stub(utils, 'deprecate'); + }); + + describe('when run in Node.js', function() { + before(function() { + if (process.browser) { + return this.skip(); + } + }); + + beforeEach(function() { + sinon.stub(utils, 'isBrowser').returns(false); + sinon.stub(require('../../lib/cli'), 'lookupFiles').returns([]); + }); + + it('should print a deprecation message', function() { + utils.lookupFiles(); + expect(utils.deprecate, 'was called once'); + }); + + it('should delegate to new location of lookupFiles()', function() { + utils.lookupFiles(['foo']); + expect( + require('../../lib/cli').lookupFiles, + 'to have a call satisfying', + [['foo']] + ).and('was called once'); + }); + }); + + describe('when run in browser', function() { + beforeEach(function() { + sinon.stub(utils, 'isBrowser').returns(true); + }); + + it('should throw', function() { + expect(() => utils.lookupFiles(['foo']), 'to throw', { + code: 'ERR_MOCHA_UNSUPPORTED' + }); + }); + }); + }); }); From 051f9f61065ccb5b5960de22cd59a7e8b42123ad Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 27 Aug 2020 14:08:31 -0700 Subject: [PATCH 1565/1771] assert mocha is bundle-able by webpack; fixes #4422 --- lib/mocha.js | 27 +- lib/nodejs/file-unloader.js | 15 + package-lock.json | 1158 ++++++++++++++++- package-scripts.js | 8 +- package.json | 6 +- .../fixtures/webpack/webpack.config.js | 13 + .../fixtures/webpack/webpack.fixture.mjs | 1 + test/unit/mocha.spec.js | 14 + 8 files changed, 1218 insertions(+), 24 deletions(-) create mode 100644 lib/nodejs/file-unloader.js create mode 100644 test/browser-specific/fixtures/webpack/webpack.config.js create mode 100644 test/browser-specific/fixtures/webpack/webpack.fixture.mjs diff --git a/lib/mocha.js b/lib/mocha.js index 0b4aa5a4bd..350df62dbc 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -12,18 +12,18 @@ var builtinReporters = require('./reporters'); var growl = require('./nodejs/growl'); var utils = require('./utils'); var mocharc = require('./mocharc.json'); -var errors = require('./errors'); var Suite = require('./suite'); var esmUtils = utils.supportsEsModules(true) ? require('./esm-utils') : undefined; var createStatsCollector = require('./stats-collector'); -var createInvalidReporterError = errors.createInvalidReporterError; -var createInvalidInterfaceError = errors.createInvalidInterfaceError; -var createMochaInstanceAlreadyDisposedError = - errors.createMochaInstanceAlreadyDisposedError; -var createMochaInstanceAlreadyRunningError = - errors.createMochaInstanceAlreadyRunningError; +const { + createUnsupportedError, + createInvalidInterfaceError, + createInvalidReporterError, + createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError +} = require('./errors'); var EVENT_FILE_PRE_REQUIRE = Suite.constants.EVENT_FILE_PRE_REQUIRE; var EVENT_FILE_POST_REQUIRE = Suite.constants.EVENT_FILE_POST_REQUIRE; var EVENT_FILE_REQUIRE = Suite.constants.EVENT_FILE_REQUIRE; @@ -445,7 +445,12 @@ Mocha.prototype.loadFilesAsync = function() { * @param {string} file - Pathname of file to be unloaded. */ Mocha.unloadFile = function(file) { - delete require.cache[require.resolve(file)]; + if (utils.isBrowser()) { + throw createUnsupportedError( + 'unloadFile() is only suported in a Node.js environment' + ); + } + return require('./nodejs/file-unloader').unloadFile(file); }; /** @@ -1051,9 +1056,7 @@ Mocha.prototype.rootHooks = function rootHooks(hooks) { */ Mocha.prototype.parallelMode = function parallelMode(enable) { if (utils.isBrowser()) { - throw errors.createUnsupportedError( - 'parallel mode is only supported in Node.js' - ); + throw createUnsupportedError('parallel mode is only supported in Node.js'); } var parallel = enable === true; if ( @@ -1064,7 +1067,7 @@ Mocha.prototype.parallelMode = function parallelMode(enable) { return this; } if (this._state !== mochaStates.INIT) { - throw errors.createUnsupportedError( + throw createUnsupportedError( 'cannot change parallel mode after having called run()' ); } diff --git a/lib/nodejs/file-unloader.js b/lib/nodejs/file-unloader.js new file mode 100644 index 0000000000..50a817837a --- /dev/null +++ b/lib/nodejs/file-unloader.js @@ -0,0 +1,15 @@ +'use strict'; + +/** + * This module should not be in the browser bundle, so it's here. + * @private + * @module + */ + +/** + * Deletes a file from the `require` cache. + * @param {string} file - File + */ +exports.unloadFile = file => { + delete require.cache[require.resolve(file)]; +}; diff --git a/package-lock.json b/package-lock.json index 207dd6d30c..07c32bf7ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3520,6 +3520,193 @@ "@wdio/logger": "6.0.16" } }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -3677,6 +3864,18 @@ "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -4734,6 +4933,12 @@ "callsite": "1.0.0" } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", @@ -6474,6 +6679,55 @@ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -6972,6 +7226,15 @@ } } }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", @@ -7731,6 +7994,31 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -8174,6 +8462,12 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", @@ -8581,6 +8875,12 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-indent": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", @@ -8924,6 +9224,18 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "easy-extender": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", @@ -9016,6 +9328,12 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -9129,6 +9447,29 @@ "has-binary2": "~1.0.2" } }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -10234,6 +10575,12 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "fail-on-errors-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fail-on-errors-webpack-plugin/-/fail-on-errors-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-U0WqfpDZV4HI9ueb7sWmZzEr+yjo0R3JCCw6nIfzJU6gnN1rU1k+1XPea7LqcZTOwmfbf4DuhMswWl1quxj7Xw==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -10308,6 +10655,12 @@ "pend": "~1.2.0" } }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -10488,6 +10841,18 @@ "semver-regex": "^2.0.0" } }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -10524,6 +10889,16 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -10680,6 +11055,18 @@ "minipass": "^2.6.0" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -12124,6 +12511,12 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -12167,6 +12560,61 @@ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "impro": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/impro/-/impro-0.7.1.tgz", @@ -12223,6 +12671,12 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12413,6 +12867,12 @@ } } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", @@ -14613,6 +15073,23 @@ "strip-bom": "^2.0.0" } }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "localtunnel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", @@ -15652,6 +16129,16 @@ } } }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -15889,16 +16376,46 @@ "minipass": "^2.9.0" } }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -15972,6 +16489,31 @@ "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", "dev": true }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -17285,6 +17827,17 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -18708,6 +19261,12 @@ "asap": "~2.0.3" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "promise.allsettled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", @@ -18963,6 +19522,29 @@ "once": "^1.3.1" } }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -19689,6 +20271,15 @@ "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", "dev": true }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -20114,6 +20705,15 @@ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", @@ -20431,6 +21031,17 @@ "xmlchars": "^2.1.1" } }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "schemes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/schemes/-/schemes-1.1.1.tgz", @@ -21370,6 +21981,12 @@ "sort-keys": "^1.0.0" } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -21605,6 +22222,15 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -21685,6 +22311,16 @@ "readable-stream": "^2.0.2" } }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", @@ -21716,6 +22352,12 @@ } } }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, "stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", @@ -22209,6 +22851,12 @@ "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=", "dev": true }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", @@ -22394,6 +23042,107 @@ } } }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -23045,6 +23794,24 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -24653,6 +25420,217 @@ } } }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "optional": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "webdriver": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.4.0.tgz", @@ -24816,6 +25794,157 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, + "webpack": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -24921,6 +26050,15 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, "workerpool": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", diff --git a/package-scripts.js b/package-scripts.js index 410393fa2c..da7cb1c4ab 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -221,7 +221,7 @@ module.exports = { browser: { default: { script: - 'nps clean build test.browser.unit test.browser.bdd test.browser.tdd test.browser.qunit test.browser.esm test.browser.requirejs', + 'nps clean build test.browser.unit test.browser.bdd test.browser.tdd test.browser.qunit test.browser.esm test.browser.requirejs test.browser.webpack', description: 'Run browser tests' }, unit: { @@ -252,6 +252,12 @@ module.exports = { script: 'cross-env MOCHA_TEST=requirejs nps test.browser.unit', description: 'Run RequireJS compat test', hiddenFromHelp: true + }, + webpack: { + script: + 'webpack --mode development --config ./test/browser-specific/fixtures/webpack/webpack.config.js', + description: 'Run Webpack compat test', + hiddenFromHelp: true } } }, diff --git a/package.json b/package.json index 625a4140a5..bb450c90ca 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", + "fail-on-errors-webpack-plugin": "^3.0.0", "fs-extra": "^9.0.1", "husky": "^4.2.5", "hyperlink": "^4.5.2", @@ -150,7 +151,9 @@ "update-notifier": "^4.1.0", "uslug": "^1.0.4", "uuid": "^8.3.0", - "watchify": "^3.11.1" + "watchify": "^3.11.1", + "webpack": "^4.44.1", + "webpack-cli": "^3.3.12" }, "files": [ "bin/*mocha", @@ -174,6 +177,7 @@ "./lib/nodejs/buffered-worker-pool.js": false, "./lib/nodejs/parallel-buffered-runner.js": false, "./lib/nodejs/reporters/parallel-buffered.js": false, + "./lib/nodejs/file-unloader.js": false, "./lib/cli/index.js": false }, "prettier": { diff --git a/test/browser-specific/fixtures/webpack/webpack.config.js b/test/browser-specific/fixtures/webpack/webpack.config.js new file mode 100644 index 0000000000..f43a80d010 --- /dev/null +++ b/test/browser-specific/fixtures/webpack/webpack.config.js @@ -0,0 +1,13 @@ +'use strict'; + +const FailOnErrorsPlugin = require('fail-on-errors-webpack-plugin'); + +module.exports = { + entry: require.resolve('./webpack.fixture.mjs'), + plugins: [ + new FailOnErrorsPlugin({ + failOnErrors: true, + failOnWarnings: true + }) + ] +}; diff --git a/test/browser-specific/fixtures/webpack/webpack.fixture.mjs b/test/browser-specific/fixtures/webpack/webpack.fixture.mjs new file mode 100644 index 0000000000..abb0703ceb --- /dev/null +++ b/test/browser-specific/fixtures/webpack/webpack.fixture.mjs @@ -0,0 +1 @@ +import mocha from '../../../../mocha.js'; diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 75be0341c9..d4f3ee8be0 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -844,5 +844,19 @@ describe('Mocha', function() { }); }); }); + + describe('unloadFile', function() { + describe('when run in a browser', function() { + beforeEach(function() { + sinon.stub(utils, 'isBrowser').returns(true); + }); + + it('should throw', function() { + expect(() => Mocha.unloadFile('guy-fieri.js'), 'to throw', { + code: 'ERR_MOCHA_UNSUPPORTED' + }); + }); + }); + }); }); }); From b1729c68a0be8308434a4f89fd2e25217d54a635 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 28 Aug 2020 13:15:40 -0700 Subject: [PATCH 1566/1771] update CHANGELOG.md for v8.1.3 [skip ci] Signed-off-by: Christopher Hiller --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fef83cf212..4ac1c73bac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 8.1.3 / 2020-08-28 + +## :bug: Fixes + +- #4425: Restore `Mocha.utils.lookupFiles()` and Webpack compatibility (both broken since v8.1.0); `Mocha.utils.lookupFiles()` is now **deprecated** and will be removed in the next major revision of Mocha; use `require('mocha/lib/cli').lookupFiles` instead (@boneskull) + # 8.1.2 / 2020-08-25 ## :bug: Fixes From fa9e67c6ba2e2af6f7cc70e51b2c97db94c73ad0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 28 Aug 2020 13:15:54 -0700 Subject: [PATCH 1567/1771] Release v8.1.3 --- CHANGELOG.md | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ac1c73bac..d3ce03feb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## :bug: Fixes -- #4425: Restore `Mocha.utils.lookupFiles()` and Webpack compatibility (both broken since v8.1.0); `Mocha.utils.lookupFiles()` is now **deprecated** and will be removed in the next major revision of Mocha; use `require('mocha/lib/cli').lookupFiles` instead (@boneskull) +- [#4425](https://github.com/mochajs/mocha/issues/4425): Restore `Mocha.utils.lookupFiles()` and Webpack compatibility (both broken since v8.1.0); `Mocha.utils.lookupFiles()` is now **deprecated** and will be removed in the next major revision of Mocha; use `require('mocha/lib/cli').lookupFiles` instead ([**@boneskull**](https://github.com/boneskull)) # 8.1.2 / 2020-08-25 diff --git a/package-lock.json b/package-lock.json index 07c32bf7ab..1dc3dee937 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.2", + "version": "8.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bb450c90ca..3fb8e4f847 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "8.1.2", + "version": "8.1.3", "description": "simple, flexible, fun test framework", "keywords": [ "mocha", From f28d6fe1bea23da9bdab52e8adda598dc891745a Mon Sep 17 00:00:00 2001 From: "JeongHoon Byun (a.k.a Outsider)" Date: Sun, 30 Aug 2020 20:43:37 +0900 Subject: [PATCH 1568/1771] fix typo in 8.1.2 changelog (#4432) Signed-off-by: Outsider --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3ce03feb5..d6511f8934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ ## :bug: Fixes - [#4418](https://github.com/mochajs/mocha/issues/4418): Fix command-line flag incompatibility in forthcoming Node.js v14.9.0 ([**@boneskull**](https://github.com/boneskull)) -- [#4401](https://github.com/mochajs/mocha/issues/4401): Fix missing global variable in browser ([**@irrationelle**](https://github.com/irrationelle)) +- [#4401](https://github.com/mochajs/mocha/issues/4401): Fix missing global variable in browser ([**@irrationnelle**](https://github.com/irrationnelle)) ## :lock: Security Fixes From 06a7f2199d10cc9002d6c23a302ff719f2b72a3e Mon Sep 17 00:00:00 2001 From: Donghoon Song Date: Sun, 30 Aug 2020 16:01:37 +0900 Subject: [PATCH 1569/1771] remove wallaby-logo.png trim option --- docs/_includes/default.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/default.liquid b/docs/_includes/default.liquid index 1b146cd001..58a49edb0c 100644 --- a/docs/_includes/default.liquid +++ b/docs/_includes/default.liquid @@ -52,7 +52,7 @@ title="Mocha is sponsored by Wallaby" > From c1db2a6b6c056753feae8ddb9d7343f99fc94245 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 2 Sep 2020 13:25:30 -0700 Subject: [PATCH 1570/1771] redirect webpack test output to a temp dir Signed-off-by: Christopher Hiller --- test/browser-specific/fixtures/webpack/webpack.config.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/browser-specific/fixtures/webpack/webpack.config.js b/test/browser-specific/fixtures/webpack/webpack.config.js index f43a80d010..53d4769c8e 100644 --- a/test/browser-specific/fixtures/webpack/webpack.config.js +++ b/test/browser-specific/fixtures/webpack/webpack.config.js @@ -1,9 +1,18 @@ 'use strict'; const FailOnErrorsPlugin = require('fail-on-errors-webpack-plugin'); +const {tmpdir} = require('os'); +const {join} = require('path'); + +const outputPath = join(tmpdir(), 'mocha-test-webpack'); + +console.error('output dir: %s', outputPath); module.exports = { entry: require.resolve('./webpack.fixture.mjs'), + output: { + path: outputPath + }, plugins: [ new FailOnErrorsPlugin({ failOnErrors: true, From 12db9dbc9dd3b0ec31c182d0e41a6ec615735401 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 8 Sep 2020 12:58:01 -0700 Subject: [PATCH 1571/1771] implementation of global setup/teardown; closes #4308 (#4360) * implementation of global setup/teardown; closes #4308 * move deprecate() and warn() from utils into errors module This avoids a circular dependency which arises when Mocha is bundled. These are private APIs. --- .eslintignore | 1 + .wallaby.js | 3 +- docs/index.md | 526 +++-- lib/cli/run-helpers.js | 71 +- lib/cli/run.js | 14 +- lib/cli/watch-run.js | 79 +- lib/errors.js | 149 +- lib/mocha.js | 307 ++- lib/nodejs/parallel-buffered-runner.js | 18 + lib/nodejs/worker.js | 17 +- lib/plugin-loader.js | 286 +++ lib/runner.js | 253 ++- lib/suite.js | 7 +- lib/utils.js | 80 +- package-lock.json | 1243 ++--------- package.json | 4 +- test/assertions.js | 275 ++- test/browser-specific/setup.js | 2 + .../integration/fixtures/deprecate.fixture.js | 8 +- .../global-setup-teardown-multiple.fixture.js | 20 + .../global-setup-teardown.fixture.js | 10 + .../global-fixtures/global-setup.fixture.js | 6 + .../global-teardown.fixture.js | 5 + .../root-hooks}/esm/package.json | 0 .../esm/root-hook-defs-esm.fixture.js | 0 .../root-hooks}/root-hook-defs-a.fixture.js | 0 .../root-hooks}/root-hook-defs-b.fixture.js | 0 .../root-hooks}/root-hook-defs-c.fixture.js | 0 .../root-hooks}/root-hook-defs-d.fixture.js | 0 .../root-hook-defs-esm-broken.fixture.js | 0 .../root-hook-defs-esm.fixture.mjs | 0 .../root-hooks}/root-hook-test-2.fixture.js | 0 .../root-hooks}/root-hook-test.fixture.js | 0 test/integration/helpers.js | 546 +++-- test/integration/hook-err.spec.js | 4 +- test/integration/hooks.spec.js | 4 +- test/integration/multiple-runs.spec.js | 31 +- test/integration/options/extension.spec.js | 4 +- test/integration/options/watch.spec.js | 196 +- test/integration/pending.spec.js | 4 +- .../plugins/global-fixtures.spec.js | 293 +++ .../root-hooks.spec.js} | 44 +- test/integration/retries.spec.js | 4 +- test/node-unit/cli/run-helpers.spec.js | 79 +- test/node-unit/mocha.spec.js | 57 +- test/node-unit/worker.spec.js | 28 +- test/reporters/xunit.spec.js | 28 +- test/setup.js | 2 + test/unit/errors.spec.js | 81 + test/unit/mocha.spec.js | 439 +++- test/unit/plugin-loader.spec.js | 514 +++++ test/unit/runner.spec.js | 1842 +++++++++-------- test/unit/suite.spec.js | 6 +- test/unit/utils.spec.js | 130 +- 54 files changed, 4590 insertions(+), 3130 deletions(-) create mode 100644 lib/plugin-loader.js create mode 100644 test/integration/fixtures/plugins/global-fixtures/global-setup-teardown-multiple.fixture.js create mode 100644 test/integration/fixtures/plugins/global-fixtures/global-setup-teardown.fixture.js create mode 100644 test/integration/fixtures/plugins/global-fixtures/global-setup.fixture.js create mode 100644 test/integration/fixtures/plugins/global-fixtures/global-teardown.fixture.js rename test/integration/fixtures/{options/require => plugins/root-hooks}/esm/package.json (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/esm/root-hook-defs-esm.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-a.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-b.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-c.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-d.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-esm-broken.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-defs-esm.fixture.mjs (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-test-2.fixture.js (100%) rename test/integration/fixtures/{options/require => plugins/root-hooks}/root-hook-test.fixture.js (100%) create mode 100644 test/integration/plugins/global-fixtures.spec.js rename test/integration/{options/require.spec.js => plugins/root-hooks.spec.js} (81%) create mode 100644 test/unit/plugin-loader.spec.js diff --git a/.eslintignore b/.eslintignore index a7a33c25c6..bf70c4ebbe 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,6 +2,7 @@ coverage/ mocha.js *.fixture.js docs/_site +docs/api docs/_dist docs/example out/ diff --git a/.wallaby.js b/.wallaby.js index b23a244650..59083bb5f4 100644 --- a/.wallaby.js +++ b/.wallaby.js @@ -48,6 +48,7 @@ module.exports = () => { ); require('./test/setup'); }, - debug: true + debug: true, + runMode: 'onsave' }; }; diff --git a/docs/index.md b/docs/index.md index b8396ea39e..ebe5f86ed1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -78,9 +78,9 @@ In your editor: ```js var assert = require('assert'); -describe('Array', function () { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { +describe('Array', function() { + describe('#indexOf()', function() { + it('should return -1 when the value is not present', function() { assert.equal([1, 2, 3].indexOf(4), -1); }); }); @@ -116,51 +116,65 @@ $ npm test ## Run Cycle Overview -A brief outline on the order Mocha's components are executed. -Worth noting that all hooks, `describe` and `it` callbacks are run in the order they are defined (i.e. found in the file). - -``` -run 'mocha spec.js' -| -spawn child process -| -|--------------> inside child process - process and apply options - | - run spec file/s - | - |--------------> per spec file - suite callbacks (e.g., 'describe') - | - 'before' root-level pre-hook - | - 'before' pre-hook - | - |--------------> per test - 'beforeEach' root-level pre-hook - | - 'beforeEach' pre-hook - | - test callbacks (e.g., 'it') - | - 'afterEach' post-hook - | - 'afterEach' root-level post-hook - |<-------------- per test end - | - 'after' post-hook - | - 'after' root-level post-hooks - |<-------------- per spec file end -|<-------------- inside child process end -``` +> Updated for v9.0.0. + +The following is a mid-level outline of Mocha's "flow of execution" when run in Node.js; the "less important" details have been omitted. + +In a browser, test files are loaded by ` - - - - - - - -``` - ## Configuring Mocha (Node.js) > _New in v6.0.0_ @@ -2422,8 +2350,7 @@ $ npm test In addition to chatting with us on [Gitter][gitter-mocha], for additional information such as using spies, mocking, and shared behaviours be sure to check out the [Mocha Wiki][mocha-wiki] on GitHub. -For discussions join the [Google Group][google-mocha]. For a running example of Mocha, view -[example/tests.html](example/tests.html). For the JavaScript API, view the [API documentation](api/) +For a running example of Mocha, view [example/tests.html](example/tests.html). For the JavaScript API, view the [API documentation](api/) or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [//]: # 'Cross reference section' @@ -2452,8 +2379,6 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [gist-async-hooks]: https://git.io/vdlNM [gist-globbing-tutorial]: https://gist.github.com/reggi/475793ea1846affbcfe8 [gitter-mocha]: https://gitter.im/mochajs/mocha -[google-mocha]: https://groups.google.com/group/mochajs -[growl]: http://growl.info/ [jetbrains]: https://www.jetbrains.com/ [jetbrains-plugin]: https://www.jetbrains.com/idea/features/nodejs.html [mdn-array-sort]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort @@ -2467,7 +2392,6 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [mocha-website]: https://mochajs.org/ [mocha-wiki]: https://github.com/mochajs/mocha/wiki [mocha-wiki-compilers]: https://github.com/mochajs/mocha/wiki/compilers-deprecation -[mocha-wiki-growl]: https://github.com/mochajs/mocha/wiki/Growl-Notifications [mocha-wiki-more-reporters]: https://github.com/mochajs/mocha/wiki/Third-party-reporters [node.js]: https://nodejs.org/ [node-assert]: https://nodejs.org/api/assert.html @@ -2477,7 +2401,6 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [npm-babel-register]: https://npm.im/@babel/register [npm-chai-as-promised]: https://www.npmjs.com/package/chai-as-promised [npm-glob]: https://www.npmjs.com/package/glob -[npm-growl]: https://npm.im/growl [npm-mocha-lcov-reporter]: https://npm.im/mocha-lcov-reporter [npm-mochawesome]: https://npm.im/mochawesome [npm-should.js]: https://npm.im/should diff --git a/lib/browser/growl.js b/lib/browser/growl.js deleted file mode 100644 index 29d185de41..0000000000 --- a/lib/browser/growl.js +++ /dev/null @@ -1,169 +0,0 @@ -'use strict'; - -/** - * Web Notifications module. - * @module Growl - */ - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ -var Date = global.Date; -var setTimeout = global.setTimeout; -var EVENT_RUN_END = require('../runner').constants.EVENT_RUN_END; -var isBrowser = require('../utils').isBrowser; - -/** - * Checks if browser notification support exists. - * - * @public - * @see {@link https://caniuse.com/#feat=notifications|Browser support (notifications)} - * @see {@link https://caniuse.com/#feat=promises|Browser support (promises)} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlCapable} - * @return {boolean} whether browser notification support exists - */ -exports.isCapable = function () { - var hasNotificationSupport = 'Notification' in window; - var hasPromiseSupport = typeof Promise === 'function'; - return isBrowser() && hasNotificationSupport && hasPromiseSupport; -}; - -/** - * Implements browser notifications as a pseudo-reporter. - * - * @public - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/notification|Notification API} - * @see {@link https://developers.google.com/web/fundamentals/push-notifications/display-a-notification|Displaying a Notification} - * @see {@link Growl#isPermitted} - * @see {@link Mocha#_growl} - * @param {Runner} runner - Runner instance. - */ -exports.notify = function (runner) { - var promise = isPermitted(); - - /** - * Attempt notification. - */ - var sendNotification = function () { - // If user hasn't responded yet... "No notification for you!" (Seinfeld) - Promise.race([promise, Promise.resolve(undefined)]) - .then(canNotify) - .then(function () { - display(runner); - }) - .catch(notPermitted); - }; - - runner.once(EVENT_RUN_END, sendNotification); -}; - -/** - * Checks if browser notification is permitted by user. - * - * @private - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Notification/permission|Notification.permission} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlPermitted} - * @returns {Promise} promise determining if browser notification - * permissible when fulfilled. - */ -function isPermitted() { - var permitted = { - granted: function allow() { - return Promise.resolve(true); - }, - denied: function deny() { - return Promise.resolve(false); - }, - default: function ask() { - return Notification.requestPermission().then(function (permission) { - return permission === 'granted'; - }); - } - }; - - return permitted[Notification.permission](); -} - -/** - * @summary - * Determines if notification should proceed. - * - * @description - * Notification shall not proceed unless `value` is true. - * - * `value` will equal one of: - *
                - *
              • true (from `isPermitted`)
              • - *
              • false (from `isPermitted`)
              • - *
              • undefined (from `Promise.race`)
              • - *
              - * - * @private - * @param {boolean|undefined} value - Determines if notification permissible. - * @returns {Promise} Notification can proceed - */ -function canNotify(value) { - if (!value) { - var why = value === false ? 'blocked' : 'unacknowledged'; - var reason = 'not permitted by user (' + why + ')'; - return Promise.reject(new Error(reason)); - } - return Promise.resolve(); -} - -/** - * Displays the notification. - * - * @private - * @param {Runner} runner - Runner instance. - */ -function display(runner) { - var stats = runner.stats; - var symbol = { - cross: '\u274C', - tick: '\u2705' - }; - var logo = require('../../package.json').notifyLogo; - var _message; - var message; - var title; - - if (stats.failures) { - _message = stats.failures + ' of ' + stats.tests + ' tests failed'; - message = symbol.cross + ' ' + _message; - title = 'Failed'; - } else { - _message = stats.passes + ' tests passed in ' + stats.duration + 'ms'; - message = symbol.tick + ' ' + _message; - title = 'Passed'; - } - - // Send notification - var options = { - badge: logo, - body: message, - dir: 'ltr', - icon: logo, - lang: 'en-US', - name: 'mocha', - requireInteraction: false, - timestamp: Date.now() - }; - var notification = new Notification(title, options); - - // Autoclose after brief delay (makes various browsers act same) - var FORCE_DURATION = 4000; - setTimeout(notification.close.bind(notification), FORCE_DURATION); -} - -/** - * As notifications are tangential to our purpose, just log the error. - * - * @private - * @param {Error} err - Why notification didn't happen. - */ -function notPermitted(err) { - console.error('notification error:', err.message); -} diff --git a/lib/cli/run-option-metadata.js b/lib/cli/run-option-metadata.js index 984ad4b75e..492608fbdd 100644 --- a/lib/cli/run-option-metadata.js +++ b/lib/cli/run-option-metadata.js @@ -39,7 +39,6 @@ const TYPES = (exports.types = { 'forbid-only', 'forbid-pending', 'full-trace', - 'growl', 'inline-diffs', 'invert', 'list-interfaces', @@ -76,7 +75,6 @@ exports.aliases = { fgrep: ['f'], global: ['globals'], grep: ['g'], - growl: ['G'], ignore: ['exclude'], invert: ['i'], jobs: ['j'], diff --git a/lib/cli/run.js b/lib/cli/run.js index 85f88bc68a..c15584fed5 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -141,10 +141,6 @@ exports.builder = yargs => group: GROUPS.FILTERS, requiresArg: true }, - growl: { - description: 'Enable Growl notifications', - group: GROUPS.OUTPUT - }, ignore: { defaultDescription: '(none)', description: 'Ignore file(s) or glob pattern(s)', diff --git a/lib/mocha.js b/lib/mocha.js index cee11f3aa5..1b7101a2a7 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -9,7 +9,6 @@ var escapeRe = require('escape-string-regexp'); var path = require('path'); var builtinReporters = require('./reporters'); -var growl = require('./nodejs/growl'); var utils = require('./utils'); var mocharc = require('./mocharc.json'); var Suite = require('./suite'); @@ -165,7 +164,6 @@ exports.run = function (...args) { * @param {boolean} [options.fullTrace] - Full stacktrace upon failure? * @param {string[]} [options.global] - Variables expected in global scope. * @param {RegExp|string} [options.grep] - Test filter given regular expression. - * @param {boolean} [options.growl] - Enable desktop notifications? * @param {boolean} [options.inlineDiffs] - Display inline diffs? * @param {boolean} [options.invert] - Invert test filter matches? * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? @@ -195,7 +193,7 @@ function Mocha(options = {}) { .ui(options.ui) .reporter( options.reporter, - options.reporterOption || options.reporterOptions // for backwards compability + options.reporterOption || options.reporterOptions // for backwards compatibility ) .slow(options.slow) .global(options.global); @@ -222,7 +220,6 @@ function Mocha(options = {}) { 'forbidOnly', 'forbidPending', 'fullTrace', - 'growl', 'inlineDiffs', 'invert' ].forEach(function (opt) { @@ -468,7 +465,7 @@ Mocha.prototype.loadFilesAsync = function () { Mocha.unloadFile = function (file) { if (utils.isBrowser()) { throw createUnsupportedError( - 'unloadFile() is only suported in a Node.js environment' + 'unloadFile() is only supported in a Node.js environment' ); } return require('./nodejs/file-unloader').unloadFile(file); @@ -647,49 +644,6 @@ Mocha.prototype.fullTrace = function (fullTrace) { return this; }; -/** - * Enables desktop notification support if prerequisite software installed. - * - * @public - * @see [CLI option](../#-growl-g) - * @return {Mocha} this - * @chainable - */ -Mocha.prototype.growl = function () { - this.options.growl = this.isGrowlCapable(); - if (!this.options.growl) { - var detail = utils.isBrowser() - ? 'notification support not available in this browser...' - : 'notification support prerequisites not installed...'; - console.error(detail + ' cannot enable!'); - } - return this; -}; - -/** - * @summary - * Determines if Growl support seems likely. - * - * @description - * Not available when run in browser. - * - * @private - * @see {@link Growl#isCapable} - * @see {@link Mocha#growl} - * @return {boolean} whether Growl support can be expected - */ -Mocha.prototype.isGrowlCapable = growl.isCapable; - -/** - * Implements desktop notifications using a pseudo-reporter. - * - * @private - * @see {@link Mocha#growl} - * @see {@link Growl#notify} - * @param {Runner} runner - Runner instance. - */ -Mocha.prototype._growl = growl.notify; - /** * Specifies whitelist of variable names to be expected in global scope. * @@ -713,7 +667,7 @@ Mocha.prototype.global = function (global) { }); return this; }; -// for backwards compability, 'globals' is an alias of 'global' +// for backwards compatibility, 'globals' is an alias of 'global' Mocha.prototype.globals = Mocha.prototype.global; /** @@ -1037,9 +991,6 @@ Mocha.prototype.run = function (fn) { if (options.global) { runner.globals(options.global); } - if (options.growl) { - this._growl(runner); - } if (options.color !== undefined) { exports.reporters.Base.useColors = options.color; } diff --git a/lib/nodejs/growl.js b/lib/nodejs/growl.js deleted file mode 100644 index 6664d67c67..0000000000 --- a/lib/nodejs/growl.js +++ /dev/null @@ -1,137 +0,0 @@ -'use strict'; - -/** - * Desktop Notifications module. - * @module Growl - */ - -const os = require('os'); -const path = require('path'); -const {sync: which} = require('which'); -const {EVENT_RUN_END} = require('../runner').constants; -const {isBrowser} = require('../utils'); - -/** - * @summary - * Checks if Growl notification support seems likely. - * - * @description - * Glosses over the distinction between an unsupported platform - * and one that lacks prerequisite software installations. - * - * @public - * @see {@link https://github.com/tj/node-growl/blob/master/README.md|Prerequisite Installs} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlCapable} - * @return {boolean} whether Growl notification support can be expected - */ -exports.isCapable = () => { - if (!isBrowser()) { - return getSupportBinaries().reduce( - (acc, binary) => acc || Boolean(which(binary, {nothrow: true})), - false - ); - } - return false; -}; - -/** - * Implements desktop notifications as a pseudo-reporter. - * - * @public - * @see {@link Mocha#_growl} - * @param {Runner} runner - Runner instance. - */ -exports.notify = runner => { - runner.once(EVENT_RUN_END, () => { - display(runner); - }); -}; - -/** - * Displays the notification. - * - * @private - * @param {Runner} runner - Runner instance. - */ -const display = runner => { - const growl = require('growl'); - const stats = runner.stats; - const symbol = { - cross: '\u274C', - tick: '\u2705' - }; - let _message; - let message; - let title; - - if (stats.failures) { - _message = `${stats.failures} of ${stats.tests} tests failed`; - message = `${symbol.cross} ${_message}`; - title = 'Failed'; - } else { - _message = `${stats.passes} tests passed in ${stats.duration}ms`; - message = `${symbol.tick} ${_message}`; - title = 'Passed'; - } - - // Send notification - const options = { - image: logo(), - name: 'mocha', - title - }; - growl(message, options, onCompletion); -}; - -/** - * @summary - * Callback for result of attempted Growl notification. - * - * @description - * Despite its appearance, this is not an Error-first - * callback -- all parameters are populated regardless of success. - * - * @private - * @callback Growl~growlCB - * @param {*} err - Error object, or null if successful. - */ -function onCompletion(err) { - if (err) { - // As notifications are tangential to our purpose, just log the error. - const message = - err.code === 'ENOENT' ? 'prerequisite software not found' : err.message; - console.error('notification error:', message); - } -} - -/** - * Returns Mocha logo image path. - * - * @private - * @return {string} Pathname of Mocha logo - */ -const logo = () => { - return path.join(__dirname, '..', 'assets', 'mocha-logo-96.png'); -}; - -/** - * @summary - * Gets platform-specific Growl support binaries. - * - * @description - * Somewhat brittle dependency on `growl` package implementation, but it - * rarely changes. - * - * @private - * @see {@link https://github.com/tj/node-growl/blob/master/lib/growl.js#L28-L126|setupCmd} - * @return {string[]} names of Growl support binaries - */ -const getSupportBinaries = () => { - const binaries = { - Darwin: ['terminal-notifier', 'growlnotify'], - Linux: ['notify-send', 'growl'], - Windows_NT: ['growlnotify.exe'] - }; - return binaries[os.type()] || []; -}; diff --git a/package-lock.json b/package-lock.json index 229e47f721..2addf3cf91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", @@ -28,7 +27,6 @@ "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", @@ -224,25 +222,25 @@ } }, "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "engines": { @@ -290,9 +288,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "dependencies": { "@babel/types": "^7.17.0", @@ -343,26 +341,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -454,13 +439,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" }, "engines": { @@ -468,9 +453,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -553,9 +538,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -565,9 +550,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -597,18 +582,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -677,6 +662,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -818,6 +813,16 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -982,15 +987,15 @@ } }, "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", "dev": true, "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -1061,9 +1066,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz", - "integrity": "sha512-d/OmjaLVO4j/aQX69bwpWPpbvI3TJkQuxoAk7BH8ew1PyoMBLTOuvJTjzG8oEoW7drIIqB0KCJtfFLu/2GClWg==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.3.tgz", + "integrity": "sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -1379,10 +1384,16 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, "node_modules/@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/json5": { @@ -1444,9 +1455,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3362,24 +3373,27 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -3397,28 +3411,13 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" @@ -3493,12 +3492,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -4312,9 +4310,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true, "funding": [ { @@ -5023,6 +5021,25 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "node_modules/compress-brotli": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", + "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", + "dev": true, + "dependencies": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compress-brotli/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -5441,14 +5458,10 @@ "dev": true }, "node_modules/crc-32": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", - "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.3.1" - }, "bin": { "crc32": "bin/crc32.njs" }, @@ -6219,12 +6232,12 @@ "dev": true }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/dependency-graph": { @@ -6281,10 +6294,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-indent": { "version": "3.0.1", @@ -6313,15 +6330,12 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/detect-node": { @@ -6503,9 +6517,9 @@ } }, "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -6567,9 +6581,9 @@ } }, "node_modules/domhandler/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -6814,9 +6828,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.89", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", - "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "node_modules/elliptic": { @@ -7029,9 +7043,9 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7040,15 +7054,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -7384,9 +7398,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "dependencies": { "array-includes": "^3.1.4", @@ -7394,14 +7408,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "engines": { "node": ">=4" @@ -7410,6 +7424,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7469,6 +7493,16 @@ "eslint": ">=5.16.0" } }, + "node_modules/eslint-plugin-node/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -7624,6 +7658,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -7998,15 +8042,6 @@ "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==", "dev": true }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", @@ -8277,6 +8312,16 @@ "minimatch": "^3.0.4" } }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/filelist/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8881,6 +8926,15 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9058,9 +9112,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/grapheme-splitter": { @@ -9118,14 +9172,6 @@ "integrity": "sha1-1toR82Ybt5eBLaeKHqUQZ4oqhzk=", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "engines": { - "node": ">=4.x" - } - }, "node_modules/gulp-header": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", @@ -9535,28 +9581,28 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-proxy": { @@ -9786,9 +9832,9 @@ } }, "node_modules/hyperlink/node_modules/assetgraph": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-7.5.0.tgz", - "integrity": "sha512-DeVCYLxe8nAWO4ehN5oYJk2UZOYvjWVf3NPHPl9q2grUTpoqOxk7GICw+58a28BiW3oSgj727x+YB7NjoJiVYA==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-7.6.1.tgz", + "integrity": "sha512-8TazHwB/y1MZeYEEotTXgrtYN9X9KV+khRWmSZaHRIQWBKg7wkW5KqDcvhtj+96XglVxGQfVwnCTpv8Puo32mw==", "dev": true, "dependencies": { "acorn": "^8.0.4", @@ -9815,7 +9861,7 @@ "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", - "perfectionist-papandreou": "^2.4.0-patch2", + "perfectionist-dfd": "^3.0.0", "postcss": "^8.4.12", "qs": "^6.5.2", "read-pkg-up": "^6.0.0", @@ -9831,6 +9877,15 @@ "workbox-build": "^4.3.1" } }, + "node_modules/hyperlink/node_modules/assetgraph/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/hyperlink/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -9870,29 +9925,26 @@ } }, "node_modules/hyperlink/node_modules/css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", "dev": true, - "dependencies": { - "timsort": "^0.3.0" - }, "engines": { - "node": ">= 10" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" } }, "node_modules/hyperlink/node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, @@ -9914,9 +9966,9 @@ } }, "node_modules/hyperlink/node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -9926,12 +9978,12 @@ } }, "node_modules/hyperlink/node_modules/cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.5", + "cssnano-preset-default": "^5.2.7", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -9947,12 +9999,12 @@ } }, "node_modules/hyperlink/node_modules/cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.0.3", + "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -9961,7 +10013,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", + "postcss-merge-longhand": "^5.1.4", "postcss-merge-rules": "^5.1.1", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -10002,9 +10054,9 @@ } }, "node_modules/hyperlink/node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", @@ -10016,9 +10068,9 @@ } }, "node_modules/hyperlink/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -10130,6 +10182,28 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/hyperlink/node_modules/perfectionist-dfd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/perfectionist-dfd/-/perfectionist-dfd-3.0.0.tgz", + "integrity": "sha512-g2EBMVcmkPN1geYaB5/Fg0cVUDN2oLXsTkbsoZPc3QPdUBAyIsOQr/UCTavqFwbvPwETXgSjN8/tzjqzV1CgPw==", + "dev": true, + "dependencies": { + "defined": "^1.0.0", + "minimist": "^1.2.6", + "postcss-scss": "^4.0.3", + "postcss-value-parser": "^4.2.0", + "read-file-stdin": "^0.2.1", + "semver": "^7.3.5", + "string.prototype.repeat": "^1.0.0", + "write-file-stdout": "^0.0.2" + }, + "bin": { + "perfectionist-dfd": "bin/cmd.js" + }, + "peerDependencies": { + "postcss": "^8.4.12" + } + }, "node_modules/hyperlink/node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -10255,9 +10329,9 @@ } }, "node_modules/hyperlink/node_modules/postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", @@ -10533,6 +10607,22 @@ "postcss": "^8.2.15" } }, + "node_modules/hyperlink/node_modules/postcss-scss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", + "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, "node_modules/hyperlink/node_modules/postcss-svgo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", @@ -10564,15 +10654,6 @@ "postcss": "^8.2.15" } }, - "node_modules/hyperlink/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/hyperlink/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10582,6 +10663,16 @@ "node": ">=0.10.0" } }, + "node_modules/hyperlink/node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/hyperlink/node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -11300,9 +11391,9 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -11442,10 +11533,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11583,9 +11677,9 @@ "dev": true }, "node_modules/isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "engines": { "node": ">= 8.0.0" @@ -11597,7 +11691,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -11798,6 +11893,16 @@ "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -11860,12 +11965,12 @@ "dev": true }, "node_modules/js-beautify": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", - "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.3.tgz", + "integrity": "sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==", "dev": true, "dependencies": { - "config-chain": "^1.1.12", + "config-chain": "^1.1.13", "editorconfig": "^0.15.3", "glob": "^7.1.3", "nopt": "^5.0.0" @@ -12312,9 +12417,9 @@ } }, "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -12429,6 +12534,16 @@ "node": ">= 10.0.0" } }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/karma/node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -12656,9 +12771,9 @@ "dev": true }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true, "engines": { "node": ">=10" @@ -13562,9 +13677,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz", - "integrity": "sha512-sLODeRetZ/61KkKLJElaU3NuU2z7MhXf12Ml1WJMSdwpngeofneCRF+JBbat8HiSqhniOMuTemXMrsI7hA6XyA==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.2.tgz", + "integrity": "sha512-JNaekTlIwwyYGBN3zifZDxgz4bSL8sbEj58fdTZGmPSMMGXBZapFjcZk2I33Jy79c1fvCKHpF7MA/67FOTjvzA==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", @@ -13720,6 +13835,16 @@ "node": ">=12" } }, + "node_modules/markdownlint-cli/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/markdownlint-cli/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -13773,9 +13898,9 @@ } }, "node_modules/marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.13.tgz", + "integrity": "sha512-lS/ZCa4X0gsRcfWs1eoh6dLnHr9kVH3K1t2X4M/tTtNouhZ7anS1Csb6464VGLQHv8b2Tw1cLeZQs58Jav8Rzw==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -13869,6 +13994,16 @@ "node": ">=0.10.0" } }, + "node_modules/maximatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/maximatch/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14603,13 +14738,13 @@ ] }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -14708,14 +14843,6 @@ "node": ">=10" } }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", @@ -14779,12 +14906,12 @@ } }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -14874,6 +15001,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/multimatch/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -16712,79 +16849,6 @@ "perfectionist": "bin/cmd.js" } }, - "node_modules/perfectionist-papandreou": { - "version": "2.4.0-patch2", - "resolved": "https://registry.npmjs.org/perfectionist-papandreou/-/perfectionist-papandreou-2.4.0-patch2.tgz", - "integrity": "sha512-HStzgA+cBL+IR7IpYkTE++9q4VP+74LbKnJG5NgI4vShEy8h1iuY6f8A7XVEVpjUoFZZTXfEPgsNwy9/LpN6oA==", - "dev": true, - "dependencies": { - "comment-regex": "^1.0.0", - "defined": "^1.0.0", - "minimist": "^1.2.0", - "postcss": "^8.4.12", - "postcss-scss": "^4.0.3", - "postcss-value-parser": "^3.3.0", - "read-file-stdin": "^0.2.0", - "string.prototype.repeat": "^0.2.0", - "vendors": "^1.0.0", - "write-file-stdout": "0.0.2" - }, - "bin": { - "perfectionist": "bin/cmd.js" - } - }, - "node_modules/perfectionist-papandreou/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/perfectionist-papandreou/node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/perfectionist-papandreou/node_modules/postcss-scss": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", - "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/perfectionist-papandreou/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, "node_modules/perfectionist/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -17762,9 +17826,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -17890,15 +17954,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/prebuild-install/node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -18031,9 +18086,9 @@ } }, "node_modules/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -18083,18 +18138,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/printj": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", - "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", - "dev": true, - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/prismjs": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", @@ -18654,40 +18697,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -18871,6 +18880,16 @@ "minimatch": "^3.0.4" } }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -19396,6 +19415,16 @@ "node": ">= 0.8.0" } }, + "node_modules/resp-modifier/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/resp-modifier/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -19917,11 +19946,12 @@ "dev": true }, "node_modules/saucelabs/node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "dev": true, "dependencies": { + "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, @@ -20048,18 +20078,18 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": ">=10" + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/semver-compare": { @@ -20123,15 +20153,12 @@ } }, "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", + "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/send": { @@ -20167,6 +20194,21 @@ "ms": "2.0.0" } }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "node_modules/send/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -20310,6 +20352,15 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -20452,9 +20503,9 @@ } }, "node_modules/sharp/node_modules/color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.1.tgz", - "integrity": "sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, "dependencies": { "color-convert": "^2.0.1", @@ -20479,6 +20530,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/sharp/node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -21681,9 +21744,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -22068,6 +22131,16 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -22446,14 +22519,14 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", - "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, @@ -23021,9 +23094,9 @@ } }, "node_modules/urijs": { - "version": "1.19.10", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.10.tgz", - "integrity": "sha512-EzauQlgKuJgsXOqoMrCiePBf4At5jVqRhXykF3Wfb8ZsOBMxPcfiVBcsHXug4Aepb/ICm2PIgqAUGMelgdrWEg==", + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", "dev": true }, "node_modules/url": { @@ -23458,11 +23531,12 @@ "dev": true }, "node_modules/webdriver/node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "dev": true, "dependencies": { + "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, @@ -23551,6 +23625,16 @@ "node": ">=10.0.0" } }, + "node_modules/webdriverio/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/webdriverio/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -23615,9 +23699,9 @@ } }, "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -23845,6 +23929,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -24513,25 +24598,25 @@ "dev": true }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { @@ -24563,9 +24648,9 @@ } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "requires": { "@babel/types": "^7.17.0", @@ -24603,23 +24688,13 @@ } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -24687,20 +24762,20 @@ "dev": true }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -24767,15 +24842,15 @@ } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true }, "@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -24801,18 +24876,18 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -24866,6 +24941,16 @@ "sprintf-js": "~1.0.2" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -24974,6 +25059,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -25109,15 +25204,15 @@ } }, "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", "dev": true, "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -25170,9 +25265,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz", - "integrity": "sha512-d/OmjaLVO4j/aQX69bwpWPpbvI3TJkQuxoAk7BH8ew1PyoMBLTOuvJTjzG8oEoW7drIIqB0KCJtfFLu/2GClWg==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.3.tgz", + "integrity": "sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -25427,10 +25522,16 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, "@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/json5": { @@ -25492,9 +25593,9 @@ "dev": true }, "@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/normalize-package-data": { @@ -27058,21 +27159,23 @@ "dev": true }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -27090,22 +27193,13 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true - }, - "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "ee-first": "1.1.1" } } } @@ -27166,12 +27260,11 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { @@ -27874,9 +27967,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true }, "canvas": { @@ -28461,6 +28554,24 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-brotli": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", + "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", + "dev": true, + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "dependencies": { + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + } + } + }, "compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -28822,14 +28933,10 @@ } }, "crc-32": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", - "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", - "dev": true, - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.3.1" - } + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true }, "crc32-stream": { "version": "4.0.2", @@ -29449,9 +29556,9 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "dependency-graph": { @@ -29501,9 +29608,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-indent": { @@ -29526,9 +29633,9 @@ } }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true }, "detect-node": { @@ -29677,9 +29784,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true } } @@ -29723,9 +29830,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true } } @@ -29939,9 +30046,9 @@ } }, "electron-to-chromium": { - "version": "1.4.89", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", - "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "elliptic": { @@ -30105,9 +30212,9 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -30116,15 +30223,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -30275,6 +30382,16 @@ "sprintf-js": "~1.0.2" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -30460,9 +30577,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -30470,16 +30587,26 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -30529,6 +30656,16 @@ "semver": "^6.1.0" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -30839,12 +30976,6 @@ "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==", "dev": true }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true - }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", @@ -31063,6 +31194,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -31495,6 +31636,15 @@ "path-is-absolute": "^1.0.0" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -31661,9 +31811,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "grapheme-splitter": { @@ -31717,11 +31867,6 @@ "integrity": "sha1-1toR82Ybt5eBLaeKHqUQZ4oqhzk=", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, "gulp-header": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", @@ -32036,22 +32181,22 @@ "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "dependencies": { "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -32226,9 +32371,9 @@ } }, "assetgraph": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-7.5.0.tgz", - "integrity": "sha512-DeVCYLxe8nAWO4ehN5oYJk2UZOYvjWVf3NPHPl9q2grUTpoqOxk7GICw+58a28BiW3oSgj727x+YB7NjoJiVYA==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-7.6.1.tgz", + "integrity": "sha512-8TazHwB/y1MZeYEEotTXgrtYN9X9KV+khRWmSZaHRIQWBKg7wkW5KqDcvhtj+96XglVxGQfVwnCTpv8Puo32mw==", "dev": true, "requires": { "acorn": "^8.0.4", @@ -32255,7 +32400,7 @@ "memoizesync": "1.1.1", "mkdirp": "^0.5.1", "normalizeurl": "^1.0.0", - "perfectionist-papandreou": "^2.4.0-patch2", + "perfectionist-dfd": "^3.0.0", "postcss": "^8.4.12", "qs": "^6.5.2", "read-pkg-up": "^6.0.0", @@ -32269,6 +32414,14 @@ "terser": "^4.0.0", "urltools": "^0.4.1", "workbox-build": "^4.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "chalk": { @@ -32304,23 +32457,21 @@ "dev": true }, "css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", "dev": true, - "requires": { - "timsort": "^0.3.0" - } + "requires": {} }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } @@ -32336,29 +32487,29 @@ } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.5", + "cssnano-preset-default": "^5.2.7", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "dev": true, "requires": { - "css-declaration-sorter": "^6.0.3", + "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -32367,7 +32518,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", + "postcss-merge-longhand": "^5.1.4", "postcss-merge-rules": "^5.1.1", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -32397,9 +32548,9 @@ "requires": {} }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -32408,9 +32559,9 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domutils": { @@ -32488,6 +32639,22 @@ "boolbase": "^1.0.0" } }, + "perfectionist-dfd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/perfectionist-dfd/-/perfectionist-dfd-3.0.0.tgz", + "integrity": "sha512-g2EBMVcmkPN1geYaB5/Fg0cVUDN2oLXsTkbsoZPc3QPdUBAyIsOQr/UCTavqFwbvPwETXgSjN8/tzjqzV1CgPw==", + "dev": true, + "requires": { + "defined": "^1.0.0", + "minimist": "^1.2.6", + "postcss-scss": "^4.0.3", + "postcss-value-parser": "^4.2.0", + "read-file-stdin": "^0.2.1", + "semver": "^7.3.5", + "string.prototype.repeat": "^1.0.0", + "write-file-stdout": "^0.0.2" + } + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -32565,9 +32732,9 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", @@ -32736,6 +32903,13 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-scss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", + "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", + "dev": true, + "requires": {} + }, "postcss-svgo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", @@ -32755,18 +32929,22 @@ "postcss-selector-parser": "^6.0.5" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -33298,9 +33476,9 @@ } }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -33389,10 +33567,13 @@ "dev": true }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-stream": { "version": "1.1.0", @@ -33488,15 +33669,16 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -33656,6 +33838,16 @@ "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -33707,12 +33899,12 @@ "dev": true }, "js-beautify": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", - "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.3.tgz", + "integrity": "sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==", "dev": true, "requires": { - "config-chain": "^1.1.12", + "config-chain": "^1.1.13", "editorconfig": "^0.15.3", "glob": "^7.1.3", "nopt": "^5.0.0" @@ -34031,6 +34223,16 @@ "yargs": "^16.1.1" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -34143,9 +34345,9 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "ansi-styles": { @@ -34343,9 +34545,9 @@ } }, "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true }, "limiter": { @@ -35059,9 +35261,9 @@ } }, "markdown-it-anchor": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz", - "integrity": "sha512-sLODeRetZ/61KkKLJElaU3NuU2z7MhXf12Ml1WJMSdwpngeofneCRF+JBbat8HiSqhniOMuTemXMrsI7hA6XyA==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.2.tgz", + "integrity": "sha512-JNaekTlIwwyYGBN3zifZDxgz4bSL8sbEj58fdTZGmPSMMGXBZapFjcZk2I33Jy79c1fvCKHpF7MA/67FOTjvzA==", "dev": true, "requires": {} }, @@ -35199,6 +35401,16 @@ "run-con": "~1.2.10" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -35229,9 +35441,9 @@ "dev": true }, "marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.13.tgz", + "integrity": "sha512-lS/ZCa4X0gsRcfWs1eoh6dLnHr9kVH3K1t2X4M/tTtNouhZ7anS1Csb6464VGLQHv8b2Tw1cLeZQs58Jav8Rzw==", "dev": true }, "marky": { @@ -35298,6 +35510,16 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -35772,13 +35994,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "miller-rabin": { @@ -35850,16 +36072,6 @@ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "requires": { "brace-expansion": "^2.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - } } }, "minimist": { @@ -35915,12 +36127,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "mkdirp-classic": { @@ -35994,6 +36206,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -37548,56 +37770,6 @@ } } }, - "perfectionist-papandreou": { - "version": "2.4.0-patch2", - "resolved": "https://registry.npmjs.org/perfectionist-papandreou/-/perfectionist-papandreou-2.4.0-patch2.tgz", - "integrity": "sha512-HStzgA+cBL+IR7IpYkTE++9q4VP+74LbKnJG5NgI4vShEy8h1iuY6f8A7XVEVpjUoFZZTXfEPgsNwy9/LpN6oA==", - "dev": true, - "requires": { - "comment-regex": "^1.0.0", - "defined": "^1.0.0", - "minimist": "^1.2.0", - "postcss": "^8.4.12", - "postcss-scss": "^4.0.3", - "postcss-value-parser": "^3.3.0", - "read-file-stdin": "^0.2.0", - "string.prototype.repeat": "^0.2.0", - "vendors": "^1.0.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "dev": true, - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-scss": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", - "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", - "dev": true, - "requires": {} - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -38341,9 +38513,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -38438,12 +38610,6 @@ "mimic-response": "^3.1.0" } }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -38543,9 +38709,9 @@ "dev": true }, "prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true }, "prettier-linter-helpers": { @@ -38574,12 +38740,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, - "printj": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", - "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", - "dev": true - }, "prismjs": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", @@ -39039,33 +39199,6 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } } }, "rc": { @@ -39218,6 +39351,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -39625,6 +39768,16 @@ "minimatch": "^3.0.2" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -40044,11 +40197,12 @@ "dev": true }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "dev": true, "requires": { + "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, @@ -40142,22 +40296,19 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" }, "dependencies": { "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", + "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", + "dev": true } } }, @@ -40237,6 +40388,18 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -40362,6 +40525,12 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -40481,9 +40650,9 @@ }, "dependencies": { "color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.1.tgz", - "integrity": "sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, "requires": { "color-convert": "^2.0.1", @@ -40499,6 +40668,12 @@ "mimic-response": "^3.1.0" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -41455,9 +41630,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -41746,6 +41921,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -42054,14 +42239,14 @@ "dev": true }, "tsconfig-paths": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", - "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { @@ -42499,9 +42684,9 @@ } }, "urijs": { - "version": "1.19.10", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.10.tgz", - "integrity": "sha512-EzauQlgKuJgsXOqoMrCiePBf4At5jVqRhXykF3Wfb8ZsOBMxPcfiVBcsHXug4Aepb/ICm2PIgqAUGMelgdrWEg==", + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", "dev": true }, "url": { @@ -42846,11 +43031,12 @@ "dev": true }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "dev": true, "requires": { + "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, @@ -42920,6 +43106,16 @@ "webdriver": "6.12.1" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -42965,9 +43161,9 @@ "dev": true }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -43130,6 +43326,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package-scripts.js b/package-scripts.js index b8214a3c33..6fb0594980 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -121,7 +121,7 @@ module.exports = { unit: { script: test( 'unit', - '"test/unit/*.spec.js" "test/node-unit/**/*.spec.js" --growl' + '"test/unit/*.spec.js" "test/node-unit/**/*.spec.js"' ), description: 'Run Node.js unit tests' }, diff --git a/package.json b/package.json index 137e27b719..4f6c5dde87 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", @@ -73,7 +72,6 @@ "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", @@ -156,7 +154,6 @@ }, "files": [ "bin/*mocha*", - "assets/growl/*.png", "lib/**/*.{js,html,json}", "index.js", "mocha.css", @@ -166,7 +163,6 @@ ], "browser": { "./index.js": "./browser-entry.js", - "./lib/nodejs/growl.js": "./lib/browser/growl.js", "fs": false, "path": false, "supports-color": false, diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 11cdcb20b6..f966e0c3e7 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -485,32 +485,6 @@ describe('Mocha', function () { }); }); - describe('growl()', function () { - describe('if capable of notifications', function () { - it('should set the growl option to true', function () { - mocha.isGrowlCapable = function forceEnable() { - return true; - }; - mocha.growl(); - expect(mocha.options, 'to have property', 'growl', true); - }); - }); - - describe('if not capable of notifications', function () { - it('should set the growl option to false', function () { - mocha.isGrowlCapable = function forceDisable() { - return false; - }; - mocha.growl(); - expect(mocha.options, 'to have property', 'growl', false); - }); - }); - - it('should be chainable', function () { - expect(mocha.growl(), 'to be', mocha); - }); - }); - describe('inlineDiffs()', function () { it('should set the inlineDiffs option to true', function () { mocha.inlineDiffs(); @@ -668,20 +642,6 @@ describe('Mocha', function () { }); }); - describe('when "growl" option is present', function () { - beforeEach(function () { - mocha.options.growl = true; - sinon.stub(Mocha.prototype, '_growl').returnsThis(); - }); - - it('should initialize growl support', function (done) { - mocha.run(function () { - expect(mocha._growl, 'to have a call satisfying', [runner]); - done(); - }); - }); - }); - describe('Base reporter initialization', function () { beforeEach(function () { mocha.options.inlineDiffs = 'some value'; From baaa41ae42523977446c4c2c56f716b9d3563d3d Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Mon, 18 Apr 2022 08:18:35 +0200 Subject: [PATCH 1747/1771] chore(ci): ignore changes to docs files (#4871) --- .github/workflows/mocha.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/mocha.yml b/.github/workflows/mocha.yml index b30d6016ac..ab4d78a3d1 100644 --- a/.github/workflows/mocha.yml +++ b/.github/workflows/mocha.yml @@ -4,13 +4,12 @@ on: branches: - '**' - '!mochajs.org' + paths-ignore: ['*.md', 'docs/**'] tags-ignore: - '**' pull_request: - types: - - opened - - synchronize - - reopened + types: [opened, synchronize, reopened] + paths-ignore: ['*.md', 'docs/**'] jobs: prevent-double-run: @@ -20,6 +19,7 @@ jobs: if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository steps: - run: 'echo run Tests' + smoke: name: 'Smoke [Node.js v${{ matrix.node }} / ${{ matrix.os }}]' needs: prevent-double-run @@ -118,6 +118,7 @@ jobs: uses: coverallsapp/github-action@master with: github-token: '${{ secrets.GITHUB_TOKEN }}' + test-browser: # TODO: configure to retain build artifacts in `.karma/` dir name: 'Browser Tests' From b863359cc80e3db06b180bff9e3c21afd0b2acd7 Mon Sep 17 00:00:00 2001 From: Elihu Cruz Date: Tue, 19 Apr 2022 01:34:50 -0500 Subject: [PATCH 1748/1771] docs: fix 'fgrep' url (#4873) --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index d452e951f5..fc16ed56b4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1287,7 +1287,7 @@ In serial mode, tests results will "stream" as they occur. In parallel mode, rep Suggested workarounds: -1. Use [`--grep`](#-grep-regexp-g-regexp) or [`--fgrep`](http://localhost:8080/#-fgrep-string-f-string) instead; it's not particularly efficient, but it will work. +1. Use [`--grep`](#-grep-regexp-g-regexp) or [`--fgrep`](#-fgrep-string-f-string) instead; it's not particularly efficient, but it will work. 1. Don't use parallel mode. Likely, you won't be running very many exclusive tests, so you won't see a great benefit from parallel mode anyhow. > _TIP: If parallel mode is defined in your config file, you can temporarily disable it on the command-line by using either the `--no-parallel` flag or reducing the job count, e.g., `--jobs=0`._ From 59f619227428e22265b26d3788505d6e081c0e2a Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:13:57 +0200 Subject: [PATCH 1749/1771] chore(ci): conditionally skip 'push' event (#4872) --- .github/workflows/mocha.yml | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/.github/workflows/mocha.yml b/.github/workflows/mocha.yml index ab4d78a3d1..18fd35ef65 100644 --- a/.github/workflows/mocha.yml +++ b/.github/workflows/mocha.yml @@ -13,16 +13,28 @@ on: jobs: prevent-double-run: + # skip 'push' event when an open PR exists name: Prevent double run runs-on: ubuntu-latest - # Run 'pull-request' event only on external PRs from forked repos. - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository + outputs: + pr-id: ${{ steps.findPr.outputs.number }} steps: - - run: 'echo run Tests' + - name: Check event pull_request + if: github.event_name == 'pull_request' + run: 'echo pull_request: run workflow' + - uses: actions/checkout@v2 + if: github.event_name == 'push' + - name: Check event push + id: findPr + if: github.event_name == 'push' + uses: jwalton/gh-find-current-pr@v1 + with: + state: open smoke: name: 'Smoke [Node.js v${{ matrix.node }} / ${{ matrix.os }}]' needs: prevent-double-run + if: needs.prevent-double-run.outputs.pr-id == '' runs-on: '${{ matrix.os }}' strategy: matrix: @@ -89,7 +101,7 @@ jobs: - uses: actions/checkout@v2 - name: Get npm cache directory in Windows id: npm-cache - if: "${{ matrix.os == 'windows-2019' }}" + if: ${{ matrix.os == 'windows-2019' }} run: | echo "::set-output name=dir::$(npm config get cache)" - name: 'Cache node_modules' @@ -111,22 +123,21 @@ jobs: # this is so mocha-github-actions-reporter can find mocha NODE_PATH: lib - name: Generate Coverage Report (Linux + Node.js latest) - if: '${{ matrix.env.COVERAGE }}' + if: ${{ matrix.env.COVERAGE }} run: npm start coverage-report-lcov - name: Upload Coverage to Coveralls (Linux + Node.js latest) - if: '${{ matrix.env.COVERAGE }}' + if: ${{ matrix.env.COVERAGE }} uses: coverallsapp/github-action@master with: github-token: '${{ secrets.GITHUB_TOKEN }}' test-browser: - # TODO: configure to retain build artifacts in `.karma/` dir name: 'Browser Tests' needs: smoke - timeout-minutes: 20 runs-on: ubuntu-latest - # Run 'push' event only because of sauce labs token - if: github.event_name == 'push' + timeout-minutes: 20 + # Don't run forked 'pull_request' without saucelabs token + if: github.event_name == 'push' || !github.event.pull_request.head.repo.fork steps: - uses: actions/setup-node@v2 with: @@ -146,5 +157,5 @@ jobs: - name: Run Browser Tests run: npm start test.browser env: - SAUCE_USERNAME: '${{secrets.SAUCE_USERNAME}}' - SAUCE_ACCESS_KEY: '${{secrets.SAUCE_ACCESS_KEY}}' + SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} + SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} From f6695f0df57f7ba8fae58341de0abeb7bdfd0d31 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 24 Apr 2022 09:32:15 +0200 Subject: [PATCH 1750/1771] chore(esm): remove code for Node v12 (#4874) --- lib/nodejs/esm-utils.js | 110 +++++++++++-------------------- test/integration/diffs.spec.js | 6 -- test/integration/glob.spec.js | 15 +---- test/integration/no-diff.spec.js | 6 -- 4 files changed, 42 insertions(+), 95 deletions(-) diff --git a/lib/nodejs/esm-utils.js b/lib/nodejs/esm-utils.js index 9a854be376..18abe81ff8 100644 --- a/lib/nodejs/esm-utils.js +++ b/lib/nodejs/esm-utils.js @@ -10,7 +10,7 @@ const formattedImport = async file => { // the location of the syntax error in the error thrown. // This is problematic because the user can't see what file has the problem, // so we add the file location to the error. - // This `if` should be removed once Node.js fixes the problem. + // TODO: remove once Node.js fixes the problem. if ( err instanceof SyntaxError && err.message && @@ -30,64 +30,52 @@ const formattedImport = async file => { return import(file); }; -const hasStableEsmImplementation = (() => { - const [major, minor] = process.version.split('.'); - // ESM is stable from v12.22.0 onward - // https://nodejs.org/api/esm.html#esm_modules_ecmascript_modules - const majorNumber = parseInt(major.slice(1), 10); - const minorNumber = parseInt(minor, 10); - return majorNumber > 12 || (majorNumber === 12 && minorNumber >= 22); -})(); - -exports.requireOrImport = hasStableEsmImplementation - ? async file => { - if (path.extname(file) === '.mjs') { - return formattedImport(file); - } +exports.requireOrImport = async file => { + if (path.extname(file) === '.mjs') { + return formattedImport(file); + } + try { + return dealWithExports(await formattedImport(file)); + } catch (err) { + if ( + err.code === 'ERR_MODULE_NOT_FOUND' || + err.code === 'ERR_UNKNOWN_FILE_EXTENSION' || + err.code === 'ERR_UNSUPPORTED_DIR_IMPORT' + ) { try { - return dealWithExports(await formattedImport(file)); - } catch (err) { + // Importing a file usually works, but the resolution of `import` is the ESM + // resolution algorithm, and not the CJS resolution algorithm. We may have + // failed because we tried the ESM resolution, so we try to `require` it. + return require(file); + } catch (requireErr) { if ( - err.code === 'ERR_MODULE_NOT_FOUND' || - err.code === 'ERR_UNKNOWN_FILE_EXTENSION' || - err.code === 'ERR_UNSUPPORTED_DIR_IMPORT' + requireErr.code === 'ERR_REQUIRE_ESM' || + (requireErr instanceof SyntaxError && + requireErr + .toString() + .includes('Cannot use import statement outside a module')) ) { - try { - // Importing a file usually works, but the resolution of `import` is the ESM - // resolution algorithm, and not the CJS resolution algorithm. So in this case - // if we fail, we may have failed because we tried the ESM resolution and failed - // So we try to `require` it - return require(file); - } catch (requireErr) { - if ( - requireErr.code === 'ERR_REQUIRE_ESM' || - (requireErr instanceof SyntaxError && - requireErr - .toString() - .includes('Cannot use import statement outside a module')) - ) { - // ERR_REQUIRE_ESM happens when the test file is a JS file, but via type:module is actually ESM, - // AND has an import to a file that doesn't exist. - // This throws an `ERR_MODULE_NOT_FOUND` error above, - // and when we try to `require` it here, it throws an `ERR_REQUIRE_ESM`. - // What we want to do is throw the original error (the `ERR_MODULE_NOT_FOUND`), - // and not the `ERR_REQUIRE_ESM` error, which is a red herring. - // - // SyntaxError happens when in an edge case: when we're using an ESM loader that loads - // a `test.ts` file (i.e. unrecognized extension), and that file includes an unknown - // import (which thows an ERR_MODULE_NOT_FOUND). require-ing it will throw the - // syntax error, because we cannot require a file that has import-s. - throw err; - } else { - throw requireErr; - } - } - } else { + // ERR_REQUIRE_ESM happens when the test file is a JS file, but via type:module is actually ESM, + // AND has an import to a file that doesn't exist. + // This throws an `ERR_MODULE_NOT_FOUND` error above, + // and when we try to `require` it here, it throws an `ERR_REQUIRE_ESM`. + // What we want to do is throw the original error (the `ERR_MODULE_NOT_FOUND`), + // and not the `ERR_REQUIRE_ESM` error, which is a red herring. + // + // SyntaxError happens when in an edge case: when we're using an ESM loader that loads + // a `test.ts` file (i.e. unrecognized extension), and that file includes an unknown + // import (which throws an ERR_MODULE_NOT_FOUND). `require`-ing it will throw the + // syntax error, because we cannot require a file that has `import`-s. throw err; + } else { + throw requireErr; } } + } else { + throw err; } - : implementationOfRequireOrImportForUnstableEsm; + } +}; function dealWithExports(module) { if (module.default) { @@ -104,21 +92,3 @@ exports.loadFilesAsync = async (files, preLoadFunc, postLoadFunc) => { postLoadFunc(file, result); } }; - -/* istanbul ignore next */ -async function implementationOfRequireOrImportForUnstableEsm(file) { - if (path.extname(file) === '.mjs') { - return formattedImport(file); - } - // This is currently the only known way of figuring out whether a file is CJS or ESM in - // Node.js that doesn't necessitate calling `import` first. - try { - return require(file); - } catch (err) { - if (err.code === 'ERR_REQUIRE_ESM') { - return formattedImport(file); - } else { - throw err; - } - } -} diff --git a/test/integration/diffs.spec.js b/test/integration/diffs.spec.js index 2f15fecc0b..26c4882d10 100644 --- a/test/integration/diffs.spec.js +++ b/test/integration/diffs.spec.js @@ -69,12 +69,6 @@ describe('diffs', function () { var diffs, expected; before(function (done) { - // @TODO: It should be removed when Node.js 10 LTS is not supported. - const nodeVersion = parseInt(process.version.match(/^v(\d+)\./)[1], 10); - if (nodeVersion === 10) { - this.skip(); - } - run('diffs/diffs.fixture.js', [], function (err, res) { if (err) { done(err); diff --git a/test/integration/glob.spec.js b/test/integration/glob.spec.js index c85c072d49..19b06f8b1c 100644 --- a/test/integration/glob.spec.js +++ b/test/integration/glob.spec.js @@ -187,13 +187,6 @@ var testGlob = { }) }; -var isFlakeyNode = (function () { - var version = process.versions.node.split('.'); - return ( - version[0] === '0' && version[1] === '10' && process.platform === 'win32' - ); -})(); - function execMochaWith(validate) { return function execMocha(glob, assertOn, done) { exec( @@ -206,12 +199,8 @@ function execMochaWith(validate) { function (error, stdout, stderr) { try { validate(error, stderr); - if (isFlakeyNode && error && stderr === '') { - execMocha(glob, assertOn, done); - } else { - assertOn({stdout: stdout, stderr: stderr}); - done(); - } + assertOn({stdout: stdout, stderr: stderr}); + done(); } catch (assertion) { done(assertion); } diff --git a/test/integration/no-diff.spec.js b/test/integration/no-diff.spec.js index 99775abf48..d7eeb9ea1e 100644 --- a/test/integration/no-diff.spec.js +++ b/test/integration/no-diff.spec.js @@ -6,12 +6,6 @@ var run = helpers.runMocha; describe('no-diff', function () { describe('when enabled', function () { it('should not display a diff', function (done) { - // @TODO: It should be removed when Node.js 10 LTS is not supported. - const nodeVersion = parseInt(process.version.match(/^v(\d+)\./)[1], 10); - if (nodeVersion === 10) { - this.skip(); - } - run('no-diff.fixture.js', ['--no-diff'], function (err, res) { if (err) { done(err); From 007fa65d5f382916b0c264cde395c0051aef7830 Mon Sep 17 00:00:00 2001 From: Outsider Date: Wed, 27 Apr 2022 00:03:55 +0900 Subject: [PATCH 1751/1771] chore(ci): add Node v18 to test matrix (#4876) Signed-off-by: Outsider --- .github/workflows/mocha.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/mocha.yml b/.github/workflows/mocha.yml index 18fd35ef65..771d243d1f 100644 --- a/.github/workflows/mocha.yml +++ b/.github/workflows/mocha.yml @@ -19,17 +19,17 @@ jobs: outputs: pr-id: ${{ steps.findPr.outputs.number }} steps: - - name: Check event pull_request - if: github.event_name == 'pull_request' - run: 'echo pull_request: run workflow' - - uses: actions/checkout@v2 - if: github.event_name == 'push' - - name: Check event push - id: findPr - if: github.event_name == 'push' - uses: jwalton/gh-find-current-pr@v1 - with: - state: open + - name: Check event pull_request + if: github.event_name == 'pull_request' + run: 'echo pull_request: run workflow' + - uses: actions/checkout@v2 + if: github.event_name == 'push' + - name: Check event push + id: findPr + if: github.event_name == 'push' + uses: jwalton/gh-find-current-pr@v1 + with: + state: open smoke: name: 'Smoke [Node.js v${{ matrix.node }} / ${{ matrix.os }}]' @@ -44,7 +44,7 @@ jobs: node: - 14 - 16 - - 17 + - 18 steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 @@ -88,7 +88,7 @@ jobs: node: - 14 - 16 - - 17 + - 18 include: - os: ubuntu-latest node: 16 From 2b98521756e69d3f0cdb36855b446954ba2bdf74 Mon Sep 17 00:00:00 2001 From: Sukka Date: Wed, 27 Apr 2022 23:10:42 +0800 Subject: [PATCH 1752/1771] docs: replace 'git.io' short links (#4877) [ci skip] --- docs/index.md | 2 +- lib/cli/commands.js | 2 +- lib/cli/run.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index fc16ed56b4..990f3b53d3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2376,7 +2376,7 @@ or the [source](https://github.com/mochajs/mocha/blob/master/lib/mocha.js). [expresso]: https://github.com/tj/expresso [fish-globbing]: https://fishshell.com/docs/current/#expand-wildcard [github-mocha]: https://github.com/mochajs/mocha -[gist-async-hooks]: https://git.io/vdlNM +[gist-async-hooks]: https://gist.github.com/boneskull/7fe75b63d613fa940db7ec990a5f5843 [gist-globbing-tutorial]: https://gist.github.com/reggi/475793ea1846affbcfe8 [gitter-mocha]: https://gitter.im/mochajs/mocha [jetbrains]: https://www.jetbrains.com/ diff --git a/lib/cli/commands.js b/lib/cli/commands.js index eb10c6833a..1102f860f5 100644 --- a/lib/cli/commands.js +++ b/lib/cli/commands.js @@ -2,7 +2,7 @@ /** * Exports Yargs commands - * @see https://git.io/fpJ0G + * @see https://github.com/yargs/yargs/blob/main/docs/advanced.md * @private * @module */ diff --git a/lib/cli/run.js b/lib/cli/run.js index c15584fed5..fbbe510e94 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -329,7 +329,7 @@ exports.builder = yargs => if (argv.compilers) { throw createUnsupportedError( `--compilers is DEPRECATED and no longer supported. - See https://git.io/vdcSr for migration information.` + See https://github.com/mochajs/mocha/wiki/compilers-deprecation for migration information.` ); } From fbe7a24269631b6f7c5d259cc8ce26b83b2e60dc Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 30 Apr 2022 17:57:31 +0200 Subject: [PATCH 1753/1771] chore: update dependencies (#4878) --- package-lock.json | 1320 +++++++++++++++++++++------------------------ package.json | 6 +- 2 files changed, 623 insertions(+), 703 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2addf3cf91..06cc3af68d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", @@ -23,11 +23,11 @@ "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.1", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -120,37 +120,39 @@ } }, "node_modules/@11ty/dependency-tree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.0.tgz", - "integrity": "sha512-tYrGX3Tvccufy2jaYDkYpjBmVP1LeQq6b/d0r4GYThTXL4f3ZR7yMAl/0r8h9xvnsP+gkO53wfnV7s8cXcCtEg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", + "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", "dev": true }, "node_modules/@11ty/eleventy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.0.tgz", - "integrity": "sha512-UMZghkMFwovu3Vh6DzjJ9GbcBnlE3nydGmLAti2AB1d6etQE+jXgfuHNxOyV1em33ywsBgGUCtLmLHaaTSU+Nw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.1.tgz", + "integrity": "sha512-2fJDHVBkRr1SB7CqBexwoLdiOGUE0f22O+Ie1TT/FI65XQZWshgHVZzvmZfmtKvQW4qtaC/FuJG3wMxkXfel7w==", "dev": true, "dependencies": { - "@11ty/dependency-tree": "^2.0.0", + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-utils": "^1.0.1", "@iarna/toml": "^2.2.5", "@sindresorhus/slugify": "^1.1.2", - "browser-sync": "^2.27.7", - "chokidar": "^3.5.2", - "debug": "^4.3.3", + "browser-sync": "^2.27.9", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", "dependency-graph": "^0.11.0", "ejs": "^3.1.6", - "fast-glob": "^3.2.9", - "graceful-fs": "^4.2.9", + "fast-glob": "^3.2.11", + "graceful-fs": "^4.2.10", "gray-matter": "^4.0.3", "hamljs": "^0.6.2", "handlebars": "^4.7.7", "is-glob": "^4.0.3", "kleur": "^4.1.4 ", - "liquidjs": "^9.32.0", + "liquidjs": "^9.36.1", "lodash": "^4.17.21", - "luxon": "^2.3.0", + "luxon": "^2.3.2", "markdown-it": "^12.3.2", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "moo": "^0.5.1", "multimatch": "^5.0.0", "mustache": "^4.2.0", @@ -160,8 +162,8 @@ "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", "pug": "^3.0.2", - "recursive-copy": "^2.0.13", - "semver": "^7.3.5", + "recursive-copy": "^2.0.14", + "semver": "^7.3.7", "slugify": "^1.6.5" }, "bin": { @@ -188,13 +190,30 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/eleventy-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.1.tgz", + "integrity": "sha512-HPpCTz4PzudcQU+i+x6GSNHVqgnvRhnVYg5dLKaAoRWLN966odAGsBxKSyhF8i1MdlOPtsytYb2AGWP7jISC5w==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -961,10 +980,32 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", "dev": true, "engines": { "node": ">=6.0.0" @@ -977,9 +1018,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -1066,9 +1107,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.3.tgz", - "integrity": "sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", + "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -1129,9 +1170,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz", - "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.2.1.tgz", + "integrity": "sha512-btX7kzGvp1JwShQI9V6IM841YKNPYjKCvUbNrQ2EcVYbULtUd/GH6wZ/qdqH13j9pOHBER+EZXNN2L8RSJhVRA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -1278,9 +1319,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, "node_modules/@szmarczak/http-timer": { @@ -1455,9 +1496,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", + "version": "17.0.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", + "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1473,9 +1514,9 @@ "dev": true }, "node_modules/@types/puppeteer": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.5.tgz", - "integrity": "sha512-lxCjpDEY+DZ66+W3x5Af4oHnEmUXt0HuaRzkBGE2UZiZEp/V1d3StpLPlmNVu/ea091bdNmVPl44lu8Wy/0ZCA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.6.tgz", + "integrity": "sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -1527,9 +1568,9 @@ "dev": true }, "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "dependencies": { @@ -1804,9 +1845,9 @@ "dev": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/abbrev": { @@ -1829,9 +1870,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2115,13 +2156,13 @@ } }, "node_modules/archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "dev": true, "dependencies": { "archiver-utils": "^2.1.0", - "async": "^3.2.0", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", @@ -2342,14 +2383,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2547,9 +2589,9 @@ } }, "node_modules/assetgraph-builder/node_modules/yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -2915,12 +2957,6 @@ "babylon": "bin/babylon.js" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -3675,9 +3711,9 @@ } }, "node_modules/browser-sync/node_modules/yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -3979,9 +4015,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "funding": [ { @@ -3994,10 +4030,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -4310,9 +4346,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==", "dev": true, "funding": [ { @@ -4841,9 +4877,9 @@ } }, "node_modules/coffeescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", - "integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", + "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", "dev": true, "bin": { "cake": "bin/cake", @@ -4886,9 +4922,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, "dependencies": { "color-name": "^1.0.0", @@ -5338,9 +5374,9 @@ } }, "node_modules/core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", + "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", "dev": true, "hasInstallScript": true, "funding": { @@ -5916,18 +5952,18 @@ } }, "node_modules/date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.9.tgz", + "integrity": "sha512-+8J+BOUpSrlKLQLeF8xJJVTxS8QfRSuJgwxSVvslzgO3E6khbI0F5mMEPf5mTYhCCm4h99knYP6H3W9n3BQFrg==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6199,15 +6235,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/defined": { @@ -6813,12 +6853,12 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -6828,9 +6868,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", + "version": "1.4.126", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.126.tgz", + "integrity": "sha512-g/e18Yv0fBdN2c2Z8hWV9jOXxOxOByyG8uGufrJWUym+LHMYa5K2oR9C+D8Bvh0slUTarBwBBZFi41ImQjEZIA==", "dev": true }, "node_modules/elliptic": { @@ -6878,9 +6918,9 @@ } }, "node_modules/engine.io": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", - "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -6899,20 +6939,16 @@ } }, "node_modules/engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.1.tgz", + "integrity": "sha512-5cu7xubVxEwoB6O9hJ6Zfu990yBVjXfyMlE1ZvfO5L8if3Kvc9bgDNEapV0C5pMp+5Om1UZFnljxoOuFm6dBKA==", "dev": true, "dependencies": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" + "xmlhttprequest-ssl": "~2.0.0" } }, "node_modules/engine.io-client/node_modules/ws": { @@ -6970,9 +7006,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7043,9 +7079,9 @@ } }, "node_modules/es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7059,7 +7095,7 @@ "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", "object-inspect": "^1.12.0", @@ -7082,6 +7118,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -8304,34 +8349,12 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", + "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "minimatch": "^5.0.1" } }, "node_modules/filename-reserved-regex": { @@ -8662,9 +8685,9 @@ "dev": true }, "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -9287,20 +9310,14 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9309,6 +9326,18 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -9689,9 +9718,9 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", @@ -10608,9 +10637,9 @@ } }, "node_modules/hyperlink/node_modules/postcss-scss": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", - "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.4.tgz", + "integrity": "sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==", "dev": true, "engines": { "node": ">=12.0" @@ -11185,9 +11214,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -11870,12 +11899,12 @@ } }, "node_modules/jake": { - "version": "10.8.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", - "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { - "async": "0.9.x", + "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" @@ -11887,12 +11916,6 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12335,9 +12358,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "version": "6.3.19", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", + "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -12359,7 +12382,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -12960,9 +12983,9 @@ } }, "node_modules/liquidjs": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.36.0.tgz", - "integrity": "sha512-HbU4xBsY1r3ZEORTgPsiluXsOtMx8iI0MqTsPejgIk+sIgta5wQUYsoQgUPuGKWVHKKKMO9PidiMEPKlePl8rg==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.37.0.tgz", + "integrity": "sha512-qDj9iiNdB+QNZTR4iKjiQzoHQma7V8Itx5oZG/ZCP7xjebh1LI+s5IG2ZYUbs1ALO6hBzmW36Ptd8RR4eohuDA==", "dev": true, "bin": { "liquid": "bin/liquid.js", @@ -13077,9 +13100,9 @@ } }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { "node": ">=6.11.5" @@ -13395,44 +13418,21 @@ } }, "node_modules/log4js": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", - "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.6.tgz", + "integrity": "sha512-1XMtRBZszmVZqPAOOWczH+Q94AI42mtNWjvjA5RduKTSWjEc56uOBbyM1CJnfN4Ym0wSd8cQ43zOojlSHgRDAw==", "dev": true, "dependencies": { - "date-format": "^4.0.6", + "date-format": "^4.0.9", "debug": "^4.3.4", "flatted": "^3.2.5", "rfdc": "^1.3.0", - "streamroller": "^3.0.6" + "streamroller": "^3.0.8" }, "engines": { "node": ">=8.0" } }, - "node_modules/log4js/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/log4js/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/logalot": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", @@ -13579,9 +13579,9 @@ "dev": true }, "node_modules/luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.2.tgz", + "integrity": "sha512-MlAQQVMFhGk4WUA6gpfsy0QycnKP0+NlCBJRVRNPxxSIbjrCbQ65nrpJD3FVyJNZLuJ0uoqL57ye6BmDYgHaSw==", "dev": true, "engines": { "node": ">=12" @@ -13699,18 +13699,18 @@ } }, "node_modules/markdown-it-emoji": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", - "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==", "dev": true }, "node_modules/markdown-it-prism": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.2.3.tgz", - "integrity": "sha512-vtiJ1ALGpIg2JPCSv3E8pEwx8Axr9eWu/P4BvCvyXWWM1GEXbr95a7cMuyR4FiEKkZVOXHqqGM6RJoqxra7UGQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.2.4.tgz", + "integrity": "sha512-7oQVppKjiZqVQo7s7eLTIs3o/0hdvqAWDW8lvRel6eUCGD4iXjKbSZjvdHZFA2ZnCkQUF47kbvtWZDVQrv7zyQ==", "dev": true, "dependencies": { - "prismjs": "1.27.0" + "prismjs": "1.28.0" }, "engines": { "node": ">=6.0.0" @@ -13898,9 +13898,9 @@ } }, "node_modules/marked": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.13.tgz", - "integrity": "sha512-lS/ZCa4X0gsRcfWs1eoh6dLnHr9kVH3K1t2X4M/tTtNouhZ7anS1Csb6464VGLQHv8b2Tw1cLeZQs58Jav8Rzw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -15039,9 +15039,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -15146,9 +15146,9 @@ } }, "node_modules/node-abi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", - "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", + "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -15249,9 +15249,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", "dev": true }, "node_modules/nopt": { @@ -16658,18 +16658,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -17888,9 +17876,9 @@ } }, "node_modules/prebuild-install": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", - "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", + "integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==", "dev": true, "dependencies": { "detect-libc": "^2.0.0", @@ -18139,9 +18127,9 @@ } }, "node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", "dev": true, "engines": { "node": ">=6" @@ -19582,9 +19570,9 @@ } }, "node_modules/rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "version": "2.70.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", + "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -19680,9 +19668,9 @@ } }, "node_modules/rollup-plugin-visualizer/node_modules/yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -20078,18 +20066,18 @@ } }, "node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/semver-compare": { @@ -20153,12 +20141,15 @@ } }, "node_modules/semver/node_modules/lru-cache": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", - "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/send": { @@ -20799,16 +20790,16 @@ } }, "node_modules/socket.io": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", - "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", + "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", "socket.io-parser": "~4.0.4" }, "engines": { @@ -20816,35 +20807,33 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "node_modules/socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", + "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", "dev": true, "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "engine.io-client": "~6.2.1", + "socket.io-parser": "~4.2.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-client/node_modules/socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.0.tgz", + "integrity": "sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng==", "dev": true, "dependencies": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" }, "engines": { @@ -21248,42 +21237,19 @@ } }, "node_modules/streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.8.tgz", + "integrity": "sha512-VI+ni3czbFZrd1MrlybxykWZ8sMDCMtTU7YJyhgb9M5X6d1DDxLdJr+gSnmRpXPMnIWxWKMaAE8K0WumBp3lDg==", "dev": true, "dependencies": { - "date-format": "^4.0.6", + "date-format": "^4.0.9", "debug": "^4.3.4", - "fs-extra": "^10.0.1" + "fs-extra": "^10.1.0" }, "engines": { "node": ">=8.0" } }, - "node_modules/streamroller/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/streamroller/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -22082,14 +22048,14 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", "dev": true, "dependencies": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -22100,10 +22066,13 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, "engines": { "node": ">= 8" } @@ -22552,9 +22521,9 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/tty-browserify": { @@ -22677,9 +22646,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -22704,14 +22673,14 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -22769,9 +22738,9 @@ } }, "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, "node_modules/unexpected": { @@ -24250,9 +24219,9 @@ } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -24461,12 +24430,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -24519,37 +24482,39 @@ }, "dependencies": { "@11ty/dependency-tree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.0.tgz", - "integrity": "sha512-tYrGX3Tvccufy2jaYDkYpjBmVP1LeQq6b/d0r4GYThTXL4f3ZR7yMAl/0r8h9xvnsP+gkO53wfnV7s8cXcCtEg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", + "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", "dev": true }, "@11ty/eleventy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.0.tgz", - "integrity": "sha512-UMZghkMFwovu3Vh6DzjJ9GbcBnlE3nydGmLAti2AB1d6etQE+jXgfuHNxOyV1em33ywsBgGUCtLmLHaaTSU+Nw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.1.tgz", + "integrity": "sha512-2fJDHVBkRr1SB7CqBexwoLdiOGUE0f22O+Ie1TT/FI65XQZWshgHVZzvmZfmtKvQW4qtaC/FuJG3wMxkXfel7w==", "dev": true, "requires": { - "@11ty/dependency-tree": "^2.0.0", + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-utils": "^1.0.1", "@iarna/toml": "^2.2.5", "@sindresorhus/slugify": "^1.1.2", - "browser-sync": "^2.27.7", - "chokidar": "^3.5.2", - "debug": "^4.3.3", + "browser-sync": "^2.27.9", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", "dependency-graph": "^0.11.0", "ejs": "^3.1.6", - "fast-glob": "^3.2.9", - "graceful-fs": "^4.2.9", + "fast-glob": "^3.2.11", + "graceful-fs": "^4.2.10", "gray-matter": "^4.0.3", "hamljs": "^0.6.2", "handlebars": "^4.7.7", "is-glob": "^4.0.3", "kleur": "^4.1.4 ", - "liquidjs": "^9.32.0", + "liquidjs": "^9.36.1", "lodash": "^4.17.21", - "luxon": "^2.3.0", + "luxon": "^2.3.2", "markdown-it": "^12.3.2", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "moo": "^0.5.1", "multimatch": "^5.0.0", "mustache": "^4.2.0", @@ -24559,8 +24524,8 @@ "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", "pug": "^3.0.2", - "recursive-copy": "^2.0.13", - "semver": "^7.3.5", + "recursive-copy": "^2.0.14", + "semver": "^7.3.7", "slugify": "^1.6.5" } }, @@ -24573,13 +24538,23 @@ "chalk": "^4.1.0" } }, + "@11ty/eleventy-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.1.tgz", + "integrity": "sha512-HPpCTz4PzudcQU+i+x6GSNHVqgnvRhnVYg5dLKaAoRWLN966odAGsBxKSyhF8i1MdlOPtsytYb2AGWP7jISC5w==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0" + } + }, "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { @@ -25181,10 +25156,26 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -25194,9 +25185,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -25265,9 +25256,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.3.tgz", - "integrity": "sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", + "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -25310,9 +25301,9 @@ } }, "@rollup/plugin-node-resolve": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz", - "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.2.1.tgz", + "integrity": "sha512-btX7kzGvp1JwShQI9V6IM841YKNPYjKCvUbNrQ2EcVYbULtUd/GH6wZ/qdqH13j9pOHBER+EZXNN2L8RSJhVRA==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -25425,9 +25416,9 @@ "dev": true }, "@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, "@szmarczak/http-timer": { @@ -25593,9 +25584,9 @@ "dev": true }, "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", + "version": "17.0.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", + "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==", "dev": true }, "@types/normalize-package-data": { @@ -25611,9 +25602,9 @@ "dev": true }, "@types/puppeteer": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.5.tgz", - "integrity": "sha512-lxCjpDEY+DZ66+W3x5Af4oHnEmUXt0HuaRzkBGE2UZiZEp/V1d3StpLPlmNVu/ea091bdNmVPl44lu8Wy/0ZCA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.6.tgz", + "integrity": "sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q==", "dev": true, "requires": { "@types/node": "*" @@ -25665,9 +25656,9 @@ "dev": true }, "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "requires": { @@ -25914,9 +25905,9 @@ "dev": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "abbrev": { @@ -25936,9 +25927,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true }, "acorn-globals": { @@ -26141,13 +26132,13 @@ } }, "archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "dev": true, "requires": { "archiver-utils": "^2.1.0", - "async": "^3.2.0", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", @@ -26322,14 +26313,15 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "arraydiff-async": { @@ -26608,9 +26600,9 @@ }, "dependencies": { "yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -26800,12 +26792,6 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -27398,9 +27384,9 @@ "dev": true }, "yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -27700,15 +27686,15 @@ } }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "dependencies": { @@ -27967,9 +27953,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==", "dev": true }, "canvas": { @@ -28392,9 +28378,9 @@ "dev": true }, "coffeescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", - "integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", + "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", "dev": true }, "color": { @@ -28444,9 +28430,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -28832,9 +28818,9 @@ "dev": true }, "core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", + "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", "dev": true }, "core-util-is": { @@ -29308,15 +29294,15 @@ } }, "date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.9.tgz", + "integrity": "sha512-+8J+BOUpSrlKLQLeF8xJJVTxS8QfRSuJgwxSVvslzgO3E6khbI0F5mMEPf5mTYhCCm4h99knYP6H3W9n3BQFrg==", "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" }, @@ -29529,12 +29515,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "defined": { @@ -30037,18 +30024,18 @@ "dev": true }, "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", + "version": "1.4.126", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.126.tgz", + "integrity": "sha512-g/e18Yv0fBdN2c2Z8hWV9jOXxOxOByyG8uGufrJWUym+LHMYa5K2oR9C+D8Bvh0slUTarBwBBZFi41ImQjEZIA==", "dev": true }, "elliptic": { @@ -30095,9 +30082,9 @@ } }, "engine.io": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", - "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -30122,20 +30109,16 @@ } }, "engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.1.tgz", + "integrity": "sha512-5cu7xubVxEwoB6O9hJ6Zfu990yBVjXfyMlE1ZvfO5L8if3Kvc9bgDNEapV0C5pMp+5Om1UZFnljxoOuFm6dBKA==", "dev": true, "requires": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" + "xmlhttprequest-ssl": "~2.0.0" }, "dependencies": { "ws": { @@ -30157,9 +30140,9 @@ } }, "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -30212,9 +30195,9 @@ } }, "es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -30228,7 +30211,7 @@ "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", "object-inspect": "^1.12.0", @@ -30245,6 +30228,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -31186,33 +31178,12 @@ "dev": true }, "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", + "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, "requires": { - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "minimatch": "^5.0.1" } }, "filename-reserved-regex": { @@ -31450,9 +31421,9 @@ "dev": true }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -31960,15 +31931,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -31976,6 +31941,15 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -32268,9 +32242,9 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", @@ -32904,9 +32878,9 @@ } }, "postcss-scss": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz", - "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.4.tgz", + "integrity": "sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==", "dev": true, "requires": {} }, @@ -33320,9 +33294,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -33821,23 +33795,17 @@ } }, "jake": { - "version": "10.8.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", - "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "async": "0.9.x", + "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -34192,9 +34160,9 @@ "dev": true }, "karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "version": "6.3.19", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", + "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -34216,7 +34184,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -34685,9 +34653,9 @@ } }, "liquidjs": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.36.0.tgz", - "integrity": "sha512-HbU4xBsY1r3ZEORTgPsiluXsOtMx8iI0MqTsPejgIk+sIgta5wQUYsoQgUPuGKWVHKKKMO9PidiMEPKlePl8rg==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.37.0.tgz", + "integrity": "sha512-qDj9iiNdB+QNZTR4iKjiQzoHQma7V8Itx5oZG/ZCP7xjebh1LI+s5IG2ZYUbs1ALO6hBzmW36Ptd8RR4eohuDA==", "dev": true }, "list-item": { @@ -34769,9 +34737,9 @@ } }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "localtunnel": { @@ -35041,33 +35009,16 @@ } }, "log4js": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", - "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.6.tgz", + "integrity": "sha512-1XMtRBZszmVZqPAOOWczH+Q94AI42mtNWjvjA5RduKTSWjEc56uOBbyM1CJnfN4Ym0wSd8cQ43zOojlSHgRDAw==", "dev": true, "requires": { - "date-format": "^4.0.6", + "date-format": "^4.0.9", "debug": "^4.3.4", "flatted": "^3.2.5", "rfdc": "^1.3.0", - "streamroller": "^3.0.6" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "streamroller": "^3.0.8" } }, "logalot": { @@ -35180,9 +35131,9 @@ "dev": true }, "luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.2.tgz", + "integrity": "sha512-MlAQQVMFhGk4WUA6gpfsy0QycnKP0+NlCBJRVRNPxxSIbjrCbQ65nrpJD3FVyJNZLuJ0uoqL57ye6BmDYgHaSw==", "dev": true }, "magic-string": { @@ -35275,18 +35226,18 @@ "requires": {} }, "markdown-it-emoji": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", - "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==", "dev": true }, "markdown-it-prism": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.2.3.tgz", - "integrity": "sha512-vtiJ1ALGpIg2JPCSv3E8pEwx8Axr9eWu/P4BvCvyXWWM1GEXbr95a7cMuyR4FiEKkZVOXHqqGM6RJoqxra7UGQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.2.4.tgz", + "integrity": "sha512-7oQVppKjiZqVQo7s7eLTIs3o/0hdvqAWDW8lvRel6eUCGD4iXjKbSZjvdHZFA2ZnCkQUF47kbvtWZDVQrv7zyQ==", "dev": true, "requires": { - "prismjs": "1.27.0" + "prismjs": "1.28.0" } }, "markdown-link": { @@ -35441,9 +35392,9 @@ "dev": true }, "marked": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.13.tgz", - "integrity": "sha512-lS/ZCa4X0gsRcfWs1eoh6dLnHr9kVH3K1t2X4M/tTtNouhZ7anS1Csb6464VGLQHv8b2Tw1cLeZQs58Jav8Rzw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true }, "marky": { @@ -36240,9 +36191,9 @@ "dev": true }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, "napi-build-utils": { "version": "1.0.2", @@ -36336,9 +36287,9 @@ } }, "node-abi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", - "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", + "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", "dev": true, "requires": { "semver": "^7.3.5" @@ -36424,9 +36375,9 @@ } }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", "dev": true }, "nopt": { @@ -37524,18 +37475,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -38559,9 +38498,9 @@ "dev": true }, "prebuild-install": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", - "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", + "integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==", "dev": true, "requires": { "detect-libc": "^2.0.0", @@ -38741,9 +38680,9 @@ "dev": true }, "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", "dev": true }, "process": { @@ -39920,9 +39859,9 @@ } }, "rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "version": "2.70.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", + "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -39993,9 +39932,9 @@ "dev": true }, "yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -40296,19 +40235,22 @@ } }, "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" }, "dependencies": { "lru-cache": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", - "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } } } }, @@ -40868,46 +40810,44 @@ } }, "socket.io": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", - "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", + "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", "socket.io-parser": "~4.0.4" } }, "socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", + "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", "dev": true, "requires": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "engine.io-client": "~6.2.1", + "socket.io-parser": "~4.2.0" }, "dependencies": { "socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.0.tgz", + "integrity": "sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng==", "dev": true, "requires": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } } @@ -41245,31 +41185,14 @@ } }, "streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.8.tgz", + "integrity": "sha512-VI+ni3czbFZrd1MrlybxykWZ8sMDCMtTU7YJyhgb9M5X6d1DDxLdJr+gSnmRpXPMnIWxWKMaAE8K0WumBp3lDg==", "dev": true, "requires": { - "date-format": "^4.0.6", + "date-format": "^4.0.9", "debug": "^4.3.4", - "fs-extra": "^10.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "fs-extra": "^10.1.0" } }, "strict-uri-encode": { @@ -41889,22 +41812,25 @@ "dev": true }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", "dev": true, "requires": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } } } } @@ -42268,9 +42194,9 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "tty-browserify": { @@ -42359,9 +42285,9 @@ "dev": true }, "uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", "dev": true }, "ukkonen": { @@ -42377,14 +42303,14 @@ "dev": true }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, @@ -42424,9 +42350,9 @@ } }, "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, "unexpected": { @@ -43616,9 +43542,9 @@ } }, "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { "version": "7.0.0", @@ -43770,12 +43696,6 @@ "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 4f6c5dde87..0cf6a4feea 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", @@ -68,11 +68,11 @@ "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.1", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" From 62b1566211a631b22f4bd7d888cd2c046efdd9e4 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 1 May 2022 06:29:18 +0200 Subject: [PATCH 1754/1771] build(v10.0.0): update CHANGELOG --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ccee20de..bffd5b9737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# 10.0.0 / 2022-05-01 + +## :boom: Breaking Changes + +- #4845: **Drop Node.js v12.x support** (@juergba) + +- #4848: Drop Internet-Explorer-11 support (@juergba) + +- #4857: Drop AMD/RequireJS support (@juergba) + +- #4866: Drop Growl notification support (@juergba) + +- #4863: Rename executable `bin/mocha` to `bin/mocha.js` (@juergba) + +- #4865: `--ignore` option in Windows: upgrade Minimatch (@juergba) + +- #4861: Remove deprecated `Runner` signature (@juergba) + +## :nut\_and\_bolt: Other + +- #4878: Update production dependencies (@juergba) + +- #4876: Add Node.js v18 to CI test matrix (@outsideris) + +- #4852: Replace deprecated `String.prototype.substr()` (@CommanderRoot) + +Also thanks to @ea2305 and @SukkaW for improvements to our documentation. + # 9.2.2 / 2022-03-11 ## :bug: Fixes From 023f548213e571031b41cabbcb8bb20e458b2725 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 1 May 2022 06:54:10 +0200 Subject: [PATCH 1755/1771] build(v10.0.0): release --- AUTHORS | 3 +++ CHANGELOG.md | 22 +++++++++++----------- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/AUTHORS b/AUTHORS index a632fd7fc3..e0a69c92e8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -532,5 +532,8 @@ Curtis Man Andrei Rusu Quentin Barbe Mattias Norlander +CommanderRoot +Elihu Cruz +Sukka # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bffd5b9737..c4026fd099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,29 +2,29 @@ ## :boom: Breaking Changes -- #4845: **Drop Node.js v12.x support** (@juergba) +- [#4845](https://github.com/mochajs/mocha/issues/4845): **Drop Node.js v12.x support** ([**@juergba**](https://github.com/juergba)) -- #4848: Drop Internet-Explorer-11 support (@juergba) +- [#4848](https://github.com/mochajs/mocha/issues/4848): Drop Internet-Explorer-11 support ([**@juergba**](https://github.com/juergba)) -- #4857: Drop AMD/RequireJS support (@juergba) +- [#4857](https://github.com/mochajs/mocha/issues/4857): Drop AMD/RequireJS support ([**@juergba**](https://github.com/juergba)) -- #4866: Drop Growl notification support (@juergba) +- [#4866](https://github.com/mochajs/mocha/issues/4866): Drop Growl notification support ([**@juergba**](https://github.com/juergba)) -- #4863: Rename executable `bin/mocha` to `bin/mocha.js` (@juergba) +- [#4863](https://github.com/mochajs/mocha/issues/4863): Rename executable `bin/mocha` to `bin/mocha.js` ([**@juergba**](https://github.com/juergba)) -- #4865: `--ignore` option in Windows: upgrade Minimatch (@juergba) +- [#4865](https://github.com/mochajs/mocha/issues/4865): `--ignore` option in Windows: upgrade Minimatch ([**@juergba**](https://github.com/juergba)) -- #4861: Remove deprecated `Runner` signature (@juergba) +- [#4861](https://github.com/mochajs/mocha/issues/4861): Remove deprecated `Runner` signature ([**@juergba**](https://github.com/juergba)) ## :nut\_and\_bolt: Other -- #4878: Update production dependencies (@juergba) +- [#4878](https://github.com/mochajs/mocha/issues/4878): Update production dependencies ([**@juergba**](https://github.com/juergba)) -- #4876: Add Node.js v18 to CI test matrix (@outsideris) +- [#4876](https://github.com/mochajs/mocha/issues/4876): Add Node.js v18 to CI test matrix ([**@outsideris**](https://github.com/outsideris)) -- #4852: Replace deprecated `String.prototype.substr()` (@CommanderRoot) +- [#4852](https://github.com/mochajs/mocha/issues/4852): Replace deprecated `String.prototype.substr()` ([**@CommanderRoot**](https://github.com/CommanderRoot)) -Also thanks to @ea2305 and @SukkaW for improvements to our documentation. +Also thanks to [**@ea2305**](https://github.com/ea2305) and [**@SukkaW**](https://github.com/SukkaW) for improvements to our documentation. # 9.2.2 / 2022-03-11 diff --git a/package-lock.json b/package-lock.json index 06cc3af68d..d144e6a2d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mocha", - "version": "9.2.2", + "version": "10.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mocha", - "version": "9.2.2", + "version": "10.0.0", "license": "MIT", "dependencies": { "@ungap/promise-all-settled": "1.1.2", diff --git a/package.json b/package.json index 0cf6a4feea..aba2b8f181 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "9.2.2", + "version": "10.0.0", "type": "commonjs", "description": "simple, flexible, fun test framework", "keywords": [ From 84b2f846148b180d6e1af088f77358a85c81d1ba Mon Sep 17 00:00:00 2001 From: Darius Dzien Date: Tue, 19 Jul 2022 12:55:23 -0500 Subject: [PATCH 1756/1771] chore(ci): upgrade GH actions to latest versions (#4899) --- .github/workflows/browser-test.yml | 6 +++--- .github/workflows/mocha.yml | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/browser-test.yml b/.github/workflows/browser-test.yml index 40d746e64a..306a139eca 100644 --- a/.github/workflows/browser-test.yml +++ b/.github/workflows/browser-test.yml @@ -12,14 +12,14 @@ jobs: runs-on: ubuntu-latest if: contains(github.event.pull_request.labels.*.name, 'run-browser-test') steps: - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: 16 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} - name: 'Cache node_modules' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: '~/.npm' key: "ubuntu-latest-node-full-v16-${{ hashFiles('**/package-lock.json') }}" diff --git a/.github/workflows/mocha.yml b/.github/workflows/mocha.yml index 771d243d1f..d4f7a66791 100644 --- a/.github/workflows/mocha.yml +++ b/.github/workflows/mocha.yml @@ -22,7 +22,7 @@ jobs: - name: Check event pull_request if: github.event_name == 'pull_request' run: 'echo pull_request: run workflow' - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: github.event_name == 'push' - name: Check event push id: findPr @@ -46,8 +46,8 @@ jobs: - 16 - 18 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '${{ matrix.node }}' - run: npm install --production @@ -58,12 +58,12 @@ jobs: runs-on: ubuntu-latest needs: smoke steps: - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: 16 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: 'Cache node_modules' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: '~/.npm' key: "ubuntu-latest-node-v16-${{ hashFiles('**/package-lock.json') }}" @@ -95,17 +95,17 @@ jobs: env: COVERAGE: 1 steps: - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: '${{ matrix.node }}' - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Get npm cache directory in Windows id: npm-cache if: ${{ matrix.os == 'windows-2019' }} run: | echo "::set-output name=dir::$(npm config get cache)" - name: 'Cache node_modules' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ${{ matrix.os == 'ubuntu-latest' && '~/.npm' || steps.npm-cache.outputs.dir }} key: "${{ matrix.os }}-node-v${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }}" @@ -139,12 +139,12 @@ jobs: # Don't run forked 'pull_request' without saucelabs token if: github.event_name == 'push' || !github.event.pull_request.head.repo.fork steps: - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: 16 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: 'Cache node_modules' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: '~/.npm' # this key is different than above, since we are running scripts From 77c18d29c565e68a0d487e357765acb5ec776cc6 Mon Sep 17 00:00:00 2001 From: Outsider Date: Thu, 11 Aug 2022 02:37:13 +0900 Subject: [PATCH 1757/1771] chore: use standard 'Promise.allSettled' instead of polyfill (#4905) Signed-off-by: Outsider --- lib/nodejs/parallel-buffered-runner.js | 3 +-- package-lock.json | 11 ----------- package.json | 1 - 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/lib/nodejs/parallel-buffered-runner.js b/lib/nodejs/parallel-buffered-runner.js index 3f882ba227..6052efc0d1 100644 --- a/lib/nodejs/parallel-buffered-runner.js +++ b/lib/nodejs/parallel-buffered-runner.js @@ -6,7 +6,6 @@ 'use strict'; -const allSettled = require('@ungap/promise-all-settled').bind(Promise); const Runner = require('../runner'); const {EVENT_RUN_BEGIN, EVENT_RUN_END} = Runner.constants; const debug = require('debug')('mocha:parallel:parallel-buffered-runner'); @@ -322,7 +321,7 @@ class ParallelBufferedRunner extends Runner { delete options[opt]; }); - const results = await allSettled( + const results = await Promise.allSettled( files.map(this._createFileRunner(pool, options)) ); diff --git a/package-lock.json b/package-lock.json index d144e6a2d7..b2acc6f551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "10.0.0", "license": "MIT", "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -1577,11 +1576,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" - }, "node_modules/@wdio/config": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.12.1.tgz", @@ -25665,11 +25659,6 @@ "@types/node": "*" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" - }, "@wdio/config": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.12.1.tgz", diff --git a/package.json b/package.json index aba2b8f181..22eeff7f81 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "test:smoke": "node ./bin/mocha --no-config test/smoke/smoke.spec.js" }, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", From 61b4b9209c2c64b32c8d48b1761c3b9384d411ea Mon Sep 17 00:00:00 2001 From: Yeting Li Date: Fri, 26 Aug 2022 01:30:49 +0800 Subject: [PATCH 1758/1771] fix the regular expression for function `clean` in `utils.js` (#4770) --- lib/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 9db34cb1ad..7e1d566819 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -76,7 +76,7 @@ exports.clean = function (str) { .replace(/^\uFEFF/, '') // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content .replace( - /^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, + /^function(?:\s*|\s[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\}|((?:.|\n)*))$/, '$1$2$3' ); From 41567df1fa039875a043b54b0d4e26153b802893 Mon Sep 17 00:00:00 2001 From: Greggman Date: Thu, 25 Aug 2022 10:31:16 -0700 Subject: [PATCH 1759/1771] Support prefers-color-scheme: dark (#4896) Adds CSS for prefers-color-scheme: dark --- lib/browser/progress.js | 19 +++++- mocha.css | 136 +++++++++++++++++++++++++++++----------- 2 files changed, 118 insertions(+), 37 deletions(-) diff --git a/lib/browser/progress.js b/lib/browser/progress.js index 30d45f6a2f..c82bc0824e 100644 --- a/lib/browser/progress.js +++ b/lib/browser/progress.js @@ -86,6 +86,20 @@ Progress.prototype.update = function (n) { */ Progress.prototype.draw = function (ctx) { try { + var darkMatcher = window.matchMedia('(prefers-color-scheme: dark)'); + var isDarkMode = !!darkMatcher.matches; + var lightColors = { + outerCircle: '#9f9f9f', + innerCircle: '#eee', + text: '#000' + }; + var darkColors = { + outerCircle: '#888', + innerCircle: '#444', + text: '#fff' + }; + var colors = isDarkMode ? darkColors : lightColors; + var percent = Math.min(this.percent, 100); var size = this._size; var half = size / 2; @@ -100,13 +114,13 @@ Progress.prototype.draw = function (ctx) { ctx.clearRect(0, 0, size, size); // outer circle - ctx.strokeStyle = '#9f9f9f'; + ctx.strokeStyle = colors.outerCircle; ctx.beginPath(); ctx.arc(x, y, rad, 0, angle, false); ctx.stroke(); // inner circle - ctx.strokeStyle = '#eee'; + ctx.strokeStyle = colors.innerCircle; ctx.beginPath(); ctx.arc(x, y, rad - 1, 0, angle, true); ctx.stroke(); @@ -115,6 +129,7 @@ Progress.prototype.draw = function (ctx) { var text = this._text || (percent | 0) + '%'; var w = ctx.measureText(text).width; + ctx.fillStyle = colors.text; ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); } catch (ignore) { // don't fail if we can't render progress diff --git a/mocha.css b/mocha.css index 4ca8fcb897..3a3ed7714f 100644 --- a/mocha.css +++ b/mocha.css @@ -1,7 +1,73 @@ @charset "utf-8"; +:root { + --mocha-color: #000; + --mocha-bg-color: #fff; + --mocha-pass-icon-color: #00d6b2; + --mocha-pass-color: #fff; + --mocha-pass-shadow-color: rgba(0,0,0,.2); + --mocha-pass-mediump-color: #c09853; + --mocha-pass-slow-color: #b94a48; + --mocha-test-pending-color: #0b97c4; + --mocha-test-pending-icon-color: #0b97c4; + --mocha-test-fail-color: #c00; + --mocha-test-fail-icon-color: #c00; + --mocha-test-fail-pre-color: #000; + --mocha-test-fail-pre-error-color: #c00; + --mocha-test-html-error-color: #000; + --mocha-box-shadow-color: #eee; + --mocha-box-bottom-color: #ddd; + --mocha-test-replay-color: #888; + --mocha-test-replay-bg-color: #eee; + --mocha-stats-color: #888; + --mocha-stats-em-color: #000; + --mocha-stats-hover-color: #eee; + --mocha-error-color: #c00; + + --mocha-code-comment: #ddd; + --mocha-code-init: #2f6fad; + --mocha-code-string: #5890ad; + --mocha-code-keyword: #8a6343; + --mocha-code-number: #2f6fad; +} + +@media (prefers-color-scheme: dark) { + :root { + --mocha-color: #fff; + --mocha-bg-color: #222; + --mocha-pass-icon-color: #00d6b2; + --mocha-pass-color: #222; + --mocha-pass-shadow-color: rgba(255,255,255,.2); + --mocha-pass-mediump-color: #f1be67; + --mocha-pass-slow-color: #f49896; + --mocha-test-pending-color: #0b97c4; + --mocha-test-pending-icon-color: #0b97c4; + --mocha-test-fail-color: #f44; + --mocha-test-fail-icon-color: #f44; + --mocha-test-fail-pre-color: #fff; + --mocha-test-fail-pre-error-color: #f44; + --mocha-test-html-error-color: #fff; + --mocha-box-shadow-color: #444; + --mocha-box-bottom-color: #555; + --mocha-test-replay-color: #888; + --mocha-test-replay-bg-color: #444; + --mocha-stats-color: #aaa; + --mocha-stats-em-color: #fff; + --mocha-stats-hover-color: #444; + --mocha-error-color: #f44; + + --mocha-code-comment: #ddd; + --mocha-code-init: #9cc7f1; + --mocha-code-string: #80d4ff; + --mocha-code-keyword: #e3a470; + --mocha-code-number: #4ca7ff; + } +} + body { margin:0; + background-color: var(--mocha-bg-color); + color: var(--mocha-color); } #mocha { @@ -69,11 +135,11 @@ body { } #mocha .test.pass.medium .duration { - background: #c09853; + background: var(--mocha-pass-mediump-color); } #mocha .test.pass.slow .duration { - background: #b94a48; + background: var(--mocha-pass-slow-color); } #mocha .test.pass::before { @@ -82,17 +148,17 @@ body { display: block; float: left; margin-right: 5px; - color: #00d6b2; + color: var(--mocha-pass-icon-color); } #mocha .test.pass .duration { font-size: 9px; margin-left: 5px; padding: 2px 5px; - color: #fff; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + color: var(--mocha-pass-color); + -webkit-box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); + -moz-box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); + box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; @@ -105,20 +171,20 @@ body { } #mocha .test.pending { - color: #0b97c4; + color: var(--mocha-test-pending-color); } #mocha .test.pending::before { content: '◦'; - color: #0b97c4; + color: var(--mocha-test-pending-icon-color); } #mocha .test.fail { - color: #c00; + color: var(--mocha-test-fail-color); } #mocha .test.fail pre { - color: black; + color: var(--mocha-test-fail-pre-color); } #mocha .test.fail::before { @@ -127,35 +193,35 @@ body { display: block; float: left; margin-right: 5px; - color: #c00; + color: var(--mocha-pass-icon-color); } #mocha .test pre.error { - color: #c00; + color: var(--mocha-test-fail-pre-error-color); max-height: 300px; overflow: auto; } #mocha .test .html-error { overflow: auto; - color: black; + color: var(--mocha-test-html-error-color); display: block; float: left; clear: left; font: 12px/1.5 monaco, monospace; margin: 5px; padding: 15px; - border: 1px solid #eee; + border: 1px solid var(--mocha-box-shadow-color); max-width: 85%; /*(1)*/ max-width: -webkit-calc(100% - 42px); max-width: -moz-calc(100% - 42px); max-width: calc(100% - 42px); /*(2)*/ max-height: 300px; word-wrap: break-word; - border-bottom-color: #ddd; - -webkit-box-shadow: 0 1px 3px #eee; - -moz-box-shadow: 0 1px 3px #eee; - box-shadow: 0 1px 3px #eee; + border-bottom-color: var(--mocha-box-bottom-color); + -webkit-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -moz-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + box-shadow: 0 1px 3px var(--mocha-box-shadow-color); -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; @@ -187,16 +253,16 @@ body { font: 12px/1.5 monaco, monospace; margin: 5px; padding: 15px; - border: 1px solid #eee; + border: 1px solid var(--mocha-box-shadow-color); max-width: 85%; /*(1)*/ max-width: -webkit-calc(100% - 42px); max-width: -moz-calc(100% - 42px); max-width: calc(100% - 42px); /*(2)*/ word-wrap: break-word; - border-bottom-color: #ddd; - -webkit-box-shadow: 0 1px 3px #eee; - -moz-box-shadow: 0 1px 3px #eee; - box-shadow: 0 1px 3px #eee; + border-bottom-color: var(--mocha-box-bottom-color); + -webkit-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -moz-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + box-shadow: 0 1px 3px var(--mocha-box-shadow-color); -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; @@ -217,7 +283,7 @@ body { height: 15px; line-height: 15px; text-align: center; - background: #eee; + background: var(--mocha-test-replay-bg-color); font-size: 15px; -webkit-border-radius: 15px; -moz-border-radius: 15px; @@ -227,7 +293,7 @@ body { -o-transition:opacity 200ms; transition: opacity 200ms; opacity: 0.3; - color: #888; + color: var(--mocha-test-replay-color); } #mocha .test:hover a.replay { @@ -251,7 +317,7 @@ body { } #mocha-error { - color: #c00; + color: var(--mocha-error-color); font-size: 1.5em; font-weight: 100; letter-spacing: 1px; @@ -263,7 +329,7 @@ body { right: 10px; font-size: 12px; margin: 0; - color: #888; + color: var(--mocha-stats-color); z-index: 1; } @@ -284,7 +350,7 @@ body { } #mocha-stats em { - color: black; + color: var(--mocha-stats-em-color); } #mocha-stats a { @@ -293,7 +359,7 @@ body { } #mocha-stats a:hover { - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--mocha-stats-hover-color); } #mocha-stats li { @@ -308,11 +374,11 @@ body { height: 40px; } -#mocha code .comment { color: #ddd; } -#mocha code .init { color: #2f6fad; } -#mocha code .string { color: #5890ad; } -#mocha code .keyword { color: #8a6343; } -#mocha code .number { color: #2f6fad; } +#mocha code .comment { color: var(--mocha-code-comment); } +#mocha code .init { color: var(--mocha-code-init); } +#mocha code .string { color: var(--mocha-code-string); } +#mocha code .keyword { color: var(--mocha-code-keyword); } +#mocha code .number { color: var(--mocha-code-number); } @media screen and (max-device-width: 480px) { #mocha { From 4e06a6fd00537bcdb1b6fd98b4684875356193f9 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 20 Sep 2022 12:13:19 -0400 Subject: [PATCH 1760/1771] fix(browser): increase contrast for replay buttons (#4912) --- mocha.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mocha.css b/mocha.css index 3a3ed7714f..87a4d22ef5 100644 --- a/mocha.css +++ b/mocha.css @@ -17,7 +17,7 @@ --mocha-test-html-error-color: #000; --mocha-box-shadow-color: #eee; --mocha-box-bottom-color: #ddd; - --mocha-test-replay-color: #888; + --mocha-test-replay-color: #000; --mocha-test-replay-bg-color: #eee; --mocha-stats-color: #888; --mocha-stats-em-color: #000; @@ -49,7 +49,7 @@ --mocha-test-html-error-color: #fff; --mocha-box-shadow-color: #444; --mocha-box-bottom-color: #555; - --mocha-test-replay-color: #888; + --mocha-test-replay-color: #fff; --mocha-test-replay-bg-color: #444; --mocha-stats-color: #aaa; --mocha-stats-em-color: #fff; @@ -292,11 +292,12 @@ body { -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition: opacity 200ms; - opacity: 0.3; + opacity: 0.7; color: var(--mocha-test-replay-color); } #mocha .test:hover a.replay { + box-shadow: 0 0 1px inset var(--mocha-test-replay-color); opacity: 1; } From 51d4746cf6ccefdcfcbc841c92f70efaa338e34f Mon Sep 17 00:00:00 2001 From: Outsider Date: Wed, 28 Sep 2022 03:02:25 +0900 Subject: [PATCH 1761/1771] chore(devDeps): update 'ESLint' to v8 (#4926) Signed-off-by: Outsider --- lib/interfaces/bdd.js | 18 +- lib/interfaces/qunit.js | 8 +- lib/interfaces/tdd.js | 18 +- lib/reporters/json-stream.js | 2 +- lib/reporters/markdown.js | 2 +- package-lock.json | 1066 ++++++++++++++++++--------------- package.json | 12 +- test/assertions.js | 12 +- test/integration/glob.spec.js | 2 +- test/reporters/helpers.js | 12 +- test/reporters/nyan.spec.js | 10 +- test/reporters/xunit.spec.js | 2 +- test/unit/errors.spec.js | 6 +- test/unit/utils.spec.js | 20 +- 14 files changed, 638 insertions(+), 552 deletions(-) diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index bf1ffe8893..40581617cc 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -40,9 +40,9 @@ module.exports = function bddInterface(suite) { context.describe = context.context = function (title, fn) { return common.suite.create({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; @@ -55,9 +55,9 @@ module.exports = function bddInterface(suite) { context.describe.skip = function (title, fn) { return common.suite.skip({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; @@ -67,9 +67,9 @@ module.exports = function bddInterface(suite) { context.describe.only = function (title, fn) { return common.suite.only({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; diff --git a/lib/interfaces/qunit.js b/lib/interfaces/qunit.js index 71cad080d9..8f5434c244 100644 --- a/lib/interfaces/qunit.js +++ b/lib/interfaces/qunit.js @@ -49,8 +49,8 @@ module.exports = function qUnitInterface(suite) { suites.shift(); } return common.suite.create({ - title: title, - file: file, + title, + file, fn: false }); }; @@ -64,8 +64,8 @@ module.exports = function qUnitInterface(suite) { suites.shift(); } return common.suite.only({ - title: title, - file: file, + title, + file, fn: false }); }; diff --git a/lib/interfaces/tdd.js b/lib/interfaces/tdd.js index f52ae0cbc5..8b7b1d57fa 100644 --- a/lib/interfaces/tdd.js +++ b/lib/interfaces/tdd.js @@ -47,9 +47,9 @@ module.exports = function (suite) { */ context.suite = function (title, fn) { return common.suite.create({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; @@ -58,9 +58,9 @@ module.exports = function (suite) { */ context.suite.skip = function (title, fn) { return common.suite.skip({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; @@ -69,9 +69,9 @@ module.exports = function (suite) { */ context.suite.only = function (title, fn) { return common.suite.only({ - title: title, - file: file, - fn: fn + title, + file, + fn }); }; diff --git a/lib/reporters/json-stream.js b/lib/reporters/json-stream.js index b20c000d37..5926587e45 100644 --- a/lib/reporters/json-stream.js +++ b/lib/reporters/json-stream.js @@ -36,7 +36,7 @@ function JSONStream(runner, options) { var total = runner.total; runner.once(EVENT_RUN_BEGIN, function () { - writeEvent(['start', {total: total}]); + writeEvent(['start', {total}]); }); runner.on(EVENT_TEST_PASS, function (test) { diff --git a/lib/reporters/markdown.js b/lib/reporters/markdown.js index f65726fcfd..d5adfae1ee 100644 --- a/lib/reporters/markdown.js +++ b/lib/reporters/markdown.js @@ -50,7 +50,7 @@ function Markdown(runner, options) { var ret = obj; var key = SUITE_PREFIX + suite.title; - obj = obj[key] = obj[key] || {suite: suite}; + obj = obj[key] = obj[key] || {suite}; suite.suites.forEach(function (suite) { mapTOC(suite, obj); }); diff --git a/package-lock.json b/package-lock.json index b2acc6f551..8326cb3e9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "devDependencies": { "@11ty/eleventy": "^1.0.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.3", - "@babel/eslint-parser": "^7.16.5", + "@babel/eslint-parser": "^7.19.1", "@mocha/docdash": "^4.0.1", "@rollup/plugin-commonjs": "^21.0.2", "@rollup/plugin-json": "^4.1.0", @@ -52,14 +52,14 @@ "configstore": "^5.0.1", "coveralls": "^3.1.1", "cross-env": "^7.0.2", - "eslint": "^7.32.0", + "eslint": "^8.24.0", "eslint-config-prettier": "^8.3.0", - "eslint-config-semistandard": "^16.0.0", - "eslint-config-standard": "^16.0.3", + "eslint-config-semistandard": "^17.0.0", + "eslint-config-standard": "^17.0.0", "eslint-plugin-import": "^2.24.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.0.1", "fail-on-errors-webpack-plugin": "^3.0.0", "fs-extra": "^10.0.0", "husky": "^4.2.5", @@ -279,12 +279,12 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", "dev": true, "dependencies": { - "eslint-scope": "^5.1.1", + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.0" }, @@ -652,32 +652,26 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { @@ -691,9 +685,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -721,19 +715,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -755,12 +736,6 @@ "node": ">=4" } }, - "node_modules/@eslint/eslintrc/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -818,12 +793,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -853,6 +828,29 @@ "node": "*" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -1070,6 +1068,15 @@ "pause-stream": "0.0.11" } }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1864,9 +1871,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4133,6 +4140,16 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "peer": true, + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6492,6 +6509,18 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -7221,57 +7250,56 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7290,22 +7318,22 @@ } }, "node_modules/eslint-config-semistandard": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-16.0.0.tgz", - "integrity": "sha512-oD8QOo4mSInRJhQb3Zi6L8HebwZaB6SI3A+NNrPdVN0nN1K45L5pXK3joY+ksWDlT3ew/M+fJk2tuMCjIpjRzQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-17.0.0.tgz", + "integrity": "sha512-tLi0JYmfiiJgtmRhoES55tENatR7y/5aXOh6cBeW+qjzl1+WwyV0arDqR65XN3/xrPZt+/1EG+xNLknV/0jWsQ==", "dev": true, "peerDependencies": { - "eslint": ">=7.12.1", - "eslint-config-standard": ">=16.0.3", - "eslint-plugin-import": ">=2.22.1", - "eslint-plugin-node": ">=11.1.0", - "eslint-plugin-promise": ">=4.2.1" + "eslint": "^8.13.0", + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", "dev": true, "funding": [ { @@ -7322,10 +7350,10 @@ } ], "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { @@ -7436,6 +7464,26 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, "node_modules/eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", @@ -7512,6 +7560,75 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/eslint-plugin-n": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz", + "integrity": "sha512-IyzPnEWHypCWasDpxeJnim60jhlumbmq0pubL6IOcnk8u2y53s5QfT8JnXy7skjHJ44yWHRb11PLtDHuu1kg/Q==", + "dev": true, + "peer": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.10.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -7561,15 +7678,6 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-plugin-node/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7592,15 +7700,15 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" }, "peerDependencies": { "eslint": ">=7.28.0", @@ -7613,15 +7721,15 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz", + "integrity": "sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==", "dev": true, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^7.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/eslint-scope": { @@ -7679,38 +7787,81 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/eslint/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -7738,19 +7889,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7789,12 +7927,6 @@ "node": ">=4" } }, - "node_modules/eslint/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -7808,38 +7940,29 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -8728,12 +8851,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/gather-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", @@ -9026,6 +9143,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gm-papandreou": { "version": "1.23.0-patch1", "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", @@ -10787,9 +10924,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -11208,9 +11345,9 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -12001,6 +12138,12 @@ "node": ">=10" } }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -13314,12 +13457,6 @@ "lodash._reinterpolate": "^3.0.0" } }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -19301,15 +19438,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -19332,12 +19460,12 @@ } }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -21687,61 +21815,6 @@ "acorn-node": "^1.2.0" } }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/taffydb": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", @@ -23197,12 +23270,6 @@ "node": ">=8" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -24598,12 +24665,12 @@ } }, "@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", "dev": true, "requires": { - "eslint-scope": "^5.1.1", + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.0" }, @@ -24885,31 +24952,22 @@ "dev": true }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -24921,9 +24979,9 @@ } }, "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -24939,16 +24997,6 @@ "resolve-from": "^4.0.0" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -24964,12 +25012,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -25018,12 +25060,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -25049,6 +25091,18 @@ } } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -25223,6 +25277,15 @@ "pause-stream": "0.0.11" } }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -25916,9 +25979,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-globals": { @@ -27776,6 +27839,16 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "peer": true, + "requires": { + "semver": "^7.0.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -29704,6 +29777,15 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -30298,85 +30380,108 @@ } }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -30392,16 +30497,6 @@ "resolve-from": "^4.0.0" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -30431,12 +30526,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -30453,16 +30542,16 @@ "requires": {} }, "eslint-config-semistandard": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-16.0.0.tgz", - "integrity": "sha512-oD8QOo4mSInRJhQb3Zi6L8HebwZaB6SI3A+NNrPdVN0nN1K45L5pXK3joY+ksWDlT3ew/M+fJk2tuMCjIpjRzQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-17.0.0.tgz", + "integrity": "sha512-tLi0JYmfiiJgtmRhoES55tENatR7y/5aXOh6cBeW+qjzl1+WwyV0arDqR65XN3/xrPZt+/1EG+xNLknV/0jWsQ==", "dev": true, "requires": {} }, "eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", "dev": true, "requires": {} }, @@ -30557,6 +30646,17 @@ } } }, + "eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "peer": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, "eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", @@ -30623,6 +30723,56 @@ } } }, + "eslint-plugin-n": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz", + "integrity": "sha512-IyzPnEWHypCWasDpxeJnim60jhlumbmq0pubL6IOcnk8u2y53s5QfT8JnXy7skjHJ44yWHRb11PLtDHuu1kg/Q==", + "dev": true, + "peer": true, + "requires": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.10.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -30657,12 +30807,6 @@ "regexpp": "^3.0.0" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -30681,18 +30825,18 @@ } }, "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz", + "integrity": "sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==", "dev": true, "requires": {} }, @@ -30738,26 +30882,20 @@ "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -31446,12 +31584,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "gather-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", @@ -31676,6 +31808,20 @@ "define-properties": "^1.1.3" } }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "gm-papandreou": { "version": "1.23.0-patch1", "resolved": "https://registry.npmjs.org/gm-papandreou/-/gm-papandreou-1.23.0-patch1.tgz", @@ -32966,9 +33112,9 @@ "dev": true }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "imageinfo": { @@ -33283,9 +33429,9 @@ } }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -33867,6 +34013,12 @@ "nopt": "^5.0.0" } }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -34922,12 +35074,6 @@ "lodash._reinterpolate": "^3.0.0" } }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -39619,12 +39765,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -39647,12 +39787,12 @@ } }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -41528,50 +41668,6 @@ "acorn-node": "^1.2.0" } }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, "taffydb": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", @@ -42716,12 +42812,6 @@ "sade": "^1.7.3" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index 22eeff7f81..046a485d25 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "devDependencies": { "@11ty/eleventy": "^1.0.0", "@11ty/eleventy-plugin-inclusive-language": "^1.0.3", - "@babel/eslint-parser": "^7.16.5", + "@babel/eslint-parser": "^7.19.1", "@mocha/docdash": "^4.0.1", "@rollup/plugin-commonjs": "^21.0.2", "@rollup/plugin-json": "^4.1.0", @@ -93,14 +93,14 @@ "configstore": "^5.0.1", "coveralls": "^3.1.1", "cross-env": "^7.0.2", - "eslint": "^7.32.0", + "eslint": "^8.24.0", "eslint-config-prettier": "^8.3.0", - "eslint-config-semistandard": "^16.0.0", - "eslint-config-standard": "^16.0.3", + "eslint-config-semistandard": "^17.0.0", + "eslint-config-standard": "^17.0.0", "eslint-plugin-import": "^2.24.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.0.1", "fail-on-errors-webpack-plugin": "^3.0.0", "fs-extra": "^10.0.0", "husky": "^4.2.5", diff --git a/test/assertions.js b/test/assertions.js index 223e5fba95..b6ed7b9cc9 100644 --- a/test/assertions.js +++ b/test/assertions.js @@ -109,7 +109,7 @@ module.exports = { (expect, result, output) => { expect(result, '[not] to satisfy', { code: expect.it('to be greater than', 0), - output: output + output }); } ) @@ -118,7 +118,7 @@ module.exports = { (expect, result, output) => { expect(result, '[not] to satisfy', { code: 0, - output: output + output }); } ) @@ -214,7 +214,7 @@ module.exports = { (expect, result, ...titles) => { titles.forEach(title => { expect(result.passes, '[not] to have an item satisfying', { - title: title + title }); }); } @@ -226,7 +226,7 @@ module.exports = { result[state].slice(0, titles.length), '[not] to satisfy', titles.map(title => { - return typeof title === 'string' ? {title: title} : title; + return typeof title === 'string' ? {title} : title; }) ); } @@ -292,7 +292,7 @@ module.exports = { ' [not] to have retried test ', (expect, result, title) => { expect(result.tests, '[not] to have an item satisfying', { - title: title, + title, currentRetry: expect.it('to be positive') }); } @@ -301,7 +301,7 @@ module.exports = { ' [not] to have retried test ', (expect, result, title, count) => { expect(result.tests, '[not] to have an item satisfying', { - title: title, + title, currentRetry: count }); } diff --git a/test/integration/glob.spec.js b/test/integration/glob.spec.js index 19b06f8b1c..3533e35a4c 100644 --- a/test/integration/glob.spec.js +++ b/test/integration/glob.spec.js @@ -199,7 +199,7 @@ function execMochaWith(validate) { function (error, stdout, stderr) { try { validate(error, stderr); - assertOn({stdout: stdout, stderr: stderr}); + assertOn({stdout, stderr}); done(); } catch (assertion) { done(assertion); diff --git a/test/reporters/helpers.js b/test/reporters/helpers.js index 6fedb0529e..7159824c56 100644 --- a/test/reporters/helpers.js +++ b/test/reporters/helpers.js @@ -145,7 +145,7 @@ function createRunnerFunction(runStr, ifStr1, ifStr2, ifStr3, arg1, arg2) { function makeTest(err) { return { - err: err, + err, titlePath: function () { return ['test title']; } @@ -232,9 +232,9 @@ function createRunReporterFunction(ctor) { } module.exports = { - createElements: createElements, - createMockRunner: createMockRunner, - createRunReporterFunction: createRunReporterFunction, - makeExpectedTest: makeExpectedTest, - makeTest: makeTest + createElements, + createMockRunner, + createRunReporterFunction, + makeExpectedTest, + makeTest }; diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index a6e6c5def3..7d405e4542 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -386,7 +386,7 @@ describe('Nyan reporter', function () { }, numberOfLines: 4, trajectoryWidthMax: 0, - trajectories: trajectories + trajectories }); expect(expectedSegment, 'to be', '_'); @@ -414,7 +414,7 @@ describe('Nyan reporter', function () { }, numberOfLines: 4, trajectoryWidthMax: 0, - trajectories: trajectories + trajectories }); expect(trajectories, 'to equal', expectedTrajectories); @@ -436,7 +436,7 @@ describe('Nyan reporter', function () { }, numberOfLines: 4, trajectoryWidthMax: 5, - trajectories: trajectories + trajectories }); expect(expectedSegment, 'to equal', '-'); @@ -469,7 +469,7 @@ describe('Nyan reporter', function () { var fakeThis = { cursorUp: noop, - stats: {passes: passes, pending: pending, failures: failures}, + stats: {passes, pending, failures}, numberOfLines: 4 }; @@ -538,7 +538,7 @@ describe('Nyan reporter', function () { var nyanCat = new NyanCat(runner, options); var fakeThis = { cursorUp: noop, - trajectories: trajectories, + trajectories, scoreboardWidth: expectedWidth, numberOfLines: 1 }; diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index eaeb400da0..a5e0f1bbeb 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -264,7 +264,7 @@ describe('XUnit reporter', function () { it("should call 'fileStream.write' with line and newline", function () { var xunit = new XUnit(runner); - var fakeThis = {fileStream: fileStream}; + var fakeThis = {fileStream}; xunit.write.call(fakeThis, expectedLine); expect(fileStream.write.calledWith(expectedLine + '\n'), 'to be true'); diff --git a/test/unit/errors.spec.js b/test/unit/errors.spec.js index 24e81ee9b7..09f56c6861 100644 --- a/test/unit/errors.spec.js +++ b/test/unit/errors.spec.js @@ -17,7 +17,7 @@ describe('Errors', function () { errors.createInvalidReporterError(message, 'badReporter'), 'to satisfy', { - message: message, + message, code: 'ERR_MOCHA_INVALID_REPORTER', reporter: 'badReporter' } @@ -31,7 +31,7 @@ describe('Errors', function () { errors.createInvalidInterfaceError(message, 'badUi'), 'to satisfy', { - message: message, + message, code: 'ERR_MOCHA_INVALID_INTERFACE', interface: 'badUi' } @@ -75,7 +75,7 @@ describe('Errors', function () { errors.createUnparsableFileError(message, 'badFilePath'), 'to satisfy', { - message: message, + message, code: 'ERR_MOCHA_UNPARSABLE_FILE' } ); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 336bb1698e..adb36c4cd6 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -324,7 +324,7 @@ describe('lib/utils', function () { it('should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values', function () { var regexp = /(?:)/; - var regExpObj = {regexp: regexp}; + var regExpObj = {regexp}; var regexpString = '/(?:)/'; expect( @@ -335,14 +335,14 @@ describe('lib/utils', function () { expect(stringify(regexp), 'to be', regexpString); var number = 1; - var numberObj = {number: number}; + var numberObj = {number}; var numberString = '1'; expect(stringify(numberObj), 'to be', '{\n "number": ' + number + '\n}'); expect(stringify(number), 'to be', numberString); var boolean = false; - var booleanObj = {boolean: boolean}; + var booleanObj = {boolean}; var booleanString = 'false'; expect( @@ -353,7 +353,7 @@ describe('lib/utils', function () { expect(stringify(boolean), 'to be', booleanString); var string = 'sneepy'; - var stringObj = {string: string}; + var stringObj = {string}; expect( stringify(stringObj), @@ -372,7 +372,7 @@ describe('lib/utils', function () { it('should handle arrays', function () { var array = ['dave', 'dave', 'dave', 'dave']; - var arrayObj = {array: array}; + var arrayObj = {array}; var arrayString = ' "dave"\n "dave"\n "dave"\n "dave"'; expect( @@ -389,7 +389,7 @@ describe('lib/utils', function () { it('should handle functions', function () { var fn = function () {}; - var fnObj = {fn: fn}; + var fnObj = {fn}; var fnString = '[Function]'; expect(stringify(fnObj), 'to be', '{\n "fn": ' + fnString + '\n}'); @@ -482,7 +482,7 @@ describe('lib/utils', function () { var date = new Date(0); expect(stringify(date), 'to be', '[Date: 1970-01-01T00:00:00.000Z]'); expect( - stringify({date: date}), + stringify({date}), 'to be', '{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}' ); @@ -505,11 +505,7 @@ describe('lib/utils', function () { it('should handle Symbol', function () { var symbol = Symbol('value'); expect(stringify(symbol), 'to match', /^Symbol\(value\)/); - expect( - stringify({symbol: symbol}), - 'to match', - /"symbol": Symbol\(value\)/ - ); + expect(stringify({symbol}), 'to match', /"symbol": Symbol\(value\)/); }); } From ed74f16878f6520411d9a391c5f184056be6da30 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:18:05 +0200 Subject: [PATCH 1762/1771] build(v10.1.0): update CHANGELOG --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4026fd099..851191be44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# 10.1.0 / 2022-10-16 + +## :tada: Enhancements + +- #4896: Browser: add support for `prefers-color-scheme: dark` (@greggman) + +## :nut\_and\_bolt: Other + +- #4912: Browser: increase contrast for replay buttons (@JoshuaKGoldberg) +- #4905: Use standard `Promise.allSettled` instead of polyfill (@outsideris) +- #4899: Upgrade official GitHub actions to latest (@ddzz) +- #4770: Fix regex in function `clean`(@yetingli) + # 10.0.0 / 2022-05-01 ## :boom: Breaking Changes From 5f96d511dbf913f135b92198aab721a27f6b44fe Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:27:14 +0200 Subject: [PATCH 1763/1771] build(v10.1.0): release --- AUTHORS | 4 ++++ CHANGELOG.md | 10 +++++----- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index e0a69c92e8..94f192dfc1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -535,5 +535,9 @@ Mattias Norlander CommanderRoot Elihu Cruz Sukka +Darius Dzien +Yeting Li +Greggman +Josh Goldberg # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 851191be44..aeb09de3ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,14 @@ ## :tada: Enhancements -- #4896: Browser: add support for `prefers-color-scheme: dark` (@greggman) +- [#4896](https://github.com/mochajs/mocha/issues/4896): Browser: add support for `prefers-color-scheme: dark` ([**@greggman**](https://github.com/greggman)) ## :nut\_and\_bolt: Other -- #4912: Browser: increase contrast for replay buttons (@JoshuaKGoldberg) -- #4905: Use standard `Promise.allSettled` instead of polyfill (@outsideris) -- #4899: Upgrade official GitHub actions to latest (@ddzz) -- #4770: Fix regex in function `clean`(@yetingli) +- [#4912](https://github.com/mochajs/mocha/issues/4912): Browser: increase contrast for replay buttons ([**@JoshuaKGoldberg**](https://github.com/JoshuaKGoldberg)) +- [#4905](https://github.com/mochajs/mocha/issues/4905): Use standard `Promise.allSettled` instead of polyfill ([**@outsideris**](https://github.com/outsideris)) +- [#4899](https://github.com/mochajs/mocha/issues/4899): Upgrade official GitHub actions to latest ([**@ddzz**](https://github.com/ddzz)) +- [#4770](https://github.com/mochajs/mocha/issues/4770): Fix regex in function `clean`([**@yetingli**](https://github.com/yetingli)) # 10.0.0 / 2022-05-01 diff --git a/package-lock.json b/package-lock.json index 8326cb3e9f..fcfa2d529a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mocha", - "version": "10.0.0", + "version": "10.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mocha", - "version": "10.0.0", + "version": "10.1.0", "license": "MIT", "dependencies": { "ansi-colors": "4.1.1", diff --git a/package.json b/package.json index 046a485d25..a807ebabd9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "10.0.0", + "version": "10.1.0", "type": "commonjs", "description": "simple, flexible, fun test framework", "keywords": [ From 8f3c37b6b77b6754cd9445204c536c1a0671450a Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Tue, 18 Oct 2022 20:17:38 +0200 Subject: [PATCH 1764/1771] chore(ci): workaround for firefox error (#4933) --- karma.conf.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index 3d8b9d31fe..dbe3d53617 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -90,7 +90,8 @@ module.exports = config => { const buildId = `github-${env.GITHUB_RUN_ID}_${env.GITHUB_RUN_NUMBER}`; bundleDirPath = path.join(BASE_BUNDLE_DIR_PATH, buildId); sauceConfig = { - build: buildId + build: buildId, + geckodriverVersion: '0.30.0' // temporary workaround for firefox }; } else { console.error(`Local environment (${hostname}) detected`); From 3cc9cac7ee040fff1de10af79fb16e7586ea65e8 Mon Sep 17 00:00:00 2001 From: Outsider Date: Sun, 13 Nov 2022 17:37:31 +0900 Subject: [PATCH 1765/1771] ci: update stale action (#4931) to suppress node.js 12 deprecation warning in actions Signed-off-by: Outsider --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f3dd1cf14f..301433f03e 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -8,7 +8,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4 + - uses: actions/stale@v6 with: days-before-stale: 120 days-before-close: 14 From b0a0fb808c6d771f198fca120527222f92edaa57 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Mon, 14 Nov 2022 19:36:24 +0100 Subject: [PATCH 1766/1771] fix(browser): failed test icon color (#4946) The failed test icon is currently incorrectly colored as `#00d6b2` instead of `#cc0000` (light schema) or `#ff4444` (dark schema). --- mocha.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mocha.css b/mocha.css index 87a4d22ef5..b4d7e5b207 100644 --- a/mocha.css +++ b/mocha.css @@ -193,7 +193,7 @@ body { display: block; float: left; margin-right: 5px; - color: var(--mocha-pass-icon-color); + color: var(--mocha-test-fail-icon-color); } #mocha .test pre.error { From 0a10ddc1213c208ccc106acc9e8bf372a25f0dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Gon=C3=A7alves?= Date: Tue, 15 Nov 2022 18:27:18 +0000 Subject: [PATCH 1767/1771] docs: remove duplicated header (#4944) --- docs/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 990f3b53d3..2d9177d79e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -990,8 +990,6 @@ It can however make the output harder to interpret when comparing large strings. A value of 0 indicates no limit, default is 8192 characters. -## Command-Line Usage - ### `--full-trace` Enable "full" stack traces. By default, Mocha attempts to distill stack traces into less noisy (though still useful) output. From fc4ac58f1fda1a178b26189398b65f66f6561716 Mon Sep 17 00:00:00 2001 From: Outsider Date: Wed, 30 Nov 2022 03:30:18 +0900 Subject: [PATCH 1768/1771] chore(devDeps): remove unused depedencies (#4949) Signed-off-by: Outsider --- package-lock.json | 1327 --------------------------------------------- package.json | 3 - 2 files changed, 1330 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcfa2d529a..319e9be2ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,6 @@ "canvas": "^2.9.0", "chai": "^4.3.4", "coffeescript": "^2.6.1", - "configstore": "^5.0.1", "coveralls": "^3.1.1", "cross-env": "^7.0.2", "eslint": "^8.24.0", @@ -96,7 +95,6 @@ "sinon": "^9.0.3", "strip-ansi": "^6.0.0", "svgo": "^1.3.2", - "through2": "^4.0.2", "touch": "^3.1.0", "unexpected": "^11.14.0", "unexpected-eventemitter": "^2.2.0", @@ -106,7 +104,6 @@ "update-notifier": "^4.1.0", "uslug": "^1.0.4", "uuid": "^8.3.0", - "watchify": "^4.0.0", "webpack": "^5.67.0", "webpack-cli": "^4.9.1" }, @@ -1922,29 +1919,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -2855,18 +2829,6 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -3553,48 +3515,12 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-pack/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -3738,68 +3664,6 @@ "node": ">=12" } }, - "node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -3907,114 +3771,6 @@ "pako": "~1.0.5" } }, - "node_modules/browserify/node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/browserify/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/browserify/node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/browserify/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify/node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/browserify/node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/browserify/node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/browserify/node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/browserify/node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, "node_modules/browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -4236,12 +3992,6 @@ "node": ">=4" } }, - "node_modules/cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", - "dev": true - }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -4978,30 +4728,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "node_modules/combine-source-map/node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5933,12 +5659,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6300,31 +6020,6 @@ "node": ">= 0.6.0" } }, - "node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/deps-sort/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/dequal": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", @@ -6395,23 +6090,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/dev-ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", @@ -6770,15 +6448,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -8392,12 +8061,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -8708,12 +8371,6 @@ "node": ">=0.10.0" } }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -8886,12 +8543,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -9725,15 +9376,6 @@ "node": ">=6" } }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -11131,52 +10773,6 @@ "semver": "^7.3.2" } }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/insert-module-globals/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -11222,22 +10818,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11454,21 +11034,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -11743,25 +11308,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -12429,31 +11975,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -12837,16 +12358,6 @@ "node": ">=6" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -15054,45 +14565,6 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/moo": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", @@ -16410,15 +15882,6 @@ "node": ">=4" } }, - "node_modules/outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "dev": true, - "dependencies": { - "shell-quote": "^1.4.2" - } - }, "node_modules/p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -16748,15 +16211,6 @@ "node": ">=6" } }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "dependencies": { - "path-platform": "~0.11.15" - } - }, "node_modules/parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -16883,15 +16337,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/path-to-regexp": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", @@ -18849,15 +18294,6 @@ "gather-stream": "^1.0.0" } }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -20692,15 +20128,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -20722,12 +20149,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -21309,16 +20730,6 @@ "duplexer": "~0.1.1" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, "node_modules/stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", @@ -21332,16 +20743,6 @@ "xtend": "^4.0.0" } }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "node_modules/stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", @@ -21629,15 +21030,6 @@ "node": ">=8" } }, - "node_modules/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -21806,15 +21198,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, "node_modules/taffydb": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", @@ -22275,29 +21658,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -22730,15 +22090,6 @@ "integrity": "sha512-g8SLGxflI0/VNH2C8j66KcfJXrU5StJglRQBYPNiChXFlOrqqYM1icOykOAAUgTeBpktaEuCm9hjpPinQ080PA==", "dev": true }, - "node_modules/umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true, - "bin": { - "umd": "bin/cli.js" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -22788,22 +22139,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, "node_modules/underscore": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", @@ -23391,27 +22726,6 @@ "node": ">=10" } }, - "node_modules/watchify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", - "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", - "dev": true, - "dependencies": { - "anymatch": "^3.1.0", - "browserify": "^17.0.0", - "chokidar": "^3.4.0", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^4.0.2", - "xtend": "^4.0.2" - }, - "bin": { - "watchify": "bin/cmd.js" - }, - "engines": { - "node": ">= 8.10.0" - } - }, "node_modules/watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -24001,26 +23315,6 @@ "node": ">=4" } }, - "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -26016,25 +25310,6 @@ "dev": true, "requires": {} }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -26759,12 +26034,6 @@ "postcss-value-parser": "^4.1.0" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -27319,47 +26588,12 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "requires": { - "resolve": "^1.17.0" - } - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -27484,167 +26718,6 @@ "stream-throttle": "^0.1.3" } }, - "browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "requires": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - } - } - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -27916,12 +26989,6 @@ } } }, - "cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", - "dev": true - }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -28519,32 +27586,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - } - } - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -29329,12 +28370,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -29616,30 +28651,6 @@ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "dequal": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", @@ -29693,17 +28704,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, "dev-ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", @@ -29999,15 +28999,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -31241,12 +30232,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -31480,12 +30465,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -31613,12 +30592,6 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -32277,12 +31250,6 @@ "uglify-js": "^3.5.1" } }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -33272,51 +32239,6 @@ "semver": "^7.3.2" } }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "requires": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -33350,16 +32272,6 @@ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -33498,15 +32410,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -33708,19 +32611,6 @@ "has-symbols": "^1.0.2" } }, - "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -34250,22 +33140,6 @@ "universalify": "^2.0.0" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -34573,16 +33447,6 @@ "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", "dev": true }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -36227,41 +35091,6 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, - "module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "requires": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "moo": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", @@ -37318,15 +36147,6 @@ "arch": "^2.1.0" } }, - "outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "dev": true, - "requires": { - "shell-quote": "^1.4.2" - } - }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -37572,15 +36392,6 @@ } } }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -37691,12 +36502,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, "path-to-regexp": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", @@ -39304,15 +38109,6 @@ "gather-stream": "^1.0.0" } }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -40764,15 +39560,6 @@ } } }, - "shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -40788,12 +39575,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -41270,16 +40051,6 @@ "duplexer": "~0.1.1" } }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", @@ -41293,16 +40064,6 @@ "xtend": "^4.0.0" } }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", @@ -41520,15 +40281,6 @@ } } }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -41659,15 +40411,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, "taffydb": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", @@ -42023,28 +40766,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -42381,12 +41102,6 @@ "integrity": "sha512-g8SLGxflI0/VNH2C8j66KcfJXrU5StJglRQBYPNiChXFlOrqqYM1icOykOAAUgTeBpktaEuCm9hjpPinQ080PA==", "dev": true }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -42421,19 +41136,6 @@ } } }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, "underscore": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", @@ -42911,21 +41613,6 @@ "xml-name-validator": "^3.0.0" } }, - "watchify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", - "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", - "dev": true, - "requires": { - "anymatch": "^3.1.0", - "browserify": "^17.0.0", - "chokidar": "^3.4.0", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^4.0.2", - "xtend": "^4.0.2" - } - }, "watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -43361,20 +42048,6 @@ "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true }, - "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" - } - }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/package.json b/package.json index a807ebabd9..f67f224959 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,6 @@ "canvas": "^2.9.0", "chai": "^4.3.4", "coffeescript": "^2.6.1", - "configstore": "^5.0.1", "coveralls": "^3.1.1", "cross-env": "^7.0.2", "eslint": "^8.24.0", @@ -137,7 +136,6 @@ "sinon": "^9.0.3", "strip-ansi": "^6.0.0", "svgo": "^1.3.2", - "through2": "^4.0.2", "touch": "^3.1.0", "unexpected": "^11.14.0", "unexpected-eventemitter": "^2.2.0", @@ -147,7 +145,6 @@ "update-notifier": "^4.1.0", "uslug": "^1.0.4", "uuid": "^8.3.0", - "watchify": "^4.0.0", "webpack": "^5.67.0", "webpack-cli": "^4.9.1" }, From 73bb81904fa017fc474973ce9b1e8fc325709142 Mon Sep 17 00:00:00 2001 From: Anton Usmansky Date: Sun, 4 Dec 2022 17:59:11 +0300 Subject: [PATCH 1769/1771] feat(esm): ability to decorate ESM module name before importing it (#4945) --- lib/mocha.js | 7 +++-- lib/nodejs/esm-utils.js | 28 +++++++++++++------ test/node-unit/esm-utils.spec.js | 46 ++++++++++++++++++++++++++++++++ test/node-unit/mocha.spec.js | 19 +++++++++++++ 4 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 test/node-unit/esm-utils.spec.js diff --git a/lib/mocha.js b/lib/mocha.js index 1b7101a2a7..f93865df7e 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -429,6 +429,8 @@ Mocha.prototype.loadFiles = function (fn) { * @see {@link Mocha#addFile} * @see {@link Mocha#run} * @see {@link Mocha#unloadFiles} + * @param {Object} [options] - Settings object. + * @param {Function} [options.esmDecorator] - Function invoked on esm module name right before importing it. By default will passthrough as is. * @returns {Promise} * @example * @@ -437,7 +439,7 @@ Mocha.prototype.loadFiles = function (fn) { * .then(() => mocha.run(failures => process.exitCode = failures ? 1 : 0)) * .catch(() => process.exitCode = 1); */ -Mocha.prototype.loadFilesAsync = function () { +Mocha.prototype.loadFilesAsync = function ({esmDecorator} = {}) { var self = this; var suite = this.suite; this.lazyLoadFiles(true); @@ -450,7 +452,8 @@ Mocha.prototype.loadFilesAsync = function () { function (file, resultModule) { suite.emit(EVENT_FILE_REQUIRE, resultModule, file, self); suite.emit(EVENT_FILE_POST_REQUIRE, global, file, self); - } + }, + esmDecorator ); }; diff --git a/lib/nodejs/esm-utils.js b/lib/nodejs/esm-utils.js index 18abe81ff8..5318099365 100644 --- a/lib/nodejs/esm-utils.js +++ b/lib/nodejs/esm-utils.js @@ -1,10 +1,12 @@ const path = require('path'); const url = require('url'); -const formattedImport = async file => { +const forward = x => x; + +const formattedImport = async (file, esmDecorator = forward) => { if (path.isAbsolute(file)) { try { - return await import(url.pathToFileURL(file)); + return await exports.doImport(esmDecorator(url.pathToFileURL(file))); } catch (err) { // This is a hack created because ESM in Node.js (at least in Node v15.5.1) does not emit // the location of the syntax error in the error thrown. @@ -27,15 +29,17 @@ const formattedImport = async file => { throw err; } } - return import(file); + return exports.doImport(esmDecorator(file)); }; -exports.requireOrImport = async file => { +exports.doImport = async file => import(file); + +exports.requireOrImport = async (file, esmDecorator) => { if (path.extname(file) === '.mjs') { - return formattedImport(file); + return formattedImport(file, esmDecorator); } try { - return dealWithExports(await formattedImport(file)); + return dealWithExports(await formattedImport(file, esmDecorator)); } catch (err) { if ( err.code === 'ERR_MODULE_NOT_FOUND' || @@ -85,10 +89,18 @@ function dealWithExports(module) { } } -exports.loadFilesAsync = async (files, preLoadFunc, postLoadFunc) => { +exports.loadFilesAsync = async ( + files, + preLoadFunc, + postLoadFunc, + esmDecorator +) => { for (const file of files) { preLoadFunc(file); - const result = await exports.requireOrImport(path.resolve(file)); + const result = await exports.requireOrImport( + path.resolve(file), + esmDecorator + ); postLoadFunc(file, result); } }; diff --git a/test/node-unit/esm-utils.spec.js b/test/node-unit/esm-utils.spec.js new file mode 100644 index 0000000000..8880b5bceb --- /dev/null +++ b/test/node-unit/esm-utils.spec.js @@ -0,0 +1,46 @@ +'use strict'; + +const esmUtils = require('../../lib/nodejs/esm-utils'); +const sinon = require('sinon'); +const url = require('url'); + +describe('esm-utils', function () { + beforeEach(function () { + sinon.stub(esmUtils, 'doImport').resolves({}); + }); + + afterEach(function () { + sinon.restore(); + }); + + describe('loadFilesAsync()', function () { + it('should not decorate imported module if no decorator passed', async function () { + await esmUtils.loadFilesAsync( + ['/foo/bar.mjs'], + () => {}, + () => {} + ); + + expect( + esmUtils.doImport.firstCall.args[0].toString(), + 'to be', + url.pathToFileURL('/foo/bar.mjs').toString() + ); + }); + + it('should decorate imported module with passed decorator', async function () { + await esmUtils.loadFilesAsync( + ['/foo/bar.mjs'], + () => {}, + () => {}, + x => `${x}?foo=bar` + ); + + expect( + esmUtils.doImport.firstCall.args[0].toString(), + 'to be', + `${url.pathToFileURL('/foo/bar.mjs').toString()}?foo=bar` + ); + }); + }); +}); diff --git a/test/node-unit/mocha.spec.js b/test/node-unit/mocha.spec.js index 8bf48b1b06..78991657e2 100644 --- a/test/node-unit/mocha.spec.js +++ b/test/node-unit/mocha.spec.js @@ -48,6 +48,9 @@ describe('Mocha', function () { stubs.Suite = sinon.stub().returns(stubs.suite); stubs.Suite.constants = {}; stubs.ParallelBufferedRunner = sinon.stub().returns({}); + stubs.esmUtils = { + loadFilesAsync: sinon.stub() + }; const runner = Object.assign(sinon.createStubInstance(EventEmitter), { runAsync: sinon.stub().resolves(0), globals: sinon.stub(), @@ -66,6 +69,7 @@ describe('Mocha', function () { '../../lib/suite.js': stubs.Suite, '../../lib/nodejs/parallel-buffered-runner.js': stubs.ParallelBufferedRunner, + '../../lib/nodejs/esm-utils': stubs.esmUtils, '../../lib/runner.js': stubs.Runner, '../../lib/errors.js': stubs.errors }) @@ -219,6 +223,21 @@ describe('Mocha', function () { }); }); + describe('loadFilesAsync()', function () { + it('shoud pass esmDecorator to actual load function', async function () { + const esmDecorator = x => `${x}?foo=bar`; + + await mocha.loadFilesAsync({esmDecorator}); + + expect(stubs.esmUtils.loadFilesAsync, 'was called once'); + expect( + stubs.esmUtils.loadFilesAsync.firstCall.args[3], + 'to be', + esmDecorator + ); + }); + }); + describe('unloadFiles()', function () { it('should delegate Mocha.unloadFile() for each item in its list of files', function () { mocha.files = [DUMB_FIXTURE_PATH, DUMBER_FIXTURE_PATH]; From 6782d6d0757a5e7b49b291bcae173316ec00c513 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 11 Dec 2022 14:46:56 +0100 Subject: [PATCH 1770/1771] build(v10.2.0): update CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeb09de3ec..bad7d6bd4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# 10.2.0 / 2022-12-11 + +## :tada: Enhancements + +- #4945: API: add possibility to decorate ESM name before import (@j0tunn) + +## :bug: Fixes + +- #4946: Browser: color of failed test icon (@kleisauke) + +## :book: Documentation + +- #4944: Remove duplicated header (@PauloGoncalvesBH) + # 10.1.0 / 2022-10-16 ## :tada: Enhancements From 202e9b8b4d1b6611c96d95d631c49d631d88c827 Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Sun, 11 Dec 2022 15:00:31 +0100 Subject: [PATCH 1771/1771] build(v10.2.0): release --- AUTHORS | 3 +++ CHANGELOG.md | 6 +++--- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index 94f192dfc1..08ec60d757 100644 --- a/AUTHORS +++ b/AUTHORS @@ -539,5 +539,8 @@ Darius Dzien Yeting Li Greggman Josh Goldberg +Kleis Auke Wolthuizen +Paulo Gonçalves +Anton Usmansky # Generated by scripts/update-authors.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bad7d6bd4b..ba868af4d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,15 +2,15 @@ ## :tada: Enhancements -- #4945: API: add possibility to decorate ESM name before import (@j0tunn) +- [#4945](https://github.com/mochajs/mocha/issues/4945): API: add possibility to decorate ESM name before import ([**@j0tunn**](https://github.com/j0tunn)) ## :bug: Fixes -- #4946: Browser: color of failed test icon (@kleisauke) +- [#4946](https://github.com/mochajs/mocha/issues/4946): Browser: color of failed test icon ([**@kleisauke**](https://github.com/kleisauke)) ## :book: Documentation -- #4944: Remove duplicated header (@PauloGoncalvesBH) +- [#4944](https://github.com/mochajs/mocha/issues/4944): Remove duplicated header ([**@PauloGoncalvesBH**](https://github.com/PauloGoncalvesBH)) # 10.1.0 / 2022-10-16 diff --git a/package-lock.json b/package-lock.json index 319e9be2ab..9af4aa58d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mocha", - "version": "10.1.0", + "version": "10.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mocha", - "version": "10.1.0", + "version": "10.2.0", "license": "MIT", "dependencies": { "ansi-colors": "4.1.1", diff --git a/package.json b/package.json index f67f224959..bdb347cc0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mocha", - "version": "10.1.0", + "version": "10.2.0", "type": "commonjs", "description": "simple, flexible, fun test framework", "keywords": [

              -

              Mocha

              -

              simple, flexible, fun

              -

              Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.

              - -

              - -

              Features

              - -
                -
              • browser support
              • -
              • simple async support, including promises
              • -
              • test coverage reporting
              • -
              • string diff support
              • -
              • javascript API for running tests
              • -
              • proper exit status for CI support etc
              • -
              • auto-detects and disables coloring for non-ttys
              • -
              • maps uncaught exceptions to the correct test case
              • -
              • async test timeout support
              • -
              • test-specific timeouts
              • -
              • growl notification support
              • -
              • reports test durations
              • -
              • highlights slow tests
              • -
              • file watcher support
              • -
              • global variable leak detection
              • -
              • optionally run tests that match a regexp
              • -
              • auto-exit to prevent "hanging" with an active loop
              • -
              • easily meta-generate suites & test-cases
              • -
              • mocha.opts file support
              • -
              • clickable suite titles to filter test execution
              • -
              • node debugger support
              • -
              • detects multiple calls to done()
              • -
              • use any assertion library you want
              • -
              • extensible reporting, bundled with 9+ reporters
              • -
              • extensible test DSLs or "interfaces"
              • -
              • before, after, before each, after each hooks
              • -
              • arbitrary transpiler support (coffee-script etc)
              • -
              • TextMate bundle
              • -
              • and more!
              • -
              - -

              Table of contents

              - - - -

              Installation

              - -

              Install with npm:

              - -
              $ npm install -g mocha
              -
              - -

              1. 2. 3. Mocha!

              - -
              $ npm install -g mocha
              -$ mkdir test
              -$ $EDITOR test/test.js
              -
              -var assert = require("assert")
              -describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it('should return -1 when the value is not present', function(){
              -      assert.equal(-1, [1,2,3].indexOf(5));
              -      assert.equal(-1, [1,2,3].indexOf(0));
              -    })
              -  })
              -})
              -
              -$  mocha
              -
              -  .
              -
              -  ✔ 1 test complete (1ms)
              -
              - -

              Assertions

              - -

              Mocha allows you to use any assertion library you want, if it throws an error, it will work! This means you can utilize libraries such as should.js, node's regular assert module, or others. The following is a list of known assertion libraries for node and/or the browser:

              - -
                -
              • should.js BDD style shown throughout these docs
              • -
              • expect.js expect() style assertions
              • -
              • chai expect(), assert() and should style assertions
              • -
              • better-assert c-style self-documenting assert()
              • -
              - -

              Synchronous code

              - -

              When testing synchronous code, omit the callback and Mocha will automatically continue on to the next test.

              - -
              describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it('should return -1 when the value is not present', function(){
              -      [1,2,3].indexOf(5).should.equal(-1);
              -      [1,2,3].indexOf(0).should.equal(-1);
              -    })
              -  })
              -})
              -
              - -

              Asynchronous code

              - -

              Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named done) to it() Mocha will know that it should wait for completion.

              - -
              describe('User', function(){
              -  describe('#save()', function(){
              -    it('should save without error', function(done){
              -      var user = new User('Luna');
              -      user.save(function(err){
              -        if (err) throw err;
              -        done();
              -      });
              -    })
              -  })
              -})
              -
              - -

              To make things even easier, the done() callback accepts an error, so we may use this directly:

              - -
              describe('User', function(){
              -  describe('#save()', function(){
              -    it('should save without error', function(done){
              -      var user = new User('Luna');
              -      user.save(done);
              -    })
              -  })
              -})
              -
              - -

              All "hooks", that is before(), after(), beforeEach(), afterEach() may be sync or async as well, behaving much like a regular test-case. For example you may wish to populate database with dummy content before each test:

              - -
              describe('Connection', function(){
              -  var db = new Connection
              -    , tobi = new User('tobi')
              -    , loki = new User('loki')
              -    , jane = new User('jane');
              -
              -  beforeEach(function(done){
              -    db.clear(function(err){
              -      if (err) return done(err);
              -      db.save([tobi, loki, jane], done);
              -    });
              -  })
              -
              -  describe('#find()', function(){
              -    it('respond with matching records', function(done){
              -      db.find({ type: 'User' }, function(err, res){
              -        if (err) return done(err);
              -        res.should.have.length(3);
              -        done();
              -      })
              -    })
              -  })
              -})
              -
              - -

              Alternately, instead of using the done() callback, you can return a promise. This is useful if the APIs you are testing return promises instead of taking callbacks:

              - -
              beforeEach(function(){
              -  return db.clear().then(function() {
              -    return db.save([tobi, loki, jane]);
              -  });
              -})
              -
              -describe('#find()', function(){
              -  it('respond with matching records', function(){
              -    return db.find({ type: 'User' }).should.eventually.have.length(3);
              -  })
              -})
              -
              - -

              (The latter example uses Chai as Promised for fluent promise assertions.)

              - -

              Note that you may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

              - -
              beforeEach(function(){
              -  console.log('before every test')
              -})
              -
              - -

              Hooks

              - -

              Mocha provides the hooks before(), after(), beforeEach(), afterEach(), - that can be used to set up preconditions and clean up your tests.

              - -
              describe('hooks', function() {
              -  before(function() {
              -    // runs before all tests in this block
              -  })
              -  after(function(){
              -    // runs after all tests in this block
              -  })
              -  beforeEach(function(){
              -    // runs before each test in this block
              -  })
              -  afterEach(function(){
              -    // runs after each test in this block
              -  })
              -  // test cases
              -})
              -
              - -

              All hooks can be invoked with an optional description, making it easier to pinpoint errors in your tests. - If hooks are given named functions those names will be used if no description is supplied.

              - -
              beforeEach(function(){
              -  // beforeEach hook
              -})
              -beforeEach(function namedFun() {
              -  // beforeEach:namedFun
              -})
              -beforeEach('some description', function(){
              -  // beforeEach:some description
              -})
              -
              - -

              Pending tests

              - -

              Pending test-cases are simply those without a callback:

              - -
              describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it('should return -1 when the value is not present')
              -  })
              -})
              -
              - -

              Exclusive tests

              - -

              The exclusivity feature allows you to run only the specified suite or test-case - by appending .only() to the call as shown here:

              - -
              describe('Array', function(){
              -  describe.only('#indexOf()', function(){
              -    ...
              -  })
              -})
              -
              - -

              Or a specific test-case:

              - -
              describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it.only('should return -1 unless present', function(){
              -
              -    })
              -
              -    it('should return the index when present', function(){
              -
              -    })
              -  })
              -})
              -
              - -

              Note that currently only one .only() call is respected, this - effectively turns into a --grep.

              - -

              Inclusive tests

              - -

              This feature is similar to .only(), however by appending .skip() - you may tell Mocha to simply ignore these suite(s) and test-case(s). This - puts them in a pending state, and is favoured over commenting out tests - which you may forget to uncomment.

              - -
              describe('Array', function(){
              -  describe.skip('#indexOf()', function(){
              -    ...
              -  })
              -})
              -
              - -

              Or a specific test-case:

              - -
              describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it.skip('should return -1 unless present', function(){
              -
              -    })
              -
              -    it('should return the index when present', function(){
              -
              -    })
              -  })
              -})
              -
              - -

              Meta-Generated tests

              - -

              Given mocha's use of call statements and function expressions to define - suites and specs, it's rather straightforward to generate your tests. No - special syntax is required - plain JavaScript can be used to achieve - similar functionality as parameterized tests in other test frameworks. - Take the following example:

              - -
              var assert = require('assert');
              -
              -function add() {
              -  return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
              -    return prev + curr;
              -  }, 0);
              -}
              -
              -describe('add()', function() {
              -  var tests = [
              -    {args: [1, 2],       expected: 3},
              -    {args: [1, 2, 3],    expected: 6},
              -    {args: [1, 2, 3, 4], expected: 10}
              -  ];
              -
              -  tests.forEach(function(test) {
              -    it('correctly adds ' + test.args.length + ' args', function() {
              -      var res = add.apply(null, test.args);
              -      assert.equal(res, test.expected);
              -    });
              -  });
              -});
              -
              - -

              The code above will output a suite with three specs:

              - -
              add()
              -  ✓ correctly adds 2 args
              -  ✓ correctly adds 3 args
              -  ✓ correctly adds 4 args
              -
              - -

              Test duration

              - -

              Most of the reporters support some form of displaying - test duration, as well as flagging tests that are slow, - as shown here with the "spec" reporter:

              - -

              test duration

              - -

              String diffs

              - -

              Mocha supports the err.expected, and err.actual properties - when available to present expectations to the developer. Currently - Mocha provides string diffs, however in the future object diffs and - others may be provided.

              - -

              string diffs

              - -

              mocha(1)

              - -
              Usage: mocha [debug] [options] [files]
              -
              -Commands:
              -
              -  init <path>
              -  initialize a client-side mocha setup at <path>
              -
              -Options:
              -
              - -h, --help                              output usage information
              - -V, --version                           output the version number
              - -A, --async-only                        force all tests to take a callback (async)
              - -c, --colors                            force enabling of colors
              - -C, --no-colors                         force disabling of colors
              - -G, --growl                             enable growl notification support
              - -O, --reporter-options <k=v,k2=v2,...>  reporter-specific options
              - -R, --reporter <name>                   specify the reporter to use
              - -S, --sort                              sort test files
              - -b, --bail                              bail after first test failure
              - -d, --debug                             enable node's debugger, synonym for node --debug
              - -g, --grep <pattern>                    only run tests matching <pattern>
              - -f, --fgrep <string>                    only run tests containing <string>
              - -gc, --expose-gc                        expose gc extension
              - -i, --invert                            inverts --grep and --fgrep matches
              - -r, --require <name>                    require the given module
              - -s, --slow <ms>                         "slow" test threshold in milliseconds [75]
              - -t, --timeout <ms>                      set test-case timeout in milliseconds [2000]
              - -u, --ui <name>                         specify user-interface (bdd|tdd|exports)
              - -w, --watch                             watch files for changes
              - --check-leaks                           check for global variable leaks
              - --compilers <ext>:<module>,...          use the given module(s) to compile files
              - --debug-brk                             enable node's debugger breaking on the first line
              - --globals <names>                       allow the given comma-delimited global [names]
              - --inline-diffs                          display actual/expected differences inline within each string
              - --interfaces                            display available interfaces
              - --no-deprecation                        silence deprecation warnings
              - --no-exit                               require a clean shutdown of the event loop: mocha will exit
              - --no-timeouts                           disables timeouts, given implicitly with --debug
              - --opts <path>                           specify opts path
              - --prof                                  log statistical profiling information
              - --recursive                             include sub directories
              - --reporters                             display available reporters
              - --throw-deprecation                     throw an exception anytime a deprecated function is used
              - --trace                                 trace function calls
              - --trace-deprecation                     show stack traces on deprecations
              - --watch-extensions <ext>,...            additional extensions to monitor with --watch
              - --delay                                 wait for async suite definition
              -
              - -

              -w, --watch

              - -

              Executes tests on changes to JavaScript in the CWD, and once initially.

              - -

              --compilers

              - -

              coffee-script is no longer supported out of the box. CS and similar transpilers - may be used by mapping the file extensions (for use with --watch) and the module - name. For example --compilers coffee:coffee-script with CoffeeScript 1.6- or - --compilers coffee:coffee-script/register with CoffeeScript 1.7+.

              - -

              -b, --bail

              - -

              Only interested in the first exception? use --bail !

              - -

              -d, --debug

              - -

              Enables node's debugger support, this executes your script(s) with node debug <file ...> allowing you to step through code and break with the debugger statement. Note the difference between mocha debug and mocha --debug: mocha debug will fire up node's built-in debug client, mocha --debug will allow you to use a different interface — such as the Blink Developer Tools.

              - -

              --globals <names>

              - -

              Accepts a comma-delimited list of accepted global variable names. For example, suppose your app deliberately exposes a global named app and YUI, you may want to add --globals app,YUI. It also accepts wildcards. You could do --globals '*bar' and it would match foobar, barbar, etc. You can also simply pass in '*' to ignore all globals.

              - -

              --check-leaks

              - -

              By default Mocha will not check for global variables leaked while running tests, to enable this pass --check-leaks, to specify globals that are acceptable use --globals, for example --globals jQuery,MyLib.

              - -

              -r, --require <name>

              - -

              The --require option is useful for libraries such as should.js, so you may simply --require should instead of manually invoking require('should') within each test file. Note that this works well for should as it augments Object.prototype, however if you wish to access a module's exports you will have to require them, for example var should = require('should'). Furthermore, it can be used with relative paths, e.g. --require ./test/helper.js

              - -

              -u, --ui <name>

              - -

              The --ui option lets you specify the interface to use, defaulting to "bdd".

              - -

              -R, --reporter <name>

              - -

              The --reporter option allows you to specify the reporter that will be used, defaulting to "dot". This flag may also be used to utilize third-party reporters. For example if you npm install mocha-lcov-reporter you may then do --reporter mocha-lcov-reporter.

              - -

              -t, --timeout <ms>

              - -

              Specifies the test-case timeout, defaulting to 2 seconds. To override you may pass the timeout in milliseconds, or a value with the s suffix, ex: --timeout 2s or --timeout 2000 would be equivalent.

              - -

              -s, --slow <ms>

              - -

              Specify the "slow" test threshold, defaulting to 75ms. Mocha uses this to highlight test-cases that are taking too long.

              - -

              -g, --grep <pattern>

              - -

              The --grep option when specified will trigger mocha to only run tests matching the given pattern which is internally compiled to a RegExp.

              - -

              Suppose for example you have "api" related tests, as well as "app" related tests, as shown in the following snippet; One could use --grep api or --grep app to run one or the other. The same goes for any other part of a suite or test-case title, --grep users would be valid as well, or even --grep GET.

              - -
              describe('api', function(){
              -  describe('GET /api/users', function(){
              -    it('respond with an array of users')
              -  })
              -})
              -
              -describe('app', function(){
              -  describe('GET /users', function(){
              -    it('respond with an array of users')
              -  })
              -})
              -
              - -

              Interfaces

              - -

              Mocha "interface" system allows developers to choose their style of DSL. Shipping with BDD, TDD, and exports flavoured interfaces.

              - -

              BDD

              - -

              The "BDD" interface provides describe(), context(), it(), before(), after(), beforeEach(), and afterEach():

              - -

              context() is just an alias for describe(), and behaves the same way; it just provides a way to keep tests easier to read and organized.

              - -
              describe('Array', function(){
              -  before(function(){
              -    // ...
              -  });
              -
              -  describe('#indexOf()', function(){
              -    context('when not present', function(){
              -      it('should not throw an error', function(){
              -        (function(){
              -          [1,2,3].indexOf(4);
              -        }).should.not.throw();
              -      });
              -      it('should return -1', function(){
              -        [1,2,3].indexOf(4).should.equal(-1);
              -      });
              -    });
              -    context('when present', function(){
              -      it('should return the index where the element first appears in the array', function(){
              -        [1,2,3].indexOf(3).should.equal(2);
              -      });
              -    });
              -  });
              -});
              -
              - -

              TDD

              - -

              The "TDD" interface provides suite(), test(), suiteSetup(), suiteTeardown(), setup(), and teardown().

              - -
              suite('Array', function(){
              -  setup(function(){
              -    // ...
              -  });
              -
              -  suite('#indexOf()', function(){
              -    test('should return -1 when not present', function(){
              -      assert.equal(-1, [1,2,3].indexOf(4));
              -    });
              -  });
              -});
              -
              - -

              Exports

              - -

              The "exports" interface is much like Mocha's predecessor expresso. The keys before, after, beforeEach, and afterEach are special-cased, object values - are suites, and function values are test-cases.

              - -
              module.exports = {
              -  before: function(){
              -    // ...
              -  },
              -
              -  'Array': {
              -    '#indexOf()': {
              -      'should return -1 when not present': function(){
              -        [1,2,3].indexOf(4).should.equal(-1);
              -      }
              -    }
              -  }
              -};
              -
              - -

              QUnit

              - -

              The qunit-inspired interface matches the "flat" look of QUnit where the test suite title is simply defined before the test-cases. Like TDD, it uses suite() and test(), but resembling BDD it also contains before(), after(), beforeEach(), and afterEach().

              - -
              function ok(expr, msg) {
              -  if (!expr) throw new Error(msg);
              -}
              -
              -suite('Array');
              -
              -test('#length', function(){
              -  var arr = [1,2,3];
              -  ok(arr.length == 3);
              -});
              -
              -test('#indexOf()', function(){
              -  var arr = [1,2,3];
              -  ok(arr.indexOf(1) == 0);
              -  ok(arr.indexOf(2) == 1);
              -  ok(arr.indexOf(3) == 2);
              -});
              -
              -suite('String');
              -
              -test('#length', function(){
              -  ok('foo'.length == 3);
              -});
              -
              - -

              Require

              - -

              The require interface allows you to require the describe and friend words - directly using require and call them whatever you want. This interface - is also useful if you want to avoid global variables in your tests.

              - -

              Note this works when you run your tests via the mocha executable only, and not when using the node executable directly. The reason is that - certain methods are exposed at runtime and when using the mocha executable only.

              - -
              var testCase = require('mocha').describe
              -var pre = require('mocha').before
              -var assertions = require('mocha').it
              -var assert = require('assert')
              -
              -testCase('Array', function(){
              -  pre(function(){
              -    // ...
              -  });
              -
              -  testCase('#indexOf()', function(){
              -    assertions('should return -1 when not present', function(){
              -      assert.equal([1,2,3].indexOf(4), -1);
              -    });
              -  });
              -});
              -
              - -

              Reporters

              - -

              Mocha reporters adjust to the terminal window, - and always disable ansi-escape colouring when - the stdio streams are not associated with a tty.

              - -

              Dot Matrix

              - -

              The "dot" matrix reporter is simply a series of dots - that represent test cases, failures highlight in red, - pending in blue, slow as yellow.

              - -

              dot matrix reporter

              - -

              Spec

              - -

              The "spec" reporter outputs a hierarchical view - nested just as the test cases are.

              - -

              spec reporter - spec reporter with failure

              - -

              Nyan

              - -

              The "nyan" reporter is exactly what you might expect:

              - -

              js nyan cat reporter

              - -

              TAP

              - -

              The TAP reporter emits lines for a Test-Anything-Protocol consumer.

              - -

              test anything protocol

              - -

              Landing Strip

              - -

              The Landing Strip reporter is a gimmicky test reporter simulating - a plane landing :) unicode ftw

              - -

              landing strip plane reporter - landing strip with failure

              - -

              List

              - -

              The "List" reporter outputs a simple specifications list as - test cases pass or fail, outputting the failure details at - the bottom of the output.

              - -

              list reporter

              - -

              Progress

              - -

              The progress reporter implements a simple progress-bar:

              - -

              progress bar

              - -

              JSON

              - -

              The JSON reporter outputs a single large JSON object when - the tests have completed (failures or not).

              - -

              json reporter

              - -

              JSON Stream

              - -

              The JSON Stream reporter outputs newline-delimited JSON "events" as they occur, beginning with a "start" event, followed by test passes or failures, and then the final "end" event.

              - -

              json stream reporter

              - -

              JSONCov

              - -

              The JSONCov reporter is similar to the JSON reporter, however when run against a library instrumented by node-jscoverage it will produce coverage output.

              - -

              HTMLCov

              - -

              The HTMLCov reporter extends the JSONCov reporter. The library being tested should first be instrumented by node-jscoverage, this allows Mocha to capture the coverage information necessary to produce a single-page HTML report.

              - -

              Click to view the current Express test coverage report. For an integration example view the mocha test coverage support commit for Express.

              - -

              code coverage reporting

              - -

              Min

              - -

              The "min" reporter displays the summary only, while still outputting errors - on failure. This reporter works great with --watch as it clears the terminal - in order to keep your test summary at the top.

              - -

              min reporter

              - -

              Doc

              - -

              The "doc" reporter outputs a hierarchical HTML body representation - of your tests, wrap it with a header, footer, some styling and you - have some fantastic documentation!

              - -

              doc reporter

              - -

              For example suppose you have the following JavaScript:

              - -
              describe('Array', function(){
              -  describe('#indexOf()', function(){
              -    it('should return -1 when the value is not present', function(){
              -      [1,2,3].indexOf(5).should.equal(-1);
              -      [1,2,3].indexOf(0).should.equal(-1);
              -    })
              -  })
              -})
              -
              - -

              The command mocha --reporter doc array would yield:

              - -
              <section class="suite">
              -  <h1>Array</h1>
              -  <dl>
              -    <section class="suite">
              -      <h1>#indexOf()</h1>
              -      <dl>
              -      <dt>should return -1 when the value is not present</dt>
              -      <dd><pre><code>[1,2,3].indexOf(5).should.equal(-1);
              -[1,2,3].indexOf(0).should.equal(-1);</code></pre></dd>
              -      </dl>
              -    </section>
              -  </dl>
              -</section>
              -
              - -

              The SuperAgent request library test documentation was generated with Mocha's doc reporter using this simple make target:

              - -
              test-docs:
              -    make test REPORTER=doc \
              -        | cat docs/head.html - docs/tail.html \
              -        > docs/test.html
              -
              - -

              View the entire Makefile for reference.

              - -

              XUnit

              - -

              Documentation needed.

              - -

              TeamCity

              - -

              Documentation needed.

              - -

              Markdown

              - -

              The "markdown" reporter generates a markdown TOC and body for your - test suite. This is great if you want to use the tests as documentation - within a Github wiki page, or a markdown file in the repository that - Github can render. For example here is the Connect test output.

              - -

              HTML

              - -

              The HTML reporter is currently the only browser reporter - supported by Mocha, and it looks like this:

              - -

              HTML test reporter

              - -

              Browser support

              - -

              Mocha runs in the browser. Every release of Mocha will have new builds of ./mocha.js and ./mocha.css for use in the browser. To setup Mocha for browser use all you have to do is include the script, stylesheet, tell Mocha which interface you wish to use, and then run the tests. A typical setup might look something like the following, where we call mocha.setup('bdd') to use the BDD interface before loading the test scripts, running them onload with mocha.run().

              - -
              <html>
              -<head>
              -  <meta charset="utf-8">
              -  <title>Mocha Tests</title>
              -  <link rel="stylesheet" href="mocha.css" />
              -</head>
              -<body>
              -  <div id="mocha"></div>
              -  <script src="jquery.js"></script>
              -  <script src="expect.js"></script>
              -  <script src="mocha.js"></script>
              -  <script>mocha.setup('bdd')</script>
              -  <script src="test.array.js"></script>
              -  <script src="test.object.js"></script>
              -  <script src="test.xhr.js"></script>
              -  <script>
              -    mocha.checkLeaks();
              -    mocha.globals(['jQuery']);
              -    mocha.run();
              -  </script>
              -</body>
              -</html>
              -
              - -

              grep

              - -

              The client-side may use --grep as well, however, you must append a query-string to your URL: ?grep=api.

              - -

              Mocha Setup in the Browser

              - -

              Mocha options can be set via mocha.setup(). Examples:

              - -
              // Use "tdd" interface.  This is a shortcut to setting the interface;
              -// any other options must be passed via an object.
              -mocha.setup('tdd');
              -
              -// This is equivalent to the above.
              -mocha.setup({
              -  ui: 'tdd'
              -});
              -
              -// Use "tdd" interface, ignore leaks, and force all tests to be asynchronous
              -mocha.setup({
              -  ui: 'tdd',
              -  ignoreLeaks: true,
              -  asyncOnly: true
              -});
              -
              - -

              Browser-specific option(s)

              - -

              The following option(s) only function in a browser context:

              - -

              noHighlighting : If set to true, do not attempt to use syntax highlighting on output test code.

              - -

              mocha.opts

              - -

              Mocha will attempt to load ./test/mocha.opts, these are concatenated with process.argv, though command-line args will take precedence. For example suppose you have the following mocha.opts file:

              - -
              --require should
              ---reporter dot
              ---ui bdd
              -
              - -

              This will default the reporter to dot, require the should library, - and use bdd as the interface. With this you may then invoke mocha(1) - with additional arguments, here enabling growl support and changing - the reporter to list:

              - -
              $ mocha --reporter list --growl
              -
              - -

              Suite specific timeouts

              - -

              Suite-level timeouts may be applied to entire test "suites", or disabled - via this.timeout(0). This will be inherited by all nested suites and test-cases - that do not override the value.

              - -
              describe('a suite of tests', function(){
              -  this.timeout(500);
              -
              -  it('should take less than 500ms', function(done){
              -    setTimeout(done, 300);
              -  })
              -
              -  it('should take less than 500ms as well', function(done){
              -    setTimeout(done, 200);
              -  })
              -})
              -
              - -

              Test specific timeouts

              - -

              Test-specific timeouts may also be applied, or the use of this.timeout(0) - to disable timeouts all together:

              - -
              it('should take less than 500ms', function(done){
              -  this.timeout(500);
              -  setTimeout(done, 300);
              -})
              -
              - -

              Best practices

              - -

              test/*

              - -

              By default mocha(1) will use the pattern ./test/*.js, so - it's usually a good place to put your tests.

              - -

              Makefiles

              - -

              Be kind and don't make developers hunt around in your docs to figure - out how to run the tests, add a make test target to your Makefile:

              - -
              test:
              -    ./node_modules/.bin/mocha --reporter list
              -
              -.PHONY: test
              -
              - -

              Editors

              - -

              The following editor-related packages are available:

              - -

              TextMate bundle

              - -

              The Mocha TextMate bundle includes snippets to - make writing tests quicker and more enjoyable. - To install the bundle run:

              - -
              $ make tm
              -
              - -

              JetBrains plugin

              - -

              JetBrains provides a NodeJS plugin for its suite of IDEs (IntelliJ IDEA, WebStorm, etc.), which contains a Mocha test runner, among other things.

              - -

              JetBrains Mocha Runner Plugin in Action

              - -

              The plugin is titled NodeJS, and can be installed via Preferences > Plugins, or via direct download.

              - -

              Example test suites

              - -

              The following test suites are from real projects putting Mocha to use, - so they serve as good examples:

              - - - -

              Running mocha's tests

              - -

              Run the tests:

              - -
              $ make test
              -
              - -

              Run all tests, including interfaces:

              - -
              $ make test-all
              -
              - -

              Alter the reporter:

              - -
              $ make test REPORTER=list
              -
              - -

              More information

              - -

              For additional information such as using spies, mocking, and shared behaviours be sure to check out the Mocha Wiki on GitHub. For discussions join the Google Group. For a running example of mocha view example/tests.html. For the JavaScript API view the source.

              -

              Mocha